вот задание: Заданы 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;
beginfor i:=1to n dofor J;=1to m do
a[i,j]:=random(20);
end;
procedure ooo.vivod;
var i,j:byte;
beginfor i:=1to n dobegin writeln;
for j:=1to 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 := 1to n dobegin
IsNegative := false;
Summ := 0;
i := 0;
while (i < m) ornot IsNegative dobeginif a[i,j] > 0then
Summ := Summ + a[i,j]
else
IsNegative := true;
inc(i);
end;
ifnot 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.
но почему-то после
Код
ooo = object;
выбивает 2 ошибку
Айра
9.01.2009 5:20
Точку с запятой убери после object Он разве тебе не пишет, что хочет увидеть идентификаторы, а не ";" ? (дальше не смотрела)
NiMfetKa
9.01.2009 5:51
теперь 4 ошибка после
Код
procedure ooo.vvod; var i,j:byte;
Lapp
9.01.2009 6:04
Цитата(NiMfetKa @ 9.01.2009 1:51)
теперь 4 ошибка после
Код
procedure ooo.vvod; var i,j:byte;
После объявления процедуры? Параметры вставь, как выше.
Ты лучше приводи сам текст ошибки тоже..
Айра
9.01.2009 6:06
а вызываешь как ooo.vvod(5,6)? на так нужно ж указать программе, что у процедуры есть параметры.. В выложенном здесь коде у тебя это было..
Из замеченного далее: есть проблема с выводом (тут тоже нужно указывать значения m и n) и с sum_m.. Указывать второй раз ее тип не нужно, опять же значение m и n откуда программе брать? и обрати внимание на i и j, точнее на то, какие они принимают значения и существуют ли элементы массивов с такими номерами..
Добавлено через 1 мин. Да.. сумма должна считаться отдельно по каждому столбцу, неимеющему отрицательных, или на всю матрицу?
NiMfetKa
9.01.2009 6:11
ему не нра вар почему-то...
Айра
9.01.2009 6:14
И еще: 0. в цикле while нужно не or а and и (j <= m) 1. у тебя значения элементов массива всегда будут >=0..
Цитата
ему не нра вар почему-то...
покажи описательную часть.. ты что-то изменила относительно варианта из 1го поста?
Добавлено через 4 мин.
Цитата
сумма должна считаться отдельно по каждому столбцу, неимеющему отрицательных, или на всю матрицу?
к чему я это.. если второй вариант, то отдельные вызовы функции sum_m можно убрать и оставить только writeln'ы..
Lapp
9.01.2009 6:24
Цитата(NiMfetKa @ 9.01.2009 2:11)
ему не нра вар почему-то...
Слушай, NiMfetKa, а какой у тя компилятор, если не секрет?
Айра
9.01.2009 6:26
Ошибка 4 - duplicate identifier (сорри, не то скопировала, теперь исправила) - дублированны\двойной идентификатор.. [telepathy_on] проверь, не описала ли ты переменные i и j где-нибудь вне процедуры.. [telepathy_off]
volvo
9.01.2009 6:27
Цитата
теперь 4 ошибка после
procedure ooo.vvod;
var i,j:byte;
Прав компилятор на все 100%... У тебя уже есть N, как член объекта, ты еще и как параметр метода хочешь использовать N? Нельзя. Давай другое имя либо параметру, либо члену класса...
Lapp
9.01.2009 6:32
Цитата(volvo @ 9.01.2009 2:27)
Прав компилятор на все 100%...
Ну, на 99%.. Turbo этого не требует.
volvo
9.01.2009 6:33
Турбо как раз и требует, чтобы не было повторений в именах параметров... А вот FPC компилирует нормально...
Lapp
9.01.2009 6:33
NiMfetKa, скажи, чем компилируешь!
Добавлено через 5 мин.
Цитата(volvo @ 9.01.2009 2:33)
Турбо как раз и требует, чтобы не было повторений в именах параметров... А вот FPC компилирует нормально...
Хм, да, забавно... А FP в моде TP - вроде, кушает..
NiMfetKa
9.01.2009 6:39
и что должно долучиться ?
Lapp
9.01.2009 6:40
Хотя в моде FP - не пропускает. Причем, раньше
NiMfetKa
9.01.2009 6:40
TURBO PASCAL 7.1
Lapp
9.01.2009 6:41
Цитата(NiMfetKa @ 9.01.2009 2:39)
и что должно долучиться ?
Хороший вопрос.. Думаю - прогресс!
Добавлено через 2 мин. Мне кажется, параметры у Vvod можно просто убрать...
Айра
9.01.2009 6:50
Тоже проверила, fpc все равно, tp7.0 ругается.. А я решила проблему изгнанием n и m из членов объекта и принятием в ряды параметров процедур\функций
В общем, у меня получились такие бредни (оставляю возможность не смотреть)))
Спойлер(Показать/Скрыть)
Program pr7;
uses crt;
type matr=array [1..10,1..10] of integer;
ooo = object
a:matr;
procedure Vvod(n,m: byte);
procedure vivod(n,m: byte);
function sum_m(n,m: byte): integer;
end;
var x,y,z:ooo;
procedure ooo.vvod;
var i,j:byte;
beginfor i:=1to n dofor J:=1to m do
a[i,j]:=random(20);
end;
procedure ooo.vivod;
var i,j:byte;
beginfor i:=1to n dobegin writeln;
for j:=1to m do
write(a[i,j]:6);
end;
writeln;
end;
function ooo.sum_m;
var
i, j: byte;
Summ, ResSumm: integer;
IsNegative: boolean;
begin
ResSumm := 0;
for i := 1to n dobegin
IsNegative := false;
Summ := 0;
j := 1;
while (j <= m) andnot IsNegative dobeginif a[i,j] > 0then
Summ := Summ + a[i,j]
else
IsNegative := true;
inc(j);
end;
ifnot IsNegative then
ResSumm := ResSumm + Summ;
end;
sum_m := ResSumm;
end;
begin
clrscr;
randomize;
x.vvod(5,6);
y.vvod(10,8);
z.vvod(8,7);
x.vivod(5,6);
y.vivod(10,8);
z.vivod(8,7);
writeln;
writeln;
writeln(x.sum_m(5,6));
writeln(y.sum_m(10,8));
writeln(z.sum_m(8,7));
readln;
end.
NiMfetKa
9.01.2009 6:59
а где третий массив? и надо искать сумму строк...
Айра
9.01.2009 7:07
а что с третим массивом? за основу брала твой вариант.. там было только три вывода.. да и спрашивала я тебя уже, что именно надо делать..
к тому же:
пост #1
Цитата
Определить сумму элементов в тех столбцах
теперь
Цитата
и надо искать сумму строк...
в такой ситуации моя телепатия бессильна..
NiMfetKa
9.01.2009 7:17
третий массивчик надо как-то вместить на экране, но как? и сумму все же столбцов
Айра
9.01.2009 7:21
по-моему никак) во всяком случае я выхода не знаю.. сейчас пересмотрела, у меня действительно сумма строк, сама переделаешь можешь на подсчет того, что тебе надо?
NiMfetKa
9.01.2009 7:24
спаси меня, Айра, умоляю
Айра
9.01.2009 7:28
Странно как-то.. написала такой большой код, а сейчас не можешь поменять местами i\j и n\m ? Ну ладно.. вот:
function ooo.sum_m;
var
i, j: byte;
Summ, ResSumm: integer;
IsNegative: boolean;
begin
ResSumm := 0;
for j := 1to m dobegin
IsNegative := false;
Summ := 0;
i := 1;
while (i <= n) andnot IsNegative dobeginif a[i,j] > 0then
Summ := Summ + a[i,j]
else
IsNegative := true;
inc(i);
end;
ifnot IsNegative then
ResSumm := ResSumm + Summ;
end;
sum_m := ResSumm;
end;
Да.. random во вводе поправь, я единицу прибавляла для проверки, теперь не надо.. а то даже нулей в массиве не будет..
NiMfetKa
9.01.2009 7:28
в функции надо поменять i с j местами и дописать вывод суммы столбцов, да? но тогда в основной проге тоже надо переделывать...
Айра
9.01.2009 7:34
NiMfetKa, ну я же у тебя несколько раз спрашивала: "выводить сумму надо каждого столбца отдельно или всех столбцов матрицы?" (естественно, удовлетворяющих условию)
NiMfetKa
9.01.2009 7:41
четкого требования нет, но, наверное, удобнее для просмотра будет же сумма кождого столбца...
Айра
9.01.2009 7:49
тогда вот это: функция подсчета мутирует в процедуру и выводит суммы по мере вычисления.. (ну и еще кое-какие изменения есть)
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:=1to n dofor J:=1to m do
a[i,j]:=random(20)-5;
end;
procedure ooo.vivod;
var i,j:byte;
beginfor i:=1to n dobegin writeln;
for j:=1to m do
write(a[i,j]:6);
end;
writeln;
end;
procedure ooo.sum_m;
var
i, j: byte;
Summ: integer;
IsNegative: boolean;
beginfor j := 1to m dobegin
IsNegative := false;
Summ := 0;
i := 1;
while (i <= n) andnot IsNegative dobeginif a[i,j] > 0then
Summ := Summ + a[i,j]
else
IsNegative := true;
inc(i);
end;
ifnot 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.
Все, я ушла..
NiMfetKa
9.01.2009 8:47
пасибки, Айра, огромное))
Добавлено через 3 мин. но вот результаты с random(20)-5
почему в первой матрице только одна сумма, если с положительными элементами 2-ва столбца? да еще странная какая-то...
Lapp
9.01.2009 9:29
Айра, ты зачем поменяла местами m и n?
procedure Vvod(size_m,size_n: byte);
NiMfetKa, все (почти) верно, у тебя просто первые две строчки первой матрицы уползают за экран, и ты их не видишь.
Добавлено через 6 мин. Еще вместо
if a[i,j] > 0then
нужно
if a[i,j] >= 0then
NiMfetKa
9.01.2009 16:56
Хм, как переделать процедуру ooo.sum_m в функцию определения отрицательных элементов и процедуру определения суммы. Хелп ми
Айра
9.01.2009 17:12
Цитата
Айра, ты зачем поменяла местами m и n?
Ой.. случайно.. в алфавитном порядке записала.. (сейчас исправлю)
Цитата
Еще вместо
Вот с этим всегда проблемы, считать ли ноль положительным числом или нет)) наши преподы отвечали: "не считайте"
Lapp
9.01.2009 22:31
Цитата(Айра @ 9.01.2009 13:12)
Вот с этим всегда проблемы, считать ли ноль положительным числом или нет)) наши преподы отвечали: "не считайте"
Никаких проблем нет. Разумеется, ноль - не положительное число. Но только в условии ничего нет про положительные числа, цитирую:
Цитата(NiMfetKa @ 9.01.2009 0:59)
Определить сумму элементов в тех столбцах, которые не содержат отрицательных элементов.
Мне кажется, тут разночтений быть не может
Lapp
10.01.2009 5:51
Цитата(NiMfetKa @ 9.01.2009 12:56)
функцию определения отрицательных элементов
- что это значит? Выражайся так, чтоб тебя можно было понять. Может, в функцию определения наличия отрицательных элементов?
Айра
10.01.2009 6:19
to NiMfetKa, и можно вообще увидеть конкретные требования по заданию и программе? а то твои просьбы постоянно мутируют, и постоянно что-то переделывать желания не возникает...
NiMfetKa
10.01.2009 21:39
да, Lapp, в в функцию определения наличия отрицательных элементов и в процедуру определения суммы столбцов. Айра, все требования и их изменения зависят только от переменчевого настроения преподавателя.
там же функция должна передавать параметр j и быть логического типа, да? а процедуда должна определять суммы только в том случае, когда not IsNegative?
Айра
10.01.2009 22:16
Цитата
там же функция должна передавать параметр j и быть логического типа, да?
То есть? Может в функцию должен передаваться этот параметр (номер столбца) ? (в голову приходит процедура с вложенной в нее функцией.. )
NiMfetKa
10.01.2009 22:54
ХМ, нет, не вложенный... процедурка же должна знать сумму какого столбца ей определять...
Айра
10.01.2009 23:09
procedure sum_m;
function IsNegative({передаешь номер текущего столбца}): boolean;
begin{здесь идет проверка конкретного столбца наличие отрицательных элементов.
если они есть, то функция принимает значение true, если нет - false
}end;
beginfor j:=1to m doifnot IsNegative(j) then{считаешь и выводишь сумму}end;
{это краткий набросок}
?
NiMfetKa
10.01.2009 23:25
а не вложенной можно сделать?
Айра
10.01.2009 23:31
И не вложенной можно. Принцип вызова остается тот же, просто описываешь ее вне процедуры по всем правилам..
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.