| Цитата(mkuint @ 21.5.2005, 20:56) | | Ввести последовательность целых чисел. Найти в ней значение, которое ближе всего к среднему значению |
Вот, написал небольшую прогу на Delphi, которая делает это:
| Код | unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Edit1: TEdit; //Сюда будем вводить числа Label1: TLabel; //Пояснение "Введите очередное число" Button1: TButton; //Кнопка "Добавить" Memo1: TMemo; //Список всех введенных чисел Button2: TButton; //Кнопка "Вычислить" Label2: TLabel; //Пояснение "Ближайшее к среднему значение" Edit2: TEdit; //Сюда выведем это значение Edit3: TEdit; //Здесь будет среднее значение. Т.к. я юзал тип Integer, то значение округляется Button3: TButton; //Кнопка "Очистить" - очищает все использованные переменные и поле Memo Label3: TLabel; //Пояснение "Среднее значение" procedure Button1Click(Sender: TObject); //С этим, думаю, все понятно... procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1; Val_Count: integer = 0; //количество введенных значений Middle_Val: integer = 0; //среднее значение Near_Val: integer; //ближайшее к среднему значение Values: array of integer; //динамический массив введенных значений
implementation
{$R *.dfm}
{добавление числа в Memo} procedure TForm1.Button1Click(Sender: TObject); begin Inc (Val_Count); //увеличим счетчик введенных значений на единицу Memo1.Lines.Add (Edit1.Text); Edit1.Text := '0'; //для удобства очищаем поле Edit1... Edit1.SetFocus; //...и устанавливаем на него фокус ввода end;
{рассчет} procedure TForm1.Button2Click(Sender: TObject); var i: integer; //счетчик циклов begin SetLength (Values, Val_Count); for i := 0 to (Val_Count-1) do //в этом цикле мы заполним массив... begin Values[i] := StrToInt(Memo1.Lines[i]); //...для чего будем последовательно считывать строки в Memo Middle_Val := Middle_Val + Values[i]; //Заодно вычислять сумму элементов... end; Middle_Val := round (Middle_Val / Val_Count); //...а здесь вычислим среднее значение, поделив сумму на кол-во
Edit3.Text := IntToStr(Middle_Val); Near_Val := Values[0]; //будем считать, что наиболее приближенное к среднему значение в массиве первое...
for i := 0 to (Val_Count-1) do begin if abs (Middle_Val - Near_Val) >= abs (Values[i] - Middle_Val) then Near_Val := Values[i]; //...и будем сравнивать модули разностей... короче, думаю, можно разобраться :) end; Edit2.Text := IntToStr (Near_Val); //после всех вычислений выводим наиболее приближенное к ср. значение end;
{очистка переменных и Memo} procedure TForm1.Button3Click(Sender: TObject); begin Middle_Val := 0; Val_Count := 0; Memo1.Clear; Edit1.Text := '0'; Edit1.SetFocus; Edit2.Text := '0'; Edit3.Text := '0'; end; end.
|
Надеюсь, этот код тебе поможет . |