"Три в одном" — пример решения задачи в Turbo Pascal, Delphi и Flash

Разделы: Информатика


“Три в одной” – пример решения задачи в Turbo Pascal, Delphi и Flash (Action Script)

Организация в программе разветвлений

Данный урок рассчитан на тех, кто уже знаком с азами программирования и имеет элементарные навыки работы в программной среде Turbo Pascal (v7.1), Delphi (v6 или v7) и Flash (v5 или MX) . Урок будет сопровождаться лирическими отступлениями в виде справочного материала по программированию. Я очень надеюсь, что этот урок, позволит Вам в последующем самостоятельно решать задачи, в которых требуется организовать ветвящуюся структуру.

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

Для практического исследования организации разветвлений возьмём очень простую с точки зрения физики задачу:

Условие задачи: Развивая предельно возможную скорость своего движения, жираф пробегает за 23 с 335,8 м. Заяц пробегает за 55 с 918,5 м. Кому из этих животных вы присвоите звание чемпиона, сопоставляя их скорости?

Решение задачи сводится к расчёту скорости животных и их последующему сравнению.

Представим алгоритм решения задачи в виде блок-схемы.

Рис. 1

Обратите внимание, что в ходе реализации решения задачи в Delphi и Flash мы сделаем ветвящуюся структуру более сложной, а именно будем анализировать содержимое полей ввода. Может быть, пользователь не заполнил какое-то поле и тщетно нажимает кнопочку расчётов? Может быть, введённые им данные не являются числами?

Действие первое: Turbo Pascal v7.1

Обратите внимание на вложенную структуру оператора. Справочный материал по программированию в Turbo Pascal позволит Вам разобраться с текстом программы самостоятельно.

program champion;
uses crt;
var s1,s2,t1,t2,v1,v2:real;
begin
clrscr;
writeln ('Введите показатели жирафа s1, t1'); readln (s1,t1);
writeln ('Введите показатели зайца s2, t2'); readln (s2,t2);
v1:=s1/t1; v2:=s2/t2;
if v1=v2 then
   begin textcolor (10); writeln ('Победила дружба'); end
else if v1>v2 then
   begin textcolor (14); writeln ('Жираф чемпион'); end
else
   begin textcolor (9); writeln ('Заяц чемпион'); end;
repeat until keypressed;
end.

Справка по программированию. Turbo Pascal v7.1:

Общий формат оператора:

if <условие> then <оператор> [else <оператор>]

Квадратные скобки говорят нам о том, что служебное слово else может быть упущено. Различают полную и неполную форму оператора.

Общий формат оператора (полная форма):

if <условие> then <оператор>
  else <оператор>

Как работает эта конструкция? Выполняется оператор if, т. е. проверяется условие. Условие может быть истинным (true) или ложным (false). Если условие истинно (true), то выполняется оператор, следующий за служебным словом then. Если условие ложно (false), то оператор, следующий за then, игнорируется и программа переходит к выполнению оператора следующего за служебным словом else.

Для того, чтобы записать группу действий после служебных слов then или else, необходимо использовать составной оператор – begin end (операторные скобки).

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

Внимание! Перед словом else нельзя ставить точку с запятой. Обратите внимание на запись служебных слов и операторов. Каждое слово else под своим, словом if. Для большей наглядности и “читаемости” текста программы операторы, следующие за словами then и else, можно писать на следующей строке.

Общий формат оператора (краткая форма):

Упущено служебное слово else.

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

Как работает эта конструкция? Выполняется оператор if, проверяется условие. Если условие истинно (true), то выполняется оператор, следующий за служебным словом then, а затем продолжается выполнение программы. Если условие ложно (false), то оператор, следующий за then, игнорируется и программа продолжает свою работу.

Общий формат оператора (вложенная форма):

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

Как работает эта конструкция? Выполняется оператор if, проверяется условие. Если условие истинно (true), то выполняются операторы, следующие за служебным словом then, и заключённые в операторные скобки begin и end. Если условие ложно (false), то блок операторов, следующий за then, игнорируется и программа переходит к следующему оператору if, расположенному за служебным словом else. Если это условие оказывается истинным (true), то выполняется оператор, следующий за служебным словом then… Вложенность операторов неограниченна!

