Консультация № 175934
08.01.2010, 23:01
0.00 руб.
0 18 1
Добрый вечер уважаемые эксперты. помогите с плиз с написанием программы. пользователь вводит строку, затем вводит на сколько частей её поделить.

Обсуждение

Неизвестный
09.01.2010, 01:28
общий
Fedor.:
Что должна выполнить программа после ввода исходных данных?
Неизвестный
09.01.2010, 11:45
общий
Fedor.:
Доброе утро! Имеется в виду "на сколько равных частей?"
Пример. Дана строка из 25 символов. Надо разделить на 4 части:
1. 7,7,7,4. Или
2. 6,6,6,7. Или ...
Неизвестный
09.01.2010, 11:48
общий
Да, она должна разделять строку на равные части. например: мамамылараму. делит на 3 равные части получается мама мыла раму
Неизвестный
09.01.2010, 11:52
общий
Fedor.:
Уточните, пожалуйста, как быть, коли длина строки не делится нацело на кол-во частей. мамамыларамку на 3 части.
давно
Академик
320937
2216
09.01.2010, 12:31
общий
это ответ
Рассматривается случай, когда последняя часть (подстрока) не короче остальных. Код в приложении. G++. Подстроки для наглядности разделены не пробелом, а знаком подчеркивания.

Пример работы
Код:
Строка мамамыларамку
Частей 4
Строка мамамыларамку разделена на 4 частей
мам_амы_лар_амку


С уважением

Приложение:
#include <iostream>
#include <string>

using namespace std;
int main()
{
string s;
unsigned int parts;
unsigned int slen;

cout << "Строка ";
getline(cin, s);
cout << "Частей ";
cin >> parts;

if ((slen=s.length())==0)
{
cout << "Нет строки"<< endl;
}
else if (parts<=0)
{
cout << "Некорректное число частей"<< endl;
}
else if (parts==1)
{
cout << s;
}
else
{
cout << "Строка " << s << " разделена на " << parts << " частей" <<endl;

unsigned int plen=slen/parts;
unsigned int partno=0;
for (unsigned int i=0; i<slen;i++)
{
if (i>0 && i%plen==0 && partno<parts-1)
{
cout << "_";
partno++;
}

cout << s[i];
}
cout<< endl;
}
return 0;
}
Неизвестный
10.01.2010, 13:18
общий
Эм... а можете пояснить,что обозначает каждое действие. а то я не всё понимаю.
Неизвестный
10.01.2010, 13:31
общий
Fedor.:
Добрый день! Можете пометить строки (или блоки), которые вызывают Ваши вопросы?
Неизвестный
10.01.2010, 13:45
общий
getline(cin, s) if ((slen=s.length())==0) if (i>0 && i%plen==0 && partno<parts-1)
Неизвестный
10.01.2010, 14:23
общий
Fedor.:
1. getline(cin,s) читает строку до возврата каретки, включая пробелы, тогда как cout до пробела
Обращаю Ваше внимание на Описание C++
2. if ((slen=s.length())==0)
в программе длина введенной строки анализируется не один раз. Поэтому выгодно записать ее в переменную, чтобы не искать '\0' каждый раз.
Приведенная строка примерно эквивалентна следующим.
Код:

slen=s.length(); // в любом случае slen нам понадобится, независимо от условия равенства нулю
if (slen==0) //... если длина строки равна нулю, строка не содержит символов, кроме '\0'

3. if (i>0 && i%plen==0 && partno<parts-1)
// Вставляем пробелы (в моем коде знаки подчеркивания) перед каждым подсловом, кроме первого
// Поскольку последнее подслово может оказаться длинней каждого из предыдущих, не разбиваем его (условие partno<parts-1)

Если что-то вновь не "прозрачно" - спрашивайте.
Неизвестный
10.01.2010, 14:33
общий
Fedor.:
Наибольший интерес, конечно, представляет сама постановка задачи. Поскольку в Вашем вопросе не указано, как делить, в программе принято:
мам_амы_лар_амку. Но ведь есть еще и другое деление: мама_мыла_рамк_у (тоже на 4 части).
Неизвестный
16.01.2010, 21:21
общий
добрый вечер. подправил немного программу, но она всё рано работает не правильно
Код:

void main()
{ setlocale (LC_ALL, "Rus");
char s[12];
int parts;
int slen;
int i;

printf ("Строка ");
scanf("%s",&s);
printf ("Частей ");
scanf ("%i",&parts);
printf ("Длина строки ");
scanf ("%i",&slen);
if (parts<=0)
{
printf ("Некорректное число частей");
}
else if (parts==1)
{
printf ("%s",s);
}
else
{
printf ("Строка %s", s);
printf ("разделена на %i",parts);
printf ("частей");

int plen;
plen=slen/parts;
int partno=0;
for (int i=0;i<slen;i++)
{
if (i>0&&i%plen==0&&partno<parts-1)
{
printf ( "_");
partno++;
}

printf ("%s",s[i]); }


}
getch();
}
Неизвестный
16.01.2010, 22:37
общий
Fedor.:
Добрый вечер! Вы пишете
она всё рано работает не правильно
. Имеется в виду программа, данная в ответе? В чем ее неправильность?
Неизвестный
17.01.2010, 10:32
общий
мой код переделанный код,в общем она несколько раз пишет строку, разделяя её чертой т.е. mamamylaramy_mamamylaramy_ и т.д.
Неизвестный
17.01.2010, 10:52
общий
Fedor.:
Доброе утро! Я посмотрю Ваш исходник, завтра до 12-00 напишу.
Неизвестный
17.01.2010, 18:06
общий
Fedor.:
Добрый вечер! Еще не начал разбираться, но "сходу"
printf ("%s",s[i]);
неверно. Требуется
Код:
printf ("%c",s[i]);
Требуется печатать один символ, а в таком виде, как показано в минифоруме, печатается строка, начальный символ который s[i].
Неизвестный
18.01.2010, 09:12
общий
Fedor.:
Доброе утро! Внес изменения, выделил их /***************/
Код:
#include <stdio.h>
int main()
{
/* setlocale (LC_ALL, "Rus");*/
char s[12];
int parts;
int slen;
int i;

printf ("Строка ");

/***********************/
gets(s);
/***********************/

/* scanf ("%s", s); */
printf ("Частей ");
scanf ("%i",&parts);
/* printf ("Длина строки "); */
/* scanf ("%i",&slen); */

/***********************/
slen = strlen(s);
/***********************/
if (parts<=0)
{
printf ("Некорректное число частей");
}
else if (parts==1)
{
printf ("%s",s);
}
else
{
printf ("Строка %s", s);
printf ("разделена на %i",parts);
printf ("частей");

int plen;
plen=slen/parts;
int partno=0;

/***********************/
/* выносим объявление из заголовка цикла */
/* следовательно, другое имя счетчика */
int ii;
for (ii=0;ii<slen;ii++)
{
if (ii>0&&ii%plen==0&&partno<parts-1)
{
printf ( "_");
partno++;
}

/* printf ("%s",s[ii]); } */
/***********************/
printf ("%c",s[ii]); }
/***********************/


}
getch();
return 0;
}


Неизвестный
18.01.2010, 13:23
общий
Большое спасибо
Неизвестный
18.01.2010, 13:30
общий
Fedor.:
Удачи!
Форма ответа