Введение в программирование на Delphi

Управляющая конструкция if, цикл for

Показывать лекцию целиком

Строковые типы данных

Мы уже работали со строковым типом данных String. Однако, как и в случае с цифрами, бывает несколько строковых типов. Строка состоит из набора символов. Компьютер работает в двоичной системе исчисления, он работает только с цифрами. И символы компьютер воспринимает в виде цифр. Для этого в операционной системе существует таблица символов, где каждому символу соответствует какая либо цифра.

Самая первая таблица символов, созданная для операционной системы MS-DOS, называлась ASCII. Эти символы были 7-ми битными, как следствие, таблица содержала максимум 128 символов. Поскольку в одном байте содержится 8 бит, один бит терялся впустую. У этой таблицы были свои языковые расширения, то есть, для каждого языка делалась своя такая таблица.

Для операционной системы Windows была разработана таблица символов ANSI, которая используется по сей день. Эта таблица использует 8-ми битные символы, то есть, содержит 256 символов, от 0 до 255. В Delphi такая таблица используется, как основная. Большее количество символов позволило вставить в таблицу не только основные символы, но и цифры, знаки препинания, специальные символы. Мы будем работать, в основном, с этой таблицей.

Для того, чтобы удовлетворить потребности пользователей других языков, была создана таблица UNICODE. Эта таблица использует 16 бит, и в нее помещается от 0 до 65 535 символов. Эта таблица, начиная с Windows 2000, используется все более широко, и когда-нибудь станет стандартом, но пока что она встречается гораздо реже, чем ANSI.

Имеются следующие строковые типы данных:

ShortStringкороткая строка из ANSI символов. Количество символов может быть от 0 до 255. Иными словами, строку длиной более 255 символов в ShortString записать нельзя.

LongStringдлинная строка из ANSI символов. Длина строки здесь почти не ограничена, в одну переменную такого типа можно записать текстовый файл с романом "Война и мир". Этот тип используется по умолчанию, то есть, когда мы указываем тип String, подразумевается именно этот тип данных. С ним нам чаще всего и придется работать.

WideStringдлинная строка из UNICODE символов. От LongString отличается только тем, что использует иную таблицу символов.

Существует еще один тип строк – PChar. Этот тип работает с процессором совершенно иначе, чем предыдущие типы строк. Он очень неудобен в использовании и остался для совместимости с программами старых версий. Кроме того, встроенные в Windows функции работают именно с таким типом данных, поэтому его все же придется использовать. Когда мы начнем работать с этими функциями, разберем этот тип подробней.

Символьные типы данных

Программисту приходится работать не только со строками, но и с отдельными символами. Символ – это любая буква, цифра, арифметический знак, знаки препинания или пробел. Кроме того, существуют специальные символы, например, символ перехода на новую строку. Delphi поддерживает два типа символьных данных:

AnsiCharсимвол ANSI таблицы. Используется по умолчанию, то есть, когда мы указываем тип Char, подразумеваем именно этот тип.

WideCharсимвол UNICODE таблицы. Разница между ними такая же, как и у строк этих типов.

Как и в случае со строками, программист обычно объявляет тип Char, что соответствует типу AnsiChar.

Логический тип данных

Логический тип данных используется в условных выражениях. Он необходим для создания логики программы. Условное выражение проверяет – соответствует ли действительность заданному условию? Если соответствует, то выражение возвращает результат True (Истина). Если не соответствует, то возвращается False (Ложь). Таким образом, логический тип данных может иметь только одно из двух этих значений.

Booleanлогический тип данных.

В таблице 4.1 приведены операнды, с помощью которых формируют логические выражения:

Логические операнды
Логическая операция Описание Логическая операция Описание
= Равно >= Больше или равно
> Больше <= Меньше или равно
< Меньше <> Не равно
== Точное равно

Предположим, у нас есть два числа, и нужно проверить их на равенство. Эти числа хранятся в переменных целого типа a и b. Тогда выражение сравнения будет выглядеть так:

a = b;

Если в обоих переменных хранится одно и то же значение, то результатом такого сравнения будет True, иначе – False.

Begin .. end

В языке программирования Delphi, как и в других языках, существуют программные скобки, показывающие начало и конец какого-либо блока кода. Эти скобки имеют вид

Begin
   //блок кода
end;

