Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Скорая помощь для вашего компьютера. Программирование в среде Delphi 7. Циклы в Object Pascal


 Компьютерная помощь

   2012-02-03 07:06 

 Выпуск No 19. Скорая помощь для вашего компьютера. Программирование в среде Delphi 7. Циклы в Object Pascal

 

  Здравствуйте, уважаемые подписчики! В продолжении темы программирования на Delphi 7, сегодня затронем важную тему - организация циклов.

  В прошлый раз мы рассматривали написание программы "Записная книга". Теперь, в отличии от предыдущего урока, постараемся использовать уже более серьёзный подход в написании программ, будем использовать базы данных для хранения информации.

  По простому, база данных - это файл или несколько файлов, объединённых по какому-либо признаку, в котором (в которых) хранится некоторая информация в структурированном виде. Более подробно этот вопрос будем рассматривать далее в будущих выпусках рассылки, а пока что рассмотрим понятие цикла. Цикл в программировании - это набор операций, которые повторяются некоторое количество раз. Начнём с цикла for.

  Открываем среду разработки Delphi 7 и устанавливаем кнопку на форму. Но перед этим сделаем всё по правилам! Проект сохраним в новой рабочей папке, свойство Caption формы изменим в инспекторе объектов на "Примеры циклов". Название формы - значение свойства Name изменим с Form1 на FCicle. Сохраним файлы проекта.

  Первая кнопка понадобится нам для демонстрации работы цикла for.

Cреда программирования Delphi 7

  Кликаем один раз по кнопке в редакторе форм, тогда в "Инспекторе объектов" отобразятся свойства кнопки. Вообще, когда кликаем по компоненту на форме, в окне "Object Inspector" отображаются свойства выбранного компонента. Я, в качестве примера, изменяю свойство Font у кнопки, выделяя шрифт жирным и увеличивая его размер. потом справа от кнопки поставим компонент TEdit и, примыкающий к строке редактирования, компонент TUpDown, находящийся на вкладке Win32 палитры компонентов.

Компонент TUpDown на вкладке Win32 палитры компонентов

  Для экземпляра UpDown1 в свойстве Associate выбираем Edit1. Теперь, регулируя стрелками, мы можем изменять значение в строке редактирования. Обозначим, что это значение параметра цикла, поставив метку с соответствующей надписью над Edit1.

Заготовка формы для цикла for

  Делаем двойной щелчок мыши по кнопке Button1, и перед нами в окне кода появляется шаблон процедуры обработчика события нажатия на кнопку Button1Click. Начнём писать наш цикл. Пусть перед нами стоит задача посчитать сумму натурального ряда чисел от 1 до значения которое мы укажем в строке Edit1. Ниже представлен код.



procedure TFCicle.Button1Click(Sender: TObject);
Var
  i, S: Integer;
begin
  S := 0;
  for i := 1 to StrToInt(Edit1.Text) do
    S := S + i;

  ShowMessage(IntToStr(S));
end;

  Сперва определяем две локальные переменные (эти переменные используются только внутри события нажатия на кнопку). Переменная i - это счётчик цикла. Значение S - результирующая сумма, изначально, после объявления, имеет значение равное нулю. Всё-таки лучше иметь привычку сумму всегда обнулять. Затем в цикле, счётчик принимает последовательно значения 1, 2, 3 и т. д. до StrToInt(Edit1.Text). Здесь мы преобразовываем строковое значение, которое ввели в строке редактирования, в целочисленное значение, посредством функции StrToInt. Если целочисленному (integer) значению попытаться присвоить строковое значение, то возникнет ошибка компиляции, программа не запустится! Так вот, каждый раз в цикле присваивая последовательно значения счётчика i значению суммы S, мы получаем в итоге требуемый результат. Если в строку Edit1 поставить 1, то цикл выполнится 1 раз. А если поставить значение меньшее начальному значению счётчика, в данном случае это 1, то цикл вообще не выполнится. Ошибки не возникнет. Окончательно выводим результат с помощью процедуры ShowMessage. В качестве параметра в неё нужно передать строку, поэтому целочисленное значение переменной S преобразовываем в строку функцией IntToStr.

  У компонента TUpDown есть свойства Min и Max, определяющие минимальное и максимальное значение. По умолчанию это 0 и 100, можно изменить на своё усмотрение.

  Если мы введём в строку редактирования не число, а какой-либо символ, то будет выдана ошибка после нажатия на кнопку. Потому что в качестве параметра для функции StrToInt необходимо передавать целое значение. Чтобы оградить пользователя от этой ошибки, нужно просто не дать ему возможности вводить символы в эту строку с клавиатуры. Кликаем по строке Edit1, жмём F11, выбираем вкладку Events "Инспектора объектов", два раза кликаем на событии OnKeyPress - событии, когда нажата клавиша на клавиатуре. В этом событии у нас есть возможности обработать вводимый символ, изменить его значение. Пишем следующий код.

 