Обратите внимание, что после “закрывающей скобки” end точки с запятой нет!

Действие второе: Delhi 7.0. “Волшебство перевоплощения”

Запустим Delphi и сохраним на диске рабочие файлы. Откроем закладку Standard и приступим к работе. Для создания программы мы будем использовать готовые компоненты Delphi – классы, размещённые на этой закладке: 1) Класс Label ; 2) Класс Edit; 3) Класс Panel; 4) Класс Button.

Рис. 2

Класс Label – используем для нанесения надписей, поясняющего текста непосредственно на форму (статический текст). Разместив объект на форме изменяем его свойство Caption для нанесения на форму нужного нам текста.

Класс Edit – поле (строка) ввода. Заголовка (свойства Caption ) у этого компонента нет, но есть свойство Text, определяющее содержимое строки. В нашей программе эти поля будут пусты. Очистите их в Инспекторе объектов (Object Inspector). Очень важно прописать полям ввода имена, для того чтобы в последующем программа знала, где ей найти данные для решения задачи – свойство Name. В данной программе:

s1 – поле для ввода длины пробега жирафа;
t1 – поле ввода времени пробега жирафа;
s2 – поле для ввода длины пробега зайца;
t2 – поле ввода времени пробега зайца.

Класс Panel – панель может служить для отображения текста (у неё есть свойство Caption). В нашей программе использованы три панели. Опять таки очень важно прописать панелям имена, чтобы программа знала, куда ей разместить результаты расчётов и анализа – свойство Name . В данной программе:

v1 – скорость жирафа;
v2 – скорость зайца;
zvan – результат соревнований (присвоенное звание).

Для того, чтобы панели были внешне идентичны полям ввода в Инспекторе объектов (Object Inspector), задайте им следующие свойства:

BevelInner – bvLowered.
BevelOuter – bvLowered.
Color – clWhite.

И не забудьте очистить содержимое панелей. Как и поля ввода, панели должны быть пусты до тех пор, пока программа не осуществит расчёты и не выведет на них результаты.

Класс Button – класс “Командная кнопка”. При нажатии такой кнопки выполняется некоторое действие, описанное в процедуре. В нашей программе будут работать две кнопки: Кнопка расчётов и анализа и Кнопка, позволяющая очистить поля ввода и вывода. Следовательно, наша с Вами задача сводится к тому чтобы, разместив на форме все нужные нам объекты, прописать кнопкам процедуры.

Двойной щелчок по кнопке, размещённой на форме, позволит нам оказаться внутри заготовки процедуры.

Процедура Кнопки расчётов и анализа:

procedure TForm1.Button1Click(Sender: TObject);
var s1,t1,s2,t2,v1,v2:real;
code: integer;
S,v1S,v2S: string;
begin
if (Form1.s1.Text='') or (Form1.t1.Text='')
or (Form1.s2.Text='') or (Form1.t2.Text='')
  then Form1.zvan.Caption:='Не все поля ввода заполнены!'
  else
   begin
    Val (Form1.s1.Text, s1, code);
    Val (Form1.t1.Text, t1, code);
    Val (Form1.s2.Text, s2, code);
    Val (Form1.t2.Text, t2, code);
    v1:=s1/t1; v2:=s2/t2;
    Str (v1:9:3, v1S);
    Str (v2:9:3, v2S);
    Form1.v1.Caption:=v1S;
    Form1.v2.Caption:=v2S;
    if v1=v2 then S:='Победила дружба!!!'
      else if v1>v2 then S:='Жираф чемпион!'
             else S:=' Заяц чемпион!';
     Form1.zvan.Caption:=S;
   end;
end;

Процедура Кнопки очистки полей ввода и вывода:

procedure TForm1.Button2Click(Sender: TObject);
begin
Form1.s1.Text:='';
Form1.t1.Text:='';
Form1.s2.Text:='';
Form1.t2.Text:='';
Form1.v1.Caption:='';
Form1.v2.Caption:='';
Form1.zvan.Caption:='';
end;

