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

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

Форум «Всё о Паскале» _ Задачи _ неполучается сравнить с фаилов

Автор: maksimla 20.04.2008 1: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 13:11

1. Для того, чтобы (хотя бы самому) легко ориентироваться в коде, этот код нужно форматировать.

2. Зачем здесь вложенный цикл?
Я не придираюсь, я задаю наводящий вопрос. Если ты сам сможешь сформулировать ответ на этот вопрос, то сам же и поймешь в чем ошибка.

Автор: maksimla 20.04.2008 13: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 14: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 17:38

Второй вариант я вно неоптимальный.
Насколько я понял, ты хочешь открыть файл, прочитать из него одну строку и сравнить со всеми сроками второго файла.
Это у тебя есть.
Но потом ты что-то хочешь проделать со второй строкой первого файла. Что именно?
Подозреваю, что снова сравнит со всеми строками второго файла. Для этого его надо закрыть и потом открыть с начала.

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

Автор: maksimla 20.04.2008 19:28

я первую фамилию с первого файла сравниваю с фамилию из другова файла если фамилия обнаружина в двух файлах то записываю результат в третии файл и все можете мне исправить эту программу а то мне сегодня здовать

Автор: andriano 20.04.2008 20:06

Мне кажется, надо сначала ПОНЯТЬ, а только после этого СДАВАТЬ.
Попытайся для начала сделать то, что я тебе советовал в начале своего предыдущего сообщения, а потом - в конце.

Автор: maksimla 20.04.2008 21: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 22:52

Кстати, сколько раз ты открываешь файл pr и сколько раз его закрываешь?

Автор: maksimla 20.04.2008 23:52

1 заз открыл 1 раз и закрыл а reset(pr); это кажется перезапуск и его делаю столько раз скока равно а
а что чтото неправильно?

Автор: renesko1 20.04.2008 23:59

reset - это не перезапуск ,а открытие с последующей возможностью чтения данных.

Автор: andriano 21.04.2008 0:19

Цитата(maksimla @ 20.04.2008 20:52) *

1 заз открыл 1 раз и закрыл а reset(pr); это кажется перезапуск и его делаю столько раз скока равно а
а что чтото неправильно?

Нет, открываешь ты его (а+1) раз, а вот закрываешь только один.

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