Помощь - Поиск - Пользователи - Календарь
Полная версия: Длина максимальной серии символов
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
Olya
unsure.gif Помогите пожалуйста написать программку. Буду очень благодарна yes2.gif

Вот что-то вроде алгоритма:
программка идет по заданному тексту (одномерному массиву), если встречается буква, то идем далее, если цифра или другой символ, счётчик +1 данного участка, запоминаем счётчики на отд. участках, заем они сравниваются, программка выдает максимальный.

Код
Я хотела &!123 бы быть 8936!, крев едкой! :blum:
Ответ:6
volvo
Разберешься?

#include <ctype.h>
#include <stdio.h>

int main()
{
char s[] = "Я хотела &!123 бы быть 8936!, крев едкой!\0";
int count, max = 0;

for(char *p = s, count = 0; *p; p++)
(isalpha(*p) || *p == 32) ? ((count > max) ? max = count, count = 0:max = max): ++count;
printf("%d", max);

return 0;
}

(проверялось в GCC)
Olya
no1.gif Можно поподробнее, мы только начали на Visual C++.net 2003 программировать, нам нельзя использовать классы, и обычно программку мы начинаем следующим образом:

#include <iostream>
#include <conio.h>
using spacename std;

int main()
{
...
getch();
return 0;
}


blink.gif Да и как это будет выглядеть, если пользователь сам будет вводить эту строку символов (текст)??
volvo
Цитата
нам нельзя использовать классы
А где ты здесь классы увидела? Это вообще практически чистый С, а не С++. А вот смешивать одно с другим, как этого хочешь ты (в частности, вроде бы и С++, но и классы не использовать, хотя std почему-то можно) я бы не советовал... Как строку представлять, например, будешь? Вообще-то подразумевается std::string, но ведь это - класс, тебе нельзя этим пользоваться...

Если непонятно использование оператора ?: - то вот то же самое, но с if-ами:

#include <ctype.h>
#include <stdio.h>

int main()
{
char s[256]; // Буфер под строку
int count, max = 0;

gets(s); // читаем строку с клавиатуры... Если хочешь, можешь заменить на cin.getline(s, 256);

// для каждого символа строки проделываем следующее
for(char *p = s, count = 0; *p; p++)
// если символ - буква или пробел (32 - это код пробела) ...
if(isalpha(*p) || *p == 32) {
// ... то если полученное на данный момент число символов в серии больше максимального
if(count > max) {
max = count; // тогда запоминаем его как максимальное
count = 0; // а собственно счетчик - обнуляем
}
}
else count += 1; // если же это не буква и не пробел, то увеличиваем счетчик символов

printf("%d", max);
// печатаем результат. При желании можно заменить
// на cout << "max = " << max << endl;
return 0;
}

Olya
yes2.gif Я уточнила, как программка должна работать, пользователь должен сам ввести строку символов, включающую буквы, цифры, символы и пробелы. Но пробелы не считаются. Можно ли это сделать в программке и как?

Вместо команды:
printf("%d", max);


можно ли использовать
cout<<
cin>>
,

предварительно подключив
using spacename  std;
и
#include <iostream>


wub.gif Можно ли поподробнее объяснить процесс самого поиска этой максимальной серии символов?
volvo
Цитата
Можно ли поподробнее объяснить процесс самого поиска

Комментарии добавлены...
Olya
smile.gif smile.gif smile.gif smile.gif Спасибо, солнышко! smile.gif smile.gif smile.gif smile.gif
Olya
Можно ли заменить эту программку следующим образом? rolleyes.gif
#include <iostream>
#include <conio.h>

using namespace std;

int main()
{
char str[256]; // Буфер под строку
int count, max = 0;

cin.getline(str, 256); // читаем строку с клавиатуры

// для каждого символа строки проделываем следующее
for(int i=0, count = 0; str[i]!="/0"; i++)
// если символ - буква или пробел (32 - это код пробела) ...

if((str[i]>64)&&(str[i]<91)&&(str[i]<=255)&&(str[i]>191)||(str[i]==32)){

// ... то если полученное на данный момент число символов в серии больше максимального
if(count > max) {
max = count; // тогда запоминаем его как максимальное
count = 0; // а собственно счетчик - обнуляем
}
}
else count += 1; // если же это не буква и не пробел, то увеличиваем счетчик символов

cout << "max = " << max << endl;// печатаем результат
getch();
return 0;
}

blum.gif
volvo
Ну, и чем это отличается от того, что я написал в комментариях? Тем что в очередной раз изобретается велосипед вместо использования функции isalpha? Но тогда, прости, по какому праву ты используешь cout? Не пойдет, переписывай потоковый вывод с нуля тоже... Что за двойной стандарт? Либо ты пользуешься готовым везде, либо - нигде...
Olya
Цитата(volvo @ 17.09.2007 0:07) *

Ну, и чем это отличается от того, что я написал в комментариях? Тем что в очередной раз изобретается велосипед вместо использования функции isalpha? Но тогда, прости, по какому праву ты используешь cout? Не пойдет, переписывай потоковый вывод с нуля тоже... Что за двойной стандарт? Либо ты пользуешься готовым везде, либо - нигде...

Почему мы не можем использовать
 cout?
мы же подключили библиотеку
<iostream>
... blink.gif
hardcase
Цитата(Olya @ 17.09.2007 6:41) *

Почему мы не можем использовать
 cout?
мы же подключили библиотеку
<iostream>
... blink.gif
Заменить можешь, просто isalpha несколько понятнее вереницы символов в условии, volvo ругается именно из за этого момента, потомучто в остальном программа идентична его варианту.
Olya
Цитата(hardcase @ 17.09.2007 22:02) *

Заменить можешь, просто isalpha несколько понятнее вереницы символов в условии, volvo ругается именно из за этого момента, потомучто в остальном программа идентична его варианту.

Спасибо!!! smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.