Инфоурок Информатика КонспектыМетодическое пособие для учителя информатики "Методика решения олимпиадных задач по программированию"

Методическое пособие для учителя информатики "Методика решения олимпиадных задач по программированию"

Скачать материал

Муниципальное бюджетное общеобразовательное  учреждение  «Средняя общеобразовательная школа №12» города Братска

 

Центр развития образования города Братска

 

 

Школа современного педагога 

«Информатика»

 

 

 

 

Методическое пособие для учителя «Методика решения олимпиадных задач по информатике на базе системы Free Pascal»

 

 

 

 

 

 

 

 

Разработал:                                                                  Метляева А.В.

                                                               учитель информатики                                                                 МБОУ «СОШ№12»

 

 

 

 

 

Братск, 2014г.

 

I.Аннотация

 Данная разработка представляет собой  методическое пособие для учителя информатики, которая поможет восстановить и закрепить навыки структурного программирования, полученные ранее. Пособие охватывает темы от основ до ветвлений и циклов, рассчитаны на аудиторию 7-9 класс. Язык программирования, на котором приведены примеры FreePascal, а среда программирования для выполнения заданий –Lazarus IDE. Актуальность рассмотренных  задач направлена в первую очередь на знание курса математики за 5-7 класс и навыков программирования, что вызывает у большинства школьников затруднение, в построение условий задач и в свою очередь является хорошей подготовкой учащихся к олимпиаде по информатике. На первый взгляд все задачи кажутся очень простыми, но в каждой задаче есть свои подводные камни.

 Так как  FreePascal и Lazarus официально включены в "первый список" языков и сред министерства образования РФ для проведения олимпиад по программированию, от школьных до всероссийских, рекомендуем ориентироваться именно на них. 

          Текст задач взят с дистанционных курсов по программированию  Байкальского           Университета       Экономики и        Права,        автор          задач является преподаватель  курсов Рейнгольд М.Э. Решение и разбор  задач  выполнено самостоятельно преподавателем информатики МБОУ «СОШ №12» Метляевой А.В.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Содержание

 

I.   Введение   стр.............................................................................................................. 4

II.  Основные разделы с примерами решенных задач   стр и рекомендациями по их решению ..................................................................................... 5

1. Знакомство с консольным приложением Free Pascal и стр средой визуального программирования Lazarus IDE .................................................................. 5

2.  Введение в программирование   стр........................................................................... 10

3.  Решение задач с применением простых и сложных стр условий .............................. 19

4. Циклы  стр................................................................................................................... 33

III. Заключение  стр......................................................................................................... 36

 

 

 

IV.            Список литературы и интернет источников                    стр.37

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

I.                  Введение.

 Сегодня нам – учителям информатики – приходится решать сложную, но очень «жизненную» задачу: обеспечить приемлемый уровень знаний учащихся, не просто достаточный для успешной сдачи ГИА или ЕГЭ, но и необходимый им для дальнейшего обучения в старшей или высшей школе и для дальнейшей  профессиональной жизни. 

          Особенно трудности возникают как у учителей, так и учащихся в прохождение раздела «решение задач по программированию».

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

В данном методическом пособие мы познакомимся с примерами написания учебных  программ по информатике  для учащихся 7-9  классов с помощью свободного распространяемого компилятора языка программирования  Pascal - Free Pascal

На сегодняшний день Free Pascal это мощное средство по созданию и написанию программ в кроссплатформенной среде разработки Lazarus. 

Lazarus — бесплатная среда разработки программного обеспечения с открытым исходным кодом для компилятора Free Pascal (часто используется сокращение FPC— свободно распространяемый компилятор языка программирования Pascal) на языке Object Pascal. 

Интегрированная среда разработки предоставляет возможность кроссплатформенной разработки приложений в Delphi-подобном окружении.

 На данный момент является единственным инструментом быстрой разработки приложений (RAD), позволяющим Delphi-программистам создавать приложения с графическим интерфейсом для Linux (и других не-Windows) систем.

 

