Консультация № 160648
16.02.2009, 18:36
0.00 руб.
0 1 1
Уважаемые эксперты, такая вот задача!

Дана матрица P(3*5), содержащая положительные, отрицательные, элементы и нули. Вычислить сумму модулей отрицательных элементов, произведение положительных, и число нулей

Обсуждение

Неизвестный
16.02.2009, 19:39
общий
это ответ
Здравствуйте, Slavko!

В приложении 2 варианта программы:
В первом произведение сохраняется в переменную типа Word (максимальное значение 65545), поэтому программа может работать только с небольшими числами.
Во втором варианте произведение сохраняется в строку, поэтому можно использовать довольно большие числа. Но, из-за необходимости перемножения строк, этот вариант сложнее.

С уважением, Дмитрий.

Приложение:
{===ПЕРВЫЙ ВАРИАНТ===}
program z160648;
const
K = 3;{кол-во строк}
L = 5;{кол-во столбцов}
type
elem = Integer;{тип елементов массива}
tmas = array[1..L] of elem;
mas = array[1..K] of tmas;

procedure vivod(m:mas);{вывод массива}
var i,j:byte;
begin
For j:= 1 to K do
begin
For i:= 1 to L do
Write(m[j][i],' ');
WriteLn;
end;
end;

var m: mas;
i,j: byte;
sum,kol,proizv: Word;
polozhit,otrizat: boolean;
begin
{Если надо вводить массив вручную:}
{ For j := 1 to K do
For i := 1 to L do
begin
Write('Enter m[',j,',',i,']: ');
ReadLn(m[j][i]);
end;
vivod(m);}
{Если произвольно заполнить:}
Randomize;
For j := 1 to K do
For i := 1 to L do
m[j][i]:=Random(5) - 2;{заполняем числами от -2 до +2}
vivod(m);
{основная часть:}
sum:=0;
kol:=0;
proizv:=1;
polozhit:=false;
otrizat:=false;
For j := 1 to K do{перебираем все элементы массива}
For i := 1 to L do
IF m[j][i] < 0 then{если меньше нуля - }
begin
sum:=sum+abs(m[j][i]);{считаем сумму модулей}
otrizat:=true;{запоминаем что у нас есть отрицательные элементы}
end
Else
IF m[j][i] > 0 then{если больше нуля - }
begin
proizv:=proizv*m[j][i];{считаем произведение положительных}
polozhit:=true;{запоминаем что у нас есть положительные элементы}
end
Else
inc(kol);
{выводим ответ:}
IF otrizat then
WriteLn('Summa modulei otrizatelnih elementov: ',sum)
Else
WriteLn('V massive net otrizatelnih elementov');
IF polozhit then
WriteLn('proizvedenie polozhitelnih elementov: ',proizv)
Else
WriteLn('V massive net polozhitelnih elementov');
WriteLn('Koli4estvo nulei: ',kol);
ReadLn;
end.

{===ВТОРОЙ ВАРИАНТ===}

program z160648;

type stroka = String[255];
miniStroka = String[3];

Function summ(a,b:stroka):stroka;
var zifraA,zifraB,perehod,Summa,i:byte;
sSumma,posled:miniStroka;
res:Stroka;
begin
res:='';
perehod:=0;
{уравниваем числа по длинне}
While length(a)<length(b) do
a:='0'+a;
While length(b)<length(a) do
b:='0'+b;
a:='0'+a;
b:='0'+b;
For i:= length(a) downto 1 do{перебираем числа с конца}
begin
val(copy(a,i,1),zifraA);{складываем текущие символы}
val(copy(b,i,1),zifraB);
Summa:=zifraA+zifraB+perehod;
IF Summa >= 10 then{если сумма получилась больше чем 10, то}
begin
str(Summa mod 10,posled);
res:=posled+res;{пишем в ответ последнюю цифру и}
perehod:=Summa div 10;{запоминаем сколько перешло в следующий разряд}
end
Else{если меньше - }
begin
str(Summa,posled);
res:=posled+res;{пишем в ответ сумму}
perehod:=0;
end;
end;
While copy(res,1,1) = '0' do
delete(res,1,1);
IF res = '' then
res:='0';
Summ:=res;
end;
Function umnozh_na_zifru(a:stroka; zifra:miniStroka):Stroka;
var res,sProizv:stroka;
symb:miniStroka;
i,k,nSymb,nZifra:byte;
begin
res:='';
For i:= length(a) downto 1 do{перебираем число с конца}
begin
symb:=copy(a,i,1);
val(symb,nSymb);
val(zifra,nZifra);
str(nSymb*nZifra,sProizv);{умножаем текущий символ на цифру}
For k:= 1 to length(a)-i do{приписываем порядок}
sProizv:=sProizv+'0';
res:=summ(res,sProizv);{складываем с результатом}
end;
umnozh_na_zifru:=res;
end;
Function proizv(a,b:stroka):Stroka;
var res,sProizv:stroka;
i,k:byte;
begin
IF length(b)>length(a) then{берём минимальное число}
begin
res:=b;
b:=a;
a:=res;
end;
res:='';
For i:= length(b) downto 1 do{перебираем его с конца}
begin
sProizv:=umnozh_na_zifru(a,copy(b,i,1));{умножаем большее число на текущую цифру меньшего}
For k:= 1 to length(b)-i do
sProizv:=sProizv+'0';{приписываем порядок}
res:=summ(res,sProizv);{прибавляем к результату}
end;
proizv:=res;
end;


const
K = 3;{кол-во строк}
L = 5;{кол-во столбцов}
type
elem = Integer;{тип елементов массива}
tmas = array[1..L] of elem;
mas = array[1..K] of tmas;

procedure vivod(m:mas);{вывод массива}
var i,j:byte;
begin
For j:= 1 to K do
begin
For i:= 1 to L do
Write(m[j][i],' ');
WriteLn;
end;
end;

var m: mas;
i,j: byte;
sum,kol: Word;
polozhit,otrizat: boolean;
proizved,tmp: Stroka;
begin
{Если надо вводить массив вручную:}
{ For j := 1 to K do
For i := 1 to L do
begin
Write('Enter m[',j,',',i,']: ');
ReadLn(m[j][i]);
end;
vivod(m);}
{Если произвольно заполнить:}
Randomize;
For j := 1 to K do
For i := 1 to L do
m[j][i]:=Random(101) - 50;{заполняем числами от -5 до +5}
vivod(m);
{основная часть:}
sum:=0;
kol:=0;
proizved:='1';
polozhit:=false;
otrizat:=false;
For j := 1 to K do{перебираем все элементы массива}
For i := 1 to L do
IF m[j][i] < 0 then{если меньше нуля - }
begin
sum:=sum+abs(m[j][i]);{считаем сумму модулей}
otrizat:=true;{запоминаем что у нас есть отрицательные элементы}
end
Else
IF m[j][i] > 0 then{если больше нуля - }
begin
Str(m[j][i],tmp);
proizved:=proizv(proizved,tmp);{считаем произведение положительных}
polozhit:=true;{запоминаем что у нас есть положительные элементы}
end
Else
inc(kol);
{выводим ответ:}
IF otrizat then
WriteLn('Summa modulei otrizatelnih elementov: ',sum)
Else
WriteLn('V massive net otrizatelnih elementov');
IF polozhit then
WriteLn('proizvedenie polozhitelnih elementov: ',proizved)
Else
WriteLn('V massive net polozhitelnih elementov');
WriteLn('Koli4estvo nulei: ',kol);
ReadLn;
end.
Форма ответа