Обратите внимание, что после слова Begin точка с запятой не ставится. Эти программные скобки обязательны для каждой процедуры или функции, даже если они содержат только одну команду. Однако эти же скобки часто применяются в управляющих конструкциях или циклах. Циклы, как и управляющие конструкции, работают только с одним оператором (командой). А что, если в этом месте требуется использовать более одного оператора? Тут на помощь приходят эти самые программные скобки. Весь блок кода, сколько бы команд там не было, заключенный между Begin и End воспринимается, как один оператор. Мы не раз будем использовать эти скобки.

Управляющая конструкция if

В предыдущих примерах нам уже приходилось применять эту конструкцию на практике, теперь пришло время познакомиться с ней поближе. Управляющая конструкция if является основной конструкцией, на которой строится логика программы. Простейший синтаксис этой конструкции выглядит так:

if условие then оператор;

Кто знаком с английским языком, уже ухватил суть этой конструкции. На русский язык это выражение можно перевести так:

если условие то оператор;

Другими словами, если какое-то заданное условие верно, то выполняется указанный оператор. Иначе этот оператор не выполняется.

Часто одного оператора бывает недостаточно, тогда используют программные скобки:

if условие then begin
   Оператор 1;
   Оператор 2;
   ...
   Оператор n;
end;

Операторы, заключенные в программные скобки begin .. end воспринимаются, как единый оператор. Иногда и этого бывает недостаточно. Что, если по логике программы требуется выполнить один оператор, если условие верно, и другой, если оно неверно? Тут приходит на помощь расширенная конструкция:

if условие then оператор 1
else оператор2;

Как видно из синтаксиса, если указанное условие истинно, то выполнится оператор 1. Иначе выполнится оператор 2. Еще одно правило, которое следует запомнить: перед словом else точка с запятой не ставится!

Конечно же, с помощью программных скобок можно расширить и эту конструкцию:

if условие then begin
   Оператор 1;
   …
   Оператор n;
end 
else begin
   Оператор 1;
   …
   Оператор n;
end;

Сейчас самое время упомянуть о классических стилях программирования. Мы уже говорили, что хороший стиль программирования подразумевает каждый отдельный оператор писать на своей строке, применять отступы. В литературе по программированию часто встречается два классических стиля. Один стиль выглядит так:

if условие then 
begin
   Оператор 1;
   …
   Оператор n;
end;

То есть, слово begin пишется на отдельной строке. Другой стиль выглядит иначе:

if условие then begin
   Оператор 1;
   …
   Оператор n;
end;

Оба эти стиля являются классическими, какой из них применять – дело вкуса. На этой лекции будет использоваться второй стиль.

Однако и это еще не все. В предыдущем примере мы рассматривали только одно условие. Если оно верно, то выполнялся один оператор, а если нет – другой. А что, если по логике программы требуется проверить более, чем одно условие? И снова мы можем расширить эту конструкцию. Взгляните на синтаксис:

if условие 1 then оператор 1
else if условие 2 then оператор 2
else оператор 3;

Здесь, если условие 1 будет верно, конструкция выполняет оператор 1 и завершает работу. Если это условие неверно, проверяется условие 2. Если условие 2 верно, то выполняется оператор 2, и конструкция завершает работу. Если же оба условия неверны, выполняется оператор 3. Расширений else if в такую конструкцию можно вставлять сколько угодно.

Давайте теперь проанализируем часть кода из примера прошлой лекции.

If Perem2 = 0 then begin
    Soobshenie;
    Edit3.Text := '0';
  end
  else begin
    Perem3 := Delenie(Perem1, Perem2);
    Edit3.Text := FloatToStr(Perem3);
  end;

Вам уже должно быть понятно, что если Perem2 действительно равна 0, то выполнится первый блок кода. Иначе будет выполнен второй блок кода.

Цикл for

Еще один мощный инструмент в Delphi – циклы. Эти циклы выполняют оператор или блок операторов заданное количество раз. Синтаксис цикла for следующий:

for счетчик := нач_значение to кон_значение do оператор;

В расширенном варианте синтаксис такой:

for счетчик := нач_значение to кон_значение do begin
   оператор 1;
   оператор 2;
   …
   оператор n;
end;