Почему Lazarus такой популярный?

 

Другими словами Lazarus - это библиотеки классов Free Pascal для эмуляции Delphi. 

Так что Lazarus - это то недостающее звено, которое открывает возможности кроссплатформной разработки Delphi-подобных программ.

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

 

          

 

 

 

 

 

 

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.

 После запуска Мастер создания проектов Lazarus предложит на выбор множество вариантов приложений. В процессе обучения основам алгоритмизации и программирования нас будут интересовать Проект\Приложение и Проект\Программа. Первый вариант представляет собой готовый шаблон графического приложения с 1 формой и возможностью добавления графических объектов стандартных библиотек, второй вариант даёт возможность создать программу, взаимодействующую с пользователем в режиме «чёрного экрана».

 

Интерфейс программы Lazarus Рис.1

 

            

Как можно заметить, при открытии 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 кнопка. Такой интерфейс может быть пригоден для приложения, реализующего  значений пользователем и вычисления по нажатию кнопки. Надписи будут выступать в роли текстовых подсказок.

Сразу же после добавления инструмента на форму Lazarus IDE автоматически описывает соответствующий инструменту объект и размещает его графическое отображение на панели формы. Объекту присваивается уникальное имя (поумолчанию формата <Имя_инструмента><Порядковый_номер_объекта>, например Edit1 или Timer22), по которому к нему или любому его свойству или процедуре можно обращаться из всех процедур, составляющих приложение.

Небольшое отступление. Даже самая простая надпись характеризуется множеством свойств:

Name — имя объекта

Top — положение объекта по вертикали относительно верхнего края формы

Left — положение объекта по горизонтали относительно левого края формы

Width — ширина объекта

Height — высота объекта

Caption — текст надписи на объекте

Font — шрифт надписи на объекте

Alignment — выравнивание текста надписи на объекте

Например, на иллюстрации объекты Label1 и Label2 отличаются значениями всего трёх свойств — именами, текстами надписей и положением по вертикали относительно верхнего края формы.

Как уже было отмечено выше, что с помощью среды программирования Lazarus можно разрабатывать как программу на языке Pascal, и также Delphi подобную программу, давайте рассмотрим пути создания проектов в Lazarus.

 

Рис.1.2. Создание Проект/Программа в Lazarus

 

 

 

После успешного выполнения данных команд, программа запустит окно консольного приложения Free Pascal- рисунок 1.3.

 

Рис.1.3. Окно редактора исходного кода программы на Free Pascal

 

 

 

 

 

 

Рис.1.4. Создание Проект/Приложение в Lazarus

 

1.2. Работа с файлами

 

Обыкновенно исходный код проекта Lazarus содержится не в 1, а в нескольких файлах разного назначения: файлы проекта, файлы форм, файлы модулей и другие. Поэтому очень важно правильно создать новые и сохранить уже созданные проекты. Для удобства управления проект необходимо сохранить в отдельный каталог через меню «Файл\Сохранить всё» («File\Save all») сразу же по созданию, и проверить корректность сохранения в этом каталоге. Lazarus поддерживает относительные пути при запуске проекта, но очень чувствителен к отсутствию одного из составляющих проект файлов. Также рекомендуется делать резервные копии папки проекта по мере разработки.

 

1.3.Порядок решения задач

Этапы написания программы для решения задачи:

1.     Внимательно прочесть условие задачи и разобраться с входными и выходными данными..

2.     Составить несколько тестов, желательно на все частные случаи.

3.     Составить алгоритм, написать и отладить программу.

4.     Протестировать её.

 

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

 

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

Система программирования – это программное обеспечение компьютера, предназначенное для разработки, отладки, исполнения программ, записанных на определенном языке программирования;

Программа – это алгоритм, записанный на каком-либо языке программирования, набор команд для компьютера.

Команда (оператор) – это описание действий, которые должен выполнить компьютер. 

           откуда взять исходные данные? 

           что нужно с ними сделать?

