Помощь - Поиск - Пользователи - Календарь
Полная версия: 2-мерный массив на ООП
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
NiMfetKa
вот задание:
Заданы 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.


но почему-то после
Код
ooo = object;
выбивает 2 ошибку wacko.gif wacko.gif nea.gif
Айра
Точку с запятой убери после object smile.gif Он разве тебе не пишет, что хочет увидеть идентификаторы, а не ";" ?
(дальше не смотрела)
NiMfetKa
теперь 4 ошибка после
Код
procedure ooo.vvod;
var i,j:byte;
Lapp
Цитата(NiMfetKa @ 9.01.2009 1:51) *
теперь 4 ошибка после
Код
procedure ooo.vvod;
var i,j:byte;
После объявления процедуры? Параметры вставь, как выше.

Ты лучше приводи сам текст ошибки тоже..
Айра
а вызываешь как ooo.vvod(5,6)? на так нужно ж указать программе, что у процедуры есть параметры.. В выложенном здесь коде у тебя это было..

Из замеченного далее:
есть проблема с выводом (тут тоже нужно указывать значения m и n) и с sum_m.. Указывать второй раз ее тип не нужно, опять же значение m и n откуда программе брать? и обрати внимание на i и j, точнее на то, какие они принимают значения и существуют ли элементы массивов с такими номерами..



Добавлено через 1 мин.
Да.. сумма должна считаться отдельно по каждому столбцу, неимеющему отрицательных, или на всю матрицу?
NiMfetKa
ему не нра вар почему-то...
Айра
И еще:
0. в цикле while нужно не or а and и (j <= m) smile.gif
1. у тебя значения элементов массива всегда будут >=0..

Цитата
ему не нра вар почему-то...

покажи описательную часть.. ты что-то изменила относительно варианта из 1го поста?

Добавлено через 4 мин.
Цитата
сумма должна считаться отдельно по каждому столбцу, неимеющему отрицательных, или на всю матрицу?

к чему я это.. если второй вариант, то отдельные вызовы функции sum_m можно убрать и оставить только writeln'ы..
Lapp
Цитата(NiMfetKa @ 9.01.2009 2:11) *
ему не нра вар почему-то...
Слушай, NiMfetKa, а какой у тя компилятор, если не секрет?
Айра
Ошибка 4 - duplicate identifier (сорри, не то скопировала, теперь исправила) - дублированны\двойной идентификатор.. [telepathy_on] проверь, не описала ли ты переменные i и j где-нибудь вне процедуры.. [telepathy_off]
volvo
Цитата
теперь 4 ошибка после
procedure ooo.vvod;
var i,j:byte;
Прав компилятор на все 100%... У тебя уже есть N, как член объекта, ты еще и как параметр метода хочешь использовать N? Нельзя. Давай другое имя либо параметру, либо члену класса...
Lapp
Цитата(volvo @ 9.01.2009 2:27) *
Прав компилятор на все 100%...
Ну, на 99%.. smile.gif
Turbo этого не требует.
volvo
Турбо как раз и требует, чтобы не было повторений в именах параметров... А вот FPC компилирует нормально...
Lapp
NiMfetKa, скажи, чем компилируешь!

Добавлено через 5 мин.
Цитата(volvo @ 9.01.2009 2:33) *

Турбо как раз и требует, чтобы не было повторений в именах параметров... А вот FPC компилирует нормально...

Хм, да, забавно...
А FP в моде TP - вроде, кушает..
NiMfetKa
и что должно долучиться ? huh.gif huh.gif
Lapp
Хотя в моде FP - не пропускает. Причем, раньше
NiMfetKa
TURBO PASCAL 7.1
Lapp
Цитата(NiMfetKa @ 9.01.2009 2:39) *
и что должно долучиться ? huh.gif huh.gif

Хороший вопрос.. smile.gif
Думаю - прогресс!

Добавлено через 2 мин.
Мне кажется, параметры у Vvod можно просто убрать... smile.gif
Айра
Тоже проверила, fpc все равно, tp7.0 ругается..
А я решила проблему изгнанием n и m из членов объекта и принятием в ряды параметров процедур\функций smile.gif

В общем, у меня получились такие бредни (оставляю возможность не смотреть)))
Спойлер (Показать/Скрыть)
NiMfetKa
а где третий массив? и надо искать сумму строк...
Айра
а что с третим массивом? за основу брала твой вариант.. там было только три вывода.. да и спрашивала я тебя уже, что именно надо делать..

к тому же:

пост #1
Цитата
Определить сумму элементов в тех столбцах

теперь
Цитата
и надо искать сумму строк...


в такой ситуации моя телепатия бессильна..

NiMfetKa
третий массивчик надо как-то вместить на экране, но как? и сумму все же столбцов
Айра
по-моему никак) во всяком случае я выхода не знаю..
сейчас пересмотрела, у меня действительно сумма строк, сама переделаешь можешь на подсчет того, что тебе надо?
NiMfetKa
спаси меня, Айра, умоляю
Айра
Странно как-то.. написала такой большой код, а сейчас не можешь поменять местами 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;


Да.. random во вводе поправь, я единицу прибавляла для проверки, теперь не надо.. а то даже нулей в массиве не будет..
NiMfetKa
в функции надо поменять i с j местами и дописать вывод суммы столбцов, да? но тогда в основной проге тоже надо переделывать...
Айра
NiMfetKa, ну я же у тебя несколько раз спрашивала: "выводить сумму надо каждого столбца отдельно или всех столбцов матрицы?" (естественно, удовлетворяющих условию)
NiMfetKa
четкого требования нет, но, наверное, удобнее для просмотра будет же сумма кождого столбца... blush.gif blush.gif
Айра
тогда вот это: функция подсчета мутирует в процедуру и выводит суммы по мере вычисления.. (ну и еще кое-какие изменения есть)
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.