Обратите внимание на то что “вручную” Вы прописываете только процедуры для кнопок. Разделы uses, type… Delphi создаёт сам, отслеживая Ваши действия. Сплошное удовольствие, а не работа!

Справка по программированию. Delphi 7:

Str (a, st) – преобразует число любого вещественного или целого типов в строку символов: a – числовая переменная; st – строка символов.

Val (st, a, code) – преобразует строку, содержащую цифры, в число вещественное или целое: st – строка; a – числовая переменная; code – переменная целого типа, по значению которой можно определить, успешно или нет прошёл перевод. Если перевод символов в число прошёл успешно, значение переменной code равно 0.

Очень короткая справка, ведь перед нами всё тот же Turbo Pascal, просто изменились некоторые принципы работы. В Delphi требуется точно указать месторасположение объекта, а также указать свойство которое будет изменено. Например,

procedure TForm1.Button2Click(Sender: TObject);
begin
Form1.v1.Caption:='';
end;

В этих строках указывается, что на форме Form1 “проживает” объект с именем v2 (это панель) у которого свойство Caption должно быть очищено при нажатии кнопочки Button2 “проживающей” на этой же форме Form1.

PS: Смелее переходите к объектно-ориентированному программированию, здесь всё гораздо эффектней и проще!

Действие третье: Macromedia Flash MX (язык Action Script)

Работа в этой среде представляется мне наиболее комфортной и очень доступной, а значит наиболее подходящей для организации уроков программирования в школе.

Можно рисовать самим: кисточками, карандашами, использовать эффектные градиентные заливки для имитации трёхмерности объекта, совершенно непредсказуемо искажать текст, можно импортировать в Ваш ролик растровую графику и, если есть желание, преобразовать её в векторную.

Используя инструменты векторной графики, можно реализовать в редакторе сложную чертёжную работу. Всю эту красоту можно заставить двигаться – анимировать. И это не только сюжетная мультипликация. Можно представить в виде мультфильма решение геометрической или физической задачи, создать калькулятор который наряду с расчётами будет ещё и рисовать графики функций, можно создать свою игру с несколькими уровнями сложности, свой музыкальный редактор, свой сайт… Возможности Flash ограничены только фантазией пользователя и программиста. Это необозримое поле для детского, да и для нашего с Вами взрослого творчества!

Хвалебная песнь спета. Теперь переходим к рутинной работе и реализуем решение задачи, используя технологию Macromedia Flash.

Итак, всё по порядку:

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

Рис.3

Работу со статическим текстом (Static Text) мы упустим. Будьте очень внимательны при работе с текстовыми блоками, заполняемыми пользователем (Input Text) и динамическими полями (Dynamic Text ) в которые программа будет вписывать те данные, которые она обсчитает в ходе своего выполнения. Каждому полю Вы должны присвоить уникальное имя. В данном уроке эти имена следующие:

Input Text

Данные жирафа: Длина пробега – s1; Время движения – t1;

Данные зайца: Длина пробега – s2; Время движения – t2;

Dynamic Text
Скорость жирафа – v1;
Скорость зайца – v2;
Результат соревнований – zvan.

Итак, мы определились с тем, куда пользователь будет вводить данные, и куда программа будет выводить результаты расчетов и анализа. Осталось комфортно разместить на сцене кнопочки и заставить их работать.

Кнопочке для расчётов пропишем акцию:

on (release) {
if (s1=="" or t1=="" or s2=="" or t2=="" or isNaN(s1)==true or isNaN(t1)==true or isNaN(s2)==true or isNaN(t2)==true) {
zvan = "Нет данных!";
v1 = "";
v2 = "";
} else if (Number(t1)<=0 or Number (t2)<=0 or Number(s1)<=0 or Number(s2)<=0) {
zvan = "Среди данных есть нули или отрицательные числа!";
v1 = "";
v2 = "";
} else {
v1 = Number(s1)/Number(t1);
v2 = Number(s2)/Number(t2);
if (v1==v2) {
zvan = "Победила дружба!";
} else if (v1>v2) {
zvan = "Жираф чемпион!";
} else {
zvan = "Заяц чемпион!";
}
}
}

