Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ 2-мерный массив на ООП

Автор: NiMfetKa 9.01.2009 4:59

вот задание:
Заданы 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

Автор: Айра 9.01.2009 5:20

Точку с запятой убери после object smile.gif Он разве тебе не пишет, что хочет увидеть идентификаторы, а не ";" ?
(дальше не смотрела)

Автор: 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) smile.gif
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%.. smile.gif
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

и что должно долучиться ? huh.gif huh.gif

Автор: 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) *
и что должно долучиться ? huh.gif huh.gif

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

Добавлено через 2 мин.
Мне кажется, параметры у Vvod можно просто убрать... smile.gif

Автор: Айра 9.01.2009 6:50

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

В общем, у меня получились такие бредни (оставляю возможность не смотреть)))

Спойлер (Показать/Скрыть)

Автор: 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 := 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 9.01.2009 7:28

в функции надо поменять i с j местами и дописать вывод суммы столбцов, да? но тогда в основной проге тоже надо переделывать...

Автор: Айра 9.01.2009 7:34

NiMfetKa, ну я же у тебя несколько раз спрашивала: "выводить сумму надо каждого столбца отдельно или всех столбцов матрицы?" (естественно, удовлетворяющих условию)

Автор: NiMfetKa 9.01.2009 7:41

четкого требования нет, но, наверное, удобнее для просмотра будет же сумма кождого столбца... blush.gif blush.gif

Автор: Айра 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:=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 9.01.2009 8:47

пасибки, Айра, огромное))

Добавлено через 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 9.01.2009 9:29

Айра, ты зачем поменяла местами m и n?

procedure Vvod(size_m,size_n: byte);


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

Добавлено через 6 мин.
Еще вместо
      if a[i,j] > 0 then
нужно
      if a[i,j] >= 0 then

Автор: 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) *
Определить сумму элементов в тех столбцах, которые не содержат отрицательных элементов.

Мне кажется, тут разночтений быть не может smile.gif

Автор: Lapp 10.01.2009 5:51

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

Автор: Айра 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;
begin
for j:=1 to m do
if not IsNegative(j) then
{считаешь и выводишь сумму}
end;
{это краткий набросок}



?

Автор: NiMfetKa 10.01.2009 23:25

а не вложенной можно сделать?

Автор: Айра 10.01.2009 23:31

И не вложенной можно. Принцип вызова остается тот же, просто описываешь ее вне процедуры по всем правилам..