Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ текстовые файлы

Автор: katafract 23.12.2006 2:05

Народ, у меня последняя зачётная неделя, а я никак не могу решить вот эту задачу:

Даны два текстовых файла F u G. Определить, совпадают ли компоненты этих файлов. Если нет, то получить номер первого несовпадающего компонента. В случае, когда один из файлов имеет n компонентов(n=>0) и повторяет начало другого более длинного, то ответом должно быть n+1.
Пример:

File1.txt File2.txt
Abcd abcdefg

В этом случае ответ 5, т.к. File2 длиннее File1.

File1.txt File2.txt
Abcd abgdtrfg

А здесь ответ 3…


Вообще-то она на вид лёгкая, но у меня после 2-ух недель практики за электрорадиоизмерительными приборами голова не работает… wacko.gif
А самая главная проблема в том, что я не могу понять с чего начать: с While(not EOF(file1)) While(not EOF(file2))… Помогите, пожалуйста!!!:(

Автор: мисс_граффити 23.12.2006 2:20

открыть файлы и все такое... потом:

 while not(EOF(file1)) and not(EOF(file2)) do

а еще я бы добавила флажок и выходила из этого цикла, как только встречу несовпадение.

Автор: katafract 24.12.2006 3:22

Цитата(мисс_граффити @ 22.12.2006 22:20) *

открыть файлы и все такое... потом:
 while not(EOF(file1)) and not(EOF(file2)) do

а еще я бы добавила флажок и выходила из этого цикла, как только встречу несовпадение.



А после "открыть файлы и всё такое..." поподробнее нельзя? unsure.gif

Автор: мисс_граффити 24.12.2006 4:04

считывать компонент из первого, считывать из второго.
переменная-счетчик изменяется на 1.
сравнивать.
если равны - цикл продолжается....
если нет - пользуешься переменной-флажком, о которой я говорила.
после выхода из цикла смотришь, почему вышел: если кончились оба файла и переменная осталась истиной, значит, все совпало. если нет - выводишь значение переменной-счетчика.

полностью код писать не буду.
пробуй сам. не получится - спрашивай.

Автор: katafract 26.12.2006 2:41

Цитата(мисс_граффити @ 24.12.2006 0:04) *

...

Спасибо good.gif

Автор: katafract 26.12.2006 4:38

Вот так вот подойдёт?

Program Lab;
Uses crt;
Var
F,G:text;
K,i,j:integer;
st1,st2:string;
BEGIN
Assign(F,’C:\f1.txt’);
Reset(F);
Assign(G,’C:\g1.txt’);
Reset(G);
K:=1;

While (not EOF(F)) and (not EOF(G)) do begin
Readln(f,st1);
Readln(g,st2);

For j:=1 to length(st2) do begin
If st1[i] = st2[j] then begin
K:=k+1
i:=i+1
end;
Else
Writeln(‘Позиция первого несовпадающего элемента равна’, k);
End;
End;
Close(f);
Close(g);
END.



Немного не так, как ты посоветовала, но это всё, до чего я додумался... rolleyes.gif

М
теги...
мисс_граффити


Автор: мисс_граффити 26.12.2006 5:04

я бы все же задала начальное значение i
и еще... представь, у тебя много элементов не совпадает. что получится? вставь, что ли, break какой-нибудь после

Writeln(‘Позиция первого несовпадающего элемента равна’, k);

Автор: katafract 27.12.2006 0:04

Вот так вот?

Program Lab_2;
Uses crt;
Var
F,G:text;
K,i,j:integer;
St1,st2:string;
Pr:Boolean;

BEGIN
Assign(F,’C:\f1.txt’);
Reset(F);
Assign(G,’C:\g1.txt’);
Reset(G);
K:=1;
Pr:=true;

While (not EOF(F)) and (not EOF(G)) do begin
Readln(f,st1);
Readln(g,st2);

For j:=1 to length(st2) do begin
If st1[i] = st2[j] then
begin
K:=k+1;
i:=i+1;
Pr:=true;
end;
Else
begin
Pr:=false:
Writeln(‘Позиция первого несовпадающего элемента равна’, k);
End;
End;
If pr then writeln(‘Элементы файла равны, но т.к. меньший файл имеет’,k-1,’элементов, то номер первого несовпадающего элемента будет’,k);
End;
Close(f);
Close(g);
END.

Автор: мисс_граффити 27.12.2006 0:07

теги!!!!

Автор: katafract 27.12.2006 2:54

блин, я же говорю, что не понимаю... я этот Паскаль только третий месяц учу...

Автор: мисс_граффити 27.12.2006 2:58

да при чем здесь паскаль?
видишь, как в моих сообщениях код рамочкой обводится?
у тебя так же должно быть.
вместо [cоlor=...] надо писать [ code = pas] [ / code] (без пробелов).

For j:=1 to length(st2) do begin
If st1[i] = st2[j] then
begin
K:=k+1;
i:=i+1;
Pr:=true;
end;

не боишься, что st1 закончится раньше, чем st2?

Автор: katafract 28.12.2006 3:05

вот об этом я тоже думал...Не поможешь? smile.gif

Автор: мисс_граффити 28.12.2006 15:35

пока не отредактируешь свое сообщение - нет.

Автор: katafract 30.12.2006 3:01

Отредактировал...Мне тут ещё преподаватель подсказал, что надо команду Break поставить после

Writeln(‘Позиция первого несовпадающего элемента равна’, k)
для выхода из цикла, чтобы просматривать не все элементы, а только до первого несовпадающего...это как?

Автор: мисс_граффити 30.12.2006 3:42

слушай, а ты читаешь, что я тебе пишу?
сообщение #7 в частности...

Автор: katafract 30.12.2006 4:37

Цитата(мисс_граффити @ 29.12.2006 23:42) *

слушай, а ты читаешь, что я тебе пишу?
сообщение #7 в частности...

Ой, извини...просто в то время до меня просто не дошло что это означает, а когда узнал о "Break" у меня просто из головы вылетело про сообщение номер 7... mega_chok.gif

Автор: katafract 9.01.2007 3:29

Мисс Граффити
Ну где же ты? cray.gif

Автор: Archon 9.01.2007 4:10

Цитата
Мисс Граффити
Ну где же ты?
В смысле ты ещё не понимаешь "это как" или чего другое? Если первое - ответ: буквально. После указанной строчки ставь команду
...
Break;
...
она прерывает выполнение цикла.