![]() |
|
|
Регистрация | << Правила форума >> | 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; Хорошо написанная программа не требует документации ICQ 9-184-668. |
#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. |