![]() |
|
|
Регистрация | << Правила форума >> | 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. |
#9
|
||||
|
||||
![]() А вы Randomize то использовали?!
Что делать, когда сломался комп: 1. Если вы юзер - делать ноги. 2. Если ремонтник - делать деньги. 3. Если вы программист - делать вид, что так было задумано. |
#10
|
|||
|
|||
![]() Все разобрался, Всем огромное спасибо за оказанную помощь!
|
#11
|
|||
|
|||
![]() Я конешно извиняюсь, но не могли бы вы мне снова помочь вот в чем! Надо сделать так, чтоб я задавал длину массива из строки ввода! Как мне это сделать?
|
#12
|
||||
|
||||
![]() Может динамическим массивом пойдет?
Что делать, когда сломался комп: 1. Если вы юзер - делать ноги. 2. Если ремонтник - делать деньги. 3. Если вы программист - делать вид, что так было задумано. |
#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; Что делать, когда сломался комп: 1. Если вы юзер - делать ноги. 2. Если ремонтник - делать деньги. 3. Если вы программист - делать вид, что так было задумано. |
#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; |