Компьютер исполнитель работает с определенными данными по определенной программе. Данные это числа, символы, строки, таблицы т.е. это все величины.  В алгоритмизации и программирование величины разделяется на два типа:

1.Переменная;

2.Константа;

 

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

 

Рис.2.1. Переменная, типы переменной, объявление переменной 

 

Имя переменной это её обозначение, например: a,b,c. Все буквы для объявления переменной должны быть латинскими. Заглавные буквы не отличаются от строчных букв, но строчные предпочтительнее, т.к. ближе к математической традиции. 

 В качестве имен переменных нельзя использовать служебные слова Free Pascal: имена

команд, операций и встроенных функций. Отличие от математических обозначений: -имя переменной не обязательно одна буква, но любое сочетание букв и цифр, начинающаяся с буквы. На рисунке 2.1. представлены основные типы переменных используемых во Free Pascal, и правильность написания раздела описания переменных. 

На рисунке 2.2. представлен образец объявления и написания констант во Free

Pascal.

 

Рис.2.2. Константы, объявление констант, типы констант

 

Любой переменной в ходе выполнения программы будет присвоено какое-либо значение. Оператор присваивания значения переменной имеет вид: <Имя переменной> := <выражение>

Простой знак  равенства трактуется компилятором 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:=(x1*y*5)/12;

Встроенные функции: поясню для начала слово «встроенные». Это значит сделанные изготовителями системы программирования (а можно, и создавать свои собственные).  Ниже приводятся наиболее употребляемые математические функции FreePascal

 

abs(x)

абсолютная величина (модуль)

cos(x)

косинус

sin(x)

синус

round(x)

целая часть

sqrt(x)

квадратный корень

random(x)

0 < x-1, где x — натуральное число

 

Аргументами функций должны величины соответствующих типов, константы (т.е. конкретные значения) или выражения. Функции используются в выражениях (в правой части команды присваивания или в отношениях).

 

2.1.Команды ввода и вывода

 

Команда read (ввод через консоль:)

Мы  знаем, что переменные свои значения могут получать с помощью команды присваивания. Однако, это не единственный способ. Бывает, что дать значение переменной необходимо во время работы программы, а не во время её написания. В этом случае команда присваивания не может помочь, и нужен какой-либо другой способ.  Такой способ есть - команда ввода значений переменных, «read».  Ее синтаксис:

 

write[ln](<подсказка>); read[ln](<список переменных>);

где:

<подсказка>   - любой текст, заключённый в кавычки;

<список переменных> - имя одной переменной либо несколько имён переменных, разделённых запятыми.

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

 

write(‘Введите Read(a,b);

длину

и

ширину’); 

Пример:

 

 

Работает команда «read» так:

      выводится на монитор подсказка, если она есть, иначе вопросительный знак;

      приостанавливается выполнение программы, пока не будут введены через запятую столько констант и таких типов, сколько и каких типов имён переменных перечислено в <списке переменных> и не будет нажата клавиша  Enter;

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

Как это происходит и в команде присваивания, старое значение вводимой переменной забывается.

 

Отметим, что, в отличие от команды присваивания, вводить надо именно константы, а не выражения!

Нужно подробней остановиться на подсказках. Зачем они нужны? Представим себе, что в какой-то программе подсказок нет, и пользователь, работающий с этой программой, сидит в растерянности. Компьютер остановился и чего-то ждёт, а пользователь не знает, что делать. Только с помощью подсказки и можно сообщить ему, сколько и каких значений требуется ввести, что они значат…  Надо научиться писать короткие, но толковые подсказки!

Обратите внимание на отличия команд присваивания и ввода:

      С помощью одной команды присваивания можно задать значение лишь одной переменной, а с помощью одной команды ввода – нескольким.

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

      В команде присваивания можно писать и формулы, а в команде ввода пользователь имеет право вводить лишь конкретные значения.

      Если в каком-то случае программист и пользовательодно и то же лицо, команду ввода можно заменить командой присваивания, но не наоборот.

 

Команда write (Вывод)

