хм, вот задачка, найдите, плиз ошибку, я ее мучаю уже несколько недель
Требование: В программе описать массив строк. Исходный текст считать из файла, созданного в любом текстовом редакторе. Результат обработки вывести на экран, а так же в итоговый текстовый файл.
Задание: Определить количество слов, поменять местами четные и нечетные слова.
program pr6; uses crt;
const p=3; var o1,o2:text; f:array[1..p] of string; s,s1:string; i,j,k,n,m1,m2,l1,l2:integer; procedure invert(k,l:byte); var i:byte; ch:char; b:boolean; begin for i:=k to ((l+k) div 2) do begin ch:=s[i]; s[i]:=s[l+k-i]; s[l+k-i]:=ch; end; end;
begin clrscr;
assign(ff,'d:\o1.txt');
reset(ff); j:=0; while not eoln(ff) do begin j:=j+1; readln(ff,f[j]);writeln(f[j]); end; close(ff);
reset(ff); j:=0; while not eoln(ff) do begin j:=j+1; readln(ff,f[j]); i:=0;n:=0; m1:=1;m2:=1;l1:=1;l2:=1; while i<length(f[j]) do begin i:=i+1; s:=copy(f[j],i,1); if (s[i]=' ')or(i=length(s)) then repeat if s[i+1]=' ' then begin delete(s,i,1); k:=k-1; b:=false; end else b:=true; until b; end;
begin n:=n+1; if n=1 then begin m2:=i-1; l1:=i+1 end else begin n:=0; if i=length(s) then l2:=i else l2:=i-1; invert(m1,m2);invert(l1,l2);invert(m1,l2); m1:=i+1 end end end;
writeln(f[j]); close(ff);
assign(oo,'d:\o2.txt'); rewrite(oo); for j:=1 to 3 do writeln(oo,f[j]);close(oo); end.
LyaLya
25.12.2008 18:03
ну хоть одно умное слово напишите, хоть одну фразочку по задачке, плиззззз
amega
25.12.2008 19:50
Вопервых ты обявила масив
f:array[1..p] of string;
тоесть при копирование их текстового файла будет копиротся строка целиком; а в этом цикле
while not eoln(ff) do <<а в этом цикле у тебя стоит eoln (тоесть пока не конец стоки) нада eof(пока не конец файла) begin j:=j+1; readln(ff,f[j]);writeln(f[j]); end;
да и фаловая переменная ff нигде не обявлена?
а дальше тежело разобратся что делает програма
Lapp
26.12.2008 8:04
Соблюдай разумный формат, иначе ни ты сама, ни кто либо еще не сможет разобраться в твоем творении. Я (с некоторым трудом) отформатировал - посмотри и постарайся делать в том же духе.
const p=3; var ff,oo: text; f: array[1..p] of string; s,s1: string; i,j,k,n,m1,m2,l1,l2: integer; b: boolean;
procedure invert(k,l:byte); var i:byte; ch:char; b:boolean; begin for i:=k to ((l+k) div 2) do begin ch:=s[i]; s[i]:=s[l+k-i]; s[l+k-i]:=ch; end; end;
begin assign(ff,'d:\o1.txt'); reset(ff); j:=0; while not eoln(ff) do begin j:=j+1; readln(ff,f[j]); writeln(f[j]); end; close(ff); reset(ff); j:=0; while not eoln(ff) do begin j:=j+1; readln(ff,f[j]); i:=0; n:=0; m1:=1; m2:=1; l1:=1; l2:=1; while i<length(f[j]) do begin i:=i+1; s:=copy(f[j],i,1); if (s[i]=' ')or(i=length(s)) then repeat if s[i+1]=' ' then begin delete(s,i,1); k:=k-1; b:=false; end else b:=true; until b; end;
n:=n+1; if n=1 then begin m2:=i-1; l1:=i+1 end else begin n:=0; if i=length(s) then l2:=i else l2:=i-1; invert(m1,m2);invert(l1,l2);invert(m1,l2); m1:=i+1 end end;
writeln(f[j]); close(ff);
assign(oo,'d:\o2.txt'); rewrite(oo); for j:=1 to 3 do writeln(oo,f[j]);close(oo); end.
При описании файловой переменной, нужно описывать ее имя, а не имя файла на диске (я исправил). Программа теперь по крайней мере компилируется. Разбирайся дальше. Если будут еще вопросы - приходи.
PS Да, еще я выкинул зло - uses CRT и ClrScr. Советую избегать использования CRT, где это не жизненно необходимо. А ClrScr - вообще непонятно, зачем. Имеет смысл сохранять прежние результаты для простоты отладки. Если программа отлажена и в эксплуатации, то стирать пользователю экран вообще может оказаться медвежьей услугой. Надо будет - сам сотрет.
LyaLya
27.12.2008 0:38
вот что-то переделала:
program pr6; uses crt; var f:text; i,n:integer; a:array[1..500] of string; s,sub:string; begin assign(f,'c:\o.txt'); reset(f); n:=0; while not(eof(f)) do begin readln(f,s); i:=0; repeat inc(i); if (s[i]=' ')and(s[i+1]<>' ') then begin inc(n); a[n]:=sub; sub:=''; end else if (s[i]<>' ')and(s[i]<>'.') then sub:=sub+s[i]; until length(s)=i; if sub<>'' then begin inc(n); a[n]:=sub; end; end; close(f); writeln('Всего ',n,' строк'); assign(f,'c:\o1.txt'); rewrite(f); for i:=1 to n do if i mod 2=0 then begin write(a[i],' ',a[i-1],' '); write(f,a[i],' ',a[i-1],' '); end; if n mod 2=1 then begin write(a[n]); write(f,a[n]); end; close(f); end.
но мне сказали, что проверку четности мона сделать с помощью odd(x) и т.к. необходим массив строк, то надо сделать 2-мерный массив по строкам и символам в строке. как это сделать?
М
Ставь теги паскалевского кода, а не просто кода, пожалуйста Lapp
Lapp
27.12.2008 3:38
Цитата(LyaLya @ 27.12.2008 0:38)
но мне сказали, что проверку четности мона сделать с помощью odd(x) и т.к. необходим массив строк, то надо сделать 2-мерный массив по строкам и символам в строке. как это сделать?
Я думаю, имелось в виду, что надо работать не с дополнительной строкой s, а непосредственно со строкой-элементом массива a[i]. Тогда обращение к отдельному символу будет таким же, как обращение к двумерному массиву: a[i][j] - или даже можно записать так: a[i,j]
Odd - это тоже просто. Odd в переводе с английского означает "нечетный". Условие : if n mod 2=1 then ... - эквивалентно такому: if Odd(n) then ... Или, наоборот: if n mod 2=0 then ... - эквивалентно такому: if not Odd(n) then ...
У меня другой вопрос. В условии задачи абсолютно ничего не говорится про предложения. Есть про строки, есть про слова - и ничего про предложения. Однако, в своей программе ты пытаешься обрабатывать точку отдельно от пробела. Почему? Это ты неправильно написала условие ( ), или это ты ошибаешься и делаешь что-то лишнее?..
Вот, смотри, я сделал тебе программу по условию (то есть без учета точек). В ней мне совершенно не потребовалось пользоваться четностью в изначальном смысле - я просто чередую слова.
var f:text; i,j,n,p:integer; a:array[1..500] of string; s,w1,w2:string; Letters: set of char;
begin Letters:=['A'..'Z']+['a'..'z']; assign(f,'o.txt'); reset(f);
{ считываем файл в массив } n:=0; while not(eof(f)) do begin Inc(n); readln(f,a[n]); WriteLn(a[n]) { отладочная печать } end; Close(f); assign(f,'o1.txt'); ReWrite(f); writeln('Всего ',n,' строк');
{ работаем с массивом строк } for j:=1 to n do begin i:=1; s:=''; while i<Length(a[j]) do begin { пропуск небуквенных символов и копирование их в новую строку } while (i<=Length(a[j])) and not (a[j,i] in Letters) do begin s:=s+a[j][i]; Inc(i) end; { запоминаем позицию } p:=i; { чтение первого слова } w1:=''; while (i<=Length(a[j])) and (a[j][i] in Letters) do begin w1:=w1+a[j][i]; Inc(i) end; { пропуск небуквенных символов и копирование их в новую строку } while (i<=Length(a[j])) and not (a[j][i] in Letters) do begin s:=s+a[j][i]; Inc(i) end; { чтение второго слова } w2:=''; while (i<=Length(a[j])) and (a[j][i] in Letters) do begin w2:=w2+a[j][i]; Inc(i) end; { обработка ситуации непарного слова в конце строки } if w2='' then begin w2:=w1; w1:='' end; { вставка второго слова в запомненную позицию } Insert(w2,s,p); { добавление первого слова } s:=s+w1 end; WriteLn(f,s); { запись выходного файла } WriteLn(s) { отладочная печать } end; close(f); end.
PS вставил комменты.. PPS еще добавил комментариев..
LyaLya
27.12.2008 4:33
условие и требования с методички , листинг проверил препод -сказал, что не нужно открывать и закрывать файл - сразу выводить на экран данные с файла, а потом, т.к. необходимо работать с массивом строк(возможно строки и будут содержать предложения), то циклы должны идти и по символам в строке, и по строкам. А еще, кажется, переменная s там лишняя... как переделать??? очень жду помощи
Lapp
27.12.2008 6:25
Цитата(LyaLya @ 27.12.2008 4:33)
как переделать??? очень жду помощи
А ты вообще смотришь, что тебе пишут?.. В моем коде все именно так и сделано. Из того, что ты неверно трактуешь условие, вовсе не следует, что другие делают так же. Вывод на экран вообще убери - про него в условии нету, он только для отладки. Переменная s в том виде, как я сделал - вряд ли лишняя. Но в принципе, можно и без нее - только в условии про это не сказано. Про массив - сказано, потому я с ним и сделал..
Только помогать тебе, когда ты больше половины пропускаешь мимо ушей, как-то желание пропадает..
LyaLya
27.12.2008 16:31
Lapp, я все прочитала, спасибки огромное, просто препод смотрел мой тот листинг, вот я к нему и пристала... а прога, которую вы мне написали меняет местами только слова в первой строчке...
Lapp
28.12.2008 5:54
Цитата(LyaLya @ 27.12.2008 16:31)
прога, которую вы мне написали меняет местами только слова в первой строчке...
Постарайся запомнить: если ты замечаешь в программе "неправильное функционирование" (взято в кавычки, потому что на этом этапе это только твое мнение), то прежде, чем делать выводы (типа "меняет слова только в первой строчке") либо разберись в вопросе сама, либо приведи фактический материал.
Вот, я тебе привожу результат ее работы:
файл o.txt :
Код
Humpty Dumpty sat on a wall. Humpty Dumpty had a great fall. All the king's horses and all the king's men Couldn't put Humpty together again.
файл o1.txt :
Код
Dumpty Humpty on sat wall a. Dumpty Humpty a had fall great. the All s'king and horses the all s'king men t'Couldn Humpty put again together.
Как видишь - слова меняются местами во всех четырех строках! Если тебя не затруднит и не отвлечет от более важных дел, не могла бы ты сделать так же со своим примером, в котором у тебя, как ты думаешь, ошибка..
Подозреваю, что ты сделала свою вторую строчку из цифр. А цифры не входят в множество букв.. хотя и похожи на них внешне . Если хочешь, чтоб входили - включи. Также можешь включить и апостроф ('), если хочешь, чтобы, например, "king's" считалось одним словом, а не двумя.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.