Задача.
Пусть матрица А целых чисел размером 100*100 записана по строкам в файле. Определите, является ди она единичной.
Мне не понятно как запихнуть матрицу в типизированный файл и, самое главное, как потом проверить условие....
Помогите, пожалуйста...
var f: file of integer
type vector = array[1 .. 100] of integer;? Оба - типизированные... Выбирай.
var f: file of vector;
Ну пусть integer...
матрица получается выглядит в файле как строка??
Ввели..... а как эту самую пресловутую диагональ выделить???
А тебе надо не только диагональ выделять... Надо всю таблицу проверять:
...
{ открываешь файл }
ok := true;
i := 1;
while not eof(f) do begin
read(f, X);
if pred(i) mod (n + 1) = 0 then ok := ok and (X <> 0)
else ok := ok and (X <> 1);
if not ok then break;
inc(i)
end;
if ok then writeln('yes')
else writeln('no');
{ закрываешь файл }
...
А можно ещё вопрос....
как мне осуществить ввод...
while not eof(f) do begin
read(f, X);
if pred(i) mod (n + 1) = 0 then ok := ok and (X <> 0)
else ok := ok and (X <> 1);
if not ok then break;
inc(i)
end;
while not eof(f) do begin
read(f, X);
if pred(i) mod (n + 1) = 0 then { Diagonal element }
ok := X = 1
else
ok := X = 0;
if not ok then break;
inc(i)
end;
Хорошо, например все элементы матрицы равны 2.
Тогда ok := ok and (X <> 0) == ok and (2 <> 0) = ok and TRUE = ok
и
ok := ok and (X <> 1) == ok and (2 <> 1) = ok and TRUE = ok
Так как до while ok=TRUE, то в данном случае после while также будет ok=TRUE
и далее writeln('yes'), что совершенно неверно, так как матрица явно не единичная.
Вот, что получилось у меня:
program My_TEST2; { Проверка единичной матрицы 100x100. }
const
N = 100;
var
F : File of Integer;
I, J, K : Integer;
label
LabelMatrixIsNotE, LabelCloseFile;
begin
if ParamCount <> 1 then
begin
Write('Необходимо имя файла!');
Exit
end;
Assign(F,ParamStr(1));
Reset(F);
for I := 1 to N do
for J := 1 to N do
begin
Read(F,K);
if (Ord(I<>J) + K) <> 1 then
goto LabelMatrixIsNotE
end;
Write('Матрица единичная.');
goto LabelCloseFile;
LabelMatrixIsNotE:
Write('Матрица НЕ единичная!');
LabelCloseFile:
Close(F)
end.
(*
const
n = 10;
arr: array[1 .. n * n] of integer = (
1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 1
);
*)
var
i, X: integer;
ok: boolean;
f: file of integer;
begin
assign(f, 'test.dat');
reset(f);
ok := true;
i := 1;
while not eof(f) do begin
read(f, X);
if pred(i) mod (n + 1) = 0 then ok := ok and (X = 1)
else ok := ok and (X = 0);
if not ok then break;
inc(i)
end;
if ok then writeln('yes')
else writeln('no');
close(f);
end.
while (not eof(f)) and ok do begin ...
volvo, так бы сразу и написали
ok := true;
i := 0;
while (not eof(f)) and ok do begin
read(f, X);
if i mod (n + 1) = 0 then
ok := X = 1
else
ok := X = 0;
inc(i)
end;
OK := TRUE;
I := 0;
while (not Eof(F)) and OK do
begin
Read(F, X);
OK := (Ord(I mod (N + 1) <> 0) + X) = 1;
Inc(I)
end;
volvo, извините, но мне кажется, что (Ord(I<>J) + K) <> 1 быстрее чем i mod (n + 1) = 0 + if.
Деление - последний оставшийся тормоз АЛУ.
слепил тест
Интересно, правда компилятор TP, для единичной матрицы лучше вариант с MOD(от volvo),
для не единичной с (Ord(I<>J) + K) <> 1).
Наверно правильнее проверять на Delphi...
if также может быть преобразован в CMOV...
-----------------------------------------------------------
Хмм, для TP почти нет никакой разницы.
Прикрепленные файлы
RDTSC.rar ( 26.76 килобайт )
Кол-во скачиваний: 224
Тьфу, чёрт!
Если посмотреть в отладчике(Turbo Debugger), то можно увидеть, что
при трансляции Ord(I<>J) компилятор TP использует команды условных переходов,
то есть он фактически Ord превращает в IF.
Один вопрос, volvo. Ещё неделю назад хотел спросить.