Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Сравнение файлов. (http://forum.oszone.net/showthread.php?t=169946)

Snake750 12-03-2010 18:47 1367181

Сравнение файлов.
 
Вложений: 1
Доброго времени суток.Подскажите пожалуйста как реализовать вот такую штуку:
Имеются 2 файла в которых содержится вот такая информация (на фото )
http://forum.oszone.net/attachment.p...1&d=1268408564

Цитата:

Программа должна сравнивать эти 2 фаила а именно:в обоих файлах есть 4 числа:x, y, r, q.Сначала нужно сравнить х и у и если они равны то проверить равность q и r. Смысл в том что если эти числа не равны то программа должна вывести комбинацию (x,y,r,q).
У меня встала загвозка при считывании значении с файла.Как считать со строки сразу 4 значение?
Приведу пример
Цитата:

50(пробел) 1 (пробел) 50 (пробел)0
Необходимо считать числа этой строки в переменные x,y,r,q;
И так проделать для всех строк.Я знаю как считать до пробела а вот как после него считать не знаю.

Serega 13-03-2010 00:37 1367425

Вложений: 1
Snake750, не совсем понятно, что конкретно вам надо.
Обрабатывать текстовый файл можно как угодно, читать его построчно, прочитать весь файл как одну строку, прочитать файл в массив символов, как массив байт...
Как бы привести скриншоты, это хорошо, но что дальше? Ну сравнили файлы, записать результат сравнения в третий файл? Вывести на экран сообщение? или что-то ещё...
Вот, накидал вам простой пример обработки текстового файла с последующим заполнением его в ListView.

Snake750 13-03-2010 01:41 1367446

Serega,Имеется программа1 в которую я ввожу исходные данные (х и у) и получаю результат (r и q.)
Эта программа записывает эти значения в файл1 вот в таком ввиде
Код:

x(пробел) y(пробел) r(пробел) q(пробел)
Для лучшего понимания предоставлю таблицу наборов тестов
Код:

Входные данные                        Результат
(x,y)                                  (r,q)
0,1                                      0,0
0,9999999                                0,0
9999999,1                                9999999,1
0,50                                    0,0
50,1                                    50,0
0,0                                      error
1,99999991                              error

При данном наборе тестов в файл1 будет записано:


Код:

0 1 0.0000000000000000E+0000 0.0000000000000000E+0000
0 9999999  0.0000000000000000E+0000 0.0000000000000000E+0000
9999999 1 9.9999900000000E+0007 0.0000000000000000E+0000   
0 50 0.0000000000000000E+0000 0.0000000000000000E+0000
50 1 5.0000000000E+0001 0.0000000000000000E+0000
0 0 error
1 99999991 error

Слово "error" означает что введен некорректный набор тестов(например при наборе 0,0 в программе происходит деление на 0) по этому результатом работы программы на таком наборе х,у будет слово "error"
Программа расчитана на работу с числами и если ввести вместо х или у какой-либо символ(пусть будет "А") то программа запишет в файл такую комбинацию:
Код:

1 A error
Во второй файл я записываю тоже самое но не через программу а вручную.
Код:

0 1 00
0 9999999 0 0
9999999 1 9999999 1
0 50 0 0
50 1 50 0
0 0 error
1 99999991 error

А потом программа должна сравить х1 и x2 и у1 и у2(где,x1-значение x1 из файла1, x2-значение x2 из файла2 и т.д) .
Если они равны то:
Если Е(епсилан вводится с клавиатуры)<=|r1-r2| (где,r1-значение r1 из файла1, r2-значение r2 из файла2) тогда
Если Е(епсилан вводится с клавиатуры)<=|q1-q2| (где,q1-значение q1 из файла1, q2-значение q2 из файла2) тогда к SC (количеству совпавших комбинация):=SC+1
иначе SC (количеству совпавших комбинация):=SC и вывести на экран комбинацию х у r q на которых произошло несовпадение
Если r и q не равны то вывести на экран количество не совпавших комбинация r и q
Приведу пример:
В файле1 содержится информация вида
Код:

0 1 0.0000000000000000E+0000 0.0000000000000000E+0000
0 9999999  0.0000000000000000E+0000 0.0000000000000000E+0000
9999999 1 9.9999900000000E+0007 0.0000000000000000E+0000   
0 50 0.0000000000000000E+0000 0.0000000000000000E+0000
50 1 5.0000000000E+0001 0.0000000000000000E+0000
0 0 error
1 99999991 error

В файле2 вида:
Код:

0 2 0 0
0 9999999 0 0
9999999 1 9999999 1
0 50 0 0
50 1 50 0
0 0 error
1 99999991 error

Программа сравнивает файл1 и файл2.
Код:

x1=0 y1=1 r1=0.0000000000000000E+0000 q1=0.0000000000000000E+0000
x2=0 y2=2 r1=0 q1=0

Так как y1 и у2 не равны программа выводит на экран комбинацию
Код:

0 2 0 0
И количество совпадений SC будет равно 6,так как всего наборов было 7 и один из них не совпал.
Я понятно объяснил что делает программа?

Serega 13-03-2010 22:11 1368010

Цитата:

Цитата Snake750
Я понятно объяснил что делает программа? »

Вполне, т.е. вы мне предлагаете написать за вас программу? Тогда вы не по адресу, вы спросили:
Цитата:

Цитата Snake750
Как считать со строки сразу 4 значение? »

Я вам привёл пример обработки текстового файла.
Как вариант, могу вам подсказать, сначала читайте целиком строку из первого файла, затем строку из второго файла, производите обработку строки из первого, затем обработку строки из второго файла. При сравнении используйте StrToInt, предварительно проверив, что ваше значение не слово error.

Snake750 13-03-2010 22:39 1368028

Serega, нет.Я не прошу сделать за меня все.Подскажите как считать 4 параметра со строки в массивы x[i],y[i],q[i],r[i] и все.Можно прямо тут кодом.Я расспасал как работает программа для того чтобы вам было понятнее для чего мне необходимо считать параметры

И лучще всего чтобы этот маленький кусочек кода был написан не конкретно под Делфи,а его можно было запустить на простом Паскале.(без привязки к компоненатам делфи а простыми процедурами обычного Паскаля)

Snake750 14-03-2010 22:43 1368683

Господа форумчане.Ни у что никто не знает как считать 4 параметра из строчки в массивы

Serega 15-03-2010 00:42 1368768

Цитата:

Цитата Snake750
Подскажите как считать 4 параметра со строки в массивы x[i],y[i],q[i],r[i] и все. »

Мне кажется лучше считать весь файл в матрицу, пример:
Код:

type
  TMatrixRow = array of Integer;
  TMatrix = array of TMatrixRow;

procedure FillingOfMatrix(const FileName: string; var Matrix: TMatrix);
var
  txt: TextFile;
  tmp: string;
  pos_simbol, row, col, value, e: Integer;
begin
  AssignFile(txt, FileName); Reset(txt);
  row:= 0;
  while not Eof(txt) do
    begin
      col:= 0;
      SetLength(Matrix, row+1, 4);
      Readln(txt, tmp); // читаем строку
      repeat
        while (tmp <> '') and (tmp[1] = ' ') do Delete(tmp, 1, 1); // удаляем пробелы в начале строки, если есть
        if tmp <> '' then // если строка не пустая, то
          begin
            pos_simbol:= Pos(' ', tmp); // определяем расположение пробела
            if pos_simbol = 0 then
              begin
                pos_simbol:= Length(tmp); // если пробелов не осталось, то берём всю длину строки
                Val(Copy(tmp, 1, pos_simbol), value, e);
              end
            else Val(Copy(tmp, 1, pos_simbol-1), value, e);
            Matrix[row, col]:= value; // задаём значение
            Delete(tmp, 1, pos_simbol); // удаляем до пробела
            Inc(col); // увеличиваем счётчик столбцов
          end;
      until tmp = '';
      Inc(row); // увеличиваем счётчик строк
    end;
  CloseFile(txt);
end;

P.S.
Единственное забыл добавить проверку на слово error.


Время: 13:12.

Время: 13:12.
© OSzone.net 2001-