procedure TFCicle.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
   if not (Key in ['0'..'9', #8]) then
     Key := #0;
end;

  Переменная Key - это вводимый символ, его мы можем менять в зависимости от ситуации в нашем рассматриваемом событии. Нам нужно не пропускать все символы кроме цифр и клавиши стирания символа, которая имеет код #8. Здесь стоит поговорить о символьном типе данных Char. Именно такой тип имеет переменная Key. Символ в Delphi пишется в апострофах, напрмер, 'z'. Так же символ можно указать в виде его кода после значка решётки #. Символ 'z' можно указать так же в виде кода #122. Так вот, если Key не попадает в множество символов, состоящих из цифр и клавиши стирания, то мы присваиваем ей значение символа #0, это будет означать, что ничего не введено, ввод символа блокируется. Множества в Object Pascal указываются в квадратных скобках, например, множество латинских символов в нижнем регистре: ['a'..'z'], или через запятую несколько символов ['a', 'b', 'f', 'z']. Условие вхождения в множество обеспечивается оператором if переменная in [множество]. В нашем случае мы указали not - отрицание условия.

  Стоит понимать, что существуют ещё и вложенные циклы, которыми часто приходится пользоваться. И ещё, в рамках одного цикла может быть не одно действие, а несколько. В этом случае эти действия необходимо заключить между ключевыми словами begin и end.

  К примеру вот так:
  for i := 1 to n do
    begin
      Процедура1(i, набор параметров);
      for j := 1 to m do
        begin
          Процедура2(i, j, набор параметров);
          Процедура3(i, j, набор параметров);
        end
    end

  Перейдём к изучению других циклов. Цикл с пост-условием: repeat ... until (условие). И цикл с пред-условием: while(условие) do ...

Цикл с пост-условием

  Добавляем на форму ещё одну кнопку или копируем предыдущую при помощи сочетания клавиш Ctrl + C и Ctrl + V. В случае копирования все свойства для новой кнопки сохраняются, в частности останется тот же шрифт (свойство Font). Два раза кликаем на эту кнопку Button2 и вставляем в шаблон для события нажатия на кнопку следующий текст.


procedure TFCicle.Button2Click(Sender: TObject);
Var
  i, S: Integer;
begin
  S := 0;
  i := 0;
  Repeat
     Inc(i); //i := i + 1;
     S := S + i;
  Until i = StrToInt(Edit1.Text);

  ShowMessage(IntToStr(S));
end;

  Как работает этот цикл. Счётчик цикла мы вводим самостоятельно. Сумму и счётчик предварительно обнуляем. Далее увеличиваем счётчик i на 1 процедурой Inc(i), которая работает так же как и в случае такого присвоения: i := i + 1, но делается это немного быстрее. При малых значениях витков цикла это быстродействие "незаметно для глаза". Потом прибавляем к нашей сумме S новое значение счётчика i на каждом витке цикла, пока не будет выполнено условие, стоящее после ключевого слова Until, то есть пока значение i не станет равным введённому в строку редактирования.

  Для этого случая стоит отметить, что если оставить нулевое значение в строке значения параметра цикла, то на первом шаге цикла наш счётчик уже станет равным 1 и условие i = StrToInt(Edit1.Text); не будет выполнено никогда, программа зависнет! Поэтому поставим условие. Пусть наш цикл будет выполняться только если значение параметра цикла больше нуля.


procedure TFCicle.Button2Click(Sender: TObject);
Var
  i, S: Integer;
begin
  S := 0;
  i := 0;
  if StrToInt(Edit1.Text) > i then
    Repeat
       Inc(i); //i := i + 1;
       S := S + i;
    Until i = StrToInt(Edit1.Text);

  ShowMessage(IntToStr(S));
end;

Цикл с пред-условием

  Разместим ещё кнопку на форме.

Окончательный вариант формы

 Два раза кликаем на кнопку Button3 и вставляем в шаблон для работы с циклом while.


procedure TFCicle.Button3Click(Sender: TObject);
Var
  i, S: Integer;
begin
  S := 0;
  i := 0;
  while i < StrToInt(Edit1.Text) do
    begin
       Inc(i); //i := i + 1;
       S := S + i;
    end;

  ShowMessage(IntToStr(S));
end;

  Цикл выполняется, пока выполняется условие i < StrToInt(Edit1.Text), и это условие проверяется в самом начале цикла! Тело цикла (набор действий внутри цикла) располагается между ключевыми словами begin и end.

  Архив с файлами проекта можно скачать в конце статьи.



WWW: http://yerkhov.narod.ru/

E-mail: yerkhov@yandex.ru

Copyright (C) 2010-2011 СКОРАЯ ПОМОЩЬ для ВАШЕГО КОМПЬЮТЕРА

Перепечатка любых материалов разрешена только при сохранении авторства и размещении активной ссылки на наш сайт.

Отправляя письма, Вы соглашаетесь с тем, что они могут быть опубликованы в рассылке.

--

 С уважением к Вам, Игорь.

 

 


В избранное