Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PM_02_09_02_04_UP_02.---osnovy-algoritmizacii-i-programmirovanija-artyuhina-korenkova — копия.doc
Скачиваний:
45
Добавлен:
09.12.2018
Размер:
3.37 Mб
Скачать

4 Часть

Поиск данных и сортировка выполняются по индексным полям. В телефонном справочнике чаще ищут информацию по номеру телефона или фамилии. В таблице Справочник для полей Фамилия и Телефон свойство Индексированное поле имеет значение Да(допускаются совпадения).

  1. Добавить в меню пункт Сортировка и подпункты По телефону, по Фамилии

  2. для подпунктов ввести соответствующий код:

DataModule1.BookTable.IndexFieldMNames:=’Фамилия’;

DataModule1.BookTable.IndexFieldMNames:=’Телефон’;

  1. Реализовать функцию поиска данных, для этого:

  • добавить на форму панель, на нее метку Найти и TEdit с именем FindEdit

  • ввести следующий код:

procedure TForm1.FindEditChange(Sender:TObject);

begin

if Length(FindEdit.Text)>0 then

DataModule1.BookTable.Filtered:=true

Else DataModule1.BookTable.Filtered:=false;

DataModule1.BookTable.Filter:=’Фамилия>’’’+FindEdit.Text+’’’’;

end;

  1. Проверить работу программы.

Фильтры в ADO работают плохо, но в Delphi можно расширить возможности фильтрации.

  1. Перейти в модуль DataModule1, для компонента BookTable выбрать событие OnFilterRecord и ввести код:

Accept:=false;

if copy(BookTableDSDesigner.AsString,1,Length(Form1.FindEdit.Text))=Form1.FINDedit.Text then

Accept:=true; {строка соответствует фильтру, ее можно отображать}

end;

  1. Проверить работу программы.

Дополнительные задания

Часть 1

Задание 1. Оператор выбора (альтернатива)

Наша жизнь полна неожиданностей и условностей. Каждый день приходится решать тысячи мелких задач, делая выбор. Реальная задача – переход улицы, на которой работает светофор.

Вот как выглядит эта задача на языке блок-схем:

Group 59

Рис.24. Алгоритм задачи

На естественном языке такая конструкция выглядит так:

Если горит зелёный, то иду, иначе стою.

Или, в общем виде:

Если <условие>

то <ветвь «Да»>

иначе <ветвь «нет»>

А оператор называется Если…то… иначе….

На языке программирования этот оператор звучит следующим образом:

IF…THEN…ELSE….

IF <условие>

THEN <ветвь «Да»>

ELSE <ветвь «Нет»>

А поскольку в любой ветви может быть не один, а несколько шагов, то их необходимо оформить в виде отдельной подпрограммы (записать между begin и end), т.е.

I

Если горит зелёный

То

Begin

иди

End

ELSE

Begin

стой

End

F <условие>

THEN

Begin

<ветвь «Да»>

End

ELSE

Begin

<ветвь «нет»>

End

1) Составьте блок-схему анекдота:

Председатель колхоза пришел на ферму и спрашивает коров:

– Ну, что будем сдавать, молоко или мясо?

Примечание: Вопрос нужно задавать так, чтобы на него можно было бы ответить «Да» или «нет»

2) Составьте блок-схему следующей ситуации:

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

3) Создать тест

  1. Запустите Delphi.

  2. Сделайте вашу форму, как показано на рисунке:

Рис.25. Форма приложения

Рис.26. Форма приложения

  1. Обратите внимание, слова в компонентах Label располагаются не в одной, а в нескольких строчках. Прежде, чем набирать текст, свойство WordWrap сделайте равным True.

Как должна работать программа? Пользователь выбирает ответ из предложенных, затем нажимает кнопку Проверить. Программа проверяет, правильно ли выбраны ответы. Если дан правильный ответ - выводим ответ Верно и отключаем кнопку «Проверка», если неверно - соответствующий ответ и даем возможность продолжить тест.

Значит, программировать необходимо кнопку Проверить.

  1. Дважды щелкните на кнопке Проверить. Открылось окно редактора кода.

  2. Пишем код:

Код

Пояснения

procedure TForm1.Button1Click(Sender: TObject);

begin

if radioButton3.Checked

then

Begin

label1.Caption:='Верно';

button1.Enabled:=False;

End

else

begin

label1.Caption:=' Ошибка ';

End;

end;

Процедура Щелчка кнопки Проверить.

Начало процедуры

Если выбрана 3-я радиокнопка

То

Begin

Вывести надпись «Верно»

Отключить кнопку Проверка

End

Иначе

Begin

Вывести надпись «Ошибка»

End;

Конец процедуры.

Разберите внимательно этот код, этот оператор один из наиболее употребляемых.

Для этого оператора есть правило: если между begin…end стоит один оператор, то строки begin…end можно опустить. В нашем случае, по ветви «ДА» - 2 оператора, по ветви «НЕТ»- 1 оператор, следовательно, во втором случае begin…end можно убрать. И тогда код будет выглядеть следующим образом:

procedure TForm1.Button1Click(Sender: TObject);

begin

if radioButton3.Checked

then

Begin

label1.Caption:='Верно';

button1.Enabled:=False;

End

else

label1.Caption:=' Ошибка';

end;

Самостоятельно:

1. Сделайте тест, состоящий из трех вопросов, например, такой:

Рис.27. Форма теста

Задание 2. Создание пароля. Счетчик. Введение переменных.

Необходимо создать программу-пароль. Она будет работать следующим образом: При загрузке программа попросит ввести пароль, если Вы введете пароль правильно, программа напишет «Добро пожаловать», если пароль неверен- ответ будет «Посторонним вход воспрещен».

  1. Итак, открывайте Delphi или создавайте новый проект.

