вот задание:
Заданы 3 матрицы действительных чисел 5х6, 10х8, 8х7. Определить сумму элементов в тех столбцах, которые не содержат отрицательных элементов. Сравнить результаты обработки матриц.
вот мой листинг:
Program pr7;
uses crt;
type matr=array [1..10,1..10] of integer;
ooo = object;
n,m:byte;
a:matr;
procedure Vvod(n,m:byte);
procedure vivod;
function sum_m: integer;
end;
var x,y,z:ooo;
procedure ooo.vvod;
var i,j:byte;
begin
for i:=1 to n do
for J;=1 to m do
a[i,j]:=random(20);
end;
procedure ooo.vivod;
var i,j:byte;
begin
for i:=1 to n do
begin writeln;
for j:=1 to m do
write(a[i,j]:6:0);
end;
end;
function ooo.sum_m: integer;
var
i, j: byte;
Summ, ResSumm: integer;
IsNegative: boolean;
begin
ResSumm := 0;
for j := 1 to n do
begin
IsNegative := false;
Summ := 0;
i := 0;
while (i < m) or not IsNegative do
begin
if a[i,j] > 0 then
Summ := Summ + a[i,j]
else
IsNegative := true;
inc(i);
end;
if not IsNegative then
ResSumm := ResSumm + Summ;
end;
sum_m := ResSumm;
end;
begin
clrscr;
x.vvod(5,6);
y.vvod(10,8);
z.vvod(8,7);
x.vivod;
y.vivod;
z.vivod;
writeln;
writeln;
x.summ;
y.summ;
z.summ;
writeln(x.sum_m);
writeln(y.sum_m);
writeln(z.sum_m);
readln;
end.
Точку с запятой убери после object Он разве тебе не пишет, что хочет увидеть идентификаторы, а не ";" ?
(дальше не смотрела)
теперь 4 ошибка после
а вызываешь как ooo.vvod(5,6)? на так нужно ж указать программе, что у процедуры есть параметры.. В выложенном здесь коде у тебя это было..
Из замеченного далее:
есть проблема с выводом (тут тоже нужно указывать значения m и n) и с sum_m.. Указывать второй раз ее тип не нужно, опять же значение m и n откуда программе брать? и обрати внимание на i и j, точнее на то, какие они принимают значения и существуют ли элементы массивов с такими номерами..
Добавлено через 1 мин.
Да.. сумма должна считаться отдельно по каждому столбцу, неимеющему отрицательных, или на всю матрицу?
ему не нра вар почему-то...
И еще:
0. в цикле while нужно не or а and и (j <= m)
1. у тебя значения элементов массива всегда будут >=0..
Ошибка 4 - duplicate identifier (сорри, не то скопировала, теперь исправила) - дублированны\двойной идентификатор.. [telepathy_on] проверь, не описала ли ты переменные i и j где-нибудь вне процедуры.. [telepathy_off]
procedure ooo.vvod;
var i,j:byte;
Турбо как раз и требует, чтобы не было повторений в именах параметров... А вот FPC компилирует нормально...
NiMfetKa, скажи, чем компилируешь!
Добавлено через 5 мин.
и что должно долучиться ?
Хотя в моде FP - не пропускает. Причем, раньше
TURBO PASCAL 7.1
Тоже проверила, fpc все равно, tp7.0 ругается..
А я решила проблему изгнанием n и m из членов объекта и принятием в ряды параметров процедур\функций
В общем, у меня получились такие бредни (оставляю возможность не смотреть)))
а где третий массив? и надо искать сумму строк...
а что с третим массивом? за основу брала твой вариант.. там было только три вывода.. да и спрашивала я тебя уже, что именно надо делать..
к тому же:
пост #1
третий массивчик надо как-то вместить на экране, но как? и сумму все же столбцов
по-моему никак) во всяком случае я выхода не знаю..
сейчас пересмотрела, у меня действительно сумма строк, сама переделаешь можешь на подсчет того, что тебе надо?
спаси меня, Айра, умоляю
Странно как-то.. написала такой большой код, а сейчас не можешь поменять местами i\j и n\m ?
Ну ладно.. вот:
function ooo.sum_m;
var
i, j: byte;
Summ, ResSumm: integer;
IsNegative: boolean;
begin
ResSumm := 0;
for j := 1 to m do
begin
IsNegative := false;
Summ := 0;
i := 1;
while (i <= n) and not IsNegative do
begin
if a[i,j] > 0 then
Summ := Summ + a[i,j]
else
IsNegative := true;
inc(i);
end;
if not IsNegative then
ResSumm := ResSumm + Summ;
end;
sum_m := ResSumm;
end;
в функции надо поменять i с j местами и дописать вывод суммы столбцов, да? но тогда в основной проге тоже надо переделывать...
NiMfetKa, ну я же у тебя несколько раз спрашивала: "выводить сумму надо каждого столбца отдельно или всех столбцов матрицы?" (естественно, удовлетворяющих условию)
четкого требования нет, но, наверное, удобнее для просмотра будет же сумма кождого столбца...
тогда вот это: функция подсчета мутирует в процедуру и выводит суммы по мере вычисления.. (ну и еще кое-какие изменения есть)
Program pr7;
uses crt;
type matr=array [1..10,1..10] of integer;
ooo = object
m,n: byte;
a:matr;
procedure Vvod(size_n,size_m: byte); //исправила
procedure vivod;
procedure sum_m;
end;
var x,y,z:ooo;
procedure ooo.vvod;
var i,j:byte;
begin
n:=size_n;
m:=size_m;
for i:=1 to n do
for J:=1 to m do
a[i,j]:=random(20)-5;
end;
procedure ooo.vivod;
var i,j:byte;
begin
for i:=1 to n do
begin writeln;
for j:=1 to m do
write(a[i,j]:6);
end;
writeln;
end;
procedure ooo.sum_m;
var
i, j: byte;
Summ: integer;
IsNegative: boolean;
begin
for j := 1 to m do
begin
IsNegative := false;
Summ := 0;
i := 1;
while (i <= n) and not IsNegative do
begin
if a[i,j] > 0 then
Summ := Summ + a[i,j]
else
IsNegative := true;
inc(i);
end;
if not IsNegative then write(Summ:6);
end;
writeln;
end;
begin
clrscr;
randomize;
x.vvod(5,6);
y.vvod(10,8);
z.vvod(8,7);
x.vivod;
y.vivod;
z.vivod;
x.sum_m;
y.sum_m;
z.sum_m;
readln;
end.
пасибки, Айра, огромное))
Добавлено через 3 мин.
но вот результаты с random(20)-5
Айра, ты зачем поменяла местами m и n?
procedure Vvod(size_m,size_n: byte);
if a[i,j] > 0 thenнужно
if a[i,j] >= 0 then
Хм, как переделать процедуру ooo.sum_m в функцию определения отрицательных элементов и процедуру определения суммы. Хелп ми
to NiMfetKa, и можно вообще увидеть конкретные требования по заданию и программе? а то твои просьбы постоянно мутируют, и постоянно что-то переделывать желания не возникает...
да, Lapp, в в функцию определения наличия отрицательных элементов и в процедуру определения суммы столбцов.
Айра, все требования и их изменения зависят только от переменчевого настроения преподавателя.
там же функция должна передавать параметр j и быть логического типа, да? а процедуда должна определять суммы только в том случае, когда not IsNegative?
ХМ, нет, не вложенный... процедурка же должна знать сумму какого столбца ей определять...
procedure sum_m;
function IsNegative({передаешь номер текущего столбца}): boolean;
begin
{здесь идет проверка конкретного столбца наличие отрицательных элементов.
если они есть, то функция принимает значение true, если нет - false
}
end;
begin
for j:=1 to m do
if not IsNegative(j) then
{считаешь и выводишь сумму}
end;
{это краткий набросок}
а не вложенной можно сделать?
И не вложенной можно. Принцип вызова остается тот же, просто описываешь ее вне процедуры по всем правилам..