1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
хм, вот задачка, найдите, плиз ошибку, я ее мучаю уже несколько недель
Требование: В программе описать массив строк. Исходный текст считать из файла, созданного в любом текстовом редакторе. Результат обработки вывести на экран, а так же в итоговый текстовый файл.
Задание: Определить количество слов, поменять местами четные и нечетные слова.
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.
тоесть при копирование их текстового файла будет копиротся строка целиком; а в этом цикле
while not eoln(ff) do <<а в этом цикле у тебя стоит eoln (тоесть пока не конец стоки) нада eof(пока не конец файла) begin j:=j+1; readln(ff,f[j]);writeln(f[j]); end;
Соблюдай разумный формат, иначе ни ты сама, ни кто либо еще не сможет разобраться в твоем творении. Я (с некоторым трудом) отформатировал - посмотри и постарайся делать в том же духе.
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 - вообще непонятно, зачем. Имеет смысл сохранять прежние результаты для простоты отладки. Если программа отлажена и в эксплуатации, то стирать пользователю экран вообще может оказаться медвежьей услугой. Надо будет - сам сотрет.
--------------------
я - ветер, я северный холодный ветер я час расставанья, я год возвращенья домой
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
но мне сказали, что проверку четности мона сделать с помощью 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 еще добавил комментариев..
Сообщение отредактировано: Lapp -
--------------------
я - ветер, я северный холодный ветер я час расставанья, я год возвращенья домой
условие и требования с методички , листинг проверил препод -сказал, что не нужно открывать и закрывать файл - сразу выводить на экран данные с файла, а потом, т.к. необходимо работать с массивом строк(возможно строки и будут содержать предложения), то циклы должны идти и по символам в строке, и по строкам. А еще, кажется, переменная s там лишняя... как переделать??? очень жду помощи
А ты вообще смотришь, что тебе пишут?.. В моем коде все именно так и сделано. Из того, что ты неверно трактуешь условие, вовсе не следует, что другие делают так же. Вывод на экран вообще убери - про него в условии нету, он только для отладки. Переменная s в том виде, как я сделал - вряд ли лишняя. Но в принципе, можно и без нее - только в условии про это не сказано. Про массив - сказано, потому я с ним и сделал..
Только помогать тебе, когда ты больше половины пропускаешь мимо ушей, как-то желание пропадает..
--------------------
я - ветер, я северный холодный ветер я час расставанья, я год возвращенья домой
Lapp, я все прочитала, спасибки огромное, просто препод смотрел мой тот листинг, вот я к нему и пристала... а прога, которую вы мне написали меняет местами только слова в первой строчке...
прога, которую вы мне написали меняет местами только слова в первой строчке...
Постарайся запомнить: если ты замечаешь в программе "неправильное функционирование" (взято в кавычки, потому что на этом этапе это только твое мнение), то прежде, чем делать выводы (типа "меняет слова только в первой строчке") либо разберись в вопросе сама, либо приведи фактический материал.
Вот, я тебе привожу результат ее работы:
файл 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" считалось одним словом, а не двумя.
--------------------
я - ветер, я северный холодный ветер я час расставанья, я год возвращенья домой