Для данной программы нам потребуются следующие элементы: компонент Label (для вывода надписей на экран), компонент Edit (для ввода пароля), 2 кнопки (подтвердить ввод и выход).

  1. Поместите данные элементы на форму:

Рис.28. Форма приложения

  1. Изменяем свойства Caption объектов:

Рис.29. Форма приложения

Давайте поймем логику программы: что мы хотим, как будет работать программа. При загрузке необходимо будет ввести пароль. При нажатии на кнопку ОК, программа проверяет, правильно ли был введен пароль (сравнивает строку в Edit со строкой в памяти компьютера), и если пароль верен, то выводит надпись «Добро пожаловать», а строку Edit прячет;

если неправильно, то выводит на экран окно с сообщением, что пароль неверен.

  1. Пишем обработчик события для клавиши ОК (2 раза щелкните по кнопке, и Вы окажитесь в редакторе кода в нужном месте:

Пояcнения

Код в Delphi

Процедура щелчка по кнопке ОК

Begin

Если текст в Edit1 равен qqq (qqq-это

мой пароль, у Вас он может быть другим)

То

Begin

Вывести в строке label1 текст “Добро

пожаловать”

Отключить строку ввода

End

Иначе

Begin

Вывести окно с текстом “Посторонним вход воспрещен”

Очищаем строку ввода

Делаем активным строку ввода, устанавливая туда курсор

End;

End;

procedure TForm1.Button1Click(Sender: TObject);

begin

if edit1.Text='qqq'

Then

begin

Label1.Caption:=' Добро пожаловать ';

edit1.Enabled:=false;

end

else

begin

ShowMessage (' Посторонним вход воспрещен');

edit1.Text:='';

edit1.SetFocus;

end;

end;

  1. Запустите программу клавишей F9. Проверьте, как ведет себя программа.

Рис.30. Ошибка входа

  1. Вы не находите в нем ничего странного? Ведь мы написали оператор edit1.Text:='';, который должен был очистить строку ввод. На самом деле, все верно. Наш оператор стоит после строки ShowMessage – значит, он должен выполнятся после него. И хотя компьютер вывел на экран сообщение (т.е. данное окно), работа оператора еще не завершилась. Оператор завершиться, когда Вы нажмете ОК. И, действительно, как только Вы нажмете ОК, строка ввода очиститься.

  2. Самостоятельно: А сделайте так, чтобы строка ввода очищалась и тогда, когда окно сообщения на экране.

Счетчик

Давайте усовершенствуем программу так, чтобы пользователь мог лишь несколько раз ввести пароль, например, 3 раза. Чтобы решить данную проблему, нам понадобиться счетчик. Счетчик- это специальная переменная, которая увеличивается на 1 при нужном событии.

Итак, счетчиком будет переменная k (я так хочу, ВЫ же можете сделать любую).

8. Когда она должна увеличиваться? Когда введен неправильный пароль. Следовательно, он должен стоять в обработчике события кнопки ОК по ветви «нет». Измените код кнопки, добавив в него строку: k:= k+1;

Далее нам нужно проверить совершено ли данное событие 3 раза, т.е. k=3 или нет, и если так, то закрыть форму. Записать данную процедуру можно следующим образом:

if k=3 then form1.close;

Посмотрите, ваша процедура должна быть похожа на мою:

procedure TForm1.Button1Click(Sender: TObject);

begin

if edit1.Text='qqq'

Then

begin

Label1.Caption:=' Добро пожаловать ';

edit1.Enabled:=false;

end

Else

begin

ShowMessage (' Посторонним вход воспрещен ');

edit1.Text:='';

edit1.SetFocus;

k:= k+1;

if k=3 then form1.close;

end;

end;

  1. Теперь необходимо объявить новую переменную. Делается это после раздела implementation . Посмотрите на рис, сделайте свой код как у меня:

Рис.31. Код новой переменной

  1. Последнее, что нужно сделать, это присвоить начальное значение переменной. Где это можно сделать? В самой процедуре нельзя, потому что… ( А почему?)

Мы поступим следующим образом. Зададим начальное значение при запуске программы, т.е. при рождении формы.

  1. В Инспекторе объектов выберите Form1, перейдите в раздел Events, и дважды щелкните напротив строки OnCreate (при создании). Откроется соответствующая процедура.

  2. Введите оператор, как у меня:

procedure TForm1.FormCreate(Sender: TObject);

begin

k:=0;

end;

  1. Запускайте программу.

Самостоятельно:

  1. Доделайте программу, чтобы она при неправильном пароле выводила надпись: У вас осталась 1 попытка ( или 2 или 3).

  2. Ответьте на вопрос: «Почему нельзя задавать начальное значение счетчика в процедуре нажатия клавиши?». Если не догадались, вставьте его туда, и посмотрите, что происходит.

  3. Напишите обработчик для второй кнопки Закрыть, чтобы при нажатии на нее, форма закрывалась.

  4. Измените программу таки образом, чтобы на правильные и неправильные действия программа еще как-то реагировала (цветом формы, размером шрифта и т.д.).

Задание 3. Создать игру «Блоха»

Сюжет игры. Итак, что собой представляет игра? При нажатии на кнопку, она сдвинется на случайное количество пиксель по горизонтали. То есть прыгнет. Так как прыжки блохи мало предсказуемы, то и мы сделаем так, чтобы, после щелчка по блохе, она перескакивала на любое место по горизонтали. Если блоха (кнопка) пересечет середину экрана, то будем считать, что блоха (кнопка) выполнила свою задачу и может отдыхать (отключается). Ваша задача: за наименьшее количество щелчков перетащить всех блох на вторую половину формы. Как только все пять кнопок пересекут "экватор", игра заканчивается.