Эта команда очень похожа на предыдущую, но выполняет обратное действие. Если команда «read» вводит значения переменных в оперативную память компьютера, то команда «write» их выводит. Правда, выводить она может не только значения переменных, но и выражений, в частности, константы. Синтаксис этой команды:

Write[ln] (<список вывода>);

где: <список вывода> – одно или несколько, перечисленных через запятую или

точку с запятой, имён переменных или выражений.

Работает команда write так:  ищет значения переменных и вычисляет значения выражений, перечисленных в списке вывода, и выводит их на монитор в соответствующем порядке.

 

Команда clrscr

Это, пожалуй, самая простая команда. Получив её, FreePascal стирает с экрана всю информацию, которая находилась на нём.

 

Использование объектов формы для ввода и вывода

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

Для ввода нескольких значений поместим нужное количество текстовых полей

(инструмент TEdit) на форму, и такое же количество надписей (инструмент TLabel) для подсказки пользователю, что мы ожидаем получить от него в каждом из текстовых полей. Также поместим на форму 1 кнопку и ещё 1 надпись, чтобы программа начала рассчёт только по готовности пользователя, и вывела ответ не «испортив» поля входных данных.

После подготовки всех объектов, сделайте двойной щелчок левой кнопкой мыши по кнопке на форме, и Lazarus IDE автоматически создаст в окне программы процедуру TForm1.Button1Click. Это название можно прочитать как «Процедура по событию Click на объекте Button1, принадлежащем объекту Form1». Button1Click — имя процедуры, теперь именно оно будет являться значением свойства Button1.Click кнопки Button1 и отображаться на вкладке Events (События) панели свойств этой кнопки в строке Click.

Пример:

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, но гораздо лучше как:a1,a2,a3,a4,a5.

Во-вторых составим несколько тестов: 

 

1 тест

 

 

 

2 тест

 

 

1

2

3

4

5

 

1

2

3

4

5

Входные

10

10

10

10

30

 

10

20

30

40

60

данные

 

 

 

 

 

 

 

 

 

 

 

Выходны

е данные

3

10

5

7

10

 

3

20

15

22

20

Третий этап – написание программы. 

Запускаем приложение Lazarus IDE. Создаем новое приложение, как было описано выше. Размещаем на форме все элементы, как показано на рисунке 2.3.  

 

 

Рис.2.3.Разработка формы  Делаем щелчок по элементу Button1. 

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.

                  

Открывается окно редактора кода –Unit1. Набираем код программы, он выглядит следующим образом: 

 

 

 

 

 

 

 

Рис.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(Edit2.Text);  k:=StrToFloat(Edit3.Text);  o:=d-(s*k);

 Label6.Caption:=FloatToStr(o); end; end.                             

 В разработке программ с помощью приложения 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.Покупатель пришёл в магазин с намерением совершить три покупки. Задаётся сколько у него было денег, цена первого товара, количество первого товара, которое он хотел купить, цена второго товара, количество второго товара, цена третьего товара, количество третьего товара. Сделать программу для определения остатка денег.

Примерный тест:

Входные данные:

Выходные данные:

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) и «ЛОЖЬ» (false) и могут быть сохранены как значение переменной типа boolean, булева типа переменной. Третьего не дано.

Примеры простых условий: a = 2

(x - x0) * (x - x0) + (y – y0) * (y - y0) <= r * r a + b[1] + b[2] + b[3] + b[4]) = '12345' c = true

d <> false

 

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

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

1.   Функция «НЕ» (not)

A

НЕ (A)

ИСТИНА (true)

ЛОЖЬ (false)

ЛОЖЬ

(false)

ИСТИН

А (true)

Эта    функция «одноместная»,        то      есть имеет один аргумент. Её таблица           истинности приводится ниже:

 

 

 

 

На 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 это тоже скорей операция и записывается так:

 

(a = 3) and (b > 7)

 

(x <= x2) and (x >= x1)

 

 

 

 

 

3.Функция «ИЛИ» (or) Эта функция тоже двуместная. Вот её таблица истинности:

 

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 >= x1)

 

