Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.04.2015, 02:32
weess weess вне форума
Прохожий
 
Регистрация: 04.03.2015
Сообщения: 5
Версия Delphi: borland 2006
Репутация: 10
По умолчанию Работа с файлом

Здравствуйте, нужна ваша помощь. Задание таково: у нас есть программа, которая считывает матрицу из файла и выводит её сумму в memo в виде строки "Сумма элементов матрицы=....". Нужно сделать так, чтобы по нажатию кнопки сохранить, программа сохраняла эту строку с суммой эл в файл , где лежала матрица(т.е теперь у нас файл с матрицей и с этой строкой). Теперь,если мы вызываем этот же файл, программа должна сверить сумму эл матрица в файле с суммой в этой строке, которая лежит в файле, и если сумма совпадает написать " файл обработан", если матрица была изменена, то он опять сверяет сумму со строкой(сумма получается уже другая) и должен снова посчитать сумму матрица и вывести её в мемо.
Вот код по подсчету суммы эл матрицы.
Код:
unit UnProt;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TFMain = class(TForm)
    BTInput: TButton;
    BTexit: TButton;
    Memo1: TMemo;
    OD1: TOpenDialog;
    Label1: TLabel;
    Label2: TLabel;
    procedure BTexitClick(Sender: TObject);
    procedure BTInputClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;



type TMatrix = Array of Array of real;
var
  FMain: TFMain;

implementation

{$R *.dfm}

procedure TFMain.BTexitClick(Sender: TObject);
begin
 if (messagedlg('Вы действительно хотите выйти?',mtconfirmation,[mbYes,mbNo],0)=mryes) then
close;
end;

procedure TFMain.BTInputClick(Sender: TObject);
var M: TMatrix;
    summ:real;
    F: TextFile;
    c: Char;
    i, j: Integer;
    s:string;
begin
if od1.Execute  then

  AssignFile(F,od1.filename);
  Reset(F);
  j := 0;
  i := 0;
  summ:=0;
  // читаем пока не конец файла
  while not Eof(F) do
    begin
      j := 0;
      // читаем пока не встретится перенос строки
      while not Eoln(F) do
        begin
          SetLength(M, i + 1);      // увеличиваем размер строк у матрицы на +1
          SetLength(M[i], j + 1);   // увеличиваем размер столбцов для первой строки
          Read(F, M[i, j]);         // считываем данные
          j := j + 1;               // счетчик столбцов
        end;
      Read(F, c);                   // заглушка, чтобы передвигаться по файлу
      i := i + 1;                   // счетчик строк
    end;
    memo1.visible:=true;

  // вывод результата
  for i := 0 to Length(M) - 1 do
    begin
      for j := 0 to Length(M[i]) - 1 do
        begin
         S := S + floatToStr(M[i, j]) + '  ';
         summ:=summ+M[i, j];
        end;
        S := S + #13#10;
end;
 memo1.Lines.Add(s);
 memo1.Lines.Add(('Сумма элементов матрицы='+floattostr(summ)));
end;

end.
Ответить с цитированием
  #2  
Старый 26.04.2015, 14:39
weess weess вне форума
Прохожий
 
Регистрация: 04.03.2015
Сообщения: 5
Версия Delphi: borland 2006
Репутация: 10
По умолчанию

Попробовал сделать через Tstringlist, но не понимаю как действовать дальше.
Код:
var st1,st2:TStringList; i,j,sum,sum2:integer;
begin
if od1.execute  then

  st1:=TStringList.Create; st2:=TStringList.Create;
  st1.LoadFromFile(od1.filename);
  sum:=StrToIntDef(st1.Values['summa'],0);
  sum2:=0;
  for i:=0 to st1.Count-1 do begin
    if copy(st1[i],1,5)<>'summa' then begin
     st2.DelimitedText:=st1[i];
     for j:=0 to st2.Count-1 do
      sum2:=sum2+StrToIntDef(st2[j],0);
    end;
  end;
  if sum2<>sum then begin
   st1.Values['summa']:=IntToStr(sum2);
   st1.SaveToFile(od1.filename);
  end;
  st1.Free; st2.Free;
end;
Ответить с цитированием
  #3  
Старый 27.04.2015, 16:57
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Пример файла с матрицей - в студию!
Ответить с цитированием
  #4  
Старый 27.04.2015, 19:34
weess weess вне форума
Прохожий
 
Регистрация: 04.03.2015
Сообщения: 5
Версия Delphi: borland 2006
Репутация: 10
По умолчанию

Мой вариант с stringlist'om не подходит, т.к одно из условий в задаче, запихнуть сначала матрицу в массив.
Вот привер матрицы
Код:
8 9 5 4 6
1 2 3 4 5
7 8 5 0 4,5
Ответить с цитированием
  #5  
Старый 27.04.2015, 22:32
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Читай построчно. Если встретил запятую (последняя строка), то разбираешь ее отдельно.
Или писать сумму на отдельной строке. Тогда, если считалось много чисел (>1), то это строка матрицы. Если только одно - то сумма.
Ответить с цитированием
  #6  
Старый 28.04.2015, 02:06
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от lmikle
Читай построчно. Если встретил запятую (последняя строка), то разбираешь ее отдельно...
Вот что-то похожее
Код:
uses Math;
procedure TFMain.BTInputClick(Sender: TObject);
var
 M: array of array of integer;
 f, f1: TextFile;
 i, j, b, OldSum, AllSum: integer;
 s: string;
begin
 if od1.Execute  then
  begin
   Memo1.Clear;
   AssignFile(f, od1.filename);

   Reset(f);
   i:= 0;
   AllSum:= 0;
   OldSum:= 0;

   while not Eof(f) do
    begin
     ReadLn(f, s);
     SetLength(M, i+1);
     b:= Pos(',', s);

     if b > 0 then
      begin
       OldSum:= StrToInt(Copy(s, b+1, Length(s)));
       Delete(s, b, Length(s));
      end;

     b:= 0;

     for j := 1 to Length(s)-1 do
      if (s[j] in  ['0'..'9']) then
       begin
        SetLength(M[i], b+1);
        M[i, b]:= StrToInt(s[j]);
        Inc(b);
       end;

     Inc(AllSum, SumInt(m[i]));
     Inc(i);
    end;{while}

  if OldSum = AllSum then
   Memo1.Lines.Add('файл обработан')
   else
    begin
     Reset(f);
     AssignFile(f1,'tmp');
     Rewrite(f1);

     while not Eof(f) do
      begin
       ReadLn(f, s);
       b:= Pos(',', s);

       if b > 0 then
        begin
         Delete(s, b, Length(s));
         s:= s + ',' + IntToStr(AllSum);
        end;

      Writeln(f1, s);
     end;{while}

      CloseFile(f);
      CloseFile(f1);

      if DeleteFile(od1.filename) then
         RenameFile('tmp', od1.filename);

      Memo1.Lines.Add(('Сумма элементов матрицы=' + IntToStr(AllSum)));
   end;
 end; {od1.Execute}

end;
без оптимизации, вот как шёл набор, так и есть

З.Ы. можно ещё второго валю завалить, извнт за тавтологию, в смысле убрать лишний цикл уаил, совместив операции чтения\записи в первом, но так осталось для наглядности

Последний раз редактировалось Alegun, 28.04.2015 в 20:05.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:49.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025