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.
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 -
--------------------
я - ветер, я северный холодный ветер я час расставанья, я год возвращенья домой