4.Ветвление

Ветвление служит для того, чтобы можно было пропустить, не выполнять какую-то группу команд в программе. Вопрос о выполнении, или невыполнении решается в зависимости от выполнения, или невыполнения соответствующего условия.

 

Полное ветвление

end;

Если условие истинно, то выполняется первое действие, иначе – второе. Таким образом, всегда будет выполняться либо первое действие, либо второе. Всегда одно, не больше и не меньше!

 

Сокращённое ветвление

 

if по-английски значит «если», then – «то», else – «иначе», а end; – «конец», в

данном случае это можно интерпретировать как- «конец если».

Действия могут состоять из произвольного числа команд. Они могут включать в себя алгоритмические структуры. Могут они быть и пустыми.

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

 

Задача№1

Сделать программу, высчитывающую площадь треугольника по формуле Герона по трём заданным сторонам. Входные данные – три числа. Если они могут образовать треугольник, то выдать его площадь, иначе выдать сообщение о некорректности входных данных.

 

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

 

тес та

Входные данные

 

Выходные данные

1

3

4

5

6

2

1

1

10

некорректные данные

 

Напишем программу:

program z3; {Илья Молчанов 9Е Формула Герона} var a,b,c,p,s: real; begin

 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;  readln; end.

 

Задача №2

Человек пришёл в магазин с некоторой суммой денег. Он имеет намерение купить некоторое количество сахара. В случае возможности такой покупки, он её совершает, в противном случае – ничего не покупает и уходит. Сумма денег, которая имеется первоначально; цена одного килограмма сахара; количество, которое он хочет купить, задаются.

Сделать программу, определяющую, сколько денег остаётся.

 

Приступим к решению. В условии задачи чётко указаны все входные и выходные данные, надо лишь ещё раз вдуматься. Входные данные: три числа (количество денег изначально, цена сахара, количество сахара), выходные: одно число, сумма денег, оставшихся после посещения магазина. Составим несколько тестов.

 

те ст

а

Входные данные

 

Выходные данные

1

30

15

2

0

2

50

15

2

20

3

20

15

2

20

 

Теперь напишем программу:

program z4; {Илья Молчанов 9Е Поход в магазин} var a,b,c: real; begin  write(‘Введите количество денег’);  readln(a);

 write(‘Введите цену товара’);  readln(b);

 write(‘Введите количество товара’);  readln(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-vy konfet'); writeln('kazdai siela stolko konfet, kakoi ee poradkovy nomer'); writeln('napisat programmy dly opredeleniy kol-va y kazdoi'); writeln; writeln; d1:=1; d2:=2; d3:=3; d4:=4; write ('vvedite kolichestvo konfet ' ); 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 devocki ravno ' ), d2);  if d3>a3 then  begin d3:=0; end  else d3:=a3-d3;

 writeln(('kol-vo 3 devocki ravno ' ), d3);  if d4> a4 then begin  d4:=0; end

 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

 writeln('imeetsy doroga,       sostoyhai    iz       nekotorogo kolichestva stancii.           vse stanciipronumerovany podrad. zadaetsy nomer nac stancii i kol-vo stancii, kotoroe nado proexat. esli poezd priezhet v typik,to ostaetsy tam');  writeln;

 writeln('sdelat programmy opredelyuhyy gde okazetsy poezd.');  writeln;

 writeln('zadacha nomer 17, avtor Metlyaeva A.V');  writeln;

 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 (c>a) then begin

  c:=a;  end;  writeln;  if (c<=0) then

  c:=1;

 writeln('nomer konehcnoy stancii raven' , c);  writeln;  readln; end. end.

 

                                

 

Решение алгоритма: В первую очередь для решения данной задачи необходимо построить для наглядности отрезок и продумать алгоритм.

 

 

 

                1    2        3        4      5       6          7       8      9      10

                 Давайте посмотрим на набор тестов №1, дано общее количество станций

