| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Напечатать самое длинное слово в строке |
| Автор: Алексей 29.6.2006, 20:16 | ||
| Здравствуйте. Помогите, пожалуйста, найти ошибку. Дана строка, в ней слова разделены запятыми, последняя точка. Напечатать самое длинное слово. Я делал без учета пробелов. Т.е. "ффф,фф,фффффф,фф,ф." Функция возвращает, что попало.
Заранее спасибо. С уважением. |
| Автор: MAKCim 29.6.2006, 21:08 | ||
лучше так
|
| Автор: Xatch 29.6.2006, 21:08 |
| Могу скинуть прогу, реализованную на Borland C 3 выглядит так: #include <stdio.h> main() { char str[79]; char nac, kon, lmax, i, k, n; i=k=lmax=n=0; printf("введи строку:\n"); while((str[n++]=getchar())!='\n'); for(i=0;i<n;i++) { if(str[i] !=' ' && str[i] !=' ' && str[i] != '\n') k++; else { if(lmax<k) { lmax=k;kon=i; } k=0; } } nac=kon-lmax; kon-=1; for(i=nac;i<=kon;i++) printf("%c", str[i]); printf("\n"); printf("%d %d %d \n", nac, kon, lmax); } сам понимаешь, здесь слова отделены пробелами. а вот так можно на паскале: program ww111; { Определить самое короткое и самое длинное слово в строке введённой с клавиатуры } uses crt; var i,l,min,max,p1,p2,j:longint;a,b:string; t1:array[1..60]of string; t2:array[1..60]of longint; begin clrscr;textcolor(11); write('введите текст: ');readln(a); l:=length(a)+1;a[l]:=' '; for i:=1 to l do if a[i]=' ' then begin inc(j);t1[j]:=b; t2[j]:=length(b);b:=''; end else b:=b+a[i]; max:=t2[1];min:=t2[1];p1:=1;p2:=1; for i:=1 to j do begin if max<t2[i] then begin max:=t2[i];p1:=i; end; if min>t2[i] then begin min:=t2[i];p2:=i; end; end; writeln('самое длинное слово: ',t1[p1]); writeln('самое короткое слово: ',t1[p2]); textcolor(13);write('P.S.'); writeln(' Если слово не выведено на печать, то вы '); write(' поставили несколько подряд идущих пробелов!'); readln; end. Извини если не в тему, но думаю разобраться здесь можно... |
| Автор: HMLd 30.6.2006, 15:27 | ||
Я сделал так:
|
| Автор: Алексей 30.6.2006, 16:03 |
| А разве компилятор операцию str[i] не выполняет дольше, чем *(str+i)? Все таки, на сколько мне известно, стилем C++ является второй вариант. Поэтому я и пытался сделать с помощью указателей. MAKCim, Ваш вариант, конечно, лучше, но программу я эту пишу по просьбе одного студента, завалившего экзамен. Ему не поверят, что это он писал. Я пытался переделать Ваш вариант Xatch, но опять получил кучу ошибок. |
| Автор: MAKCim 30.6.2006, 17:02 | ||||
Тут же вроде нет ничего сверхестественного
по-моему для указателей компилятор str[i] разворачивает в *(str+i) поэтому, имхо, да |
| Автор: Rockie 30.6.2006, 18:19 | ||
Алексей, возможно это будет быстрее. но скорость - не единственный критерий оценки программы. imho прирост в скорости применительно к данной лабе будет абсолютно незаметен. зато *(str+i) намного труднее читается чем str[i]. |
| Автор: HMLd 30.6.2006, 18:52 |
| Rockie Полностью согласен... А тем более если тот студент экзамен завлил, то str[i] IMHO лучше |
| Автор: Алексей 30.6.2006, 19:33 | ||||
У меня на руках его лекции. Вернее ксерокс лекций его одногруппницы Они кроме функций strlen, strcpy, strcmp и strcat ничего больше не учили. (Как можно С++ за семестр выучить?!) Вряд ли они поверят, что он ради экзамена полез по справочникам.
А если преподаватель рекомендовал с помощью указателей? В его положении не хорошо спорить. Поэтому я и пытаюсь сделать с помощью указателей и с вышеупомянутыми функциями. |
| Автор: Алексей 30.6.2006, 20:42 | ||
Ну вот я ошибку нашел!
n=0 ни туда воткнул! Код, конечно, корявый, но для него сойдет. Теперь объясните мне, почему это в С++ 3.1 работает, а в 6-м Билдере нет. В Билдере оно к распечатанному слову добавляет какие-то символы. |
| Автор: Rockie 30.6.2006, 22:23 | ||||||
лично меня все учили нажимать F1 и Ctrl+F1. или там где твой друг учится пользуются только теми функциями что в тетрадке? а его и не надо выучить. нужно понимать где что лежит (жать F1). imho
так об этом нужно черным по русскому написать в задании. кстати str[i] это тоже указатели. [] - это разыменование.
как тебе кажется эти предложения звучат в связке? |
| Автор: Xenon 30.6.2006, 22:47 |
| [] - Это немного больше, чем разыменование |
| Автор: MAKCim 1.7.2006, 08:51 | ||||||
вообще это мало к С++ относится
Оба варианта - с указателями, просто с [] более читабельный вариант!
базис должен быть |
| Автор: Алексей 1.7.2006, 13:15 | ||||
А Вы разницу между "корявый" и "неработающий" чувствуете?
А какая разница между справочником и F1? Ему бы вообще дохлой троечки хватило! |
| Автор: AlanG 1.7.2006, 13:38 |
| Народ, вы 4е |
| Автор: MAKCim 1.7.2006, 14:51 | ||
и что? инкремент указателя - переход к следующему символу инкремент переменной - увеличение длины текущего слова |
| Автор: Rockie 1.7.2006, 16:18 | ||||||||
по ходу ваших рассуждений у образования должны покраснеть уши? =) думаю это взаимозаменяемые понятия.
оно и в Borland 3.1 не работает. так как: выделяется память для [k+1] а юзается [k-1]. лишнее выводится потомучто нет символа окончания строки. вообще честно говоря неясно где это очищается
|
| Автор: Алексей 1.7.2006, 17:59 |
| Вот теперь всем огромное спасибо! |