Форум «Всё о Паскале» _ Задачи _ работа над ошибками
Автор: Булавка 15.05.2006 22:59
Условие: дан одномерный массив А, размером N<=50. Найти среднюю геометрическую сумму положительных элементов.
Program MM; const n=50; var A:array[1..n] of integer; i,S:integer; Sg: real; begin
writeln ('ввести массив А'); for i:=1 to n do read (A[i]);
for i:=1 to n do if A[I]>0 then begin s:=1; for i:=1 to n do s:=s*A[i]; Sg:=exp(ln(s)/n); end; writeln ('Sg=',Sg:3); end.
Автор: Bokul 15.05.2006 23:07
Нельзя чтобы названия проги было числом.
Автор: Булавка 15.05.2006 23:09
Цитата(Bokul @ 15.05.2006 20:07)
Нельзя чтобы названия проги было числом.
ну это я условно поставила. это не суть важно
Автор: APAL 15.05.2006 23:17
Во первых - ТЕГИ [code][/code] кто будет за тебя проставлять?
Во вторых - последи за значением s - оно может превышать максимально допустимое значение для integer
Автор: volvo 15.05.2006 23:27
... ну, а в третьих... Тебе же надо среднее геометрическое положительных элементов массива? Почему же ты вычисляешь корень N-ой степени из S ? Тогда уже считай К = число элементов больших 0, и вычисляй корень K-ой степени...
Да и вообще у тебя цикл как-то запутан, и к тому же не будет компилироваться - ты ВНУТРИ одного цикла по i делаешь второй - тоже по i... Так нельзя.
Автор: Романтик 15.05.2006 23:32
Цитата(volvo @ 15.05.2006 20:27)
... ну, а в третьих... Тебе же надо среднее геометрическое положительных элементов массива? Почему же ты вычисляешь корень N-ой степени из S ? Тогда уже считай К = число элементов больших 0, и вычисляй корень K-ой степени...
Да и вообще у тебя цикл как-то запутан, и к тому же не будет компилироваться - ты ВНУТРИ одного цикла по i делаешь второй - тоже по i... Так нельзя.
оффтоп: to volvo: в turbo pascal compile suc. Delphi не компилится.
Автор: volvo 15.05.2006 23:46
Романтик, а ты уверен, что в TP после того, как откомпилится - будет работать, как положено? Ты же нарушаешь правило: управляющая переменная цикла в теле цикла изменяться не должна!!!
Кстати, поэтому ни один новый компилятор (проверено в Delphi/VP/FPC/GPC) не компилирует такие конструкции. Ибо они неработоспособны...
Автор: Романтик 15.05.2006 23:51
Цитата(volvo @ 15.05.2006 20:46)
Романтик, а ты уверен, что в TP после того, как откомпилится - будет работать, как положено? Ты же нарушаешь правило: управляющая переменная цикла в теле цикла изменяться не должна!!!
Кстати, поэтому ни один новый компилятор (проверено в Delphi/VP/FPC/GPC) не компилирует такие конструкции. Ибо они неработоспособны...
Спасибо. (я правило это знаю, просто не отработав в дельфе попробовал TP).
Автор: Булавка 16.05.2006 0:01
если не в падлу напишите программу с изменениями
Сначала отредактируй свой пост и поставь теги! Если проигнорируешь и во второй раз - закрою тему! Есть уже два ответа с кодом программы - но они будут скрыты до момента выполнения правил оформления топика (+/- время на реагирование админом/модером)
Автор: Bokul 16.05.2006 0:18
Код
uses crt; const n=4; var A:array[1..n] of integer; i,k:integer; s:longint; Sg: real; begin clrscr; writeln ('Array A'); for i:=1 to n do read (A[i]);
k:=0; s:=1; for i:=1 to n do if A[I]>0 then begin s:=s*A[i]; inc(k); end; Sg:=exp(ln(s)/k); readln; writeln ('S=',s,' k=',k,' Sg=',Sg:0:3); readln; end.
Автор: n4oJllI 16.05.2006 1:53
Код
uses crt; const n=50; var A:array[1..n] of integer; i,S,m,k:integer; Sg: real; begin clrscr; write('nr??'); readln(m); writeln ('masiv'); for i:=1 to m do read (A[i]); s:=1; k:=0; for i:=1 to m do if A[I]>0 then begin k:=k+1; s:=s*A[i]; end; Sg:=exp(1/k*ln(s)); writeln; write('Sg=',Sg:4:2); readkey; end.