Форум «Всё о Паскале» _ Задачи _ Вроде бы легкая задача про строки
Автор: Tim 29.11.2005 23:06
Задача вроде бы совсем проста: **Определить, сколько слов оканчивается на заданный символ** Что может быть проще:
program Project2; uses SysUtils; var s:string; i,n,k:integer; d:char; begin writeln ('Input S'); readln(s); n:=length(s); d:='a'; k:=0; for i:=1 to n do; if(i<n) and (s[i]=d) and (s[i+1]=' ') then k:=k+1; writeln(k); end.
Но ничего не выходит, не подскажите по чему?
М
Пользуемся тегами CODE ! klem4
Автор: volvo 29.11.2005 23:16
Цитата
for i:=1 to n do;
Точку с запятой убери...
Автор: Alex7 30.11.2005 0:47
Цитата
Точку с запятой убери...
У меня знаете ли, тоже такое бывает! Вроде бы се правильно, но не работает, и хоть убейся, а компилятор не видит ошибки!
ЗЫ: сори за оффтоп- не удержался)
Автор: volvo 30.11.2005 1:03
Цитата
компилятор не видит ошибки!
А с точки зрения компилятора здесь НЕТ ошибки... Все по правилам синтаксиса.
Автор: Alex7 30.11.2005 3:05
Цитата
А с точки зрения компилятора здесь НЕТ ошибки... Все по правилам синтаксиса.
Вобщем я это и имел ввиду. Просто всеравно она(ошибка) есть! Кстати, как там они называются такие ошбки, которые появляются в процессе работы, но синтаксически не видимы(как эта)? Просто интиресно
Автор: volvo 30.11.2005 3:08
Это - Логическая ошибка (ошибка в логике работы программы) ...
Автор: Tim 1.12.2005 1:51
А все остальное правильно? Она все равно не работает, после того как вводишь строку, происходит выход из программмы.
Автор: volvo 1.12.2005 1:56
Ну, я не знаю, ЧТО ты вводил, у меня все прекрасно отработало...
Автор: Alex7 1.12.2005 2:06
Цитата
после того как вводишь строку, происходит выход из программмы.
А ты не пробовал перед последним End. ставить задержку програмы, типо Readln/Readkey/Repeat Until keypressed ?
Автор: Tim 1.12.2005 19:58
Спасибо, работает, только при использовании я обнаружил, что если последее слово в строке заканчивается на 'a' то программа его не видит.
Автор: klem4 1.12.2005 20:20
это из-за того, что по этому условию :
if(i<n) and (s[i]=d) and (s[i+1]=' ')
после конца слова должен быть пробел, надо немного изменить условие и все будет ок ;)
Автор: Alex7 2.12.2005 3:06
Цитата
если последее слово в строке
Да, тебе нужно изменить условие, лиюо предварительно в строку добавить знак пробела, т.к. строка заканчивается то на enter, ане space! Поэтомц условие
and (s[i+1]=' ')
и не работает!
Автор: volvo 2.12.2005 3:18
Alex7, не надо ничего никуда НИКОГДА добавлять (если хочешь, могу привести пример, когда этот способ с добавлением пробела не сработает)... Достаточно чуть-чуть подкорректировать условие:
for i:=1 to n do if ( (i = n) or ((i < n) and (s[i + 1] = ' ')) ) and (s[i] = d) then k := k + 1;
и все прекрасно посчитается...
Автор: Alex7 2.12.2005 3:29
Ага, т.е. задаешь два условия в одном if .Когда не конец строки, то проверяем наличие пробела, а коней не проверяем. гениально просто! Не плохо.
Цитата
(если хочешь, могу привести пример, когда этот способ с добавлением пробела не сработает)
А почему? там ведь задается length(s), а он ведь не игнорирует пробелы, после которых нет "смыслоносящих"( ) елементов?!
Автор: volvo 2.12.2005 3:57
Alex7, я не про это... Не всегда же человек тебе дает полную постановку задачи... А если ему нужно будет реалировать этот алгоритм в функции? И вот такой заголовок ему дадут:
Function CountWords(Const s: String; Ch: Char): Integer;
твой алгоритм придется переписывать заново, потому как Const изменить (добавить к строке пробел) не удастся... А мой - сработает без изменений... Привыкать, так сразу к правильному...
Не забывай, код надо писать так, чтобы можно было его использовать НЕоднократно (и желательно - без изменений)