10, начальная станция  от куда будет отъезжать поезд равно 5, и количество станций которое необходимо проехать равно 3. Если данный тест просчитать с помощью нашего отрезка, то получим, что конечной номер конечной станции равен 8. В переменной «с»  я присваиваю значение номера конечной станции, следовательно, продумав алгоритм, получается что с=5+3=8,и тут необходимо узнать где находится мой поезд в тупике или нет. Для данного отрезка тупиком будет являться конечная и начальная точка. Давайте сформулируем условие: если c>a(a это общее количество станций на отрезке), тогда с:=а. Данное условие задачи будет работать на движение вперед (т.е. при положительном числе).  А теперь рассмотрим набор тестов №2. 

 

Рис.3.2. Разбор теста на отрицательное значение

 

 

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

Сформулируем условие: если с<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;

 writeln ('imeetsy krygovai doroga, zadaetsy nomer nachalnou stancii i kolichestvo kotoroe nado proexat');

 writeln('sdelat 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;

 if c>a 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<=2N. Первый «легкий» хорош тем, что мы сразу получаем ответ без всяческих преобразований. Второй вариант тоже неплох, так как достаточно вычесть 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. 

Что же делать, если Х+А>2N, либо Х+А<= -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)) и получаем номер конечной станции поезда на круговой железной дороги. В данной задачи, необходимо знать как правильно работает арифметическая функция 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: integer; begin

 writeln('imeetsy doroga, sostoyhai iz nekotorogo kolichestva stancii. vse stanciipronumerovany podrad. zadaetsy nomer nac stancii i kol-vo stancii, kotoroe nado proexat. esli poezd priezhet v typik, to razvorachivaetsy i edet v obratnyu storony 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 nahalnoj stanciy');  readln (b);

 write ('zadaite kolichestvo stanciy');  readln (n);  if n>0 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

     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 разворота, и двигаясь в изначальном направлении и не  доезжаем до начальной станции.  

Алгоритм программы соотвествует всем 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-х товаров. Сперва, делается попытка совершить первую покупку, а потом, на оставшиеся деньги, вторую.

Входные  данные

Был

о

дене

г

Цена-

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

15

0

Выходн

ые данные

 

Da

 

 

 

 

 

 

№6. У двух человек было по некоторому количеству денег. Они их сравнили, и тот, у которого было больше, отдал 1 рубль тому, у которого меньше. В случае равенства, всё осталось, как было. Сделать программу для определения, у кого сколько осталось.

Входные данные

20 10

10 30

Выходные данные

19 11

11 29

 

 

 

4.Циклы

Бывает, что при написании программы возникает необходимость в том, чтобы написать подряд несколько одинаковых действий. В принципе, можно просто взять и написать их одно за другим, если повторять надо не очень много раз, и если точно известно, сколько раз. Однако как быть, если действие надо повторить несколько тысяч раз? Как быть, если мы вообще не знаем заранее, сколько раз надо повторять, а это зависит от входных данных? Для решения этой проблемы и существует алгоритмическая структура цикл, к рассмотрению которой мы и переходим. Как и у ветвлений, у циклов есть несколько разновидностей.

 

1 Если не произойдёт переполнение, тогда последует аварийная остановка программы.

 

          

действие

 

            Истина                           Ложь

              Условие   

 

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

Цикл с параметром

for пц:=нз {to/downto} кз do begin  действие; end;

Позволим себе дать объяснение этого вида цикла без блок-схемы. Для его организации вводится специальная вспомогательная[1] переменнаяпараметр цикла (пц), обязательно целочисленного типа. Параметр цикла получает начальное значение. Потом проверяется условие пц<=кз, в случае, если шаг цикла положителен, и пц=>кз, если шаг цикла отрицателен. Если это условие истинно, то выполняется действие, параметр цикла изменяется на шаг, и опять проверяется условие. Таким образом, это частный случай цикла с предусловием, так как если условие в начале ложно, то действие вообще не выполняется.

