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

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

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

Автор: goosberry 15.06.2009 17:08

Даны два массива Т(20)и С(20). Найти среднее геометрическое положительных элементов массива Т и заменить ими все отрицательные элементы массива С.


program zadacha;
uses crt;
type
mas1=array [1..20] of integer;
mas2=array [1..20] of integer;
var
T:mas1;
C:mas2;
i,k,p:integer;
sr:real;
begin
randomize;
writeln('Massiv T:');
for i:=1 to 20 do
begin
T[i]:=random(100)-50;
write(T[i], ' ');
end;
writeln;
writeln('Massiv C:');
for i:=1 to 20 do
begin
C[i]:=random(100)-50;
write(C[i], ' ');
end;
writeln;
k:=0;
p:=1;
sr:=0;
for i:=1 to 20 do
begin
if T[i]>0 then
begin
k:=k+1;
p:=p*T[i];
end;
end;
writeln;
if k>0 then sr:=exp(ln(p)*(1/k));
writeln('sr= ',sr:3:3);
writeln;
writeln('New massiv C:');
for i:=1 to 20 do
begin
if (C[i]<0) and (T[i]>0) then C[i]:=T[i];
write(C[i], ' ');
end;
writeln;
readkey;
end.



Иногда выдаёт ошибку, подскажите, пожалуйста, что не так
Заранее спасибо

Автор: Lapp 15.06.2009 17:34

Ты представляешь себе порядок величины произведения, которая может получиться? Допустим, 10 положительных чисел, каждое равно 10. Тогда их произведение есть 1010. А p у тебя целое, то есть всего до 32 тысяч примерно.. Сделай p типа double.

Автор: goosberry 15.06.2009 18:03

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

Автор: sheka 15.06.2009 18:17

Цитата
Код

writeln('New massiv C:');
for i:=1 to 20 do
  begin
   if (C[i]<0) and (T[i]>0) then C[i]:=T[i];
   write(C[i], '  ');
  end;

а зачем здесь условие and (T[i]>0) и почему C[i]:=T[i]; ?

по моему там все проще:
Код

writeln('New massiv C:');
for i:=1 to 20 do
  begin
   if (C[i]<0) then C[i]:=sr;
   write(C[i], '  ');
  end;

и еще там mas2=array [1..20] of integer;
а sr=real, тоесть массив тоже должен быть of real;