Версия для печати темы
Форум «Всё о Паскале» _ Задачи _ неполучается сравнить с фаилов
Автор: maksimla 19.04.2008 21:44
в двух филах указано сперва цифра указывает скоко фамилии в файле а потом идут фамилии
по алфавиту сравниваем два списка где есть фамилия в двух файлах записываем в третий
Код
program Bevarde1;
var
a,b,c,d: integer;
g,h,l:string;
prad,pr,rezult: text;
begin
assign (prad, 'matematika.txt');
assign (pr, 'informatika.txt');
assign(rezult,'rezultatai.txt');
reset (prad);
reset(pr);
rewrite (rezult);
readln (prad, a);
readln(pr,b);
for c:= 1 to a do
for d:=1 to b do
begin
readln(prad,g);
readln(pr,h);
if g=h then begin l:=h; writeln (rezult, l); end; end;
close (prad);
close(pr);
close (rezult)
end.
плохо сравнивает фамилии те фамилии которые идут по порядку ана записывает а те которые непорядку пропускает
Автор: andriano 20.04.2008 9:11
1. Для того, чтобы (хотя бы самому) легко ориентироваться в коде, этот код нужно форматировать.
2. Зачем здесь вложенный цикл?
Я не придираюсь, я задаю наводящий вопрос. Если ты сам сможешь сформулировать ответ на этот вопрос, то сам же и поймешь в чем ошибка.
Автор: maksimla 20.04.2008 9:57
1. я эту программку вчера 3 часа форматировал.
2. чтобы одну фамилию со всеми фамилиями в списке проверять
я хотел без массива сделать а вот что с массивом получилось все правильна
Код
program Bevarde1;
var
a,b,c,d: integer;
g,h,l:string;
prad,pr,rezult: text;
e,f: array [1..100] of string;
begin
assign (prad, 'matematika.txt');
assign (pr, 'informatika.txt');
assign(rezult,'rezultatai.txt');
reset (prad);
reset(pr);
rewrite (rezult);
readln (prad, a);
readln(pr,b);
for c:= 1 to a do
begin
readln(prad,g);
e[c]:=g;
end;
for d:=1 to b do
begin
readln(pr,h);
f[d]:=h;
end;
for c:= 1 to a do
for d:=1 to b do
if e[c]=f[d] then begin l:=e[c]; writeln(rezult,l); end;
close (prad);
close(pr);
close (rezult)
end.
но надо без массива написать как
Автор: maksimla 20.04.2008 10:48
вот сделал но с ошибкой повторно не хочет писать h
Код
program Bevarde1;
var
a,b,c,d: integer;
g,h:string;
prad,pr,rezult: text;
begin
assign (prad, 'matematika.txt');
assign (pr, 'informatika.txt');
assign(rezult,'rezultatai.txt');
reset (prad);
reset(pr);
rewrite (rezult);
readln(prad, a);
readln(pr,b);
for c:= 1 to a do
begin
readln(prad,g);
for d:=1 to b do
begin
readln(pr,h);
writeln(h,' ',g);
end;
end;
readln;
close (prad);
close(pr);
close (rezult)
end.
почему так не хочет писать повторно
Автор: andriano 20.04.2008 13:38
Второй вариант я вно неоптимальный.
Насколько я понял, ты хочешь открыть файл, прочитать из него одну строку и сравнить со всеми сроками второго файла.
Это у тебя есть.
Но потом ты что-то хочешь проделать со второй строкой первого файла. Что именно?
Подозреваю, что снова сравнит со всеми строками второго файла. Для этого его надо закрыть и потом открыть с начала.
Только еще раз повторяю: этот способ далеко не оптимальный. Попытайся придумать алгоритм, при котором чтение из файлов происходило бы по одному разу.
Подсказка: используй тот факт, что строки в файлах упорядочены по алфавиту.
Автор: maksimla 20.04.2008 15:28
я первую фамилию с первого файла сравниваю с фамилию из другова файла если фамилия обнаружина в двух файлах то записываю результат в третии файл и все можете мне исправить эту программу а то мне сегодня здовать
Автор: andriano 20.04.2008 16:06
Мне кажется, надо сначала ПОНЯТЬ, а только после этого СДАВАТЬ.
Попытайся для начала сделать то, что я тебе советовал в начале своего предыдущего сообщения, а потом - в конце.
Автор: maksimla 20.04.2008 17:47
вот сделал как сказал а по алфавиту не знаю можешь по подробнее обеснить и по какому алфавиту вот програмка правильная теперь но без алфавита
Код
program Bevarde1;
var
a,b,c,d: integer;
g,h:string;
prad,pr,rezult: text;
begin
assign (prad, 'matematika.txt');
assign (pr, 'informatika.txt');
assign(rezult,'rezultatai.txt');
reset (prad);
reset(pr);
rewrite (rezult);
readln(prad, a);
readln(pr,b);
for c:= 1 to a do
begin
readln(prad,g);
reset(pr);
readln(pr,a);
for d:=1 to b do
begin
readln(pr,h);
if g=h then writeln(rezult,g);
end;
end;
readln;
close (prad);
close(pr);
close (rezult)
end.
Автор: andriano 20.04.2008 18:52
Кстати, сколько раз ты открываешь файл pr и сколько раз его закрываешь?
Автор: maksimla 20.04.2008 19:52
1 заз открыл 1 раз и закрыл а reset(pr); это кажется перезапуск и его делаю столько раз скока равно а
а что чтото неправильно?
Автор: renesko1 20.04.2008 19:59
reset - это не перезапуск ,а открытие с последующей возможностью чтения данных.
Автор: andriano 20.04.2008 20:19
Цитата(maksimla @ 20.04.2008 20:52)
1 заз открыл 1 раз и закрыл а reset(pr); это кажется перезапуск и его делаю столько раз скока равно а
а что чтото неправильно?
Нет, открываешь ты его (а+1) раз, а вот закрываешь только один.
По поводу оптимального алгоритма - суть состоит в том, чтобы считывать из обоих файлов при совпадении и только из одного - из того, чья очередная строка раньше по алфавиту. Т.о. каждый файл ты проходишь только по одному разу.