Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.12.2007, 14:59   #1
Oksana11
Пользователь
 
Аватар для Oksana11
 
Регистрация: 21.12.2007
Сообщений: 21
Восклицание Задача Delphi. Помогите доделать!

Код:
unit getar_1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    StringGrid1: TStringGrid;
    Button1: TButton;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  a : array[1..5] of real;    // массив
  summ: real;                 // сумма элементов
  sr:  real;                  // среднее арифметическое
  i: integer;                 // индекс
begin
  // ввод массива
  // считаем, что если ячейка пустая, то соответствующий
  // ей элемент массива равен нулю
  for i:= 1 to 5 do
     if Length(StringGrid1.Cells[i-1,0]) <> 0
        then a[i] := StrToFloat(StringGrid1.Cells[i-1,0])
        else a[i] := 0;

  // обработка массива
  summ := 0;
  for i :=1 to 5 do
      summ := summ + a[i];
  sr := summ / 5;

  // вывод результата
  Label2.Caption :=
              'Среднее арифметическое: ' + FloatToStr(sr);
end;

// Функция обеспечивает ввод в ячейку только допустимых символов
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
    case Key of
       #8,'0'..'9' :  ; // цифры и <Back Space>

       #13:      // клавиша <Enter>
            if StringGrid1.Col < StringGrid1.ColCount - 1
                   then StringGrid1.Col := StringGrid1.Col + 1;

       '.',',': // разделитель целой и дробной частей числа
                begin
                  if Key <> DecimalSeparator then
                       Key := DecimalSeparator; // заменим разделитель на допустимый
                  if Pos(StringGrid1.Cells[StringGrid1.Col,0],DecimalSeparator) <> 0
                        then Key := Chr(0); // запрет ввода второго разделителя
                end;

        '-':    // минус можно ввести только первым символом,
                // т.е. когда ячейка пустая
                if Length(StringGrid1.Cells[StringGrid1.Col,0]) <> 0
                      then Key := Chr(0);

        else   // остальные символы запрещены
               key := Chr(0);
    end;
end;

end.
Мне надо сделать, что бы среднее арифметическое считалось без учета минимального и максимального значения! И, что бы размер массива вводил пользователь! Помогите, пожалуйста!
И все равно я буду программистом!!!
Oksana11 вне форума Ответить с цитированием
Старый 26.12.2007, 15:18   #2
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Ввеcти размер массива можно так n:=strtoint(edit1.text).
Чтобы исключить из подсчета среднего максимальный и минимальный элементы, можно сначала отсортировать массив по возрастанию или убыванию, а затем подсчитать сумму в цикле for i:=2 to n-1;
puporev вне форума Ответить с цитированием
Старый 26.12.2007, 17:18   #3
Oksana11
Пользователь
 
Аватар для Oksana11
 
Регистрация: 21.12.2007
Сообщений: 21
По умолчанию

У меня не получается!
И все равно я буду программистом!!!
Oksana11 вне форума Ответить с цитированием
Старый 26.12.2007, 20:15   #4
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Вот немного переделал ваш код.
Добавил процедуру создания таблицы, сортировку и кое-чего по мелочам.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var n:integer;
begin
  n:=strtoint(edit1.text);  //создаем таблицу, куда будем заносить
  StringGrid1.ColCount:=1;  // исходные данные
  StringGrid1.RowCount:=n;
end;
// Функция обеспечивает ввод в ячейку только допустимых символов
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
    case Key of
       #8,'0'..'9' :  ; // цифры и <Back Space>

       #13:      // клавиша <Enter>
            if StringGrid1.Col < StringGrid1.ColCount - 1
                   then StringGrid1.Col := StringGrid1.Col + 1;

       '.',',': // разделитель целой и дробной частей числа
                begin
                  if Key <> DecimalSeparator then
                       Key := DecimalSeparator; // заменим разделитель на допустимый
                  if Pos(StringGrid1.Cells[StringGrid1.Col,0],DecimalSeparator) <> 0
                        then Key := Chr(0); // запрет ввода второго разделителя
                end;

        '-':    // минус можно ввести только первым символом,
                // т.е. когда ячейка пустая
                if Length(StringGrid1.Cells[StringGrid1.Col,0]) <> 0
                      then Key := Chr(0);

        else   // остальные символы запрещены
               key := Chr(0);
    end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
  a : array[1..50] of real;    // массив
  summ: real;                 // сумма элементов
  x,sr:  real;                  // буфер и среднее арифметическое
  n,i,j: integer;            //размерность массива,индексы
