Методическое пособие для учителя информатики Методика решения олимпиадных задач по программированию
Чтобы посмотреть этот PDF файл с форматированием и разметкой, скачайте файл и откройте на своем компьютере.1
Муниципальное бюджетное общеобразовательное учреждение
«Средняя общеобразовательная школа №12»
города Братска
Центр развития образования города Братска
Школа современного педагога
«Информатика»
Методическое пособие для учителя «Методика
решения о
лимпиадных задач по информатике на
базе системы
Free
Pascal
»
Разработал:
Метляева А.В.
учитель информатики
МБОУ «СОШ
№12»
Братск, 2014г.
2
I
.
Аннотация
Данная разработка представляет собой методическое пособие для учи
теля
информатики, которая поможет восстановить и закрепить навыки структурного
программирования, полученные ранее. Пособие охватывает темы от основ до
ветвлений и циклов, рассчитаны на аудиторию 7
-
9 класс. Язык программирования,
на котором приведены пример
ы
FreePascal
, а среда программирования для
выполнения заданий
–
Lazarus
IDE
.
Актуальность рассмотренных задач направлена
в первую очередь на знание курса математики за 5
-
7 класс и навыков
программирования, что вызывает у большинства школьников затруднение,
в
построение условий задач
и в свою очередь является хорошей подготовкой
учащихся к олимпиаде по информатике
. На первый взгляд все задачи кажутся очень
простыми, но в каждой задаче есть свои подводные камни.
Так как
FreePascal и Lazarus официально включ
ены в "первый список"
языков и сред министерства образования РФ для проведения олимпиад по
программированию, о
т
школьных до всероссийских, рекомендуем ориентироваться
именно на них
.
Текст задач
взят с дистанционных курсов по программированию
Байкальског
о Университета Экономики и Права, автор задач является
преподаватель курсов Рейнгольд М.Э. Решение и разбор задач выполнено
самостоятельно преподавателем информатики МБОУ «СОШ №12» Метляевой А.В.
3
Содержание
I
.
В
в
е
д
е
н
и
е
с
т
р
.
4
I
I
.
Основные разделы с примерами решенных задач
и рекомендациями по их решению
с
т
р
.
5
1
.
Знакомство с консольным приложением
Free
Pascal
и
средой визуального программирования
Lazarus
IDE
с
т
р
.
5
2
.
В
в
е
д
е
н
и
е
в
п
р
о
г
р
а
м
м
и
р
о
в
а
н
и
е
с
т
р
.
1
0
3
.
Р
е
ш
е
н
и
е
з
а
д
а
ч
с
п
р
и
м
е
н
е
н
и
е
м
п
р
о
с
т
ы
х
и
с
л
о
ж
н
ы
х
у
с
л
о
в
и
й
с
т
р
.
1
9
4
.
Ц
и
к
л
ы
с
т
р
.
3
3
I
I
I
.
З
а
к
л
ю
ч
е
н
и
е
с
т
р
.
3
6
I
V
.
С
п
и
с
о
к
л
и
т
е
р
а
т
у
р
ы
и
и
н
т
е
р
н
е
т
и
с
т
о
ч
н
и
к
о
в
с
т
р
.
3
7
4
I.
Введение.
Сегодня нам
–
учителям информатики
–
приходится решать сложную, но
очень «жизненную» задачу: обеспечить приемлемый уровень знаний учащихся, не
просто достаточный для успешной сдачи ГИА или ЕГЭ, но и необходимый им для
дальнейшего
обучения в старшей или
высшей школе и для дальнейшей
профессиональной жизни.
Особенно трудности возникают как у учителей, так и учащихся в
прохождение раздела «решение задач по программированию».
Каждый учитель организованно, ответственно подходит к про
хождению данной
темы, находится в поиске новых, интересных, продуманных задач, тщательно
продумывает какой из языков программирования, рассматриваемый школьным
курсом, можно преподать детям.
В
данном
методическом пособие мы
познакомимся с примерами написа
ния
учебных
программ по информатике
для учащихся 7
-
9
классов
с помощью
свободного распространяемого компилятора
языка программирования
Pascal
-
Free
Pascal
.
На сегодняшний день
Free
Pascal
это мощное средство по созданию и
написанию программ в кросспл
атформенной среде разработки
Lazarus
.
Lazarus
—
бесплатная
среда
разработки
программного
обеспечения
с
открытым
исходным
кодом
для
компилятора
Free
Pascal
(часто
используется
сокращение
FPC
—
свободно
распространяемый
компилятор
языка
программирования
Pasc
al)
на
языке
Object
Pascal.
Интегрированная
среда
разработки
предоставляет
возможность
кроссплатформенной
разработки
приложений
в
Delphi
-
подобном
окружении.
На
данный
момент
является
единственным
инструментом
быстрой
разработки
приложений
(RAD),
позволяю
щим
Delphi
-
программистам
создавать
приложения
с
графическим
интерфейсом
для
Linux
(и
других
не
-
Windows)
систем.
Почему Lazarus такой популярный?
Другими словами Lazarus
-
это библиотеки классов Free Pascal для эмуляции
Delphi.
Так что Lazarus
-
это то н
едостающее звено, которое открывает возможности
кроссплатформной разработки Delphi
-
подобных программ.
С помощью технологии визуального программирования, реализованную в
Lazarus
, можно строить интерфейс будущих программ из специальных компонентов,
реализую
щих различные свойства.
5
II.
Основные разделы с примерами решенных задач
и рекомендациями по их решению.
1.Знакомство с консольным приложением
Free
Pascal
и средой визуального
программирования
Lazarus
IDE
.
Для того чтобы запустить
Lazarus
, необход
имо сначала его установить. В
операционных системах на базе ядра Linux воспользуйтесь менеджером
репозиториев (apt, yum). В операционных системах Microsoft выполните загрузку
последней стабильной версии Lazarus с официального сайта разработчиков
http://www.lazarus.freepascal.org/
и установите его из загруженного установочника
(имя вида «
lazarus
-
0.9.30.2
-
fpc
-
2.4.4
-
win32.exe
»). После установки в меню
Приложений (раздел «Программирование)/Программ появится пункт «Lazarus», по
нажатию ЛКМ производящий запуск Lazarus IDE.
После запуска
Мастер создания проектов
Lazaru
s
предложит на выбор
множество вариантов приложений. В процессе обучения основам алгоритмизации и
программирования нас будут интересовать Проект
\
Приложение и
Проект
\
Программа. Первый вариант представляет собой готовый шаблон
графического приложения с 1 фор
мой и возможностью добавления графических
объектов стандартных библиотек, второй вариант даёт возможность создать
программу, взаимодействующую с пользователем в режиме «чёрного экрана».
Интерфейс программы
Lazarus
Рис.1
6
Как можно заметить, при открыти
и
Lazarus IDE
с шаблоном приложения в
панели задач появляется сразу 5 новых окон: окно главного меню, окно программы,
окно инспектора объектов, окно
сообщений и окно формы (на иллюстрации
скрытое). Если в процессе работы над программой «пропадут» какие
-
либ
о из этих
окон
—
стоит поискать их на панели задач, или через меню
View
(Вид)
(например
«пропавшую» форму через меню View
\
Forms
\
(Вид/Формы)
).
Кратко опишем все необходимые элементы интерфейса. В главном меню
собрано управление всеми графическими интерфейса
ми Lazarus IDE, важные нам
пункты:
•
File
(
File
\
New
.. (
Создать
),
File
\
Open
(
Открыть
),
File
\
Save_all
(
Сохранить
всё
))
•
View
(
View
\
Forms
(Просмотреть список доступных форм),
View
\
Modules
(Просмотреть список доступных модулей), перечисление всех видов окон и
пан
елей для скрытия или отображения их на экране)
•
Project, Run, Tools
всевозможные инструменты запуска, отладки и тонкой
настройки приложения
Панель инструментов содержит в своих вкладках наборы пиктограмм, каждая
из которых добавляет на форму соответствующи
й ей объект
-
инструмент.
Самые популярные инструменты:
Label
-
надпись
Edit
—
текстовое поле
Button
—
кнопка
StringGrid
—
таблица
CheckBox
—
опция множественного выбора
RadioButton
—
опция единственного выбора
GroupBox
—
рамка
Shape
—
изменяемая форма
Timer
—
таймер
OpenDialog
—
диалог открытия файла
SaveDialog
—
диалог сохранения файла
Буква T перед названием инструмента обозначает имя
класса, из которого будут
реплицированы экземпляры нужного инструмента в виде объектов формы.
Чтобы перенести инструмент с
панели на форму, нужно сначала нажать левой
кнопкой мыши по его пиктограмме на панели инструментов, а затем нажать левой
кнопкой мыши в подходящем месте панели формы.
Рис.1.1 Форма в
Lazarus
IDE
.
На
рисунке 1.1
приведён
пример формы, на которую
добавлен
ы 2 текстовых поля,
4
надписи и 1 кнопка. Такой
интерфейс может быть пригоде
н
для приложения, реализующего
7
значений пользователем и вычисления по нажатию кнопки. Надписи будут
выступать в роли текстовых подсказок.
Сразу же после добавления инструмента на ф
орму
Lazarus IDE
автоматически
описывает соответствующий инструменту объект и размещает его графическое
отображение на панели формы. Объекту присваивается уникальное имя (по
-
умолчанию формата
<Имя_инструмента><Порядковый_номер_объекта>
,
например
Edit1
или
Timer22
), по которому к нему или любому его свойству или
процедуре можно обращаться из всех процедур, составляющих приложение.
Небольшое отступление. Даже самая простая надпись характеризуется
множеством свойств:
Name
—
имя объекта
Top
—
положение объекта
по вертикали относительно верхнего края формы
Left
—
положение объекта по горизонтали относительно левого края формы
Width
—
ширина объекта
Height
—
высота объекта
Caption
—
текст надписи на объекте
Font
—
шрифт надписи на объекте
Alignment
—
выравнивание
текста надписи на объекте
Например, на иллюстрации объекты Label1 и Label2 отличаются значениями
всего трёх свойств
—
именами, текстами надписей и положением по вертикали
относительно верхнего края формы.
Как уже было отмечено
выше,
что с помощью среды про
граммирования
Lazarus
можно разрабатывать как программу на языке
Pascal
, и также
Delphi
подобную
программу, давайте рассмотрим пути создания проектов в
Lazarus
.
Рис
.1.2. Создание Проект/Программа
в
Lazarus
8
После успешного выполнения данных команд, про
грамма запустит окно
консольного приложения
Free
Pascal
-
рисунок 1.3.
Рис.1.3. Окно
редактора исходного кода программы на
Free
Pascal
Рис.1.4. Создание Проект/Приложение
в
Lazarus
9
1.2. Работа с файлами
Обыкновенно исходный код
проекта Lazarus содержится не в 1, а в нескольких
файлах разного назначения: файлы проекта, файлы форм, файлы модулей и другие.
Поэтому очень важно правильно создать новые и сохранить уже созданные проекты.
Для удобства управления проект необходимо сохрани
ть в отдельный каталог через
меню «Файл
\
Сохранить всё» («File
\
Save all») сразу же по созданию, и проверить
корректность сохранения в этом каталоге. Lazarus поддерживает относительные
пути при запуске проекта, но очень чувствителен к отсутствию одного из
со
ставляющих проект файлов. Также рекомендуется делать резервные копии папки
проекта по мере разработки.
1.3.
Порядок решения задач
Этапы написания программы для решения задачи:
1.
Внимательно прочесть условие
задачи
и разобраться с
входными
и
выходными
данными
.
.
2.
Составить несколько
тест
ов
, желательно на все частные случаи.
3.
Составить
алгоритм
, написать и отладить
программу
.
4.
Протестировать её.
2.Введение в программирование
На данном этапе давайте
разберемся,
что же такое программирование
.
Программирование
необх
одимо для разработки программ управления компьютером
с целью решения различных информационных задач.
Система программирования
–
это программное обеспечение компьютера,
предназначенное для разработки, отладки, исполнения программ, записанных на
определенном
языке программирования;
Программа
–
это
алгоритм, записанный на каком
-
либо языке программирования
,
набор
команд для компьютера.
Команда
(оператор)
–
это описание действий, которые должен выполнить
компьютер.
•
откуда взять исходные данные?
•
что нужно с н
ими сделать?
Компьютер исполнитель работает с определенными данными по определенной
программе. Данные это числа, символы, строки, таблицы т.е.
это все величины
.
В алгоритмизации и программирование
величины разделяется на два типа:
1.Переменная;
2.Констант
а;
Переменная это более высокий способ представления данных, по сравнению с
конкретными значениями. Переменная
–
имеет три атрибута: имя, тип, значение.
Имя и тип переменной неизменимы внутри программы, а значение может в любой
10
момента измениться. Старое
значение переменной при этом пропадает, если может
понадобиться, то необходимо сохранить его в другой переменной.
Рис.2.1. Переменная, типы переменной, объявление переменной
Имя переменной это её
обозначение
, например:
a
,
b
,
c
. Все буквы для
объявления
переменной
должны быть латинскими.
Заглавные буквы не
отличаются от строчных
букв, но строчные
предпочтительнее, т.к.
ближе к математической
традиции.
В качестве имен
переменных нельзя
использовать служебные
слова
Free
Pascal
: имена
команд, операций и вс
троенных функций. Отличие от математических обозначений:
-
имя переменной не обязательно одна буква, но любое сочетание букв и цифр,
начинающаяся с буквы. На рисунке 2.1. представлены основные типы переменных
используемых во
Free
Pascal
, и правильность напи
сания раздела описания
переменных.
На рисунке 2.2. представлен образец объявления и написания констант во
Free
Pascal
.
Рис.2.2. Константы, объявление констант, типы констант
11
Любой переменной в ходе выполнения программы будет присвоено ка
кое
-
либо
значение. Оператор присваивания значения переменной имеет вид:
Имя переменной
:=
выражение
Простой знак
равенства тра
ктуется компилятором
Free
Pascal
как сравнение, и его
использование без двоеточия обязательно вызовет ошибку компиляции. Точ
ка с
запятой говорит компилятору об окончание строки.
Таблица 2.
Пример оператора присваивания
var a,b,d,i: integer;
x1,x2:real;
b,c:string;
begin
d:=3;
i=i+1;
a:=x*b;
x1:=x2/2;
b:='roro'+c;
end.
Тип
выражения
долже
н
совпадать с
типом
переменной
!!!
Теперь подробней поговорим о
выражениях
. Понятие
выражение
полностью
совпадает с одноимённым математическим понятием.
Выражение
это последовательность
имён переменных
и констант, связанных
между собой знаками операций,
ф
ункций
, скобками, в соответствии с
существующими правилами.
Дроби пишутся «в один этаж» с помощью знака деления и скобок. Скобки можно
использовать только круглые!
Например:
x
:=(
x
1*
y
*5)/12;
Встроенные функции:
поясню для начала слово «встроенные». Это знач
ит
сделанные изготовителями системы программирования (а можно, и создавать свои
собственные). Ниже приводятся наиболее употребляемые математические функции
FreePascal
.
abs(x)
абсолютная величина (модуль)
cos(x)
косинус
sin(x)
синус
round(x)
целая час
ть
sqrt(x)
квадратный корень
random(x)
0 x
-
1, где x
—
натуральное число
Аргументами
функций
должны величины соответствующих типов,
константы
(т.е. конкретные значения) или
выражения
. Функции используются в
выражениях
(в
12
правой части
команды присваива
ния
или в
отношениях
).
2.1
.Команды
ввода и вывода
Команда read (ввод через консоль:)
Мы
знаем, что переменные свои значения могут получать с помощью команды
присваивания. Однако, это не единственный способ. Бывает, что дать значение
переменной необходим
о во время работы программы, а не во время её написания. В
этом случае команда присваивания не может помочь, и нужен какой
-
либо другой
способ. Такой способ есть
-
команда ввода значений переменных, «read». Ее
синтаксис:
write
[
ln
]
(
<подсказка>
);
read
[
ln
](
<список переменных>
);
где:
<подсказка>
-
любой текст, заключённый в кавычки;
<список переменных>
-
имя
одной
переменной
либо несколько
имён
переменных
, разделённых запятыми.
Как и в других местах, здесь в квадратные скобки берётся необязательная часть
.
Пример:
Работает команда «
read
» так:
выводится на монитор подсказка, если она есть, иначе вопросительный
знак;
приостанавливается выполнение
программы
,
пока не будут введены через
запятую столько конста
нт и таких типов, сколько и каких типов
имён
переменны
х
перечислено в <списке переменных> и не будет нажата
клавиша
Enter
;
переменные
получают
значения
соответствующих введённых констант;
продолжается выполнение
программы
.
Как это происходит и в
команде
присваивания
, старое
значение
вводимой
переменной
забывается.
Отметим, что, в отличие от
команды присваивания
, вводить надо именно
константы
, а не
выражения!
Нужно подробней остановиться на
подсказках.
Зачем они нужны? Представим
себе, что в ка
кой
-
то
программе
подсказок нет, и пользователь, работающий с этой
программой
, сидит в растерянности. Компьютер остановился и чего
-
то ждёт, а
пользователь не знает, что делать. Только с помощью подсказки и можно сообщить
ему, сколько и каких значений требуе
тся ввести, что они значат…
Надо научиться писать короткие, но толковые подсказки!
Обратите внимание на отличия
команд присваивания
и
ввода
:
write
(‘Введите длину и ширину’);
Read
(
a
,
b
);
13
С помощью одной
команды присваивания
можно задать
значение
лишь одной
переменной
,
а с помощью одной
команды ввода
–
нескольким
.
В случае
команды присваивания
вопрос о
значении переменной
решает
программист
,
а в случае
команды ввода
–
пользователь
.
В
команде присваивания
можно писать и формулы, а в
команде ввода
пользователь
имеет право вводить лишь конкретные
значения
.
Если в каком
-
то случае программист
и
пользователь
–
одно и то же лицо,
команду ввода
можно заменить
командой присваивания
,
но не наоборот
.
Команда write
(Вывод)
Эта
команд
а
очень похожа на предыдущую, но выполняет
обратное
действие.
Если
команда
«
read
»
вводит
значения переменных
в оперативную память
компьютера, то
команда
«
write
» их
выводит
. Правда, выводить она может не только
значения переменных, но и выражений, в частности, константы.
Синтаксис этой
команды
:
где: <список
вывода>
–
одно или несколько, перечисленных через запятую или
точку с запятой,
имён переменных
или
выражений
.
Работает команда
write
так: ищет
значения переменных
и вычисляет значения
выражений
, перечисленных в
списке вывода,
и выводит их на монитор в
со
ответствующем порядке.
Команда
clrscr
Это, пожалуй, самая простая
команда
. Получив её, FreePascal стирает с экрана
всю информацию, которая находилась на нём.
Использование объектов формы
для ввода и вывода
При работе с приложением, использующим графическ
ий интерфейс, нам
потребуется использовать доступные объекты этого интерфейса для ввода и вывода
данных. Это даже проще, чем работа с консолью.
Для ввода нескольких значений поместим нужное количество текстовых полей
(инструмент
TEdit
) на форму, и такое же
количество надписей (инструмент
TLabel
)
для подсказки пользователю, что мы ожидаем получить от него в каждом из
текстовых полей. Также поместим на форму 1 кнопку и ещё 1 надпись, чтобы
программа начала рассчёт только по готовности пользователя, и вывела о
твет не
«испортив» поля входных данных.
После подготовки всех объектов, сделайте двойной щелчок левой кнопкой мыши
по кнопке на форме, и
Lazarus IDE
автоматически создаст в окне программы
процедуру
TForm1.Button1Click
. Это название можно прочитать как «Про
цедура по
событию
Click
на объекте
Button1
, принадлежащем объекту
Form1
».
Button1Click
—
имя процедуры, теперь именно оно будет являться значением свойства
Button1.Click
кнопки
Button1
и отображаться на вкладке Events (События) панели
свойств этой кнопки в
строке Click.
Пример:
Write[ln]
(
список вывода
)
;
14
procedure TForm1.Button1Click(Sender: TObject);
var a,b: string;
c,d: real;
begin
a:=edit1.text;
b:=edit2.text;
c:=strtofloat(a);
d:=strtofloat(b);
label3.caption:=floattostr(c+d);
end;
В вышеуказанном примере мы видим модиф
ицированный пустой шаблон
процедуры
Button1Click
. Добавлено описание 4 переменных (2
—
символьные, и 2
—
вещественные). В теле процедуры, запускаемой после нажатия кнопки
Button1
,
происходит присваивание значений переменных
a
и
b
, первичный ввод данных.
За
тем переменным
c
и
d
присваивается значение, получаемое через преобразование
значений переменных
a
и
b
(из символьного в вещественный). Последним
присваиванием мы осуществляем вывод на надпись
Label3
(в его свойство
Caption
)
значения суммы переменных c и d
, преобразованного из вещественного в
символьный тип (т.к. свойство
Caption
надписи
Label3
имеет символьный тип).
2.2. Решение задач
Разберем несколько задач, для решения которых, достаточно вышеописанных
команд.
Задача №1
: У пяти мальчиков было по некотор
ому количеству денег. Они
одновременно сделали следующие действия: первый передал свои деньги
второму, второй
–
третьему, третий
–
четвертому, четвертый
–
пятому, а пятый
первому. Сделать программу для определения у кого сколько осталось денег.
Примерный
тест:
Входные данные
Выходные данные
11 22 33 44 55
55 11 22 33 44
Решение:
Во
-
первых, вчитаемся в условие и разберемся
, сколько входных, сколько
выходных данных должно быть, каковы их типы. Очевидно, что в этой
задаче
должно быть пять входных д
анных (числовые) и пять выходных (тоже числовые).
По логике задаются одни те же переменные. Можно назвать переменные как
a
,
b
,
c
,
d
,
e
,
f
, но гораздо лучше как:
a
1,
a
2,
a
3,
a
4,
a
5
.
Во
-
вторых составим несколько тестов:
1 тест
2 тест
1
2
3
4
5
1
2
3
4
5
Входные
10
10
10
10
30
10
20
30
40
60
15
д
анные
Выходны
е данные
3
10
5
7
10
3
20
15
22
20
Третий этап
–
написание программы.
Запускаем приложение
Lazarus
IDE
. Создаем новое приложение, как было описано
выше. Размещаем на форм
е
все элементы, как показано на рисунк
е 2.3.
Рис.2.3.Разработка формы
Делаем щелчок по элементу
Button
1
.
Открывается окно редактора кода
–
Unit
1.
Набираем код программы, он выглядит
следующим образом:
Program z5;
procedure TForm1.Button1Click(Sender:
TObject);
var a, b, c, d, e, f: real;
begin
a:=StrToFloat(Edit1.Text);
b:=StrToFloat(Edit2.Text);
c:=StrToFloat(Edit3.Text);
d:=StrToFloat(Edit4.Text);
e:=StrToFloat(Edit5.Text);
f:=a;
a:=e;
e:=d;
d:=c;
c:=b;
b:=f;
Label14.Caption:=FloatToStr(a);
Label15.Caption:=FloatToStr(b);
Label16.Caption:=FloatToStr(c);
Label17.Caption:=FloatToStr(d);
Label18.Caption:=FloatToStr(e);
end;
end.
16
Рис.2.4.
Задача эта проста лишь на первый
взгляд. Во
-
первых, надо каждой команде
найти свое место. Во
-
вторых, здес
ь есть
одна ловушка, которую не
легко найти
начинающему программисту.
Обратите
внимание, как среди переменных
происходит обмен значениями.
Че
твертый этап
–
тестирование
программы. Запускаем ее, вводим входные
данные из подготовленных нами тестов.
Задача №2:
Покупатель пришел в
магазин с намерением совершить одну
покупку. Задается сколько у него было
денег, цена товара, количество, которое
он
хотел купить. Сделать программу для
определения остатка денег.
Задача №2, решается аналогично
первой, создается форма, на ней
размещаются элементы. Данный вид
задачи, направлен на отработку работы с
элементами на форме в
Lazarus
и ввод и
вывод данных
через текстовые поля.
1.Создаем форму размещаем на ней
элементы рисунок 2.5
2.Запускаем процедуру
ButtonClick
;
3.Набираем код программы:
procedure Form1.Button1Click(Sender:
TObject);
var
d,s,k,o: real;
begin
d:=StrToFloat(Edit1.Text);
s:=StrToFloat(Ed
it2.Text);
k:=StrToFloat(Edit3.Text);
o:=d
-
(s*k);
Label6.Caption:=FloatToStr(o);
end;
end.
17
В разработке программ с помощью приложения
Lazarus
для преобразования
строкового значения числа, вводимого в текстовое поле, в число
вую форму
используем функцию
StrToFloat
. А для вывода на метку используем функцию
FloatToStr
.
На данном этапе мы разобрали две задачи, задачи , которые можно решить с
помощью форм.
Ниже приведены олимпиадные задачи
,
которые можно решить аналогично задачи
№1 и задачи №2, с помощью разработки форм и применения функций
FloatToStr
и
StrToFloat
:
№1.
У трёх мальчиков было по некоторому количеству конфет. Первый отдал
второму одну конфету, второй взял у третьего две конфеты, третий съел три конфеты
у первого. С
делать программу для определения у кого сколько осталось.
Примерный тест:
Входные данные:
Выходные данные:
10 10 10
6
13 8
№2.
У пяти девочек было по некоторому количеству яблок. Каждая съела по стольку
яблок, каков её порядковый номер. Сделать программу
для определения у кого
сколько осталось.
Примерный тест:
Входные данные:
Выходные данные:
10 20 30 40 50
9
18 27 36 45
№3.
У пяти мальчиков было по некоторому количеству денег. Они одновременно
сделали следующее: первый передал свои деньги пятому, пятый
–
четвёртому,
четвёртый
–
третьему, третий
–
второму, а второй
-
первому. Сделать программу для
определения у кого сколько осталось.
Примерный тест:
Входные данные:
Выходные данные:
11 22 33 44 55
22
3 44 55 11
№4.
Покупатель пришёл в магазин с намерением
совершить одну покупку. Задаётся
сколько у него было денег, цена товара, количество, которое он хотел купить.
Сделать программу для определения остатка денег.
Примерный тест:
Входные данные:
Выходные данные:
100 30 3
10
№5.
Покупатель пришёл в магазин с
намерением совершить три покупки. Задаётся
18
сколько у него было денег, цена первого товара, количество первого товара, которое
он хотел купить, цена второго товара, количество второго товара, цена третьего
това
ра, количество третьего товара.
Сделать програм
му для определения остатка
денег.
Примерный тест:
Входные данные:
Выходные данные:
1000 10 1 20 2 30 3
860
1.
№6. Имеется два прямоугольных участка земли. На каждом стоит дом
прямоугольной формы и сарай такой же формы. Данные задаются в таком
порядке: длин
а и ширина первого участка, длина и ширина первого дома, длина и
ширина первого сарая, длина и ширина второго участка, длина и ширина второго
дома, длина и ширина второго сарая. Сделать программу для определения общей
площади участков земли за вычетом площ
ади строений.
Примерный тест:
Входные данные:
Выходные данные:
30 20 6 5 3 2 40 30 6 4 3 1
1737
№7.
Имеется комната прямоугольной формы с ровными вертикальными стенами.
Задаются: длина, ширина и высота. Сделать программу для определения общей
площади чет
ырёх стен.
Примерный тест:
Входные данные:
Выходные данные:
6 4 3
60
3.Решение задач с применением простых и сложных условий
При изучении
алгоритмических структур
нам понадобится понятие
условия
.
Разберёмся с ним.
Будем называть простым
условием
два од
нотипных
выражения
, между
которыми стоит знак отношения: «
=
»,
«
»,
«
»,«
», «
=
»,
«
=
». Очевидно, что
каждое
условие
может либо выполняться, либо не выполняться, то есть находиться в
одном из двух состояний, которые называются «ИСТИНА»
(true)
и «ЛОЖЬ»
(fa
lse)
и могут быть сохранены как значение переменной типа
boolean, булева типа
переменной
. Третьего не дано.
Примеры простых
условий
:
a
= 2
(
x
-
x
0) * (x
-
x0) + (
y
–
y
0) * (y
-
y0) =
r
* r
a + b[1] + b[2] + b[3] + b[4]) = '12345'
c = true
d false
Одна
ко при решении многих
задач
одних только простых у
словий
бывает
недостаточно. Возникает необходимость в сложных
условиях
, логических
19
выражениях с использованием специальных
функций
или операций, имеющих в
качестве аргументов одно, или несколько простых
усл
овий
. С тремя простейшими
логическими
функциями
мы сейчас ознакомимся.
Поскольку сейчас нас не будет интересовать конкретное содержание
условий
, то
будем обозначать их заглавными латинскими буквами.
1.
Функция «НЕ» (
not
)
Эта
функция
«одноместная», то есть
имеет один аргумент. Её
таблица истинности
приводится ниже:
На FreePascal эта
функция
обозначается
not
(например,
NOT
a
b
) В
математической логике принято такое обозначение: (например,
a
). Эта
функция
самая простая, она ещё называется «отрицание». Её принцип «делай наоборот».
2.
Функция «И» (
and
)
А эта
функция
–
двуместная, аргумента у неё два (а может быть и больше).
Приведём таблицу истинности:
A
B
И
(A, B)
ИСТИНА
true
ИСТИНА
true
И
СТИНА
true
ИСТИНА
true
ЛОЖЬ
false
ЛОЖЬ
false
ЛОЖЬ
false
ИСТИНА
true
ЛОЖЬ
false
ЛОЖЬ
false
ЛОЖЬ
false
ЛОЖЬ
false
В этой таблице перебраны все варианты значений аргументов. Вообще, тут есть
закономерность: эта
функция
истинна лишь тогда, когда все аргум
енты истинны.
Достаточно того, чтобы хоть один аргумент имел значение ЛОЖЬ, и значение
функции тоже будет ЛОЖЬ.
В математической логике эта
функция
чаще рассматривается как операция и
называется конъюнкция, и
ли логическое умножение. На FreePascal это тоже скорей
операция и записывается так:
3.
Функция «ИЛИ» (
or
)
Эта
функция
тоже двуместная. Вот её таблица истинности:
A
НЕ
(A)
ИСТИНА
(true)
ЛОЖЬ
(false)
ЛОЖЬ
(false)
ИСТИН
А (true)
(a = 3) and (b 7)
(x = x2) and (x = x;B-3; a6n;
3x;-4 1;က= x1)
20
A
B
ИЛИ
(A, B)
ИСТИНА
true
ИСТИНА
true
ИСТИНА
true
ИСТИНА
true
ЛОЖЬ
false
ИСТИНА
true
Л
ОЖЬ
false
ИСТИНА
true
ИСТИНА
true
ЛОЖЬ
false
ЛОЖЬ
false
ЛОЖЬ
false
Закономерность такая: эта
функция
ложна лишь тогда, когда все аргументы
ложны. Достаточно того, чтобы хоть один аргумент имел значение ИСТИНА, и
значение
функции
тоже будет ИСТИНА.
В мат
ематической логике этой функции соответствует операция, называемая
дизъюнкцией, или логическим сложением (обозначается
V
).
А на FreePascal это выглядит так:
(a = 3) or (b 7)
(x = x2) or (x = x;B-3; o6r; x; 800;= x1)
4.
Ветвление
Ветвление
служит для того, чтобы можно б
ыло пропустить, не выполнять какую
-
то
группу
команд
в
программе
. Вопрос о выполнении, или невыполнении решается в
зависимости от выполнения, или невыполнения соответствующего
условия
.
Полное ветвление
if
<условие>
then
begin
1
-
е дейс
твие>
end
else begin
2
-
е
действие
end;
Если
условие
истинно, то выполняется
первое
действие
, иначе
–
второе
. Таким образом, всегда
будет выполняться либо
первое действие
, либо
второе
. Всегда одно, не больше и не меньше!
Сокращённое ветвление
Условие
1
-
е
действие
Истина
Ложь
2
-
е
действие
21
if
условие
then
begin
действие
end;
Если
условие
истинно, то выполняется
действие
, иначе
–
не делается ничего.
if
по
-
английски значит «
если
»,
then
–
«
то
»,
else
–
«
иначе
», а
end
;
–
«
конец
», в
данном случае это можно интерпретировать
как
-
«конец если».
Действия
могут состоять из произвольного числа
команд
. Они могут включать в
себя
алгоритмические структуры
. Могут они быть и пустыми.
В принципе, полное и сокращённое
ветвления
взаимозаменяемы. Если
решаемая подзадача распадается ровно
на два альтернативных случая, то удобно
воспользоваться полным
ветвлением
. В других случаях больше подходит
сокращённое. Впрочем, всё не так просто.
Задача
№1
Сделать
программу
, высчитывающую площадь треугольника
по формуле Герона по трём заданным сторона
м.
Входные данные
–
три числа. Если они могут образовать треугольник, то выдать его
площадь, иначе выдать сообщение о некорректности
входных
данных
.
Как и положено, начнём с вопроса о
входных
и
выходных данных
. Как сказано в
условии,
входными данными
слу
жат три числа, которые служат длинами сторон
треугольника. Что касается
выходных
, то они зависят от того, существует ли
треугольник с такими сторонами. Если да, то выходным данным является число
–
площадь треугольника, если нет, то сообщение о некорректнос
ти
входных данных
.
Делаем два
теста
.
№
тес
та
Входные данные
Выходные
данные
1
3
4
5
6
2
1
1
10
некорректные
данные
Напишем
программу
:
program
z
3; {Илья Молчанов 9Е Формула Герона}
var a,b,c,p,s: real;
begin
Условие
действие
Истина
Ложь
22
write
(‘Введите три стороны треугольника’);
readln(a, b, c);
if (a + b = c) and (a + c = b) and (b + c = a) then begin
p:= (a + b + c) / 2;
s:= sqrt((p
-
a) * (p
-
b) * (p
-
c) * p);
writeln(‘s =’, s);
end
else begin
writeln
(‘Треугольника с такими сторонами не существует’);
end;
r
eadln
;
end.
Задача
№2
Человек пришёл в магазин с некоторой суммой денег. Он имеет
намерение купить некоторое количество сахара. В случае возможности
такой покупки, он её совершает, в противном случае
–
ничего не
покупает и уходит. Сумма денег, которая им
еется первоначально; цена
одного килограмма сахара; количество, которое он хочет купить,
задаются.
Сделать
программу
, определяющую, сколько денег остаётся.
Приступим к решению. В условии
задачи
чётко указаны все
входные
и
выходные данные
, надо лишь ещё р
аз вдуматься.
Входные данные
: три числа
(количество денег изначально, цена сахара, количество сахара),
выходные
: одно
число, сумма денег, оставшихся после посещения магазина.
Составим несколько
тестов
.
№
те
ст
а
Входные данные
Выходные
данные
1
30
15
2
0
2
50
15
2
20
3
20
15
2
20
Теперь напишем
программу
:
program
z
4; {Илья Молчанов 9Е Поход в магазин}
var a,b,c: real;
begin
write
(‘Введите количество денег’);
readln(a);
write(‘
Введите
цену
товара
’);
readln(b);
23
write
(‘Введите количество товара’);
re
adln
(
c
);
if b * c = a then begin
a: = a
-
b * c;
end;
writeln(‘
Осталось
денег
’, a);
readln
;
end.
Задача №3.
У 4
-
х девочек было по некоторому количеству конфет. Каждая съела по столько
конфет, каков ее порядковые номер, если это было возможно
, в противном
случае она съедала все свои конфеты. Сделать программу, определяющую, у
кого сколько осталось конфет.
Составим несколько
тестов:
Входные данные
2 2 4 1
10 20 30 40
Выходные данные
1 0 1 0
9 18 27 36
Напишем программу
program project1;
var
d1,d2,d3,d4,a1,a2,a3,a4:integer;
begin
writeln ('y 4 devochek bulo po nekotoromy kol
-
writeln('napisat programmy dly opredeleniy kol
-
va y kazdoi');
writeln;
writeln;
d1:
=1;
d2:=2;
d3:=3;
d4:=4;
readln (a1,a2,a3,a4);
if d1 a1 then begin d1:=0;end
else d1:=a1
-
d1;
writeln(('kol
-
vo 1 devocki ravno ' ), d1);
if d2 a2 then begin d2:=0; end
else d2:=a2
-
d2;
writeln(('kol
-
vo 2 devo
cki ravno ' ), d2);
if d3a3 then begin d3:=0; end
else d3:=a3
-
d3;
writeln(('kol
-
vo 3 devocki ravno ' ), d3);
if d4 a4 then begin d4:=0; end
24
else d4:=a4
-
d4;
writeln(('kol
-
vo 4 devocki ravno ' ), d4);
writeln;
readln;
end.
Рис.3.1
Выходные данные
Для решения задачи применяется
полное ветвление.
Задача №4.
Имеется линейная железная дорога, состоящая из некоторого количества станций
(задаётся во входных данных). Все станции пронумерованы подряд натуральными
числ
ами. Задаётся номер начальной станции и количество станций, которое надо
проехать (положительное
–
вправо, отрицательное
–
влево). Если поезд приезжает в
тупик, то там и остаётся.
Сделать программу, определяющую, где окажется поезд.
Составим несколько
тестов:
Входные данные
Общ. Кол
ст.
Нач. ст.
Сколько
ехать
Общ.
Кол
ст.
Нач. ст.
Сколько
ехать
10
5
3
10
4
-
6
Выходные
данные
8
1
program project1;
var a,b,n,c,d: integer;
begin
vse
-
vo stancii, kotoroe
writeln;
writeln;
writeln('zadacha nomer 1
writeln;
25
writeln;
write (('zadaite chislo stanciy'));
readln (a);
writeln;
write (('zadaite nomer nahalnoj stanciy'));
readln (b);
writeln;
write (('zadaite kolichestvo stanciy'));
readln (n);
writeln;
c:=b+n;
if (ca
) then begin
c:=a;
end;
writeln;
if (c=0) then
c:=1;
writeln('nomer konehcnoy stancii raven' , c);
writeln;
readln;
end.
end.
Решение алгоритма:
В первую очередь для решения данной задачи необходимо
построить
для наглядности отрезок и продумать алгоритм.
Давайте посмотрим на набор тестов №1, дано общее количество ста
нций
10, начальная станция от куда
будет отъезжать поезд равно 5, и количество станций
которое необходимо проехать равно 3. Ес
ли данный тест просчитать с помощью
нашего отрезка, то получим, что конечной номер конечной станции равен 8.
В переменной «с» я присваиваю значение номера конечной станции, следовательно,
продумав алгоритм, получается что с=5+3=8,и тут необходимо узнать г
де находится
мой поезд в тупике или нет. Для данного отрезка тупиком будет являться конечная и
начальная точка. Давайте сформулируем условие: если
c
a
(
a
это общее количество
станций на отрезке), тогда с
:
=а. Данное условие задачи будет работать на движение
вперед (т.е. при положительном числе).
А теперь рассмотрим набор тестов №2.
Рис.3.2. Разбор теста на отрицательное значение
1 2 3
4 5 6 7 8 9 10
26
Данный набор тестов рассчитан на движение назад (влево), так как в условие задачи
нам не сказано что поезд может разверн
уться и поехать назад, тогда при данном
тесте поезд, тоже окажется в тупике.
Сформулируем условие: если с
0
(тогда поезд движется назад) тогда
c
:=1
(поезд в
тупике). В данной задаче хорошо отрабатываются знание логических приемов
математики.
Задача №5.
Имеется круговая железная дорога, состоящая из некоторого
количества станций (задаётся во входных данных). Все станции пронумерованы
подряд натуральными числами. Задаётся номер начальной станции и количество
станций, которое надо проехать (положительное
–
вправо, отрицательное
–
влево).
Сделать программу, определяющую, где окажется поезд.
Составим несколько
тестов:
Входные данные
Общ.
Кол
ст.
Нач.
ст.
Сколь
ко
ехать
Общ
. Кол
ст.
Нач.
ст.
Сколь
ко
ехать
Общ.
Кол ст.
Нач. ст.
Сколь
ко
ехать
10
5
3
8
4
-
6
10
1
-
1000
Выходные
данные
8
8
1
Program Z19;
var a,b,c,n:integer;
begin
writeln('zadacha nomer 19, avtor Metlyaeva A.V');
writeln;
kotoroe nado proexat');
writeln('sdela
t programmy kotoray opredelit gde naxoditsy poezd');
writeln;
writeln;
writeln('vvedite kolichestvo stanciy vsego ' );
readln(a);
writeln('vvedite nomer nachalnoy stancii ' );
readln (b);
writeln('vvedite nomer skolko proexat stancii ' );
readln(n)
;
c:=b+n;
27
if ca then begin
c:=c mod a;
end;
if c=0 then
c:=a
-
(abs(c mod a));
writeln ('nomer konehnoy stancii ravno ' , c);
writeln;
readln;
end.
end.
Данная задача описывает движение поезда по круговой железной доро
ги.
Отличие круговой дороги от линейной без разворота в том, что уезжая со станции к
примеру №
N
на станцию №
N
+1
поезд оказывается на станции №1 и далее
двигается от неё сохраняя направление. Обратно, уезжая со станции №1
на станцию
№0 поезд оказывается н
а станции №
N
. Для лучшего понимания данной задачи
можно построить иллюстрацию.
Итак, со станции №Х поезд проезжает А станций и оказывается на станции
№Х+А. Начнем с выделения двух частных случаев: Х+А может быть меньше Х,
либо больше или равно Х. В первом
случае А будет меньше 0, а во втором больше
или равно. Тогда для А
=0
сразу видны 2 «легких» варианта: Х+А
=
N
и
N
X
+
A
=2
N
. Первый «легкий» хорош тем, что мы сразу получаем ответ без
всяческих преобразований. Второй вариант тоже неплох, так как достаточно
в
ычесть
N
из Х+А, и мы получим заветный номер станции прибытия.
Ведь если
выполняется
N
X
+
A
=2
,то
X
+
A
=
N
+1=1,
X
+
A
=
N
+2=2
…
X
+
A
-
N
-
наш ответ.
Для А
0
можно вывести также 2 «легких» варианта: Х+А
=1
и
–
N
+1
X
+
A
1.
Если с первым «легким» все сразу ясно, то для
второго легкого следует пояснить,
что Х+А=0 переходит в
N
, Х+А=1 переходит в
N
+1…
X
+
A
=
-
N
+1
переходит в 1.
Понаблюдав за расписанным решением можно сделать вывод, что ответ в этом
случае будет равен
N
+(
X
+
A
)
.
Минусов нет ,так как Х+А и так будет отрицательн
ым,
от 0 до
–
N
-
1
. 0 будет переходит в
N
,
-
1
в
N
-
1,
a
–
N
+1
в 1.
Что же делать, если Х+А>2
N
, либо Х+А
=
-
N
+1
?
Например, для набора исходных данных
{11,10,2731}
Х+А=2741
. Как узнать,
во что отображается станция № 2741 на круговой дороге из 11 станций.
Можн
о узнать двумя способами: первый это организация цикла, который
будет пошагово прибавлять или отнимать от А и Х по 1, пока А не примет значение
0. Х же при переходе в 0 или
N
+1
нужно принудительно приравнять
N
и 1
соответственно. Второй способ не требует ц
икла, но требует знания математики за
5
-
6 классы и некоторых дополнительных функции языка программирования.
Воспользуемся функциями
mod
и
div
.
В нашем примере, если номер конечной станции
общего количества
станций, тогда воспользуемся функцией
mod
и
c
:=
c
mod
a
;
если номер конечной
станции
=
0, тогда
c
:=
a
-
(
abs
(
c
mod
a
))
и получаем номер конечной станции поезда
28
на круговой железной дороги. В данной задачи, необходимо знать как правильно
работает арифметическая функция
mod
.
Разобравшись с задаче №5, приступ
им более к сложной, но интересной задачи
№6.
Задача №6.
Имеется линейная железная дорога, состоящая из некоторого
количества станций (задаётся во входных данных). Все станции пронумерованы
подряд натуральными числами. Задаётся номер начальной станции и ко
личество
станций, которое надо проехать (положительное
–
вправо, отрицательное
–
влево).
Если поезд приезжает в тупик, то разворачивается и едет в обратную сторону
столько, сколько осталось.
Сделать программу, определяющую, где окажется поезд.
Составим не
сколько
тестов:
Входные
данные
Общ.
Кол
ст.
Нач.
ст.
Сколь
ко
ехать
Общ.
Кол
ст.
Нач.
ст.
Скольк
о ехать
Общ.
Кол
ст.
Нач.
ст.
Ско
лько
ехат
ь
Общ.
Кол ст.
Нач.
ст.
Скольк
о ехать
10
5
3
8
4
-
6
10
3
200
10
1
-
1000
Выходные
данные
8
4
5
9
var a,b,n,c,d,f: i
nteger;
begin
-
vo stancii, kotoroe nado
ony stolko
skolko ostalos');
writeln;
writeln('sdelat programmy opredelyuhyy gde okazetsy poezd.');
writeln;
writeln('zadacha nomer 18, avtor Metlyaeva A.V');
writeln;
writeln;
write ('zadaite chislo stanciy;');
readln (a);
write ('zadaite nomer n
ahalnoj stanciy');
readln (b);
write ('zadaite kolichestvo stanciy');
readln (n);
if n0 then begin
if n (a
-
b) then begin
d:=(n
-
a+b) div (a
-
1);
f:=(n
-
a+b) mod (a
-
1);
if d mod 2=0 then
29
c:=a
-
f
else
c:=f+1;
end
else
c:=b
+n;
end
else
if abs (n) b
-
1 then begin
d:=(abs(n)
-
b+1)div (a
-
1);
f:=(abs(n)
-
b+1) mod (a
-
1);
if d mod 2=0 then
c:=f+1
else
c:=a
-
f;
end
else
c:=b
-
abs(n);
writeln('nomer konehnoy stancii raven', c);
writeln;
readln;
end.
end.
Рис.3.2 Движение поезда с разворотом
Для того чтобы, задача работала правильно под все параметры, необходимо
выделить главные условия разбора, которые необходимо отобразить математически
в алг
оритме.
Если
внимательно понаблюдать за движением поезда по линейной дороге с
разворотом, можно выделить 4 «простых» случая для движения в каждую из сторон:
например А
=0
: имеем:
1.движение заканчивается до первого разворота
2.имеем 1 разворот и движение
заканчивается до возврата в начальную станцию
3. имеем 1 разворот и проезжаем через начальную станцию
4.имее 2 разворота, и двигаясь в изначальном направлении и не доезжаем до
начальной станции.
30
Алгоритм программы соотвествует всем 4 условиям.
Вот про
стой набор тестов к данной задаче:
(10,5,3=,8;4,
-
6=6)
-
движение заканчивается до 1 разворота;
(10,3,10=7;)
-
1 разворот и движение заканчивается до возврата в начальную
станцию;
(10,3,15=2), (10,3,
-
6=5)
-
1 разворот и проезжает через начальную точку;
(10, 2
, 30=6, ) имеем 2 разворота и не доезжаем до начальной станции.
(10,3,200=5) имеем более 2
-
х разворотов и проезжаем через начальную точку;
(10 5 1000=5)
(10 5
-
1000=7)
(10,5,
-
5=2) имеем движение в обратную сторону,
(10,1
-
1=2)
Пример похожих задач для сам
остоятельного решения:
№1.
Человек пошёл в магазин, имея при себе некоторую сумму денег и намереваясь
сделать одну покупку. Сделать программу, определяющую, сколько у него
останется денег, если задаётся, сколько у него было денег, цена и желаемое
количеств
о товара. Покупка совершается лишь в том случае, когда хватает денег.
Входные
данные
Был
о
дене
г
Цен
а
Количе
ство
Был
о
дене
г
Цен
а
Количес
тво
100
30
3
100
30
5
Выходные
данные
10
100
№2.
Человек пошёл в магазин, имея при себе некоторую сумму денег и намер
еваясь
сделать две покупки. Сделать программу, определяющую, сколько у него останется
денег, если задаётся, сколько у него было денег, цены и желаемые количества 2
-
х
товаров. Покупка совершается лишь в том случае, когда хватает денег на два товара.
Входные
данные
Был
о
дене
г
Цена
-
1
Количеств
о
-
1
Цена
-
2
Количеств
о
-
2
100
70
1
40
2
Выходные
данные
100
№3.
Человек пошёл в магазин, имея при себе некоторую сумму денег и намереваясь
сделать две покупки. Сделать программу, определяющую, сколько у него останетс
я
денег, если задаётся, сколько у него было денег, цены и желаемые количества 2
-
х
товаров. Сперва, делается попытка совершить первую покупку, а потом, на
оставшиеся деньги, вторую.
31
Входные
данные
Был
о
дене
г
Цена
-
1
Количеств
о
-
1
Цена
-
2
Количеств
о
-
2
100
70
1
40
2
Выходные
данные
30
№4.
Человек пошёл в магазин, имея при себе некоторую сумму денег и намереваясь
сделать три покупки последовательно. Сделать программу, определяющую, сколько
покупок он совершил, если задаётся, сколько у него было денег, цена
и желаемое
количество первого товара, цена и желаемое количество второго товара, цена и
желаемое количество третьего товара.
Входные
данные
Был
о
дене
г
Цена
-
1
Кол
-
1
Цена
-
2
Кол
-
2
Цена
-
3
Кол
-
3
100
70
1
40
2
10
2
Выходные
данные
2
№5
.
На декартовой прям
оугольной системе координат задана прямоугольная
область, ограниченная двумя парами параллельных прямых. Одна пара параллельна
оси абсцисс, другая
–
оси ординат. Область задаётся координатами двух
противоположных углов.
Написать и отладить программу, опред
еляющую, находится ли заданная точка
внутри этой области. Если точка оказывается на границе, то даётся положительный
ответ.
Входны
е
данные
x1
y1
x2
y2
x
y
100
100
200
200
150
1
5
0
Выходн
ые
данные
Da
№6.
У двух человек было по некоторому количеству де
нег. Они их сравнили, и
тот, у которого было больше, отдал 1 рубль тому, у которого меньше. В случае
равенства, всё осталось, как было. Сделать программу для определения, у кого
сколько осталось.
Входные данные
20 10
10 30
Выходные данные
19 11
11 29
32
Ложь
Истина
4.Циклы
Бывает, что при написании
программы
возникает необходимость в том, чтобы
написать подряд несколько одинаковых
действий
. В принципе, можно просто взять
и написать их одно за другим, если повторять надо не очень много раз, и если точно
известно, скол
ько раз. Однако как быть, если
действие
надо повторить несколько
тысяч раз? Как быть, если мы вообще не знаем заранее, сколько раз надо повторять,
а это зависит от
входных данных
? Для решения этой проблемы и существует
алгоритмическая структура цикл
, к рас
смотрению которой мы и переходим. Как и
у
ветвлений
, у
циклов
есть несколько разновидностей.
Циклы в FreePascal
Цикл с положительным предусловием
while
<условие>
do
begin
<действие>;
end;
Работа этого
цикла
происходит следующим образо
м: сначала
проверяется
условие
и, если оно истинно, то выполняется
действие
. После
этого опять проверяется
условие
. Так происходит до тех пор, пока условие
истинно
. Когда условие станет л
ожным
, управление будет передано на
команду
, следующую за закрывающей
цикл
операторной скобкой
«
end
;
».
do
–
делать.
while
–
повторять пока
repeat
–
повторять
until
–
прекратить как только
Такой
цикл
может и не выполняться ни одного раза, если с самого начала
условие
будет
ложно
. В случае если
условие
всегда будет истинно,
цикл
не
прекратит работу никогда,
программа
«зациклится»
1
Циклы с постусловием
Цикл с положительным постусловием
repeat
действие
;
until
условие
;
1
Если не произойдёт переполнение, тогда последует аварийная остановка
программы
.
Условие
действие
33
Всё это очень похоже на
цикл с предусловием
, отличие лишь в том, что
самый первый раз
действие выполняется независимо от
условия
.
Истинность, или ложность
условия
, влияет на выполнение действия лишь со
второго раза.
Цикл с параметром
for
пц
:=
нз
{
to/downto
}
кз
do begin
действие
;
end;
Позволим себе дать объяснение этого вида
цикла
без бл
ок
-
схемы. Для
его организации вводится специальная
вспомогательная
2
переменная
–
параметр цикла
(пц), обязательно целочисленного типа.
Параметр цикла
получает
начальное значение
. Потом проверяется
условие
пц<=кз
, в случае,
если
шаг цикла положителен
, и
пц=
>кз
, если
шаг цикла отрицателен
. Если
это
условие истинно
, то выполняется
действие
,
параметр цикла
изменяется на
шаг
, и опять проверяется
условие
. Таким образом, это
частный случай
цикла с предусловием
, так как если
условие
в начале
ложно
, то
действие
вооб
ще не выполняется.
Начальное значение
,
конечное значение
,
шаг параметра цикла
–
арифметические выражения. Если
цикл
работал хоть раз, то по окончании
параметр цикла
равен
конечное значение + шаг
.
Шаг цикла определяется
наличием связки to или downto
между н
ачальным и конечным значениями.
to
определяет положительный шаг, равный
1
, а
downto
определяет
отрицательный шаг, равный
-
1
.
Задача №1
Даны два целых числа, причём первое не больше второго. Выдать
на экран все целые числа от первого до второго.
Начнём
решать. Какие
входные
и
выходные данные
?
Входные данные
: два
числа,
выходные
: последовательность чисел.
Составим несколько
тестов
.
№
Входные данные
Выходные данные
2
В
программе
есть
переменные
входные
и
выходные
.
Переменные
же, не являющиеся ни первыми, ни вторыми, называются
вспомогательными
.
Ред
ко какая
программа
обходится без них, разве что самая простая.
действие
Условие
Ложь
Истина
34
теc
та
1
1
10
1 2 3 4 5 6 7 8 9 10
2
2
2
2
3
3
7
52
37 38 39 40 41 42 43 44 45 46 47 48 49
50 51 52
Программа:
program z5
-
1;
var n1,n2,i: integer;
begin
write
(‘Введите два числа в порядке возрастания ’);
readln(n1,n2);
i:=n1;
while i=n2 do begin
write(i);
i:=i+1;
end;
readln
;
end.
Но можно и так:
program
z
5
-
2;
uses DOS, CRT;
va
r n1,n2,i: integer;
begin
write
(‘Введите два числа в порядке возрастания ’);
readln(n1,n2);
for i:=n1 to n2 do begin
write(i);
end;
readln
;
end.
Задача
№2
Даны два натуральных числа, сделать
программу
для нахождения
их наибольшего общего делителя.
Приступим к решению. Определим
входные
и
выходные данные
?
Входные
данные
: два числа,
выходные
: одно число, их НОД.
Составим несколько
тестов
.
№
теcта
Входные
данные
Выходные
данные
1
1
10
1
35
2
2
8
2
3
37
52
1
Для составления
алгоритма
воспользуемся
известным из математики
алгоритмом Евклида. Программа:
Program
z
5
-
3;
var a,b,a1,b1: integer;
begin
clscr
;
write
(‘Введите два числа’);
readln(a,b);
a1:=a;
b1:=b;
while a1b1 do begin
if a1b1 then begin
a1:=a1
-
b1;
end
else begin
b1:=b1
-
a1;
end;
end;
write(‘
НОД
=’,a1);
readln
;
end.
Считаю необходимым объяснить, зачем
введены
вспомогательные переменные
a
1
и
b
1
. Если это явно не сказано в условии
задачи
, не вытекает из её логики, то
переменные, являющиеся
входными
данными
, лучше «не пор
тить», то есть не
менять их значений. Если это не войдёт в
привычку, то в дальнейшем возникнет
много проблем.
Задача №3
1.
Сделать программу, перемножающую два целых числа. Операцию умножения не
использовать, обойтись сложением в цикле.
Составим примерные
т
есты:
Входные данные:
Выходные данные:
5 5
25
5
-
5
-
25
-
5 5
-
25
-
5
-
5
25
0 5
0
5 0
0
var a, b, R, i: integer;
begin
writeln('napisat programmy kotorayi * dva celyx chisla, ye ispolzyi ymnojenie');
wri
teln;
36
writeln('vvedite 2 chisla');
readln(a,b);
R:=0;
if (a=0) or (b=0) then writeln ('proizvedenie = 0')
else
if (a0) and (b0) then
for i:=1 to abs(a) do R:=R+abs(b)
else
if (a0) then
for i:=1 to b do R:=R+a
else
for i:=1 to a do R:=R+b;
writeln ('proizvedenie = ', R);
writeln;
readln;
end.
end.
Чтобы данная задача, соотвествовала любым тестовым значениям,
необходимо применить и ветвления и цикл с параметром.
I
I
I
.Заключение
В данном методическом пособие рассмотри
вались задачи по
программированию для учащихся 7
-
9 классов, которые основаны вперую очередь
на законах математики, и на алгоритмическом мышление, а также обязательно
знание и умения навыков программирования на
FreePascal
.
Очень часто учителя встречаются с
тем, что у учащихся для решения
олимпиадных задач по информатике не хватает, знаний имеено по математики для
построения алгоритма решения задачи. Настоящее пособие должно помочь учителю
информатики научить ребенка первым навыкам программирования на основе
необычных, математических задач.
IV.
Список литературы и интернет ресурсов
37
1.
Л.Г. Алсынбаева, Л.А. Голубева, Л.А. Москвина «Методика начального обучения
а
л
горитмизации и программированию», Метод. материалы для препод
авателя,
НГУ,
Новосибирск, 1996;
2.
И.А.Трофимова, О.В.Яровая
-
информатика в схемах и таблицах
, М.Эксмо, 2010.;
3.
Г.Б. Рейнгольд «Использование средств компьютерной графики при изучении
а
л
горитмических конструкций». («Теория и практика преподавания математики
и информатики
», сборник методических статей, выпуск 1, ИГПУ, Иркутск 2000.)
4.
Г.Б. Рейнгольд, М.Г. Рейнгольд, А.Н. Юркевич, Я.В. Курзыбова
«Заочные
олимпиады
–
важный этап подготовки юных программистов».
(«Совершенствование методов преподавания математики и информатики в
условиях модернизации Российского образования». Материалы
XI
межрегиональной научно
-
практической конференции пр
е
подавателей школ,
инновационных учебных заведений и вузов. ИГПУ, Иркутск, 2004.)
5.
http://do.ckspo.ru/course/view.php?id=4
-
Основы алгоритмизации
и
программирования на Lazarus IDE
.