Помощь - Поиск - Пользователи - Календарь
Полная версия: файл с массивом строк
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
LyaLya
хм, вот задачка, найдите, плиз ошибку, я ее мучаю уже несколько недель

Требование:
В программе описать массив строк. Исходный текст считать из файла, созданного в любом текстовом редакторе. Результат обработки вывести на экран, а так же в итоговый текстовый файл.

Задание:
Определить количество слов, поменять местами четные и нечетные слова.

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
ну хоть одно умное слово напишите, хоть одну фразочку по задачке, плиззззз
amega
Вопервых ты обявила масив
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 нигде не обявлена?

а дальше тежело разобратся что делает програма 1.gif
Lapp
Соблюдай разумный формат, иначе ни ты сама, ни кто либо еще не сможет разобраться в твоем творении. Я (с некоторым трудом) отформатировал - посмотри и постарайся делать в том же духе.
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
вот что-то переделала:
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
Цитата(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 ...

У меня другой вопрос. В условии задачи абсолютно ничего не говорится про предложения. Есть про строки, есть про слова - и ничего про предложения. Однако, в своей программе ты пытаешься обрабатывать точку отдельно от пробела. Почему? Это ты неправильно написала условие ( norespect.gif ), или это ты ошибаешься и делаешь что-то лишнее?..

Вот, смотри, я сделал тебе программу по условию (то есть без учета точек). В ней мне совершенно не потребовалось пользоваться четностью в изначальном смысле - я просто чередую слова.
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
условие и требования с методички dry.gif , листинг проверил препод blink.gif -сказал, что не нужно открывать и закрывать файл - сразу выводить на экран данные с файла, а потом, т.к. необходимо работать с массивом строк(возможно строки и будут содержать предложения), то циклы должны идти и по символам в строке, и по строкам. А еще, кажется, переменная s там лишняя... wacko.gif
как переделать??? mega_chok.gif очень жду помощи blush.gif
Lapp
Цитата(LyaLya @ 27.12.2008 4:33) *
как переделать??? mega_chok.gif очень жду помощи blush.gif
А ты вообще смотришь, что тебе пишут?.. blink.gif
В моем коде все именно так и сделано. Из того, что ты неверно трактуешь условие, вовсе не следует, что другие делают так же.
Вывод на экран вообще убери - про него в условии нету, он только для отладки. Переменная s в том виде, как я сделал - вряд ли лишняя. Но в принципе, можно и без нее - только в условии про это не сказано. Про массив - сказано, потому я с ним и сделал..

Только помогать тебе, когда ты больше половины пропускаешь мимо ушей, как-то желание пропадает.. dry.gif
LyaLya
Lapp, я все прочитала, спасибки огромное, просто препод смотрел мой тот листинг, вот я к нему и пристала... а прога, которую вы мне написали меняет местами только слова в первой строчке...
Lapp
Цитата(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.


Как видишь - слова меняются местами во всех четырех строках! Если тебя не затруднит и не отвлечет от более важных дел, не могла бы ты сделать так же со своим примером, в котором у тебя, как ты думаешь, ошибка..

Подозреваю, что ты сделала свою вторую строчку из цифр. А цифры не входят в множество букв.. хотя и похожи на них внешне smile.gif. Если хочешь, чтоб входили - включи. Также можешь включить и апостроф ('), если хочешь, чтобы, например, "king's" считалось одним словом, а не двумя.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.