Начальное значение, конечное значение, шаг параметра цикла – арифметические выражения. Если цикл работал хоть раз, то по окончании параметр цикла равен конечное значение + шаг. Шаг цикла определяется наличием связки to или downto между начальным и конечным значениями. to определяет положительный шаг, равный 1, а downto определяет отрицательный шаг, равный -1.

 

Задача №1

Даны два целых числа, причём первое не больше второго. Выдать на экран все целые числа от первого до второго.

 

Начнём решать. Какие входные и выходные данные? Входные данные: два числа, выходные: последовательность чисел. Составим несколько тестов.

 

Входные данные

Выходные данные

те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 z5-2;  uses DOS, CRT;

var 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

 

2

2

8

2

3

37

52

1

 

Для составления алгоритма воспользуемся известным из математики алгоритмом Евклида. Программа:

 

Program z5-3;  var a,b,a1,b1: integer; begin

 clscr;

 write(‘Введите два числа’);

 readln(a,b);  a1:=a;  b1:=b;  while a1<>b1 do begin   if a1>b1 then begin    a1:=a1-b1;   end   else begin    b1:=b1-a1;

  end;  end;  write(‘НОД=’,a1);

 readln; end.

Считаю необходимым объяснить, зачем введены вспомогательные переменные a1 и b1. Если это явно не сказано в условии задачи, не вытекает из её логики, то переменные, являющиеся входными данными, лучше «не портить», то есть не менять их значений. Если это не войдёт в привычку, то в дальнейшем возникнет много проблем.

 

Задача №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('zadacha 30,avtor Metlyaeva A.V.');

 writeln('napisat programmy kotorayi * dva celyx chisla, ye ispolzyi ymnojenie');  writeln;

 writeln('vvedite 2 chisla');

 readln(a,b);  R:=0;

 if (a=0) or (b=0) then writeln ('proizvedenie = 0')  else

 if (a<0) and (b<0) then

 for i:=1 to abs(a) do R:=R+abs(b)  else  if (a<0) 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.                      

Чтобы данная задача, соотвествовала любым тестовым  значениям,  необходимо применить и ветвления и цикл с параметром.

 

III.Заключение

В данном методическом пособие рассмотривались задачи по программированию для учащихся 7-9 классов, которые основаны  вперую очередь на законах математики, и на алгоритмическом мышление, а также обязательно знание и умения навыков программирования на FreePascal.

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

 

 

 

 

 

 

 

 

 

 

 

 

        IV.    Список литературы и интернет ресурсов

 

1.   Л.Г. Алсынбаева, Л.А. Голубева, Л.А. Москвина «Методика начального обучения алгоритмизации и программированию», Метод. материалы для преподавателя, НГУ, Новосибирск, 1996;

2.   И.А.Трофимова, О.В.Яровая- информатика в схемах и  таблицах, М.Эксмо, 2010.;

3.   Г.Б. Рейнгольд «Использование средств компьютерной графики при изучении алгоритмических конструкций». («Теория и практика преподавания математики и информатики», сборник методических статей, выпуск 1, ИГПУ, Иркутск 2000.)

4.   Г.Б. Рейнгольд, М.Г. Рейнгольд, А.Н. Юркевич, Я.В. Курзыбова «Заочные олимпиады – важный этап подготовки юных программистов». («Совершенствование методов преподавания математики и информатики в условиях модернизации Российского образования». Материалы XI межрегиональной научно-практической конференции преподавателей школ, инновационных учебных заведений и вузов. ИГПУ, Иркутск, 2004.)

5.   http://do.ckspo.ru/course/view.php?id=4-Основы алгоритмизации и программирования на Lazarus IDE. 

 

 

 



[1] В программе есть переменные входные и выходные. Переменные же, не являющиеся ни первыми, ни вторыми, называются вспомогательными. Редко какая программа обходится без них, разве что самая простая.

Просмотрено: 0%
Просмотрено: 0%
Скачать материал
Скачать материал "Методическое пособие для учителя информатики "Методика решения олимпиадных задач по программированию""

Методические разработки к Вашему уроку:

