![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Народ помогите разобраться с программой которая создает массив случайных целых чисел, подсчитывает их среднее арифметическое, а также определяет и выводит на экран минимальное и максимальное из этих чисел.
Кому не трудно посмотрите plizzz и скажите, что я сделал не так! Прога не может подсчитать мин. макс. числа! Код:
procedure TfmExample.BEnterClick(Sender: TObject);
const
N = 1000;
MAX_VALUE = 100+1;
var
m: array [1..N] of Integer;
i: Integer;
max,min: Integer;
sum: Real;
begin
for i:=1 to N do
m[i]:= Random (MAX_VALUE);
sum := m[1];
max := m[1];
min := m[1];
for i:= 2 to N do
begin
sum :=sum+m[i];
if m[i]<min then min:= m[i]
else if m[i]>max then max:= m[i]
end;
mmOutput.Lines.Add('Минимальное значение данного массива равно '+inttostr(min));
mmOutput.Lines.Add('Среднее арифметическое число данного массива равно '+floattostr(sum/N));
mmOutput.Lines.Add('Максимальное значение данного массива равно '+inttostr(max));
end;Последний раз редактировалось Lukas, 06.03.2008 в 16:49. |
|
#2
|
|||
|
|||
|
На мой взгляд все правильно. А что вас не устраивает в результатах работы программы?
|
|
#3
|
||||
|
||||
|
Все действительно правильно, но вычисление min и max я бы выделил в отдельную процедуру:
Код:
function FindMin(Arr : array of integer) : integer; //возвращает само значение, но не индекс
var i : integer;
begin
Result := Arr[0];
for i := 1 to Length(Arr)-1 do
if ( Arr[i] < Result ) then
Result := Arr[i];
end;
function FindMax(Arr : array of integer) : integer;
var i : integer;
begin
Result := Arr[0];
for i := 1 to Length(Arr)-1 do
if ( Arr[i] > Result ) then
Result := Arr[i];
end;
mmOutput.Lines.Add('Минимальное значение данного массива равно '+inttostr(FindMin(m)));
mmOutput.Lines.Add('Максимальное значение данного массива равно '+inttostr(FindMax(m)));Дело в том, что при N=1000 шанс, что в массиве будет 0 и 100 равен 1. Уменьши N до..скажем..10 или MAX_VALUE до..5001 и результаты тебя порадуют ![]() Последний раз редактировалось KOOL, 07.03.2008 в 10:44. |
|
#4
|
||||
|
||||
|
Ошибка вот в чем - сортировать нужно ВЕСЬ массив, а не со 2-го его элемента.
Вообще-то это должно выглядеть так: (я заккоментировал на мой взгляд неправильные конструкции и написал свои). Код:
procedure TfmExample.BEnterClick(Sender: TObject);
const
N = 1000;
MAX_VALUE = 100+1;
var
m: array [1..N] of Integer;
i: Integer;
max,min: Integer;
sum: Real;
begin
for i:=1 to N do
m[i]:= Random (MAX_VALUE);
sum:=0;//!!!sum := m[1];
max := m[1];
min := m[1];
for i:= 1//!!!2 to N do
begin
sum :=sum+m[i];
if m[i]<min then min:= m[i]
else if m[i]>max then max:= m[i]
end;
mmOutput.Lines.Add('Минимальное значение данного массива равно '+inttostr(min));
mmOutput.Lines.Add('Среднее арифметическое число данного массива равно '+floattostr(sum/N));
mmOutput.Lines.Add('Максимальное значение данного массива равно '+inttostr(max));
end; |
|
#5
|
||||
|
||||
|
2Thrasher:
Ошибки тут нет. Если ты не заметил, нумерация массива идет с 1 |
|
#6
|
|||
|
|||
|
Все равно не хочет работать, ни как не получается!
|
|
#7
|
|||
|
|||
|
С помощью модуля Math можно не писать цикл:
Код:
Asum := SumInt(m);
Amax := MaxIntValue(m);
Amin := MinIntValue(m);
{ср. ариф.}:= Mean(m)Последний раз редактировалось AlexSku, 07.03.2008 в 12:35. |
|
#8
|
||||
|
||||
|
Цитата:
Тут все дело именно в N и MAX_VALUE. Если N слишком большое, то min всегда будет 0, а max - MAX_VALUE-1. |
|
#9
|
||||
|
||||
|
А вы Randomize то использовали?!
|
|
#10
|
|||
|
|||
|
Все разобрался, Всем огромное спасибо за оказанную помощь!
|
|
#11
|
|||
|
|||
|
Я конешно извиняюсь, но не могли бы вы мне снова помочь вот в чем! Надо сделать так, чтоб я задавал длину массива из строки ввода! Как мне это сделать?
|
|
#12
|
||||
|
||||
|
Может динамическим массивом пойдет?
|
|
#13
|
|||
|
|||
|
А как это реализовать в вышеприведенной программе?
|
|
#14
|
||||
|
||||
|
Ну можно так:
Код:
procedure TfmExample.BEnterClick(Sender: TObject);
const
MAX_VALUE = 100+1;
var
m: array of Integer;
i: Integer;
max,min: Integer;
sum: Real;
N: Integer;
begin
N:=StrToInt(Edit1.Text);
SetLength(m, N)
for i:=0 to N - 1 do
m[i]:= Random (MAX_VALUE);
sum:=0;
max := m[0];
min := m[0];
for i:= 0 to N - 1 do
begin
sum :=sum+m[i];
if m[i]<min then min:= m[i]
else if m[i]>max then max:= m[i]
end;
mmOutput.Lines.Add('Минимальное значение данного массива равно '+inttostr(min));
mmOutput.Lines.Add('Среднее арифметическое число данного массива равно '+floattostr(sum/N));
mmOutput.Lines.Add('Максимальное значение данного массива равно '+inttostr(max));
end; |
|
#15
|
|||
|
|||
|
А вам не кажется глупым два цикла делать тем более что мы САМИ генерируем значения массива?
Код:
procedure TfmExample.BEnterClick(Sender: TObject);
const
Max_Value = 100;
var
i, Min, Max, Sum: integer;
m: array of Integer;
begin
Randomize;
Sum := 0;
setlength(m, StrToInt(Edit1.Text));
for i:=0 to length(m)-1 do
begin
m[i] := Round(Random(MaxValue));
inc(Sum, m[i]);
if i=0 then
begin
Max := m[i];
Min := m[i];
end else begin
if m[i]<Min then Min := m[i];
if m[i]>Max then Max := m[i];
end;
end;
mmOutput.Lines.Clear;
mmOutput.Lines.Add('Минимальное значение данного массива равно '+inttostr(Min));
mmOutput.Lines.Add('Среднее арифметическое число данного массива равно '+floattostr(Sum/length(m)));
mmOutput.Lines.Add('Максимальное значение данного массива равно '+inttostr(Max));
end; |