begin
  n:=strtoint(edit1.text); //размерность массива
  for i:= 1 to n do
  a[i]:=StrToFloat(StringGrid1.Cells[0,i-1]); //создаем массив из таблицы
  for i:=1 to n-1 do        //сортируем его методом "пузырька"
  for j:=1 to n-1 do         //по возрастанию
  if a[j]>a[j+1] then
      begin
         x:=a[j];a[j]:=a[j+1];a[j+1]:=x;
      end;
   // обработка массива
  summ := 0;
  for i :=2 to n-1 do
  summ := summ + a[i];
  sr := summ /(n-2);
    // вывод результата в форматированном виде
  edit2.text:='Среднее арифметическое: ' + FloatToStrF(sr,ffFixed,5,2);
end;
end.
puporev вне форума Ответить с цитированием
Старый 26.12.2007, 23:45   #5
Oksana11
Пользователь
 
Аватар для Oksana11
 
Регистрация: 21.12.2007
Сообщений: 21
По умолчанию

Спасибо! Попробую разобраться! ))))))))
И все равно я буду программистом!!!
Oksana11 вне форума Ответить с цитированием
Старый 27.12.2007, 01:12   #6
Oksana11
Пользователь
 
Аватар для Oksana11
 
Регистрация: 21.12.2007
Сообщений: 21
По умолчанию

Никак не могу блок-схему к этой задаче сделать! ((((( Может кто поможет?
И все равно я буду программистом!!!
Oksana11 вне форума Ответить с цитированием
Старый 27.12.2007, 12:53   #7
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Сегодня посмотрел весь код вашей программы, и увидел что в процедуре TForm1.StringGrid1KeyPress не работает клавиша Enter, из-за чего я и создал процедуру создания таблицы. Сегодня я прописал обработчик для этой клавиши, поэтому процедура создания таблицы не нужна.
В обработчике при нажатии клавиши Enter добавляется одна ячейка и с помощью процедуры keybd_event(40, 0, 0, 0) этой ячейке передается фокус ввода. Здесь 40 это код клавиши KeyDown(стрелка вниз), ноли - коды по умолчанию.
Как работает программа посмотрите во вложении.
Если никто не откликнется на вашу последнюю прсьбу, попробую вечером набросать схему.
Вложения
Тип файла: rar Oksana11.rar (193.1 Кб, 11 просмотров)
puporev вне форума Ответить с цитированием
Старый 27.12.2007, 21:00   #8
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Как обещал. Замечания по коду смотрите в личных сообщениях.
Еще там на форме порядок наведите.
Вложения
Тип файла: rar Блок-схема.rar (16.3 Кб, 8 просмотров)

Последний раз редактировалось puporev; 27.12.2007 в 21:07.
puporev вне форума Ответить с цитированием
Старый 27.12.2007, 23:00   #9
Oksana11
Пользователь
 
Аватар для Oksana11
 
Регистрация: 21.12.2007
Сообщений: 21
По умолчанию

СПАСИБО!!! )))))))
И все равно я буду программистом!!!
Oksana11 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите доделать Povar Паскаль, Turbo Pascal, PascalABC.NET 1 16.05.2008 14:43
Доделать проект на Delphi SNUPY Фриланс 3 06.05.2008 15:16
задача в delphi!!! помогите плииииз........ Absent Помощь студентам 2 05.03.2008 23:44
Работа с текстовым файлом (delphi). Помогите доделать программу. Snord Помощь студентам 1 14.12.2007 14:10