Здесь:

  • счетчик – переменная любого целого типа;
  • нач_значение – начальное значение счетчика;
  • кон_значение – конечное значение счетчика.
  • В качестве счетчиков используют обычно целые переменные. Чтобы не тратить попусту оперативную память, счетчикам назначают тип Byte или Word, в зависимости от того, какое значение может оказаться у конечного значения.

    В самом начале счетчик будет равен начальному значению. Когда выполнятся все указанные операторы блока, управление вновь вернется к началу цикла. Счетчик увеличится на единицу, и цикл будет выполнен снова. И так далее, до тех пор, пока счетчик не станет равным конечному значению.

    Давайте изучим цикл for на примере. Пусть нам нужно перевести температуру от 0 до 100 градусов из шкалы Цельсия в шкалу Фаренгейта. Правила здесь просты: нужно взять температуру по Цельсию, умножить ее на 9/5 и к результату прибавить 32. Сам результат нужно будет программно добавить в компонент Memo в виде строки:

    "x градусов по Цельсию = y градусов по Фаренгейту"

    Создайте новое приложение.

    Сразу же свойству Name формы присвойте имя fName. В свойстве Caption напишите "Перевод температур из Цельсия в Фаренгейты". Сохраните проект в новую папку.

    В верхнюю часть окна поместите компонент Memo и в свойстве Lines удалите из него весь текст. Растяните Memo по форме, как на рисунке 4.1:

    (рис 4.1) Внешний вид приложения

    Ниже Memo добавьте кнопку Button, в свойстве Caption которой укажите "Расчет температур".

    Теперь создадим обработчик нажатия на кнопку, дважды щелкнув по ней. Процедура выглядит так:

    procedure TfName.Button1Click(Sender: TObject);
    var
       i : Byte; //счетчик
    begin
       for i := 0 to 100 do //делаем от 0 до 100
         Memo1.Lines.Add(IntToStr(i) + ' градусов Цельсия = ' +
           FloatToStr(CelToFar(i)) + ' Фаренгейта');
    end;

    Здесь следует обратить внимание на последний оператор. Оператор

    Memo1.Lines.Add('Строка');

    добавляет строку 'Строка' в компонент Memo. При этом, в качестве строки, мы использовали сложное выражение, формирующее строку из разных частей. Разберем каждую часть подробно.

    IntToStr(i)

    в качестве результата вернет значение i (счетчика) в виде строки. Как уже говорилось, это значение за каждый проход цикла будет увеличиваться на единицу. То есть, в первом проходе i будет равна 0, во втором 1, и так далее, пока не станет равна 100. Выполнив оператор в последний раз, цикл прекратит свою работу. А мы каждый раз будем получать это число в виде строки.

    Далее у нас идет строка

    ' градусов Цельсия = '

    С помощью знака "+" (знак конкатенации) мы добавляем одну строку к другой. В результате, при первом проходе мы получим строку

    '0 градусов Цельсия = '

    Обратите внимание, что во второй строке в начале и в конце есть пробелы. Без пробела строки сольются: "0градусов Цельсия =", а это некрасиво.

    Далее мы имеем строку

    FloatToStr(CelToFar(i))

    Функция FloatToStr() возвращает вещественное число в виде строки. В качестве вещественного числа мы использовали вызов функции CelToFar(i), передав ей в качестве параметра целое число – текущее значение счетчика. Функция использует это число, как градус Цельсия, преобразует его в Фаренгейт и вернет значение в виде вещественного числа. Этой функции пока еще не существует, мы напишем ее позже. В результате мы получим строку "0 градусов Цельсия = 32". Далее мы добавляем еще строку

    ' Фаренгейта'

    в результате чего получаем готовую строку "0 градусов Цельсия = 32 Фаренгейта". И уже готовую строку с помощью метода Add() мы добавляем в компонент Memo.

    Еще одно правило, которое можно увидеть из этого примера – если оператор получается длинным, его можно перенести на следующую строку после арифметического знака или запятой.

    Функцию CelToFar() нужно будет создать выше нашей процедуры:

    function CelToFar(a : Byte): Real;
    begin
       Result := a * 9/5 + 32;
    end;

    Функция принимает параметр в виде целого числа, переводит его в Фаренгейты и возвращает в качестве результата, как вещественное число. Наша программа готова. Сохраните ее, скомпилируйте и посмотрите, как она работает. Если у вас не умещается весь полученный текст в Memo, добавьте в компонент вертикальную полосу прокрутки.

    Вернуться к учебному плану