|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
06.05.2008, 18:24 | #1 |
Регистрация: 06.05.2008
Сообщений: 5
|
нужна помощь, работа со строками, Паскаль
Дана строка символов S, состоящая из латинских букв. Группы символов, разделенные пробелами и не содержащие пробелов внутри себя, будем называть словами. Преобразовать исходную строку в строки S1 и S2 в соответствии с пунктами 1 и 2 задания. Если какая-либо из итоговых строк окажется пустой, выводить соответствующее сообщение.
Задание №1 п.1. - Напечатать слово, имеющее максимальную длину и отличное от последнего слова. п.2. - Напечатать те слова последовательности, которые отличны от последнего слова, предварительно все вхождения abc заменив на def, если такие есть. Сдесь ощибка, помогите исправить: Программа глючит. 1. При вводе строки, состоящей из пробелов, программа зависает. 2. при вводе строки ff ff ff В начале строки и в конце строки пробелы. программа выдает некорректный результат: s1: f (неверно) s2: пустая program LAB_2; const abc='abc'; def='def'; var s,p,p_s,s1,s2,s3,s4,s5,s6:string; i,q,n,a,b,c,n1,y,n2,k,max,w,d,n3,n4 :byte; slovo:boolean; begin writeln('stroka s'); readln(s); slovo:=false; p:=' '; {Proverka stroki s na nachalo slova} for i:=1 to length(s) do if (s[i]<>p)and(s[i-1]=p) then slovo:=true; if slovo then q:=1; while s[q]=p do delete(s,q,1); q:=length(s); while s[q]=p do begin delete(s,q,1); q:=q-1; end; {Videlenie iz stroki s poslednego slova p_s i stroki s3 ne soderdzachei poslednego slova p_s} s:=p+s; n:=length(s);{Opredelenie dlini stroki} for i:=1 to n do begin if s[i]=p then begin b:=n-i+1;{poslednee alement} c:=n-b; end; p_s:=copy(s,a+1,b); s3:=copy(s,1,c); end; {Polychenie stroki s4, ydalaia iz stroki s3 slovo p_s} s4:=s3+' '; while pos(p+p_s,s4)>0 do begin n1:=length(p_s); y:=pos(p+p_s,s4); delete(s4,y,n1); end; {Videlenie slova max dlini s1 iz stroki s5} s5:=s4; n2:=length(s5); i:=1;{Opredelenie parametra cikla} max:=0;{max dlina slova} while i<=n2 do {Cikl dla prosmotra vsei dlini} begin k:=0;{Dlina slova. Prisvoenie nachalenogo znachenia} while (s5[i]<>p)and(i<=n2) do begin inc(k); {Vichislenie dlini slova} inc(i); {Perexod k cledyechemy simvoly} end; if k>max then begin max:=k; w:=i; end; i:=i+1; s1:=copy(s5,w-max,max); end; if max<>0 then writeln('s1=',s1) else writeln('stroka S1 pysta'); {Polychenie stroki s6, iz stroki s, zameniv vxodzdenie abc na def} s6:=s; while pos(abc,s6)>0 do begin n1:=length(abc); n2:=length(def); d:=pos(abc,s6); delete(s6,d,n2); insert(def,s6,d); end; {Opredelenia p_s, iz stroki s6, i polychenia stroki s3, ne soderdzachego p_s} n3:=length(s6); for i:=1 to n3 do begin if s6[i]=p then begin b:=n3-i+1;{posledni element} c:=n3-b; end; p_s:=copy(s6,a+1,b); s3:=copy(s6,1,c); end; {Polychenie stroki s2, pytem ydalenia iz stroki s3 p_s} s2:=s3+p; n4:=length(s3); while pos(p+p_s,s2)>0 do begin n1:=length(p_s); y:=pos(p+p_s,s2); delete(s2,y,n1+1); end; if s2=p then writeln('stroka S2 pysta') else writeln('s2=',s2); readln end. Последний раз редактировалось Dimon1231; 06.05.2008 в 21:59. Причина: ошибка |
06.05.2008, 22:02 | #2 |
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
Мм..да..
По-моему, Вы недостаточно продумали алгоритм. Несмотря на то, что код почти работает, предлагаю переделать. Посмотрите сюда: Код:
|
07.05.2008, 16:38 | #3 |
Регистрация: 06.05.2008
Сообщений: 5
|
программу доработал
сейчас работает нормально, если есть какие коментарии ответь
program LAB_2; const abc='abc'; def='def'; var s,p_s,s1,s2,s3,s4,s5:string; na,i,q,n,n1,y,n2,k,max,w,d:byte; slovo:boolean; begin writeln('stroka s'); readln(s); {Delim ctroky na 2 hacti} n := length(s); while (n >= 1) and (s[n] = ' ') do dec(n); n1 := n; while (n >= 1) and (s[n] <> ' ') do dec(n); {Slovo s3 bez poslednego slova p_s} s3 := copy(s, 1, n-1); p_s := copy(s, n+1, n1-n); {rabotaem s 1 hactie bez poslednego slova p_s} s3 := s3 + ' '; n := 1; k := 1; while n <= length(s3) do begin if s3[n] = ' ' then begin s4 := copy(s3, k, n-k); {Videlenie slova max dlini s1 iz stroki s5} s5:=' '+s4+' '+' '; n2:=length(s5); i:=1;{Opredelenie parametra cikla} max:=0;{max dlina slova} while i<=n2 do {Cikl dla prosmotra vsei dlini} begin k:=0;{Dlina slova. Prisvoenie nachalenogo znachenia} while (s5[i]<>' ')and(i<=n2) do begin inc(k); {Vichislenie dlini slova} inc(i); {Perexod k cledyechemy simvoly} end; if k>max then begin max:=k; w:=i; end; i:=i+1; s1:=copy(s5,w-max,max); end; {Polychenie stroki s6, iz stroki s, zameniv vxodzdenie abc na def} s2:=s3; while pos(abc,s2)>0 do begin na:=length(abc); d:=pos(abc,s2); delete(s2,d,na); insert(def,s2,d); end; end; inc(n); end; if max<>0 then writeln('s1=',s1) else writeln('stroka S1 pysta'); if s2=' ' then writeln('stroka S2 pysta') else writeln('s2=',s2); readln end. |
07.05.2008, 16:55 | #4 | |
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
Цитата:
------------------------- Код:
Итого Код:
Последний раз редактировалось alexBlack; 07.05.2008 в 17:22. |
|
24.05.2008, 14:47 | #5 |
Регистрация: 06.05.2008
Сообщений: 5
|
нужна помощь
не определяетс слово с одной буквой или в строке слов с одной буквой
program LAB_2; var p:integer; s,p_s,s1,s2,s3,s4:string; n,n1,k,max:byte; begin writeln('stroka s'); readln(s); {Делим строку на две части} n := length(s); while (n >= 1) and (s[n] = ' ') do dec(n); { Пропуск пробелов в конце строки} n1 := n; while (n >= 1) and (s[n] <> ' ') do dec(n); { Поиск пробела перед последним словом} s3 := copy(s, 1, n); { строка без последнего слова} p_s := copy(s, n+1, n1-n); { последнее слово} { Дальше работаем только с первой частью без последнего слова} n := 1; k := 1; max := 0; s1 := ''; s2 := ''; while n <= length(s3) do begin if s3[n] = ' ' then begin { Нашли очередной пробел} if n-k > 1 then begin s4 := copy(s3, k, n-k); {Очередное слово в строке} { дальше решаем, что делать с этим словом} if s4 <> p_s then begin { Отличное от последнего} if length(s4) > max then begin s1 := s4; max := length(s4) end; end; { Заменяем} p := pos('abc', s4); while p <> 0 do begin delete(s4, p, 3); insert('def', s4, p); p := pos('abc', s4); end; if length(s2) > 0 then s2 := s2 + ' '; s2 := s2+s4; end; k := n+1; end; inc(n); end; if max<>0 then writeln('s1=',s1) else writeln('stroka S1 pysta'); if length(s2)=0 then writeln('stroka S2 pysta') else writeln('s2=',s2); readln; end. Последний раз редактировалось Dimon1231; 24.05.2008 в 15:04. |
24.05.2008, 15:34 | #6 |
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
Измените условие:
if n-k > 0 then begin в моем коде ошибка. Должен быть 0 вместо 1. |
24.05.2008, 20:31 | #7 |
Регистрация: 06.05.2008
Сообщений: 5
|
при вводе ( g g g g )
s1 выводит строка пуста и также если (ff ff ff ) s1строка пуста |
24.05.2008, 21:46 | #8 |
Старожил
Регистрация: 06.08.2007
Сообщений: 2,183
|
Отделение слов, набросал:
Код:
|
24.05.2008, 22:36 | #9 |
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
|
24.05.2008, 22:47 | #10 |
Регистрация: 06.05.2008
Сообщений: 5
|
мне нужно чтобы выводилось
если (f f f ) то s1:=f ; а s2:=f f если (abcabc a abc abc) то s1:=abcabc ; s2:=defdef a def но выводит без а |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
нужна помощь срочно!!! | Dude | Помощь студентам | 2 | 06.06.2007 10:40 |
СРОЧНО! Нужна помощь | RUsoft | Общие вопросы Delphi | 2 | 26.03.2007 16:54 |
нужна помощь по работе с строками файлов... | Ruffian | Общие вопросы Delphi | 9 | 15.11.2006 16:05 |