![]() |
|
#1
|
|||
|
|||
![]() Здравствуйте, нужна ваша помощь. Задание таково: у нас есть программа, которая считывает матрицу из файла и выводит её сумму в 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
|
|||
|
|||
![]() Попробовал сделать через 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
|
||||
|
||||
![]() Пример файла с матрицей - в студию!
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#4
|
|||
|
|||
![]() Мой вариант с stringlist'om не подходит, т.к одно из условий в задаче, запихнуть сначала матрицу в массив.
Вот привер матрицы Код:
8 9 5 4 6 1 2 3 4 5 7 8 5 0 4,5 |
#5
|
|||
|
|||
![]() Читай построчно. Если встретил запятую (последняя строка), то разбираешь ее отдельно.
Или писать сумму на отдельной строке. Тогда, если считалось много чисел (>1), то это строка матрицы. Если только одно - то сумма. |
#6
|
||||
|
||||
![]() Цитата:
Код:
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. |