HOME ПРИМЕРЫ THANKS НОВИЧКАМ ДОКИ LINKS JavaScript Mail |
|
|
uses crt; var s,s2:string; t,i:integer; u:char; begin clrscr; write('Input string: ');readln(s); write('Input first symbol in the word: ');readln(u); while copy (s,1,1)=' ' do delete (s,1,1); while copy (s,length(s),1)=' 'do delete (s,length(s),1); while pos(' ',s)<>0 do delete (s,pos(' ',s),1); s:=s+' '; repeat t:=pos(' ',s); s2:=copy(s,1,t-1); if s2[1]=u then i:=i+1; delete(s,1,t); until length(s)=0; write('The are ',i,' words, which start with ',u); readln end. |
Комментарии 1. Значение переменной i в начале программы не определено. Если прогнать эту программу несколько раз, то вы это заметите. 2. Для предложения которое заключено в кавычки программа будет работать неправильно: 'pick a frog alopr afros dsse aed fffss dsdf' будет выдано 0, хотя на самом деле должно быть 4. Все дело в строке, заменяющей два пробела на один: while pos(' ',s)<>0 do delete (s,pos(' ',s),1); Смотрите, поскольку pos(' ',s) примет значение 39, а pos(' ',s) = 5, будет удален первый встреченный в строке пробел - и так далее пока строка не примет вид: 'pickafrogaloprafrosdsseaedfffss dsdf' а для этого предложения будет выдан 0. Правильный вариант будет длиннее всего на один пробел: while pos(' ',s)<>0 do delete (s,pos(' ',s),1); 3. Вообще говоря слова Антошка и арбуз начинаются с "а", но программа будет считать только какие-нибудь одни - либо маленькие, либо большие буквы "а". Правильное решение: ввод как и раньше ... readln(u); u:=UpCase(u); for i:=1 to lenght(s) do s[i]:=UpCase(s[i]); i:=0; s:=' '+s; t:=pos(' '+u,s); while t>0 do begin inc(i); Delete(s,1,t+2); t:=pos(' '+u,s); end; write(... to top
Автор: strike |
uses crt; var s,s1,s2:string; i,k,t:integer; begin clrscr; write('Input first word: ');readln(s); write ('Input second word: ');readln(s1); while copy (s,1,1)=' ' do delete (s,1,1); while copy (s,length(s),1)=' 'do delete (s,length(s),1); while copy (s1,1,1)=' ' do delete (s1,1,1); while copy (s1,length(s1),1)=' 'do delete (s1,length(s1),1); t:=length(s1); repeat s2:=copy(s,1,t); if s2=s1 then i:=i+1; delete(s,1,1); until length(s)=0; write ('Word ',s1,' is in word ',s,' ',i,' times'); readln end. |
Комментарии 1. Первые 4 while могут быть записаны более рационально. Как я уже говорил, можно описать переменную, которая будет всегда возвращать длину строки. k: byte absolute s; k1: byte absolute s1; ... while s[1]=' ' do delete(s,1,1); while s[k]=' ' do dec(k); while s1[1]=' ' do delete(s1,1,1); while s1[k1]=' ' do dec(k1); ... более того, если вы присвоете некое значение этой переменной, то длина строки станет равной этому значению. Например, k:=1 установит длину строки в 1 и тогда вся строка s станет равной s[1], то есть своему первому символу. Таким образом, dec(k) - уменьшает строку на один символ то есть удаляет последний символ. 2. Теперь собственно по поводу алгоритма поиска. С первого взгляда выглядит все нормально: ищем дилну второго слова, берем кусок той же длины из первого слова и сравниваем их. Затем удаляем из первого слова символ и повторяем. Однако, если изначально первое слово окажется короче второго, ответ можно было бы назвать сразу, не проводя никаких вычислений. То есть хорошо бы проверять это в начале цикла. Кстати, как только это условие перестанет удовлетворяться, проверять дальше не надо. 3. Следующий момент является неочевидным. Требуется уточнить, что означает в условии термин "встречается". Представьте, что слово в котором ищем это "мамамамамама", а слово которое ищем "мама". Приведенный алгоритм выдаст 5, хотя на самом деле слов "мама" только 3. Я бы просто удалял найденное слово из исходного. to top
Автор: strike |
uses crt; var s,s1,s2:string; i,k:integer; c:char; begin clrscr; write('Input original string: ');readln(s); write('Input necessary symbol,which you want to change: ');readln(c); write('Input suquence: ');readln(s1); for i:=1 to length(s)+1 do begin if copy(s,i,1)=c then begin delete(s,i,1); insert(s1,s,i); end; end; write('Modified string: ',s); readln; end. |
Комментарии 1. Прежде всего хочу отметить, что данная задача типовая для программирования и посему я бы посоветовал оформить ее в качестве отдельной процедуры и использовать потом по мере необходимости в более сложных задачах. 2. Мне не совсем понятно, зачем устраивать цикл до следующего за последним в строке символа (length(s)+1) и что в данном случае будет представлять из себя copy(s,length(s)+1,1)? 3. Опять тонкий момент. Из-за особенности компилятора, выражение length(s) в операторе цикла for i:=1 to length(s)+1 do будет вычисляться только один раз - перед первым проходом. А учитывая тот факт, что строка начнет "расширяться", мы никогда не дойдем до конца исходной строки. Например, s:='a rosa upala na lapu asora'; c:='a'; s1:='for'; выдаст результат: "for rosfor upforlfor nfor lapu asora" Как видно конец строки не обработан. Правильным решением будет использование другого оператора цикла - while или repeat. 4. Однако при решении новым способом вас ожидают подводные камни. Если в приведенном примере взять s1:='arfa' то программа войдет в бесконечный цикл, заменяя символы в уже замененном участке строки. Выход: переменная i должна увеличиваться на длину s1 в случае нахождения искомого символа. 5. Проблема иного рода возникнет в связи с ограничением длины строки в 255 символов для типа string. Если длина результирующей строки должна быть больше этого значения, то задача не сможет быть решена этим способом. Решением проблемы может быть вывод получаемых результатов во время вычисления (нашли символ - напечатали s1, не нашли - печатаем символ исходной строки), но такой выход подойтет только в случае, если нам не надо ничего делать с полученной строкой в дальнейшем. Если же надо, то тут надо использовать другие типы данных - динамические, но это уже выходит за рамки учебной программы. to top
Автор: strike |
uses crt; var s,s1:string; u,t,k:integer; begin clrscr; write('Input string: ');readln(s); while copy (s,length(s),1)=' 'do delete (s,length(s),1); while pos(' ',s)<>0 do delete (s,pos(' ',s),1); while copy (s,1,1)=' ' do delete (s1,1,1); u:=0;s:=s+' '; repeat t:=pos(' ',s); k:=t-1; if k>u then begin u:=k; s1:=copy(s,1,k); end; delete(s,1,t); until length(s)=0; write('The longest word: ',s1); readln end. |
HOME EXAMPLES |
|