Обратите внимание, что разветвление программы начинается с того момента, когда мы с Вами начинаем анализировать содержимое полей ввода. Например, в том случае, если хотя бы одно из полей ввода осталось незаполненным, программа в разделе Результат соревнований, в динамическом поле c именем zvan выдаст сообщение: “Недостаточно данных”, ну а два других динамических поля (v1 и v2), судя по тексту программы, будут в этой ситуации просто скромненько помалкивать. Впрочем, Вы можете позволить себе смелый эксперимент и организовать работу программы таким образом, чтобы эти поля не “молчали”, а работали при условии, конечно, что нужные им данные будут всё-таки введены пользователем. Например, показатели жирафа были введены, и в поле v1 программа вывела рассчитанную скорость, а вот зайца “обидели”, и поле с именем v2 не просто промолчало, а ещё и “обиделось”, эту обиду можно представить в виде вопросительного знака.

Рис. 4

Если пользователь правильно заполнил поля ввода, то программа попадает на 11 строку акции, где скорости рассчитываются, а затем анализируются. Обратите внимание на вложенность оператора if. Проведите эксперимент, для того, чтобы убедиться в том, что созданная Вами структура представляет собой единое целое. Для этого встаньте на 2 строку и щёлкните по кнопочке со знаком минус. В акции останутся целыми и невредимыми только первые две строки!

Кнопочке для очистки полей ввода и вывода пропишем акцию:

on (release) {
s1 = "";
s2 = "";
t1 = "";
t2 = "";
v1 = "";
v2 = "";
zvan = "";
}

Эти строки без комментариев.

Теперь остаётся обсчитать ролик и полюбоваться полученным результатом.

Справка по программированию. Action Script (Macromedia Flash MX):

Общий формат оператора (краткая форма):

if (condition) {
statement(s);
}

Как работает эта конструкция? Условие (condition) – логическое высказывание, которое может быть истинным (true) или ложным (false) . Например, if (name == "Best"), этот оператор просматривает содержимое переменной с именем name и сравнивает её значение со строкой "Best". В том случае, если содержимое переменной соответствует содержимому строки, то есть высказывание истинно (true), программа переходит к выполнению инструкции или серии инструкций (statement(s)), записанных в фигурных скобках. Инструкции разделяются точкой с запятой. Впрочем, если Вы работаете в Нормальном режиме (Normal Mode), то Flash обо всём этом позаботится сам.

Общий формат оператора (полная форма):

if (condition) {
statement(s);
}
else {
statement(s);
}

Как работает эта конструкция? В том случае, если высказывание, указанное в if оказывается ложным (false), то управление переходит к пятой строке – это альтернативная инструкция или серия инструкций.

Общий формат оператора (вложенная форма):

if (condition) {
statement(s);
} else if (condition) {
statement(s);
}

Как работает эта конструкция? В том случае если высказывание, указанное в if оказывается истинным (true), то управление переходит ко второй строке – выполняются инструкции, заключённые во внутренние фигурные скобки. В том случае если высказывание, указанное в if оказывается ложным (false), то программа пропускает инструкции, записанные во внутренних фигурных скобках, и передаёт управление третьей строке, в которой мы видим ещё одно логическое высказывание. Если это высказывание оказывается истинным (true), то программа переходит к выполнению инструкций, записанных на пятой строке… Вложенность операторов неограниченна!

PS: Обратите внимание, что рабочую версию программы, выполненной в редакторе Flash, Вы можете разместить на своей web-страничке, как это сделано в этом уроке. Размер файла тоже впечатляет - всего 15 KB, а если поскромничать и убрать кнопочку в виде капельки, убрать некоторые комментарии, уменьшить размер сцены то файл “похудеет” до 4 KB. Это ещё одно неоспоримое преимущество Flash - технологий. Времена статического Интернета отошли в прошлое, будущее за динамическим интерактивным Интернетом!

12.11.2003