Получите новую специальность за 3 месяца

Руководитель образовательного подразделения

Получите профессию

Секретарь-администратор

за 6 месяцев

Пройти курс

Рабочие листы
к вашим урокам

Скачать

Краткое описание документа:

Данная разработка представляет собой  методическое пособие для учителя информатики, которая поможет восстановить и закрепить навыки структурного программирования, полученные ранее. Пособие охватывает темы от основ до ветвлений и циклов, рассчитаны на аудиторию 7-9 класс. Язык программирования, на котором приведены примеры FreePascal, а среда программирования для выполнения заданий –LazarusIDE. Актуальность рассмотренных  задач направлена в первую очередь на знание курса математики за 5-7 класс и навыков программирования, что вызывает у большинства школьников затруднение, в построение условий задач и в свою очередь является хорошей подготовкой учащихся к олимпиаде по информатике. На первый взгляд все задачи кажутся очень простыми, но в каждой задаче есть свои подводные камни.

 

              Так как  FreePascal и Lazarus официально включены в "первый список" языков и сред министерства образования РФ для проведения олимпиад по программированию, от школьных до всероссийских, рекомендуем ориентироваться именно на них.

Скачать материал

Найдите материал к любому уроку, указав свой предмет (категорию), класс, учебник и тему:

6 671 887 материалов в базе

Скачать материал

Оставьте свой комментарий

Авторизуйтесь, чтобы задавать вопросы.

  • Скачать материал
    • 30.03.2015 1032
    • PDF 0 байт
    • 11 скачиваний
    • Оцените материал:
  • Настоящий материал опубликован пользователем Метляева Анна Валентиновна. Инфоурок является информационным посредником и предоставляет пользователям возможность размещать на сайте методические материалы. Всю ответственность за опубликованные материалы, содержащиеся в них сведения, а также за соблюдение авторских прав несут пользователи, загрузившие материал на сайт

    Если Вы считаете, что материал нарушает авторские права либо по каким-то другим причинам должен быть удален с сайта, Вы можете оставить жалобу на материал.

    Удалить материал
  • Автор материала

    Метляева Анна Валентиновна
    Метляева Анна Валентиновна
    • На сайте: 9 лет и 1 месяц
    • Подписчики: 1
    • Всего просмотров: 8404
    • Всего материалов: 10

Ваша скидка на курсы

40%
Скидка для нового слушателя. Войдите на сайт, чтобы применить скидку к любому курсу
Курсы со скидкой

Курс профессиональной переподготовки

Менеджер по туризму

Менеджер по туризму

500/1000 ч.

Подать заявку О курсе

Курс повышения квалификации

Использование компьютерных технологий в процессе обучения информатике в условиях реализации ФГОС

36 ч. — 144 ч.

от 1700 руб. от 850 руб.
Подать заявку О курсе
  • Сейчас обучается 137 человек из 45 регионов
  • Этот курс уже прошли 1 303 человека

Курс повышения квалификации

Использование нейросетей в учебной и научной работе: ChatGPT, DALL-E 2, Midjourney

36/72 ч.

от 1700 руб. от 850 руб.
Подать заявку О курсе
  • Сейчас обучается 616 человек из 77 регионов
  • Этот курс уже прошли 985 человек

Курс повышения квалификации

Специфика преподавания информатики в начальных классах с учетом ФГОС НОО

72 ч. — 180 ч.

от 2200 руб. от 1100 руб.
Подать заявку О курсе
  • Сейчас обучается 39 человек из 20 регионов
  • Этот курс уже прошли 284 человека

Мини-курс

Воспитание будущего поколения: от педагогики до игровых технологий

3 ч.

780 руб. 390 руб.
Подать заявку О курсе
  • Этот курс уже прошли 18 человек

Мини-курс

Разнообразные методы и формы обучения в высшем образовании

3 ч.

780 руб. 390 руб.
Подать заявку О курсе

Мини-курс

Современные направления в архитектуре

6 ч.

780 руб. 390 руб.
Подать заявку О курсе