Все, я ушла..
NiMfetKa
пасибки, Айра, огромное))

Добавлено через 3 мин.
но вот результаты с random(20)-5
Код
    -4     4    -4    11    -4
     0    13     2    10     1
     8    11     9     1    -2
     1     4    -1    11     0

     4    -3    12     0    10    14     4    12    11    -5
    -3    -3     5    -5     6    -5    10     8    10     9
     6    -1     8     6    14     7    14    -1     8     0
    -4    10     4    12     5     6    14     8     1    -5
     9    14    10     9    -2    -3    13    10     6    12
     8     0    -4     7     0    12    -2     0     5    14
    -2    -2     0    -2     6     4     0    -2     7     9
     9    -4    -4    -4    -3    10    11     2     7     3

     9     4     1    11    11    -3    -4    -4
    -4    -2     8    -1     6     0     2    11
     1     1     8     8    13     1     4     0
    10     9     6     9     3     5     6    12
     8    -3     4     3    -3    -4     5     8
    -4    13    11     8    13     0     9     9
     4     8    -2    -1    13     2    -3    14

    55



а если менять на random(60)-5 , то
Код
    -1    23    -1    45    -2
    12    50    17    41    14
    36    45    38    13     4
    14    22     9    44    11

    23     3    47    12    41    53    24    48    44    -4
     3     3    25    -4    30    -5    41    34    41    37
    28     7    35    30    52    33    54     9    35    12
     0    41    24    47    25    29    52    36    15    -5
    37    54    41    39     6     3    49    42    30    46
    36    12     0    32    11    47     4    11    27    52
     5     4    11     5    29    24    12     4    31    39
    39    -1    -1    -2     1    42    43    17    31    21

    39    24    15    44    44     3     0    -1
    -2     6    35     8    29    10    16    45
    13    13    34    36    49    14    23    12
    41    39    28    38    19    27    30    47
    35     1    23    19     1    -2    27    35
    -1    50    45    35    50    11    37    39
    24    34     4     8    51    16     2    54
   167
   171   195   279   201   254
   167   184   188   243   135

почему в первой матрице только одна сумма, если с положительными элементами 2-ва столбца? да еще странная какая-то...
Lapp
Айра, ты зачем поменяла местами m и n?

procedure Vvod(size_m,size_n: byte);


NiMfetKa, все (почти) верно, у тебя просто первые две строчки первой матрицы уползают за экран, и ты их не видишь.

Добавлено через 6 мин.
Еще вместо
      if a[i,j] > 0 then
нужно
      if a[i,j] >= 0 then
NiMfetKa
Хм, как переделать процедуру ooo.sum_m в функцию определения отрицательных элементов и процедуру определения суммы. Хелп ми
Айра
Цитата
Айра, ты зачем поменяла местами m и n?

Ой.. случайно.. в алфавитном порядке записала.. (сейчас исправлю)

Цитата
Еще вместо

Вот с этим всегда проблемы, считать ли ноль положительным числом или нет)) наши преподы отвечали: "не считайте"
Lapp
Цитата(Айра @ 9.01.2009 13:12) *
Вот с этим всегда проблемы, считать ли ноль положительным числом или нет)) наши преподы отвечали: "не считайте"
Никаких проблем нет. Разумеется, ноль - не положительное число. Но только в условии ничего нет про положительные числа, цитирую:
Цитата(NiMfetKa @ 9.01.2009 0:59) *
Определить сумму элементов в тех столбцах, которые не содержат отрицательных элементов.

Мне кажется, тут разночтений быть не может smile.gif
Lapp
Цитата(NiMfetKa @ 9.01.2009 12:56) *
функцию определения отрицательных элементов
- что это значит? blink.gif
Выражайся так, чтоб тебя можно было понять. Может, в функцию определения наличия отрицательных элементов?
Айра
to NiMfetKa, и можно вообще увидеть конкретные требования по заданию и программе? а то твои просьбы постоянно мутируют, и постоянно что-то переделывать желания не возникает...
NiMfetKa
да, Lapp, в в функцию определения наличия отрицательных элементов и в процедуру определения суммы столбцов.
Айра, все требования и их изменения зависят только от переменчевого настроения преподавателя.

там же функция должна передавать параметр j и быть логического типа, да? а процедуда должна определять суммы только в том случае, когда not IsNegative?
Айра
Цитата
там же функция должна передавать параметр j и быть логического типа, да?

То есть? Может в функцию должен передаваться этот параметр (номер столбца) ?
(в голову приходит процедура с вложенной в нее функцией.. )
NiMfetKa
ХМ, нет, не вложенный... процедурка же должна знать сумму какого столбца ей определять...
Айра
procedure sum_m;
function IsNegative({передаешь номер текущего столбца}): boolean;
begin
{здесь идет проверка конкретного столбца наличие отрицательных элементов.
если они есть, то функция принимает значение true, если нет - false
}
end;
begin
for j:=1 to m do
if not IsNegative(j) then
{считаешь и выводишь сумму}
end;
{это краткий набросок}



?
NiMfetKa
а не вложенной можно сделать?
Айра
И не вложенной можно. Принцип вызова остается тот же, просто описываешь ее вне процедуры по всем правилам..
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.