![]() |
|
|
#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. |