Народ, у меня последняя зачётная неделя, а я никак не могу решить вот эту задачу:
Даны два текстовых файла 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-ух недель практики за электрорадиоизмерительными приборами голова не работает…
А самая главная проблема в том, что я не могу понять с чего начать: с While(not EOF(file1)) While(not EOF(file2))… Помогите, пожалуйста!!!:(
открыть файлы и все такое... потом:
while not(EOF(file1)) and not(EOF(file2)) do
while not(EOF(file1)) and not(EOF(file2)) do
считывать компонент из первого, считывать из второго.
переменная-счетчик изменяется на 1.
сравнивать.
если равны - цикл продолжается....
если нет - пользуешься переменной-флажком, о которой я говорила.
после выхода из цикла смотришь, почему вышел: если кончились оба файла и переменная осталась истиной, значит, все совпало. если нет - выводишь значение переменной-счетчика.
полностью код писать не буду.
пробуй сам. не получится - спрашивай.
Вот так вот подойдёт?
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.
М | теги... мисс_граффити |
я бы все же задала начальное значение i
и еще... представь, у тебя много элементов не совпадает. что получится? вставь, что ли, break какой-нибудь после
Writeln(‘Позиция первого несовпадающего элемента равна’, k);
Вот так вот?
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.
теги!!!!
блин, я же говорю, что не понимаю... я этот Паскаль только третий месяц учу...
да при чем здесь паскаль?
видишь, как в моих сообщениях код рамочкой обводится?
у тебя так же должно быть.
вместо [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;
вот об этом я тоже думал...Не поможешь?
пока не отредактируешь свое сообщение - нет.
Отредактировал...Мне тут ещё преподаватель подсказал, что надо команду Break поставить после
Writeln(‘Позиция первого несовпадающего элемента равна’, k)для выхода из цикла, чтобы просматривать не все элементы, а только до первого несовпадающего...это как?
слушай, а ты читаешь, что я тебе пишу?
сообщение #7 в частности...
Мисс Граффити
Ну где же ты?
...она прерывает выполнение цикла.
Break;
...