Учебно-методическое пособие по дисциплине Основы программирования

Раздел Информатика
Класс -
Тип Другие методич. материалы
Автор
Дата
Формат doc
Изображения Есть
For-Teacher.ru - все для учителя
Поделитесь с коллегами:


Ливенский филиал ПГУ



УЧЕБНО-МЕТОДИЧЕСКОЕ ПОСОБИЕ

«ЯЗЫК ПРОГРАММИРОВАНИЯ PASCAL»

для студентов специальности 09.02.03

«Программирование в компьютерных системах»




2016

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

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

Составитель: ___________________ Е. Н. Шатохина, преподаватель кафедры естественнонаучных дисциплин

Ливенского филиала ПГУ

Рецензент: _______________________, преподаватель кафедры естественнонаучных дисциплин

Ливенского филиала ПГУ

Пособие рассмотрено и одобрено на заседании кафедры

естественнонаучных дисциплин.

Протокол № ____ от «___»__________20__ г.

Зав. кафедрой канд.техн. наук, доцент _____________

Пособие рассмотрено и одобрено на заседании научно-методического совета

Протокол № ____ от «___»__________ 20__ г.

Председатель НМС канд. соц. наук _____________

СОДЕРЖАНИЕ

Ливенский филиал ПГУ 1

УЧЕБНО-МЕТОДИЧЕСКОЕ ПОСОБИЕ 1

«ЯЗЫК ПРОГРАММИРОВАНИЯ PASCAL» 1

для студентов специальности 09.02.03 1

«Программирование в компьютерных системах» 1

2016 2

Методические указания соответствуют рабочей программе по специальности 09.02.03 Программирование в компьютерных системах. 2

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

Составитель: ___________________ Е. Н. Шатохина, преподаватель кафедры естественнонаучных дисциплин 2

Ливенского филиала ПГУ 2

Рецензент: _______________________, преподаватель кафедры естественнонаучных дисциплин 2

Ливенского филиала ПГУ 2

Пособие рассмотрено и одобрено на заседании кафедры 2

естественнонаучных дисциплин. 2

Протокол № ____ от «___»__________20__ г. 2

Зав. кафедрой канд.техн. наук, доцент _____________ 2

Пособие рассмотрено и одобрено на заседании научно-методического совета 2

Протокол № ____ от «___»__________ 20__ г. 3

Председатель НМС канд. соц. наук _____________ 3

СОДЕРЖАНИЕ 4

ПЕРВОЕ ЗНАКОМСТВО С СИСТЕМОЙ
ПРОГРАММИРОВАНИЯ ТУРБО ПАСКАЛЬ 7

КОМАНДЫ РЕДАКТОРА 8

ОСНОВНЫЕ ПОНЯТИЯ 10

ПОНЯТИЕ АЛГОРИТМА 11

Условные обозначения блок-схемы 12

Алгоритмы и блок-схемы: задания 13

АЛФАВИТ ЯЗЫКА 16

ИДЕНТИФИКАТОРЫ 17

КОНСТАНТЫ 18

ТИПЫ ДАННЫХ. ОПЕРАЦИИ И ФУНКЦИИ
НАД ДАННЫМИ РАЗНЫХ ТИПОВ 19

ПРОСТЫЕ ТИПЫ 19

ПЕРВАЯ ПРОГРАММА 25

ПУСТОЙ И СОСТАВНОЙ ОПЕРАТОРЫ 26

ОПЕРАТОРЫ ВВОДА И ВЫВОДА ИНФОРМАЦИИ 27

ОПЕРАТОРЫ ВВОДА\ВЫВОДА: ЗАДАЧИ 31

ОПЕРАТОР ПРИСВАИВАНИЯ 34

ОПЕРАТОР ПРИСВАИВАНИЯ: ЗАДАЧИ 34

МЕТКИ. 37

ОПЕРАТОР БЕЗУСЛОВНОГО ПЕРЕХОДА 37

УСЛОВНЫЙ ОПЕРАТОР 38

ВЛОЖЕННЫЕ ОПЕРАТОРЫ УСЛОВИЯ 41

ОПЕРАТОР ВЫБОРА 42

Проверочная работа
47

ЦИКЛИЧЕСКИЕ АЛГОРИТМЫ 48

ЦИКЛ. ВИДЫ ЦИКЛОВ 48

Цикл "С параметром". Оператор цикла с параметром 49

Цикл "ПОКА". Оператор цикла с предусловием 50


Цикл "ДО". Оператор цикла с постусловием 51

ЦИКЛ С ПАРАМЕТРОМ 54

Задачи 54

ЦИКЛЫ С УСЛОВИЯМИ 56

Задачи 57

ВЛОЖЕННЫЕ ЦИКЛЫ 61

Проверочные работы (циклы и условия) 64

ПРОЦЕДУРЫ И ФУНКЦИИ 66

Процедуры: задачи 71

Функции: задачи 74

СТРОКОВЫЕ ОПЕРАЦИИ 76

Задачи:символы 81

ОПРЕДЕЛЕНИЕ ТИПОВ 86

Задачи: пользовательские типы 87

МАССИВЫ 89

ОДНОМЕРНЫЙ МАССИВ (ВЕКТОР) 91

ДВУМЕРНЫЕ И МНОГОМЕРНЫЕ МАССИВЫ 100

РАБОТА С ФАЙЛАМИ 108

Задачи: работа с файлами 111

РЕКУРСИЯ 114

ПРИЛОЖЕНИЯ 116

ТЕКСТОВЫЙ ВИДЕОРЕЖИМ 116

МОДУЛЬ CRT 116

(основные возможности) 116

Управление цветом 117

Очистка экрана 119

ОПРЕДЕЛЕНИЯ КОНСТАНТ-НАЗВАНИЙ ЦВЕТОВ
ПАЛИТРЫ В ТЕКСТОВЫХ РЕЖИМАХ (МОДУЛЬ CRT) 120

Цвет 120

фона 120

Задания 121

ГРАФИКА В ПАСКАЛЕ 124

ПРОЦЕДУРЫ РИСОВАНИЯ ПРОСТЫХ ФИГУР И ЛИНИЙ 124

Процедура рисования сектора эллипса. 126

Работа с цветом 130

Задачи на графику 136

ПЕРВОЕ ЗНАКОМСТВО С СИСТЕМОЙ
ПРОГРАММИРОВАНИЯ ТУРБО ПАСКАЛЬ

Из истории. Турбо Паскаль появился на рынке программных продуктов в 1984 году и совершил революцию в программировании. До этих пор предпочтение отдавалось Бейсику - простому, дешевому и легко понимаемому. Паскаль же был аппаратно зависимым, дорогим и сложным в обращении. С появлением Турбо Паскаля положение меняется. Турбо Паскаль состоит из языка программирования и среды программирования, которая создает удобства в работе.

Изучение Паскаля как языка программирования идет вместе с изучением всей системы Турбо Паскаль. Язык программирования Паскаль был разработан Н. Виртом в 1968-1970 годах и получил широкое распространение благодаря наглядности программ и легкости при изучении. Он послужил основой для разработки других языков программирования (например, Ада, Модула-2).

Первая версия Турбо Паскаля использовалась не очень долго - появилась в 1983 году, а уже в 1984 году ее заменила вторая версия, которая получила широкое распространение. К осени 1985 года появляется третья версия, более удобная в работе (быстрее работает компилятор и редактор, возможен вызов MS-DOS из программы).

Четвертая версия (1988 год), представил Турбо Паскаль в новом виде (появление новой среды, компилятор стал встроенным). Осенью этого же года разработана пятая версия, у которой еще больше развита среда и у которой появился встроенный отладчик. А в 1989 году появилась версия 5.5, позволившая перейти к объектно-ориентированному программированию.

Шестая версия уже обеспечивала многооконный и многофайловый режим работы, использование мыши, применение объектно-ориентированного программирования, обладала встроенным ассемблером и имела другие возможности.

В 1992 году фирма Borland International выпустила два пакета программирования на языке Паскаль - это Borland Pascal 7.0 и Turbo Pascal 7.0

Пакет Turbo Pascal 7.0 использует новейшие достижения в программировании. Он может быть использован практически на любой машине и относительно дешев. Язык этой версии обладает широкими возможностями, имеет большую библиотеку модулей. Среда программирования позволяет создавать тексты программ, компилировать их, находить и исправлять ошибки, компоновать программы из отдельных частей, использовать модули, отлаживать и выполнять отлаженную программу.


КОМАНДЫ РЕДАКТОРА

F1 - вызывает помощь

F2 - записывает файл на диск

F3 - открытие файла

F4 - выполнение фрагмента программы от подсвеченной строки до строки, на которой стоит курсор

F5 - изменение размера активного окна

F6 - переход к следующему окну редактирования

F7 - запуск программы в режиме отладки с заходом внутрь процедур

F8 - запуск программы в режиме отладки, минуя вызовы процедур

F9 - компиляция программы из текущего окна

F`10 - выход в главное меню

Команды управления движением курсора

- перемещение курсора на символ вправо;

- перемещение курсора на символ влево;

- перемещение курсора на строку вверх;

- перемещение курсора на строку вниз;

Home - перемещение курсора в начало текущей строки;

End - перемещение курсора в конец текущей строки;

Page Up - перемещение курсора на страницу вверх;

Page Down - перемещение курсора на страницу вниз;

Примечание. Страница - это число строк текста, составляющих один экран (21 строка).

Ctrl + Home - перемещение курсора в левый верхний угол;

Ctrl + End - перемещение курсора в левый нижний угол;

Команды вставки и удаления текста

Insert - включение и выключение режима вставки;

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

Delete - удаление символа, стоящего в позиции курсора;

Backspace - удаление символа, стоящего перед курсором;

Ctrl + N - вставка пустой строки над строкой, где находится курсор;

Ctrl + KR - вставить с текущей позиции курсора файл с диска

Ctrl + KW -записать выделенный блок в файл

Ctrl + KT - выделить слово, где находится курсор.

Ctrl + QA - найти и заменить

Ctrl + QP - перейти к предыдущей позиции курсора

Ctrl + QL - восстановить строку

Ctrl + QW - восстановить последнее сообщение об ошибке компиляции

Shift+клавиши управления курсором - выделение блока

Shift+Del - вырезать блок

Shift+Ins - вставить блок

Ctrl+Ins - копировать блок


ОСНОВНЫЕ ПОНЯТИЯ

Как и любой алгоритм, являющийся, как вы помните, последовательностью инструкций, программа на языке Паскаль состоит из команд (операторов), записанных в определенном порядке и формате.

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

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

ПОНЯТИЕ АЛГОРИТМА

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

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

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

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

Поочередное выполнение команд алгоритма за конечное число шагов приводит к решению задачи, к достижению цели. Разделение выполнения решения задачи на отдельные операции (выполняемые исполнителем по определенным командам) - важное свойство алгоритмов, называемое дискретностью.

Алгоритмы бывают трех видов:

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

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

  • Циклический - это алгоритм, в котором последовательность действий повторяется n-ое количество раз.

Любой алгоритм можно представить в виде блок-схемы.

Блок-схема позволяет в наглядной форме (т.е. графически) представить логическую структуру алгоритма и проследить динамику его выполнения.

Условные обозначения блок-схемы


Учебно-методическое пособие по дисциплине Основы программирования

Начало программы

Учебно-методическое пособие по дисциплине Основы программирования

Конец программы

Учебно-методическое пособие по дисциплине Основы программирования

Передача управления

Учебно-методическое пособие по дисциплине Основы программирования

Ввод данных в ячейки памяти

Учебно-методическое пособие по дисциплине Основы программирования

Вывод данных из ячеек памяти

действие

Блок вычислений, в котором происходит обработка данных

Учебно-методическое пособие по дисциплине Основы программирования

Учебно-методическое пособие по дисциплине Основы программированияУчебно-методическое пособие по дисциплине Основы программированияУчебно-методическое пособие по дисциплине Основы программированияУчебно-методическое пособие по дисциплине Основы программирования

Действие 1

Действие 2

Учебно-методическое пособие по дисциплине Основы программирования

Блок проверки условия. В зависимости от результатов проверки условия выполняется действие 1 или действие 2.

Алгоритмы и блок-схемы: задания


  1. Cоставить алгоритм следующих задач: накачать колесо, сварить суп, открыть дверь.

  2. Решить задачу, оформив все этапы решения в тетрадь:

    1. Определить, сколько нужно заплатить за а) 5 булок хлеба и за 6 бутылок молока; b) за a булок хлеба и за b бутылок молока, если булка хлеба стоит 6р., бутылка молока 18р.

    2. Сколько собрали всего груш и яблок

  3. Решить задачу, оформив все этапы решения в тетрадь и составить блок-схему:

    1. Хватит ли у вас денег купить покупку?

    2. Хватит ли у вас денег, чтобы купить хлеб, молоко и сахар?

    3. Хватит ли вам времени сделать уроки?

    4. Определить опоздаете ли вы на электричку, придете раньше или вовремя.

    5. Определить, подгорит ли торт, испечется или не допечется?

    6. Подсчитать сумму первых десять чисел

    7. Подсчитать произведение чисел из промежутка от а до b

    8. Из промежутка от а до b суммировать числа, кратные трем.

    9. Из промежутка суммировать числа кратные трем и не кратные двум.

    10. Определить делители чисел из промежутка от а до b.

    11. Вывести таблицу квадратов.

Основная структура программы

Программа:

Учебно-методическое пособие по дисциплине Основы программирования

Учебно-методическое пособие по дисциплине Основы программированияУчебно-методическое пособие по дисциплине Основы программирования

Учебно-методическое пособие по дисциплине Основы программирования

В программе, написанной на Турбо Паскале, могут быть следующие разделы:

I. заголовок программы

Program ... ; { Заголовок программы }

II. Раздел указания используемых модулей

Uses ... ; { Подключение модулей }

III. Раздел описаний.

Label ... ; { Раздел объявления меток }

Const ... ; { Раздел объявления констант }

Type ... ; { Раздел объявления новых типов }

Var ... ; { Раздел объявления переменных }

Procedure ... ; { Описание своих процедур }

Function ... ; { Описание своих функций }

II. Раздел операторов.

Begin { начало основной программы }

{ Операторы }

End.

Обязательной частью является лишь тело программы, которое начинается словом begin, а заканчивается словом end с точкой. Операторы в Паскале разделяются точкой с запятой. Заголовок программы является хотя и необязательным, но желательным элементом и состоит из зарезервированного слова program и идентификатора - имени программы, за котором следует точка с запятой. Порядок объявлений и описаний не регламентируется.

!!! Замечание: сколько в программе begin(ов), столько и end(ов).

ПРИМЕР : Простейшая программа

program prim_1; { демонстрация структуры программы}

{эта программа не требует никаких объявлений и описаний}

begin

write('Привет! Вот мы и начали.') (* эта строка текста появится на экране *)

end.

Правила языка Паскаль предусматривают единую для всех программ форму основной структуры:

Program <Имя программы>;
<Раздел описаний>
Begin
<Тело программы>
End.

Здесь слова Program, Begin и End являются служебными. Правильное и уместное употребление этих слов является обязательным.

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

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

При отсутствии необходимости в каком-либо виде объектов соответствующий подраздел может быть опущен.


АЛФАВИТ ЯЗЫКА

Основу любого языка составляет алфавит, то есть конечный, фиксированный набор символов, используемых для составления текстов на данном языке (в нашем случае - программ), для этого вводится "стандарт языка".

Итак, алфавит языка Паскаль составляют:
1) буквы латинского алфавита;
2) арабские цифры;
3) специальные знаки.

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

Во-первых, это употребление заглавных и строчных букв. Большинство существующих трансляторов не различают буквы разных регистров. Таким образом, записи "progRaM" и "PROGram" будем считать идентичными.

Во-вторых, некоторые символы латиницы и кириллицы совпадают по начертанию. Нельзя ли вместо буквы "К" латинской написать "K" русскую? Ответ: в тетради (если вы их сможете различить) - пожалуйста, в программе на ЭВМ - ни в коем случае. На вид они может быть и похожи, но уж коды-то у них совершенно разные, а компьютер, как вам известно, оперирует внутри себя не буквами, а их числовыми кодами.

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

Сложнее всего обстоит дело со специальными знаками, поэтому их придется разобрать подробно. Наиболее часто употребляемым специальным символом является пробел (в значимых местах мы будем обозначать его в записях знаком "V"). Его использование связано с форматами основной структуры программы, разделов описаний, операторов. Не следует путать наличие пробела с отсутствием символа.

. конец программы, разделение целой и дробной частей вещественного числа (десятичная точка), разделение полей в переменной типа Record;

, разделение элементов списков;

.. указание диапазона;

: используется в составе оператора присваивания, а также для указания формата вывода в операторе Writeln;

; отделяет один раздел программы от другого, разделяет операторы;

' используется для ограничения строковых констант;

- + * / ( ) арифметические знаки (используются по своему назначению);

< > знаки отношений;

= используется в составе оператора присваивания, в разделах описаний констант и типов, используется как знак отношения (равно);

@ имя специального оператора определения адреса переменной, подпрограммы;

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

{} ограничение комментариев в программе;

[ ] заключают в себе индексы элементов массивов;

_ символ подчеркивания используется также как любая буква, например, в идентификаторах - вместо пробела;

# обозначение символа по его коду;

$ обозначение директивы компилятора, обозначение шестнадцатеричного числа.

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


ИДЕНТИФИКАТОРЫ

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

  • идентификатор должен быть уникальным, то есть одним и тем же именем разные объекты не могут быть названы;

  • идентификатор имеет ограничение по длине (зависит от конкретной реализации языка на компьютере);

  • идентификатор может состоять только из символов латинского алфавита, цифр и знака подчеркивания ("_");

  • идентификатор не может начинаться с цифры.


КОНСТАНТЫ

Вообще говоря, в Паскале константами являются любые явно заданные в программе данные (например, 7493, 'привет', 54.899). Следует обратить ваше внимание на то, что при записи числовых констант с дробной частью эта часть отделяется от целой не запятой, как, возможно, вы привыкли, а точкой. Для записи очень больших по модулю или очень малых (близких к нулю) чисел существует возможность записи их в так называемой экспоненциальной форме. С такой записью вы встречались в математике и физике, но называли ее стандартным видом числа.

Пример: 2 . 4 5 6 7 Е - 0 6

^мантисса ^порядок

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

Константы, представляющие собой строковые величины, заключаются в апострофы.

Если одна и та же величина используется в программе несколько раз, то удобнее было бы обозначить ее каким-нибудь именем и использовать это имя везде, где требуется записать соответствующую константу. Кроме сокращения размера исходного текста программы, это позволит избежать случайных ошибок, а также упростит отладку программы. Описание именованных констант начинается служебным словом Const. Далее следуют записи вида: <Идентификатор>=<значение>;

Пример:
Const

Pi=3.14;
Name1='Татьяна';
Name2='Виктор';
R21=6.33187E+03;
W_W_W=934122;


ТИПЫ ДАННЫХ. ОПЕРАЦИИ И ФУНКЦИИ
НАД ДАННЫМИ РАЗНЫХ ТИПОВ

Любые объекты, т.е. константы, переменные, значения функций или выражения, в Паскале характеризуются своими типами. Тип определяет множество допустимых значений того или иного объекта, а также множество операций, которые к нему применимы. Кроме того, тип определяет формат внутреннего представления данных в памяти ЭВМ.

Учебно-методическое пособие по дисциплине Основы программированияПаскаль характеризуется разветвленной структурой типов данных:



ПРОСТЫЕ ТИПЫ

К простым типам относятся порядковые и вещественный типы.

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

Integer - целый тип, представляет собой подмножество множества целых чисел, определяемое конкретной реализацией. Во внутреннем представлении он занимает 2 байта, диапазон возможных значений - от -32768 до +32767, данные представляются точно.

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

Константой символьного типа является один из допустимых символов, взятый в апострофы. Если апостроф сам является символом, то апостроф, являющийся значением константы, записывается дважды, например '7' , '+' , 'F' , '''' , 'j' , '?' .

Boolean - логический тип, определяет диапазон логических значений, который содержит два элемента False (ложь) и True (истина). Во внутреннем представлении он занимает 1 байт.

Перечисляемый тип - задается перечислением тех значений, которые он может получать. Каждое значение именуется некоторым идентификатором и располагается в списке, обрамленном круглыми скобками, например:
Type colors = (red, white, blue, black);

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

<минимальное значение> . .<максимальное значение>

При определении типа-диапазона нужно руководствоваться следующими правилами:

-".." рассматриваются как один символ, поэтому между точками пробелы недопустимы;

- левая граница не должна превышать правую границу.

Пример: Type month = 1..12;

lat = 'a' .. 'z';

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

Real - вещественный тип, представляет собой определяемое конкретной реализацией подмножество множества вещественных чисел. Во внутреннем представлении он занимает 6 байт, диапазон возможных значений - от 2.9Е-39 до 1.7Е+38, точность представления данных - 11...12 значащих цифр.

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

Целые числа

Тип

Диапазон

Размер в байтах

Byte

Shortint

Word

Longint

0 ... 255
-128 ... 127
0 ... 65535
-2147483648 ... 2147483647

1
1
2
4

Вещественные числа

Тип

Диапазон

Знач. цифры

Размер в байтах

Single
Double
Extended

1.5E-45 ... 34E38
5E-324 ... 1.7E308
1.6E-4951...1.1E4932

7-8
15-16
19-20

4
8
10


Операции

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

Знак операции

Операция

Типы

операндов

Тип

результата

+

Сложение

Целый или

вещественный

Целый, если оба операнда целого типа, в противном случае - вещественный.

-

Вычитание

Целый или

вещественный

*

Умножение

Целый или

вещественный

/

Деление

Целый или

вещественный

Вещественный

Div

Целочисленное деление

Целый

Целый

Mod

Остаток от целочисленного деления

Целый

Целый

В Паскале определены следующие логические операции:

Not - логическое НЕ;

And - логическое И;

Or - логическое ИЛИ;

Xor - исключительное ИЛИ.

Данные операции определяются следующим образом:

P

Q

Not P

P And Q

P Or Q

P Xor Q

True
True
False
False

True
False
True
False

False
False
True
True

True
False
False
False

True
True
True
False

False
True
True
False

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

При вычислении выражений любого типа приоритет вычислений определяется расставленными скобками, а при их отсутствии по следующей таблице (в порядке убывания приоритета).


Приоритет

Операция

1
2
3
4

Not
*, /, Div, Mod, And
+, -, Or, Xor
=,<>, <, >, <=, >=

Функции.

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


Вызов функции

Тип аргумента

Тип

результата

Назначение

Abs(x)

целый

вещественный

целый

вещественный

Возвращает абсолютное значение x

Pi

-

вещественный

Возвращает значение числа ПИ

Sin(x)

целый вещественный

вещественный

Возвращает синус x радиан

Cos(x)

целый вещественный

вещественный

Возвращает косинус x радиан

ArcTan(x)

целый вещественный

вещественный

Возвращает арктангенс x радиан

Sqrt(x)

целый вещественный

вещественный

Возвращает квадратный корень из x>=0

Sqr(x)

целый

вещественный

целый

вещественный

Возвращает значение квадрата x

Exp(x)

целый

вещественный

вещественный

Возвращает значение e в степени x

Ln(x)

целый

вещественный

вещественный

Возвращает натуральный логарифм x, x>0

Trunc(x)

вещественный целый

целый

Возвращает целую часть значения x

Frac(x)

вещественный целый

вещественный

Возвращает дробную часть значения x

Int(x)

вещественный целый

вещественный

Возвращает целую часть значения x

Round(x)

вещественный целый

целый

Округляет x до ближайшего целого

Odd(x)

целый

логический

Проверяет нечетность значения x

Ord(x)

порядковый

целый

Возвращает порядковый номер, соответствующий значению x

Chr(x)

символьный

целый

Возвращает символ с заданным порядковым номером x

Pred(x)

порядковый

порядковый

Возвращает предшествующее значение x

Succ(x)

порядковый

порядковый

Возвращает последующее значение x

ПЕРВАЯ ПРОГРАММА

Программа начинается с заголовка, имеющего следующий вид:

Program <имя программы>;

За ним идет раздел описаний, в котором должны быть описаны все идентификаторы (константы, переменные, типы, процедуры, функции, метки), которые будут использованы в программе.

После раздела описаний идет раздел операторов, который начинается со служебного слова Begin и заканчивается служебным словом End. В этом разделе задаются действия над объектами программы, введенными в употребление в разделе описаний. Операторы в этом разделе отделяются друг от друга точкой с запятой. После последнего слова End ставится точка.

Разбор примера

.

Рассмотрим на примере.

Program Example_1;
Var a, b, rez: Integer;
Begin
Writeln('Введите два числа через пробел');
Readln(a,b);
rez:=a*b;
Writeln ("Их произведение равно" ,rez);
Writeln (" Нажмите " );
Readln;
End.

Пояснения к программе

Имя этой программы example_1 (заметим, что в имени программы не должно быть пробелов, оно должно начинаться с буквы, состоять только из латинских букв, цифр и некоторых символов, не допускается использование символов точки и запятой). Из разделов описаний имеется лишь один - раздел переменных. Он начинается со служебного слова Var, после которого идет последовательность объявления переменных, разделенных точкой с запятой. В каждом объявлении перечисляются через запятую имена переменных одного типа, после чего ставится двоеточие и указывается тип переменных. В нашем примере описаны три переменные: все они (a, b и rez) имеют целый тип (integer), то есть переменные этого типа - это целые числа.

После описательной части идет раздел операторов, начинающийся со служебного слова Begin, после которого идут операторы языка. Первый встречающийся оператор - это Writeln('текст'); - записать (вывести) на экран текст, заключенный между апострофами, ln добавляется в конце этого оператора для того, чтобы курсор автоматически переходил на следующую строку при выводе на экран текстов или результатов выполнения программы.

Следующий оператор - это Readln(a,b); - читать данные с клавиатуры. В данном случае необходимо ввести два целых числа через пробел, тогда переменной a присваивается значение, равное первому введенному числу, а переменной b присваивается значение, равное второму введенному числу. Например, вы ввели числа 12 и 45, тогда a = 12, а b = 45. В конце этого оператора также можно ставить ln.

После этих двух операторов стоит оператор присваивания: rez := a * b; (:= - это знак присваивания в языке Паскаль). При выполнении этого оператора переменная rez получит значение, равное произведению числа a на число b (рис.1). Так как в результате умножения двух целых чисел получается целое число, то переменная rez описана типом Integer(значениями которого могут быть лишь целые числа).

Следующий оператор - это снова оператор writeln('текст',rez) - он выведет на экран текст, заключенный между апострофами, а за ним значение переменной rez. Затем следующий оператор writeln выведет на экран сообщение: ''Нажмите '', а оператор readln будет ожидать этого нажатия в окне выполнения. В конце раздела операторов стоит служебное слово End, после которого стоит точка.

Запуск программы

Для того, чтобы запустить программу, выходим в главное меню (нажатием F10) - первое окно, выбираем режим RUN и дважды нажимаем (или нажатием Ctrl+F9). На экране появляется сообщение:

Введите два целых числа через пробел

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

произведение равно...

Нажмите .


ПУСТОЙ И СОСТАВНОЙ ОПЕРАТОРЫ

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

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

Begin
<Оператор 1>;
<Оператор 2>;
......
<Оператор N>
End;

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

Обратите внимание на то, что точка с запятой перед End может не ставиться.

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


ОПЕРАТОРЫ ВВОДА И ВЫВОДА ИНФОРМАЦИИ

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

Взаимодействие устройств обработки и хранения информации с внешней средой (хотя бы с пользователем) является совершенно необходимым. За такой интерфейс в языке Паскаль отвечают операторы ввода-вывода информации. Эти инструкции позволяют ввести аргументы, параметры расчетов во время выполнения программы (а не на этапе ее написания), осуществить вывод рассчитанных данных в понятном человеку виде.

Сначала операторы ввода (форматы операторов):
Read(<Список ввода>);
Readln(<Список ввода>);

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

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

Примечание: данные при вводе разделяются пробелами или вводятся через Enter.

Разница между работой процедур Read и Readln (от Read line) состоит в следующем: после выполнения Read значение следующего данного считывается с этой же строчки, а после выполнения Readln - с новой строки.

Для вывода информации в Паскале также есть две команды:
Write(<Список вывода>);
Writeln(<Список вывода>);

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

Различие между двумя операторами вывода таково: после выполнения оператора Writeln (от Write line) происходит переход на новую строчку, а после выполнения инструкции Write, переход на новую строчку не происходит и печать по последующим командам вывода Write или Writeln будет происходить на той же строчке. При вызове оператора Writeln без параметров просто происходит переход на новую строчку.

Приведем пример использования операторов ввода и вывода:

Program Inteface;
Var
R,S : Real;
Begin
Write('Введите радиус круга '); {Печать на экране просьбы о вводе}
Readln(R); {Ввод значения в переменную R с клавиатуры}
S:=4*ARCTAN(1)*SQR(R); {Вычисление площади круга (pR2)}
Writeln('Площадь круга радиусом ',R,' равна ',S)
End.

Эта программа запрашивает у пользователя значение радиуса круга, обеспечивает возможность ввести его значение, рассчитывает и выводит на экран величину площади круга с таким радиусом. Таким образом, появляется возможность, не внося изменений в текст программы, вводить различные значения радиуса и получать, соответствующие им значения площади круга. Для этого достаточно несколько раз запустить программу. Также эта программа демонстрирует следующее правило: выдача результатов должна быть прокомментирована так, чтобы был ясен смысл напечатанных чисел. Действительно, ведь можно было бы ограничиться Writeln(S), но значение выведенного программой числа в этом случае было бы ясно только тому, кто эту программу написал.

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


Процедура

(функция)

Назначение

Пример вызова

Примечания

read(список-ввода)

ввод

данных (клвиатура)

read( a, b, c )

readln(список-ввода)

ввод данных, пропуск маркера конца строки

readln( a, b, c )

write(список-вывода)

Вывод

данных (экран)

write( 'n = ',n:10 )

write( 'n = ',n:p:q )

p,q: величины целого типа

writeln(списоквывода)

Вывод

данных, вывод маркера конца строки

writeln( '?':s+2 )

writeln( '':spaces )

s,spaces: величины целого типа

clrscr

очистить весь экран (окрасить в цвет фона)

clrscr

модуль crt

(смотри приложение)

textcolor(цвет)

выбрать цвет символа

textcolor(magenta)

модуль crt

(смотри приложение)

textbackground(цвет)

выбрать цвет фона

textbackground(0)

модуль crt

(смотри приложение)

window(x1,y1,x2,y2)

окно (x1,y1)-(x2,y2)

window(1,1,40,10)

модуль crt

(смотри приложение)

wherex

позиция курсора x - номер колонки

x := wherex

модуль crt

(смотри приложение)

wherey

позиция курсора y - номер строки

y := wherey

модуль crt

(смотри приложение)

gotoxy(x,y)

установить курсор в положение ( x, y );

x - колонка [1..80];

y - строка [1..25];

gotoxy(40,10)

gotoxy(50,wherey)

модуль crt

(смотри приложение)


ОПЕРАТОРЫ ВВОДА\ВЫВОДА: ЗАДАЧИ


  1. Что будет выведено на экран в результате выполнения инструкций?

    1. x:=1.4;
      writeln(x);

    2. x:=3;
      s:=0;
      x:=s:
      writeln(x);
      writeln(s);

  2. Найти ошибку:

    1. var
      I:integer;
      read(i);
      wrtiteln(i);
      end.

    2. i,k:integer;
      begin
      read(i)
      wrtiteln(i);
      end;


  1. Ввести три переменные типа integer и вывести их на экран.

  2. Решить задачи, составив предварительно алгоритм и блок-схему:

    1. Найти сумму трех чисел, введенных с клавиатуры

    2. Определить сколько денег нужно приготовить папе, если сын хочет купить пишущий CD-ROM, монитор, принтер.

    3. Паша решил установить на своем компьютере игру, сколько ему понадобиться дискет, если игра занимает 56000 Kb; 14 Mb; a Mb.

    4. У Маши 6 коробок дискет, а у Пети 7 коробок дискет. Сколько дискет всего, если в каждой коробке у Маши по b дискет, а У Пети -по с. (решить задачу при условии, что у Маши а коробок, а у Пети-k).

    5. В классе а мальчиков и 6 девочек. Определить сколько всего минут они играли в игры на компьютере, если мальчики играли 30 минут, а девочки на 6 минут меньше (решить эту же задачу при условии, а) что в классе а мальчиков и b девочек; b) мальчики играли с минут)

    6. Учитель закупал в школу компьютерный класс. Определить, сколько он потратит, если он покупает а мониторов по цене с рублей, k клавиатур по цене p рублей, b системных блоков по цене d рублей.

g. Чему равны значения переменных а и Ь по­сле выполнения последовательности действий:

a) a:=15 Div (16 Mod 7 ); b:=34 Mod a *5 - 29Mod 5*2;

b) a:= 4 * 5 Div 3 Mod 2; b:= 4 * 5 Div ( 3 Mod 2);

c) a:= a* b; b:= b* b.

Пример: 4-b

Uses crt;

Var

cd_rom, monitor, printer, zena:real;

begin

writeln('введите стоимость CD-ROM');

readln(cd_rom);

writeln('введите стоимость монитора');

readln(monitor);

writeln('введите стоимость принтера');

readln(printer);

zena:= cd_rom+ monitor+ printer;

writeln('папе нужно приготовить', zena, 'руб.');

end.

ОПЕРАТОР ПРИСВАИВАНИЯ

Оператор присваивания используется для задания значения переменных и имеет следующий синтаксис:

имя-переменной : = выражение;

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

ПРИМЕР: Простые вычисления.

Program vvod_vyvod;

const n=1.5;

var y1,y2:real; x:byte;

begin

writeln('Введите натуральное число <= 255');

readln(x);

y1:=cos(n); y2:=cos(x);

write('Зачем-то посчитали: ');

writeln('n=',n,' y1=',y1:7:4, cos(Pi/2):8:4);

{напечатается Зачем-то посчитали:

n= 1.50000000000000E+0000 y1= 0.0707 1.0000}

writeln('x=',x:3,' y2=',y2:7:4);

end.


ОПЕРАТОР ПРИСВАИВАНИЯ: ЗАДАЧИ


  1. Составьте список переменных, необходимых для решения задач 2 а), 3 а),b),f),g),i).

  2. Составьте список переменных, необходимых для решения задач:

    1. Вычислить площадь прямоугольника

    2. Вычислить площадь шара

    3. Цены товара с учетом скидки

    4. Подсчитать количество чисел от а до b, кратных введенному числу, если это число ноль, то ввести число повторно

  3. Перечислить все этапы решения одной из задач.

  4. Укажите типы переменных для предыдущих задач

  5. Какого типа переменные следует использовать для представления значений?

    1. Количества каких-либо предметов.

    2. Коэффициентов уравнения квадратного корня из числа

    3. Среднемесячной температуры

    4. Количества солнечных дней в году


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

    1. В:=5;

    2. С:=7.5;
      А:=(В/5+С)*7;

    3. А:=0;
      А:=А+1;

    4. А:=0;
      А:=В+А;

    5. A:=B;
      B:=C;
      C:=A;

    6. A:=0;
      B:=5*79/9;
      C:= 17;
      B:=C;
      C:=A;

    7. X:=3;
      B:=9;
      A:=4;
      A:=B-X;
      B:=A+X;

  2. Определить тип следующих выражений, если а,b,с: integer; d,e: real;

    1. d+1

    2. a*d

    3. b/c+100

    4. (a+b)*5

    5. 15 mod 5

  3. найти ошибку, если p,h,l:integer; d,v:real.

    1. p:=(d+h)*2;

    2. h:=1.0;

    3. d:=5.9*h;

    4. h:=h+1.0;

Проверочная работа

  1. Перечислить этапы решения задачи.

  2. Составить блок-схему и перечислить все этапы решения задачи:
    сколько потребуется денег, чтобы купить монитор, клавиатуру, мышку, CD-ROM, жесткий диск и процессор.

  3. Определить тип переменных предыдущей задачи.


МЕТКИ.

ОПЕРАТОР БЕЗУСЛОВНОГО ПЕРЕХОДА


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

Метка в стандарте языка Паскаль представляет собой целое неотрицательное число. Все используемые в программе метки должны быть перечислены в разделе описания меток, начинающемся служебным словом Label, например: Label 1, 2, 8;

Одной меткой можно пометить только один оператор. Метка от помеченного оператора отделяется двоеточием.

Пример:

6: Writeln(14/2);

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

Goto <метка>;

Оператор, к которому происходит переход, должен быть помечен данной меткой.

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


УСЛОВНЫЙ ОПЕРАТОР

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

Условный оператор имеет два варианта записи. Полная форма:

Учебно-методическое пособие по дисциплине Основы программирования




If <логическое выражение> Then <оператор1> Else <оператор2>;

В этом случае в зависимости от значения логического выражения выбирается для выполнения оператор1 или оператор2

Неполная форма:

If <логическое выражение> Then <оператор> ;

В этом случае в зависимости от значения логического выражения выполняется записанный после Then оператор или не производится никаких действий.

Е

Учебно-методическое пособие по дисциплине Основы программированияУчебно-методическое пособие по дисциплине Основы программированиясли после Then или Else необходимо выполнить действия, описанные несколькими операторами, то эти операторы должны быть заключены в операторные скобки Begin - End. Такая конструкция называется составным оператором.

С помощью условного оператора выбирается и выполняется один из операторов, входящих в его состав.

Замечание: Знак «точка с запятой» не ставится перед служебным словом Else, но операторы в группах, естественно, отделяются друг от друга этим знаком.

Теперь поговорим об условиях. В программах на языке Паскаль условия представляют собой выражения, значением которых является величина логического (Boolean) типа. Это может быть как просто переменная указанного типа, так и сложная последовательность высказываний, связанных логическими операциями.

В простых условиях могут применяться знаки операций сравнения: >(больше), <(меньше), =(равно), <>(не равно), >=(больше или равно), <=(меньше или равно).

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

A=5 {Значение переменной А равно 5}

(C+D3)>=(D1*(45-2)) {Значение выражения в левой части больше либо равно значению выражения из правой части}
S<>'ABC' {Значение переменной S не равно строковой константе 'ABC'}

Приведем пример решения еще одной задачи:

"Из двух чисел выбрать наибольшее".

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

Program Example;
Var A,B,C : Real; {A,B - для хранения аргументов, C - результат}
Begin

Writeln('Введите два числа');
Readln(A,B); {Вводим аргументы с клавиатуры}
If A>B Then C:=A Else C:=B; {Если A>B, то результат - A, иначе результат - B}
Writeln(C); {Выводим результат на экран}

End.

Еще один классический пример:

"По заданным коэффициентам решить квадратное уравнение".

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

Сначала вводим коэффициенты, затем вычисляем дискриминант. Теперь возникает две возможности: либо отсутствие действительных корней в случае отрицательного дискриминанта, либо эти корни можно все-таки вычислить и вывести на экран в случае неотрицательного дискриминанта (случай равенства дискриминанта нулю входит сюда же, корней - два, только они одинаковые J).

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


Program Sq1;
Var A, B, C, D, X1, X2 : Real;
Begin

Writeln ('Введите коэффициенты квадратного уравнения');
Readln (A,B,C);
D:=B*B-4*A*C;
If D<0 Then Writeln ('Корней нет! ')
Else
Begin

X1:=(-B+SQRT(D))/2/A;
X2:=(-B-SQRT(D))/2/A;
Writeln ('X1=', X1:8:3, ' X2=',X2:8:3)

End;

End.

ВЛОЖЕННЫЕ ОПЕРАТОРЫ УСЛОВИЯ

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

Рекомендуется при решении такого рода задач составлять блок-схему алгоритма в тетради. Только потом, при составлении программы, прописать сначала всю Then- часть, а затем переходить к Else- части. Обычно при записи условных операторов на языке Паскаль (особенно при множественных ветвлениях) команды записывают уступом вправо и вниз. Это повышает наглядность, и, поверьте, снижает потери времени на отладку.

Для иллюстрации решим еще одну задачу:

"Решить уравнение вида A*x^2 + B*x + C = 0".

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

Program Sq2;
Var A, B, C, D, X, X1, X2 : Real;
Begin

Writeln ('Введите коэффициенты уравнения (A, B, C) ');
If A=0 Then
If B=0 Then

If C=0 Then Writeln('X - любое число')
Else Writeln('Корней нет! ')

Else Begin X:=-C/B; Writeln('X=',X:8:3) End
Else

Begin

D:=B*B-4*A*C;
If D<0 Then Writeln ('Корней нет! ')
Else

Begin

X1:=(-B+SQRT(D))/2/A;

X2:=(-B-SQRT(D))/2/A;

Writeln ('X1=', X1:8:3, ' X2=',X2:8:3)

End;

End; End.

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

ОПЕРАТОР ВЫБОРА

Если у вас не два возможных варианта выполнения программы, а больше, то может использоваться оператор выбора CASE. Структура этого оператора в Турбо Паскале:

CASE <ключ_выбора> OF

C1 : <оператор1>;

C2 : <оператор2>;

. . .

CN : <операторN>;

[ELSE <оператор0>;]

END;

Здесь <ключ_выбора> - это выражение порядкового типа, в зависимости от значения которого принимается решение; C1,…,CN - значения, с которыми сравнивается значение <ключа>; <оператор1>,…, <операторN> - оператор (возможно составные), из которых выполняется тот, с константой которого происходит первое совпадение значения <ключа>, <оператор0> выполнится, если значение ключа не совпадает ни с одной из констант C1,…,CN.

Ветвь Else не обязательна, и в отличие от оператора if, перед ней можно ставить точку с запятой. Если для нескольких значений <ключа> действия совпадают, то эти константы можно перечислить через запятую перед двоеточием или даже задать диапазон значений (нижняя граница .. верхняя граница).

ПРИМЕР:

Вводится целое число, если это цифра, то определить четная она или нет, а если число, то определить, попадает ли оно в диапазон от 10 до 100, если нет, то выдать соответствующее сообщение.

Program chislo;

var i:integer;

begin

write('Введите целое число: ');

readln(i);

case i of

0,2,4,6,8 : writeln('Четная цифра');

1,3,5,7,9 : writeln('Нечетная цифра');

10…100,200 : writeln('Число от 10 до 100 или 200');

else writeln('Число либо отрицательное, либо > 100, но не 200');

end;

readln

end.

УСЛОВНЫЙ ОПЕРАТОР: ЗАДАЧИ

1. Даны три числа. Написать фрагмент про­граммы, подсчитывающий количество чисел, рав­ных нулю.

2. После выполнения операторов а:=0;

If a<>0 Then; a:=2

значение переменной равно двум. Объясните почему.

3. Используя составной оператор, упростите следующий фрагмент программы:

If a>b Then с:=1:

If a>b Then d:=2;

If a<=b Then c:=3;

If a<=b Then d:=4.

Каким будет значение переменной а после вы­полнения операторов:

а:=3;

If a<4 Then Begin Jnc(a,2); Inc(a,3); End.

4. Составьте программу нахождения произве­дения двух наибольших, из трех введенных с кла­виатуры чисел.

5. Если целое число М делится нацело на целое число N, то вывести на экран частное от деле­ния, в противном случае - сообщение "М на N нацело не делится".

6. Найти количество положительных (отрицатель­ных) чисел среди четырех целых чисел А, В, С и D.

7. Чему равны значения переменных а и Ь по­сле выполнения последовательности действий:

a) a:=15 Div (16 Mod 7 ); b:=34 Mod a *5 - 29Mod 5*2;

b) a:= 4 * 5 Div 3 Mod 2; b:= 4 * 5 Div ( 3 Mod 2);

c) a:= a* b; b:= b* b.

8. Составьте программу, которая определяла бы вид треугольника (если данные отрезки позво­ляют его построить).

9. Составьте программу, которая уменьшает пер­вое число в пять раз, если оно больше второго по абсолютной величине.

10. Составьте программу вычисления выражения:

a) max(x+y+z, xyz)+3;

в) min(x2+y2,y2+z2)-4,

если х, у, z введены с клавиатуры.

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

12. Расставить приоритет операций: not, or, and, *, div, mod.

13. Определить значение выражений:

  1. (а>5) and (b>5) and (a<20) and (b<30)

  2. not (a<15) or (not (b<30)

  3. c or d and (b=20) при a=10, b=20, d=false.

  4. (a>b and b>c or (db or not (f>=a)))and dпри а=100, b=50, c=30, d=120, f=70

  1. Привести пример полного условного оператора, неполного, составного, полного условного оператора со сложным условием.

  2. Найти ошибку:

    1. if a>10 then b:=5;
      else b:=-5;

    2. if x:=true then a:=8;

    3. if p=false then
      d:=k/2;
      a:=(d+c)*l;
      end;

  3. Решить задачи, предварительно составив блок-схему и алгоритм:

    1. Определить, хватит ли вам времени загрузить компьютер.

    2. Определить, нужно ли вам докупить память для новой суперигры.

    3. Определить, хватит ли Юре денег, чтобы купить видео карты, блоки памяти.

    4. Определить, хватит, не хватит или останутся дискеты для записи программы.

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

    6. Определить, на каком из трех компьютеров больше памяти.

    7. Используя составной оператор, упростите следующий фрагмент программы:
      if a>b then c:=1;
      if a>b then d:=2;
      if a<=b then c:=3;
      if a<=b then d:=4;

    8. Определить значение функции:
      3, -20<x<0
      f(x)= 5*x-2, 0<x<=3
      0, x>3


    1. Составьте программу нахождения произве­дения двух наибольших, из трех введенных с кла­виатуры чисел.

    2. Если целое число М делится нацело на целое число N, то вывести на экран частное от деле­ния, в противном случае - сообщение "М на N нацело не делится".

    3. Найти количество положительных (отрицатель­ных) чисел среди четырех целых чисел А, В, С и D.

    4. Составьте программу, которая определяла бы вид треугольника (если данные отрезки позво­ляют его построить)

    5. Составьте программу, которая уменьшает пер­вое число в пять раз, если оно больше второго по абсолютной величине.

    6. Составьте программу вычисления выражения:
      a) max(x+y+z, xyz)+3;
      в) min(x2+y2,y2+z2)-4,
      если х, у, z введены с клавиатуры

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

  1. Найти ошибку:

    1. var a,b,c:real;
      begin
      readln(a,b,c);
      case a of
      1: writeln(b+c);
      2: writeln(b*c);
      3: writeln(b/c);
      end;
      end.

    2. var p:integer;
      begin
      readln(p);
      case p
      0: writeln('ноль');
      1:writeln('один');
      2:writeln('два');
      else writeln('стоп');
      end.


  1. Определить, в каких из ниже перечисленных задачах целесообразнее применить оператор case:

    1. Определить, является ли введенный день выходным?

    2. Вывести слово «каникулы!», если введенная дата (месяц и число) приходится на зимние каникулы.

    3. По номеру месяца определить время года и название месяца

  2. Решить задачи из пункта 6, предварительно составив блок-схему к каждой задаче.

Пример: задача 4b

Uses crt;

Var pamyat_igra, pamyat_kompa :real;

Begin

Writeln('введите количество памяти необходимое для игры');

Readln(pamyat_igra);

Writeln('введите количество памяти компьютера ');

Readln(pamyat_komp);

If pamyat_igra >pamyat_komp writeln ('памяти не хватит') else writeln ('хватит');

End.

Проверочная работа

  1. Написать формат записи операторов if и case.

  2. Решить задачи:

    1. Определить, попадает ли x в промежуток от a до b.

    2. Найти наибольшее из трех введенных чисел.

    3. По номеру дня, определить день недели.

    4. Симитировать работу калькулятора.

ЦИКЛИЧЕСКИЕ АЛГОРИТМЫ

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


ЦИКЛ. ВИДЫ ЦИКЛОВ


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

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


Цикл "С параметром". Оператор цикла с параметром

Оператор цикла с параметром имеет такую структуру:

For <имя_переменной> := <выр1> To <выр2> Do <оператор> ;

<имя переменной> - параметр цикла
<выражение1> - начальное значение параметра цикла
<выражение2> - конечное значение параметра цикла
Все три указанных выше объекта должны быть одного порядкового типа.
<оператор> - тело цикла.

Э

Учебно-методическое пособие по дисциплине Основы программирования

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

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

Читается данная структура так: "Для переменной (далее следует ее имя) от начального значения до конечного выполнять оператор (являющийся телом цикла)". Иногда цикл с параметром даже называют "Для" или "For". В первом случае параметр с каждой итерацией увеличивается на единицу, во втором - уменьшается.

Выполняется этот цикл по следующему алгоритму:
1. переменной-параметру присваивается начальное значение;
2. выполняется тело цикла;

3. переменная-параметр автоматически увеличивается на 1 (в первом случае формата);

4. если параметр превышает конечное значение, то происходит выход из цикла, иначе - переход к пункту 2.

Примечание:

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

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

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

Цикл "ПОКА". Оператор цикла с предусловием

While <логическое выражение> Do <оператор> ;

Здесь тело цикла выполняется до тех пор, пока логическое выражение возвращает значение True.

Учебно-методическое пособие по дисциплине Основы программирования

Группа операторов, называемая "телом цикла", судя по этой схеме, будет выполняться пока истинно условие цикла. Выход из цикла произойдет, когда условие перестанет выполняться.

Если условие ложно изначально, то тело цикла не будет выполнено ни разу. Если условие изначально истинно и в теле цикла нет действий, влияющих на истинность этого условия, то тело цикла будет выполняться бесконечное количество раз. Такая ситуация называется "зацикливанием". Прервать зациклившуюся программу может либо оператор (нажав Ctrl+C), либо аварийный останов самой программы, в случае переполнения переменной, деления на ноль и т.п., поэтому использовать структуру цикла следует с осторожностью, хорошо понимая, что многократное выполнение должно когда-нибудь заканчиваться.

На языке Pascal структура цикла "Пока" записывается следующим образом:

While <условие> Do <оператор>;

По-русски можно прочитать так: "Пока истинно условие, выполнять оператор". Здесь, так же как в формате условного оператора, подразумевается выполнение только одного оператора. Если необходимо выполнить несколько действий, то может быть использован составной оператор. Тогда формат оператора принимает такой вид:

While <условие> Do
Begin

<оператор #1>;
<оператор #2>;
<оператор #3>;
. . .

End;


Цикл "ДО". Оператор цикла с постусловием


Repeat
<операторы>
Until <логическое выражение> ;

Здесь тело цикла выполняется до тех пор, пока логическое выражение возвращает значение False.

Учебно-методическое пособие по дисциплине Основы программирования

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

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

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

Формат цикла на языке Pascal:

Repeat

<оператор #1>;
<оператор #2>;
<оператор #3>;
. . .

Until <условие>;

Читается так: "Выполнять оператор #1, оператор #2. : до выполнения условия".

Здесь не требуется использование составного оператора, потому что сами слова Repeat и Until являются операторными скобками.

Пример:

Найти сумму квадратов всех натуральных чисел от 1 до 100.

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

I. С использованием цикла "С предусловием".

Program Ex1;
Var
A : Integer;
S : Longint;
Begin

A:=1; S:=0;
While A<=100 Do
Begin

S:=S+A*A;
A:=A+1

End;
Writeln(S)

End.

II. С использованием цикла "С постусловием".

Program Ex2;
Var
A : Integer;
S : Longint;
Begin

A:=1; S:=0;
Repeat

S:=S+A*A;
A:=A+1

Until A>100;
Writeln(S)

End.

III. С использованием цикла "С параметром".

Program Ex3;
Var
A : Integer;
S : Longint;
Begin

S:=0;
For A:=1 To 100 Do S:=S+A*A;
Writeln(S)

End.


ЦИКЛ С ПАРАМЕТРОМ

Повторение

1. Какие операции можно применять к пере­менным целого типа?

2. Можно ли применять операцию деления (/) к переменным целого типа? Почему?

3. Что получится в результате выполнения опе­раторов:

• Write('AB ':3); Writeln(5*2:3);

• Writeln(5:6,8:5); Writeln('KOHEЦ');

• Writeln('PE3УAbTAT', 5*3,3).

4. Что такое If, Then, Else?

5. Как выглядит полный условный оператор? Как он работает?

6. Как выглядит неполный условный оператор? Как он работает?

7. Записать на языке Паскаль следующие вы­ражения:

  • « если число является четным, то вывести "ДА", иначе вывести "НЕТ";

  • если число делится на 5, то вывести це­лую часть от деления.

8. Записать на языке Паскаль следующую формулу:


Задачи

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

    1. вывести на экран слово «цикл» 10 раз.

    2. вводить 10 чисел и подсчитывать сумму этих чисел.

  1. Найти ошибку:

    1. var I:real;
      begin
      for I:=1 to 10 do
      writeln('цикл');
      end.

    2. var I:integer;
      begin
      for I:=10 to 1 do
      writeln('цикл');
      end.

    3. var I:integer;
      begin
      for I:=1 to 10
      writeln('цикл');
      end.

  2. Сколько раз будет выполняться тело цикла:

    1. for I:=1 to 5 do
      writeln('*');

    2. for I:=1 to 5 do;
      writeln('*');

    3. for I:=1 to 1 do
      begin
      writeln('*');
      end;

    4. for I:=1 to 0 do
      writeln('*');


  1. Сколько раз будут выполнены операторы из тела циклов в следующих фрагментах программ:

• For k:=-l To I Do...

• For k:=10 To 20 Do...

• For k:=20 To 10 Do...

• k:-=5; r:=15; For i:=k+1 To r-1 Do...

• k:=5; r:=15; For i:=0 To k*r Do... .

k:=r; For i:=k To r Do...

  1. Определить значение переменной S после выполнения следующих операторов:

s:=0; n:=10 For i:=2 То n Do s:=s+100 Div i

  1. Составить программу возведения натураль­ного числа в квадрат, используя следующую зако­номерность:

12=1

22=1+3

32=1+3+5

42=1+3+5+7

…….

n2 =1+3+5+7+9+...+2n-1

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

  2. Составить программу вычисления суммы ку­бов чисел от 25 до 125.

  3. Среди двузначных чисел найти те, сумма квадратов цифр которых делится на 13. От­вет: 23, 32…

  4. Написать программу поиска двузначных чисел, таких, что если к сумме цифр этого числа при­бавить квадрат этой суммы, то получится это число. Ответ: 12, 42, 90.

  5. Квадрат трехзначного числа оканчивается тремя цифрами, которые как раз и составля­ют это число. Написать программу поиска таких чисел. Ответ: 376, 625.

  6. Написать программу поиска четырехзначного числа, которое при делении на 133 дает в ос­татке 125, а при делении на 134 дает в остат­ке 111. Ответ: 1987.

  7. Найти сумму положительных нечетных чи­сел, меньших 100.

  8. Найти сумму целых положительных чисел из промежутка от А до В, кратных 4 (значения переменных А и В вводятся с клавиатуры).

  9. Найти сумму целых положительных чисел, больших 20, меньших 100, кратных 3 и за­канчивающихся на 2, 4 или 8.

  10. В каких из перечисленных задач нужно использовать операторные скобки:

    1. вывести на экран 15 звездочек в столбик.

    2. сложить число само с собой 18 раз и вывести результат на экран.

    3. умножить число само на себя 25 раз и вывести все промежуточные результаты


ЦИКЛЫ С УСЛОВИЯМИ

При описании циклов с постусловием необхо­димо принимать во внимание следующее:

  • перед первым выполнением цикла усло­вие его окончания (или продолжения) должно быть определено;

  • тело цикла должно содержать хотя бы один оператор, влияющий на условие окончания (продолжения), иначе цикл бу­дет бесконечным;

  • условие окончания цикла должно быть в результате выполнено.


Задачи

  1. Написать алгоритмы решения следующих задач:

    1. До каких пор мама будет тратить папины деньги?.

    2. Выбирать из множества мышек мышки с com портами до тех пор, пока не встретится мышка с pc портом.

    3. Сколько карт из колоды вынет игрок, пока не встретит туза?

    4. Передвигать круг до тех пор, пока не нажата любая клавиша.

  2. Найти ошибку:

    1. while a>0
      begin
      readln(a);
      s:=s+a;
      end;

    2. while (a<>0) and (b>0) do
      readln(a,b);
      writeln(b/a);
      end;

    3. while I<>10 do
      begin
      s:=s+I;
      I:=I+1;

  3. Сколько раз будет выполнено тело цикла?

    1. f:=false;
      while f do
      begin
      writeln('hello');
      end;

    2. f:=true;
      while f do
      begin
      writeln('hello');
      end;

    3. while I>0 do;
      begin
      I:=I+1;
      end;

  4. Что будет выведено на экране монитора после выполнения следующего фрагмента программы:
    b:=0;
    While a<>0 Do
    Begin
    b:-=b*10+a Mod 10;
    a:=a Div 10;
    End;
    Write(b);
    Если а=13305? Решение какой задачи выражает этот фрагмент программы?
    Если n=6? Решение какой задачи выражает этот фрагмент программы?


  1. Определить значение переменной s после выполнения следующих операторов:

s:=0; i:=l;

Repeat s:=s+5 Div i; i:=l-J; Until i<=1;

  1. Произведение N первых нечетных чисел рав­но р. Сколько сомножителей взято?

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

  3. Показать, что любой оператор цикла с пре­дусловием можно записать с помощью условного оператора и оператора цикла с постусловием.

  4. Показать, что любой оператор цикла с по­стусловием можно записать с помощью условного оператора и оператора цикла с предусловием.

  5. Дана непустая последовательность натураль­ных чисел, за которой следует 0. Вычислить сумму положительных элементов последовательности, порядковые номера которых нечетны.

  6. Найти все трехзначные числа, удовлетво­ряющие каждому из условий:

    1. любые две цифры различны;

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

  7. Стороны прямоугольника заданы натураль­ными числами М и N. Составить программу, ко­торая будет находить, на сколько квадратов, сто­роны которых выражены натуральными числами, можно разрезать данный прямоугольник, если от него каждый раз отрезается квадрат максимально большой площади.

  8. Дано натуральное число n>=2. Составить программу разложения этого числа на простые множители:

    1. простой множитель р должен быть выведен k раз, где k - натуральное число, такое, что p делится на рk и не делится на pk+1;

    2. каждый простой множитель должен быть выведен ровно один раз.

  9. Даны натуральные числа N и р. Получить все на­туральные числа, меньшие N, взаимно простые с р.

  10. Даны целые числа р и q. Получить все дели­тели числа q, взаимно простые с р.

  11. Найти наименьшее натуральное число N, представимое двумя различными способами в виде суммы кубов двух натуральных чисел x3 и у3 (x>=y).

  12. Найти все простые несократимые дроби, за­ключенные между 0 и 1, знаменатели которых не превышают 7 (дробь задается двумя натуральными числами - числителем и знаменателем).

ОПЕРАТОР REPEAT

  1. Чем отличается оператор REPEAT от WHILE?

  2. Найти ошибку:

    1. repeat
      s:=s*a;

    2. repeat
      begin
      readln(a);
      s:=s+a;
      end;
      until a<>100;

  3. Сколько раз будет выполняться тело цикла?

    1. f:=false;
      repeat;
      writeln('*');
      until f;

    2. f:=false;
      repeat
      writeln('*');
      until f;

    3. f:=true;
      repeat
      writeln('*');
      until f;

ВЛОЖЕННЫЕ ЦИКЛЫ


  • Какие циклы вы знаете? В каких случаях применяется каждый из циклов?

  • Составьте фрагмент программы возведения заданного числа в степень n. Поясните свое решение.

Пример

Даны натуральные числа n и k. Составить программу вычисления выражения 1k+2k+…+nk.

Решение:

Для вычисления указанной суммы целесообразно организовать цикл с параметром i, в котором, во-первых, вычислялось бы очередное значение y=ik и, во-вторых, осуществлялось бы накопление суммы прибавлением полученного слагаемого к сумме всех предшествующих (s=s+y).

Program a1;

Var n,k,y,I,s,m:integer;

Begin

Writeln('Введите исходные данные n,k');

Readln(n,k);

s:=0;

For I:=1 to n do

Begin y:=1;

For m:=1 to k do y:=y*I; {нахождение степени k числа i}

s:=s+y;

end;

writeln('Ответ: ',s);

end.

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

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

Задачи


1. Что будет выведено на экране монитора после выполнения следующего фрагмента программы:

а:=1; b:=1;

For i:=0 To n Do Begin

For j:=1 То b Do Write('*');

WriteLn;

c:=a+b; a:=b; b:=c;

End;

если n=6? Решение какой задачи выражает этот фрагмент программы?

2. Что будет выведено на экране монитора после выполнения следующего фрагмента программы:

b:=0;

While a<>0 Do

Begin

b:-=b*10+a Mod 10;

a:=a Div 10;

End;

Write(b);

Если а=13305? Решение какой задачи выражает этот фрагмент программы?

3. Исходное данное - натуральное число q, выражающее площадь. Написать программу для нахождения всех таких прямоугольников, площадь которых равна q и стороны выражены натуральными числами.

4. Составить программу для графического изображения делимости чисел от 7 до п (n - исходное данное). В каждой строке надо печатать число и столько плюсов, сколько делителей у этого числа. Например, если исходное данное - число 4, то на экране должно быть напечатано:

1+

2++

3++

4+++

5. Составить программу получения всех совер­шенных чисел, меньших заданного числа и. Число называется совершенным, если равно сумме всех своих положительных делителей, кроме самого этого числа. Например, 28 -совершенно, так как 28=1+2+4+7+14.

Из истории. Грекам были известны первые четыре совершенных числа: 6, 28, 496, 8128. Эти числа высоко ценились. Даже в XII веке церковь утверждала, что для спасения души необходимо найти пятое совершенное число. Это число было найдено только в XV веке. До сих пор совершенные числа полностью не исследованы - не известно, имеется ли конечное число совершенных чисел или их число бесконечно, кроме того, неизвестно ни одного нечетного совершенного числа, но и не доказано, что таких чисел нет.

6. Дано натуральное число п. Можно его представить в виде суммы трех квадратов натуральных чисел? Если можно, то:

a) указать тройку х, у, z таких натуральных чисел, что x2+ y2+ z2=n;

b) указать все тройки х, у, z таких натуральных чисел, что x2+ y2+ z2=n.

7. Найти натуральное число от 1 до 10000 с максимальной суммой делителей.

8. Даны натуральные числа а, b (а<Ь). Получить все простые числа р, удовлетворяющие неравенст­вам: а<=р<=b.

9. Даны натуральные числа п, т. Получить все меньшие и натуральные числа, квадрат суммы цифр которых равен т.

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

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

12. Составить программу, печатающую для данного натурального числа k-ю цифру последовательности:

a) 12345678910..., в которой выписаны подряд все натуральные числа;

b) 14916253649..., в которой выписаны подряд квадраты всех натуральных чисел;

c) 1123581321..., в которой выписаны подряд все числа Фибоначчи.

13. Составить программу возведения заданного числа в третью степень, используя следующую закономерность:

13=1

23=3+5

33=7+9+11

43=13+15+17+19

53=21+23+25+27+29

14. Составить программу для нахождения всех натуральных решений уравнения n2+m2=k2 в ин­тервале [1, 10].

Проверочные работы (циклы и условия)

Проверочная работа №1

Вариант № 1

1. Дано натуральное число:

• найти сумму цифр этого числа;

• верно ли, что число начинается и заканчивается одной и той же цифрой.

2. Найти все трехзначные числа, такие, что сумма цифр равна А, а само число делится на В (А и В вводятся с клавиатуры).

3. Дано натуральное число. Приписать к нему такое же число.

Вариант № 2

1. Дано натуральное число:

• найти произведение цифр числа;

• верно ли, что в данном числе нет данной цифры А (цифру А вводить с клавиатуры).

2. Найти все трехзначные числа, которые при увеличении на 1 делятся на 2, при увеличении на 2 делятся на 3, при увеличении на 3 делятся на 4, а при увеличении на 4 делятся на 5.

3. Из данного натурального числа удалить все цифры А (А вводится с клавиатуры).

Вариант № 3

1. Дано натуральное число:

• найти количество цифр данного числа;

• верно ли, что данное число заканчивается на нечетную цифру.

2. Найти количество трехзначных чисел, сумма цифр которых равна А, а само число закан­чивается цифрой В (А и В вводятся с клавиатуры).

3. Найти все симметричные натуральные числа из промежутка от А до В (А и В вводятся с клавиатуры).

Вариант № 4

1. Дано натуральное число:

• найти количество четных цифр числа;

• верно ли, что данная цифра А встречается в числе более двух раз (А вводить с кла­виатуры).

2. Найти все четырехзначные числа, у которых сумма крайних цифр равна сумме средних цифр, а само число делится на 6 и 27.

3. Найти количество различных цифр данного натурального числа.

Проверочная работа №2

Вариант № 1

1. Найти количество делителей натурального числа. Сколько из них четных?

2. Найти все натуральные числа а, Ь и с из интервала от 1 до 20, для которых выполняется ра­венство: a2+b2=c2.

Вариант № 2

1. Найти сумму нечетных делителей натурального числа.

2. Найти все равновеликие прямоугольники, стороны которых выражены целыми числами а и b, а площадь равна S и b принадлежат интервалу от 1 до 20, а S вводится с клавиатуры).

Вариант № 3

1. Найти все натуральные числа из промежутка от 1 до 200, у которых количество делителей равно N (N вводить с клавиатуры).

2. Найти все натуральные числа а, b и с из ин­тервала от 1 до 20, для которых выполняется ра­венство: a+b2=c2.

Вариант № 4

1. Найти все натуральные числа из промежутка от 1 до 200, у которых сумма делителей равна S (S вводить с клавиатуры).

2. Найти все такие тройки натуральных чисел х, у и z из интервала от 1 до 20, для которых выполняется равенство: x2-y=z2.


ПРОЦЕДУРЫ И ФУНКЦИИ

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

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

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

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

Формат описания процедуры:
Procedure
<Имя процедуры> (<Имя форм. параметра 1>:<Тип>;
< Имя форм. параметра 2>:<Тип>);
<Раздел описаний>
Begin
<Тело процедуры>
End;

Раздел описаний может иметь такие же подразделы, как и раздел описаний основной программы (описание процедур и функций - в том числе). Однако все описанные здесь объекты "видимы" лишь в этой процедуре. Они здесь локальны также, как и имена формальных параметров. Объекты, описанные ранее в разделе описаний основной программы и не переопределенные в процедуре, называются глобальными для этой подпрограммы и доступны для использования.

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

Формат описания функции:
Function
<Имя функции> (<Имя форм. параметра 1>:<Тип>;
< Имя форм. параметра 2>:<Тип>?) : <Тип результата>;
<Раздел описаний>
Begin
<Тело функции>
End;

В теле функции обязательно должна быть хотя бы команда присвоения такого вида: <Имя функции>:=<Выражение>;

Указанное выражение должно приводить к значению того же типа, что и тип результата функции, описанный выше.

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

<Имя процедуры>(<Фактический параметр 1>, < Фактический параметр 2>);

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

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

Приведем простейший пример использования подпрограммы.

"Найти максимальное из трех введенных чисел".

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

Program Fn;
Var
A,B,C :Real;
Function Max(A,B:Real):Real; {Описываем функцию Max с формальными}
Begin {параметрами A и B, которая принимает }

If A>B Then Max:=A {значение максимального из них }
Else Max:=B {Здесь A и B - локальные переменные }

End;
Begin

Writeln('Введите три числа');
Readln(A,B,C);
Writeln('Максимальным из всех является ', Max(Max(A,B),C))

End.

Обратите внимание на краткость тела основной программы и на прозрачность действий внутри функции. Формальные параметры A и B, используемые в подпрограмме, не имеют никакого отношения переменным A и B, описанным в основной программе.

Существует два способа передачи фактических параметров в подпрограмму: по значению и по ссылке. В первом случае значение переменной фактического параметра при вызове подпрограммы присваивается локальной переменной, являющейся формальным параметром подпрограммы. Что бы потом ни происходило с локальной переменной, это никак не отразится на соответствующей глобальной. Для одних задач это благо, но иногда требуется произвести в подпрограмме действия над самими переменными, указанными в качестве фактических параметров. На помощь приходит второй способ. Происходит следующее: при обращении к подпрограмме не происходит формирования локальной переменной формального параметра. Просто на время выполнения подпрограммы имя этой локальной переменной будет указывать на ту же область памяти, что и имя соответствующей глобальной переменной. Если в этом случае изменить локальную переменную, изменятся данные и в глобальной.

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

Еще один классический пример.

"Расположить в порядке неубывания три целых числа".

Program Pr;
Var
S1,S2,S3 :Integer;
Procedure Swap(Var A,B: Integer);{Процедура Swap с параметрами-переменными}
Var C : Integer; {C - независимая локальная переменная}
Begin
C:=A; A:=B; B:=C {Меняем местами содержимое A и B}
End;
Begin

Writeln('Введите три числа');
Readln(S1,S2,S3);
If S1>S2 Then Swap(S1,S2);
If S2>S3 Then Swap(S2,S3);
If S1>S2 Then Swap(S1,S2);
Writeln('Числа в порядке неубывания:V',S1,S2,S3)

End.


Задачи.

1). Найти среднее арифметическое двух чисел. (PROCEDURE)

Var x,y,sr:real;

Procedure Serd(a,b:real;VAR S:REAL);…{список формальных параметров}

Begin

S:=(a+b)/2; {тело процедуры}

End;

Begin

Readln(x,y);

Sred(x,y,sr); …{список фактических параметров}

Writeln(sr);

End.

2).Найти :. (PROCEDURE)

Var x,y,z:integer:

Sr1,sr2,sr3,SR:real;

Procedure Serd(a,b:real;VAR S:REAL);…

Begin

S:=(a+b)/2;

End;

Begin

Readln(x,y);

Sred(x,y,sr1);

Sred(x,y,sr2);

Sred(x,y,sr3);

SR:=(sr1+sr2)/sr3;

Writeln(sr);

End.

3).Найти аn. (PROCEDURE)

var n,a,rez:integer;

procedure step(x,y:integer; var st:integer);

var I:integer;

begin

st:=1;

for I:=1 to y do st:=st*x;

end;

begin

writeln('введите число а');

readln(a);

writeln('введите степень');

readln(n);

step(a,n,rez);

writeln(rez);

end.

4). Получить все делители введенного числа. Посчитать их количество. (PROCEDURE)

Var z,b,c,p,i:integer;

Procedure delit(n:integer; var k:integer);

Begin

Readln(n);

For I:=1 to n do begin

P:=n mod I:

If p=0 then begin

Writeln('делители',I);

K:=k+1;

End;

End;

End;

Writeln('введите n');

Readln(z);

Delit(z,b);

Writeln('количество делителей",b);

End.

5). Найти сумму двух чисел. (FUNCTION)

Var a,b:integer;

Function summa(x,y:integer):integer;

Begin

Summa:=x+y;

End;

begin

Writeln(' введите два числа');

Readln(a,b);

Writeln(summa(a,b));

End.

6). Найти площадь треугольника. . (FUNCTION)

Var x,y,z:intger; p:real;

Unction treug(a,b,c:integer):real;

Begin

P:=(a+b+c)/2;

Treug:=sqrt(p*(p-a)*(p-b)*(p-c));

End;

Begin

Read(x,y,z);

Writeln(treug(x,y,z));

End.


Процедуры: задачи

  1. Определение процедуры.

  2. Чем отличается процедура от функции.

  3. В каком случае нужно использовать процедуру, а в каком функцию.

  4. Вызов процедуры.

  5. Как определить, нужно ли ставить var в описании процедуры перед переменной.

  6. Дать понятие параметра-переменной, параметра-значения, внутренних переменных.

  7. Найти ошибку:

    1. Procedure line (n:integer);
      var j:integer;
      begin
      for j:=1 to n do
      write('-');
      end;
      var p:real;
      begin
      writeln('введите длину линии');
      readln(p);
      line(p);
      end.

    2. Procedure line (var n:integer; s,s1:integer);
      var j:integer;
      begin
      for j:=1 to n do begin
      s:=s+j;
      s1:=s1*j;
      end;
      end;
      var s,s1,p:integer;
      begin
      s:=0;
      s1:=1;
      writeln('введите количество слагаемых');
      readln(p);
      line(s1,s,p);
      end.

  1. Решить задачи:

  1. Вычислить площадь круга и длину окружности.

  2. Написать процедуру решения квадратного уравнения.

  3. Организовать меню математических действий (сложения, умножения, деления, вычитания, решения квадратного уравнения, линейного.)

  4. Определить, является ли число совершенным.

  5. Определить, является ли число простым.

  6. Среди чисел из интервала от а до в найти все простые.

  7. Определить, является ли данное число аморфным. (квадрат числа заканчивается этим числом-25-625)

  8. Найти все аморфные числа из промежутка от а до в.

  9. Вычислить значение выражения:y=a1* x4+a2*xз+a3*x2+a4*x+a5,
    где коэффициенты a1, a2, a3, a4, a5 и х - это числа, вводимые с клавиатуры.

  10. Упорядочить значения трех переменных в порядке их возрастания.

  11. Даны координаты трех вершин треугольника. Найти длины всех его сторон.

  12. Дано натуральное число. Найти все его делители. Подсчитать их количество.

  13. Даны два натуральных числа. Определить, является ли первое число перевертышем второго?

  14. Даны координаты трех вершин треугольника а, в, с, и даны координаты четвертой точки d. Определить, является ли эта точка внутренней точкой треугольника




Функции: задачи

  1. Для чего используется функция.

  2. Дать понятие функции.

  3. Где описывается функция, что указывается в заголовке функции, в теле функции.

  4. Чем отличаются формальные переменные от фактических.

  5. Как определить тип функции.

  6. Найти ошибку:

    1. var a,b,c:integer;
      function summa (var a,b,c:integer):integer;
      begin
      summa:=a+b+c;
      end;
      begin
      readln (a,b,c);
      writeln(summa(a,b) );
      end.

    2. var a,b,c:real;
      function summa (var a,b,c:real):integer;
      begin
      summa:=a+b+c;
      end;
      begin
      readln (a,b,c);
      writeln(summa(a,b,c) );
      end.

    3. var a,b,c:integer;
      function summa (var a,b,c:real):integer;
      begin
      summa:=a+b+c;
      end;
      begin
      readln (a,b,c);
      writeln(sum(a,b) );
      end.

  1. решить задачи:

    1. вычислить площадь круга.

    2. вычислить объем шара.

    3. вычислить а4, аn, (аn+ bn)* cn,

    4. вычислить а!, (а!+b!)/c!

    5. решить систему уравнений: (аx2+bx+c)*( (px2+kx+g)+ (аy2+by+c));
      py2+ky+g=0;

    6. Найти сумму цифр числа.

    7. Найти первую цифру числа.

    8. Найти количество делителей числа.

    9. Найти числа из промежутка от А до В, у которых больше всего делителей.

    10. Найти сумму всех делителей числа.

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

    12. Определить, является ли число простым.

    13. Среди чисел из интервала от А до В найти все простые.

    14. Составьте программу, проверяющую, является ли число палиндромом (например, число 12721 - палиндром).

    15. Определить, является ли число автоморфным, то есть квадрат этого числа заканчивается этим же числом, например, число 6, так как его квадрат 36 заканчивается на 6 или число 25 - его квадрат 625.

    16. Используя функцию из предыдущей задачи, найти все автоморфные числа из промежутка от А до В.

    17. Дано четыре числа. Вывести на экран наи­большую из первых цифр заданных чисел. Например, если а=25, b==730, c=127, d=1995, то должна напечататься цифра 7.

    18. Дано натуральное число п. Выяснить, имеются ли среди чисел п, п+1...., 2п близнецы, т.е. простые числа, разность между которыми равна двум.

    19. Вычислить значение суммы:Учебно-методическое пособие по дисциплине Основы программирования



СТРОКОВЫЕ ОПЕРАЦИИ


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

Все языки программирования высокого уровня имеют средства работы с литерными величинами. Паскаль - не исключение. Как вам уже известно, в стандарте языка описаны два типа переменных для литерных величин. Это - String и Char. Напомню - переменная типа Char может содержать в себе только один единственный символ, тип String предназначен для хранения строковых величин до 255 символов длиною. При описании переменной типа String вы можете сами указать максимальное число символов, которое можно занести в нее. Конечно же, это число не должно превышать 255. Делается это так:

Var S : String[30];

Для чего это нужно?

Дело в том, что при компиляции для каждой переменной отводится свой участок памяти. Если мы будем выделять для всех переменных типа Strin String g по 256 байт, то это приведет к тому, что при использовании достаточно большого их количества, памяти может и не хватить. Но если в переменной мы собираемся хранить, например, фамилию пользователя, то тридцати символов (тридцати байт) для этого вполне достаточно. Таким образом, экономится память и увеличивается быстродействие программ.

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

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

Пример: S[5] - пятый символ строки S.

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

Обратите внимание на то, что нумерация символов в строке начинается с единицы. Внутри квадратных скобок вместо числа может находиться выражение, результатом которого является целое число. Главное, чтобы символ с таким номером в строке существовал. Но как же узнать, сколько символов в данный момент находится в строковой переменной? Для этого существует специальная функция, которая возвращает длину строковой переменной в символах. Это функция Length.

Ее формат: Length(S)

Здесь S - либо строковая величина, либо строковая переменная.

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

Program Str1;
Var
S : String;
Begin

Writeln('Введите последовательность символов');
Readln(S);
Writeln('Вы ввели строку из ',Length(S), ' символов')

End.

Решим задачу:

"Введенную строку вывести на экран по одному символу в строке экрана".

Program Str2;
Var

S : String;
I : Byte;

Begin

Writeln('Введите строку');
Readln(S);
For I:=1 to Length(S) do {организуем цикл, начиная с первого символа}
Writeln(S[I]) {строки, до последнего (номер последнего}
{совпадает с количеством символов строки S) }

End.

Какие же еще действия можно выполнять с переменными строкового типа?

Две строковые величины можно состыковывать. Эта операция называется конкатенацией и обозначается знаком "+".

Например, результатом выполнения следующих команд:
R:= 'kadabra';
H:= 'abra';
S:=H+R;
в переменной S будет значение 'abrakadabra'.

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

Строковые величины можно сравнивать между собой. Это относится также и к строковым переменным. Но как же компьютер определяет, какая строка больше:

  • та, которая длиннее?

  • та, которая содержит больше заглавных букв?

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

Код символа в Паскале можно определить при помощи функции Ord.

Ее формат: Ord(C), где С - либо непосредственно указанный символ, либо переменная символьного типа, либо один символ строковой переменной. Вообще, функция Ord имеет более глубокий смысл, но об этом - позже. Есть и обратная функция, которая возвращает символ по известному коду. Это функция Chr(N), где N - выражение, приводящее к целому числу в интервале от 0 до 255 (возможные значения кода символа). Очевидно, что Chr(Ord(C))=C, Ord(Chr(N))=N.

Следующая маленькая программа выводит на экран кодовую таблицу:

Program Str3;
Var
I : Byte;
Begin

For I:=32 to 255 do
Write('VV',I:4, '-',Chr(I))

End.

Цикл в программе начинается с 32 потому, что символы с кодами от 0 до 31 являются управляющими и не имеют соответствующего графического представления.

Задача:

"Определить, является ли введенная строка "перевертышем". Перевертышем называется такая строка, которая одинаково читается с начала и с конца. Например, "казак" и "потоп" - перевертыши, "канат" - не перевертыш".

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

Program Str4;
Var
S,B : String;
I : Byte;
Begin

Writeln('Введите строку');
Readln(S);
B:=''; {Переменной B присваиваем значение "пустая строка"}
For I:=1 to Length(S) do
B:=S[I]+B; {Конкатенация. Символы строки S пристыковываются к}
{переменной B слева. Самым левым окажется последний.}
If B=S Then Writeln('Перевертыш') Else Writeln('Не перевертыш')

End.

Число, записанное в строковую переменную, естественно числом не является, но очень часто требуется его все же использовать в качестве числа. Для этого нужно произвести преобразование типа. Перевод строкового представления числа в числовое выполняет в Паскале оператор Val.

Его формат:
Val(S,X,C);

Здесь

S - строка, содержащая число,

X - числовая переменная, в которую будет помещен результат,

С - переменная целочисленного типа, в которую помещается первого встреченного в S отличного от цифры символа.

Если после выполнения оператора Val переменная С имеет значение 0, то это означает, что преобразование типа прошло совершенно успешно и в строке нецифровых символов не встретилось.

Противоположное действие осуществляет оператор Str. Формат оператора:

Str(X,S);

X - число (либо арифметическое выражение),

S - строковая переменная.

В переменную S попадает строковое представление числа X. Это нужно, например, при необходимости выводить на экран числа в графическом режиме (будет изучено позже), так как стандартные процедуры вывода на экран там работают только со строковыми величинами.

Для иллюстрации рассмотрим такую задачу:

"Найти сумму цифр введенного натурального числа".

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

Program Str5;
Var

S : String;
I,X,A,C : Integer;

Begin

Writeln('Введите натуральное число');
Readln(S); {Число вводится в строковую переменную}
A:=0;
For I:=1 To Length(S) Do
Begin

Val(S[I],X,C); {Цифровой символ превращается в число}
A:=A+X {Цифры суммируются}

End;
Writeln('Сумма цифр равна ',A)

End.

Теперь рассмотрим еще несколько действий над строками:

  • оператор DELETE(S,I,C) из строковой переменной S удаляет C символов, начиная с I-того;

  • оператор INSERT(SN,S,I) вставляет подстроку SN в строковую переменную S перед символом с номером I;

  • функция COPY(S,I,C) возвращает подстроку строки S из C символов, начиная с символа с номером I;

  • функция Pos(SN,S) возвращает номер символа, с которого в строке S начинается подстрока SN (позицию первого вхождения подстроки в строку). Если такой подстроки нет, то возвращается ноль.

Пример их использования:

"Во введенной строке заменить все вхождения подстроки 'ABC' на подстроки 'KLMNO'".

Program Str6;
Var

S : String;
A : Byte;

Begin

Writeln('Введите строку');
Readln(S);
While Pos('ABC',S)<>0 Do
Begin

A:= Pos('ABC',S);
Delete(S,A,3);
Insert('KLMNO',S,A)

End;
Writeln(S)

End.


Задачи:символы


  1. Указать, чем отличается тип char от других известных вам типов данных.

  2. Что будет выведено на экране в результате выполнения следующих инструкций:

  1. a:='A';
    writeln(ord(a));
    writeln(chr(65));


  1. writeln(chr(97));
    writeln(ord(chr(97)));

  1. Написать программу, которая проверяет введенный пароль (цифровой), если он не верен, то раздается звуковой сигнал.

  2. Написать программу, которая переводит строчную букву в прописную.

  3. Вывести таблицу ASCII.

  4. Выводить таблицу ASCII по 10 символов, спрашивая у пользователя, хочет ли он продолжать дальше.

Пример 4:
var a:char;
begin

Writeln('Введите букву');

Readln (a);

Case a of

'a'..'п': writeln(chr(ord(a)-32));

'р'..'я': writeln(chr(ord(a)-80));

end;

end.

Задачи: строки


  1. Чем отличается тип string от известных вам типов?

  2. Чем отличаются записи:
    var
    storka1: string;
    storka2: string[25];

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

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

  5. Что будет выведено на экране в результате выполнения следующих инструкций?

    1. a:='Маша ела кашу';
      b:='суп';
      delete (a,9,4);
      writeln(concat(a,b));

    2. stroka:='компьютер';
      writeln(stroka[2]);

    3. I:integer;
      stroka:='компьютер';
      readln(i);
      writeln(stroka[i]);

  6. Составить программу- перевертыш слов.

  7. Подсчитать количество букв "а" в строке.

  8. Подсчитать количество цифр 3 в числе.

  9. Подсчитать сумму цифр числа.

  10. Заменить все гласные буквы в строке на *.

  11. Изобразить бегущую строку.

  12. Удвоить каждое вхождение символа ch в строке.

  13. Даны две строи. Если они начинаются с одинаковых символов, то напечатать ДА, иначе - НЕТ.

  14. Дана последовательность слов, напечатать все слова в алфавитном порядке.

  15. Дана последовательность слов, напечатать все слова предварительно преобразовав по следующему правилу:

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

    2. оставить в слове только первые вхождения каждой буквы.

  16. Найти сумму всех чисел строки.

  17. Подсчитать, сколько раз в данной строке встречается буква C, вводимая с клавиатуры.

  18. Сколько раз встречаются гласные буквы?

  19. Из строки удалить среднюю букву, если длина строки нечетная, иначе - удалить две средние буквы.

  20. Заменить все буквы Сh1 на Ch2 (их значения вводить с клавиатуры).

  21. Заменить все вхождения подстроки Str1 на подстроку Str2, которые вводятся с клавиатуры.

  22. После каждой буквы Ch вставить строку Strl.

  23. Дана последовательность слов. Напечатать все слова, отличные от слова "hello".

  24. Дана последовательность слов. Напечатать все слова в алфавитном порядке.

  25. Дана последовательность слов. Напечатать все слова последовательности, которые встречаются в ней по одному разу.

  26. Дано предложение. Напечатать все различные слова.

  27. Дана последовательность слов. Напечатать те слова последовательности, которые отличны от последнего слова и удовлетворяют следующему свойству:

    1. в слове нет повторяющихся букв;

    2. буквы слова упорядочены по алфавиту;

    3. слово совпадает с начальным отрезком латинского алфавита (a, ab, abc, abed,...);

    4. слово симметрично.

  28. Составьте программу вывода самой большой цифры в записи заданного числа.

  29. Дан текст из 60 букв, напечатать только строчные русские буквы, входящие в этот текст.

  30. Дан текст из строчных русских букв, за которыми следует точка. Напечатать этот текст заглавными русскими буквами.

  31. Дан непустой текст из заглавных русских букв, за которыми следует точка. Определить, упорядочены ли эти буквы по алфавиту.

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

  33. Заданное целое число от 1 до 1999 напечатать римскими цифрами.

  34. Написать программу, которая вводит дату некоторого дня года и печатает название соответствующего знака Зодиака.

  35. Дан текст из заглавных латинских букв, определить является ли этот текст правильной записью римскими цифрами целого числа от 1 до 999, и, если является, напечатать это число арабскими цифрами.

Проверочные работы

Вариант №1

Из строки удалить введенную с клавиатуры букву.

Заменить в строке буквы "а" на "o".

Вариант №2

Из строки S удалить все вхождения подстроки S1.

Заменить в строке все буквы X на Y, введенные с клавиатуры.

Варианты №3

В строке S удалить все пробелы.

Заменить каждый четный символ строки на символ "2".

Вариант №4

Из всех введенных многозначных чисел, найти число с наибольшей суммой чисел.

Перевернуть те слова, которые стоят на четных местах.

ОПРЕДЕЛЕНИЕ ТИПОВ


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

Новый тип перед первым его использованием должен быть описан в соответствующем разделе описаний. Его заголовок - служебное слово Type.

Type <Имя типа> = <Описание типа>;


Есть несколько способов описания. Иногда говорят даже о видах типов (как бы это странно ни звучало).

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

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

Формат описания следующий:

<Имя типа> = (<Ид.1>, <Ид.2>,? <Ид.N>);


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

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

Ord(X) - порядковый номер значения переменной X в списке идентификаторов.

Succ(X) - следующее значение для величины Х.

Pred(X) - предыдущее значение данного типа.

Обратите внимание на то, что для функции Ord нумерация среди значений идет, начиная от нуля. Для последнего значения нельзя применять функцию Succ, для первого - Pred.

Переменные различных перечисляемых типов несовместимы друг с другом.

Множество стандартных порядковых типов в языке Паскаль на самом деле определены как перечисляемые. Это типы Char, Integer, другие. Достоинства стандартных порядковых типов лишь в том, что над каждым из них уже определены специфические действия. Например, тип Boolean описан так:

Type Boolean = (False, True);

Единственное его отличие от перечисляемых типов, определяемых программистом, состоит в том, что значения типа Boolean можно выводить на экран. Можете проверить, Ord(False)=0.

Интересно, что переменная перечисляемого типа может быть счетчиком в цикле "с параметром".

Пример:

Program T1;
Type
Colors = (Black, Blue, Green, Cyan, Red, Magenta, Brown, Yellow, White);
Var
C1,C2 : Colors;
Begin

C1:=Green;
C2:=Red;
Writeln(Ord(C1), Ord(Succ(C2)))

End.

Во время выполнения на экране появятся числа "2" и "5", что соответствует номерам значений Green и Magenta.

Задачи: пользовательские типы


  1. Как создать «свой» тип данных?

  2. Найти ошибку:
    var I:integer;
    type int=integer;

    type li=longint;
    var a=li;

    type st=string[10];
    var s:st;
    begin
    for I:=1 to 20 do
    s[i]:=str(i);
    end.

    type
    tip:=(1,2,3,4);
    var
    a:tip;

  3. Составьте программу, которая выводит на экран номер дня недели по введенному названию (обозначьте тип-num_month ).

  4. Составьте программу, которая по названию цвета, выдаст его номер.

Пример (зад. №4)

Type

Num_cvet=integer;

Var

N:num_cvet;

Begin

Writeln('введите номер цвета от 0 до 4');

Readln(n);

Case n of

0: writeln('черный');
1: writeln('синий');

2: writeln('зеленый');

3: writeln('бирюзовый');

end;

end.

МАССИВЫ


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

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

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

Описание типа линейного массива выглядит так:

Type <Имя типа>=array [<Диапазон индексов>] Of <Тип эл-ов>;

В качестве индексов могут выступать переменные любых порядковых типов. При указании диапазона начальный индекс не должен превышать конечный. Тип элементов массива может быть любым (стандартным или описанным ранее).

Описать переменную-массив можно и сразу (без предварительного описания типа) в разделе описания переменных:

Var <Переменная-массив> : Array [<Диапазон индексов>] Of <Тип элементов>;

Примеры описания массивов:


Var

S, BB : Array [1..40] Of Real;
N : Array ['A'..'Z'] Of Integer;
R : Array [-20..20] Of Word;
T : Array [1..40] Of Real;

Теперь переменные S, BB и T представляют собой массивы из сорока вещественных чисел; массив N имеет индексы символьного типа и целочисленные элементы; массив R может хранить в себе 41 число типа Word.

Единственным действием, которое возможно произвести с массивом целиком - присваивание. Для данного примера описания впоследствии допустима следующая запись:

S:=BB;

Однако присваивать можно только массивы одинаковых типов. Даже массиву T присвоить массив S нельзя, хотя, казалось бы, их описания совпадают, произведены они в различных записях раздела описания.

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

R[10] - элемент массива R с индексом 10.

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


BB[15] - прямая адресация;


BB[K] - косвенная адресация через переменную K, значение которой будет использовано в качестве индекса элемента массива BB.

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

Если вы помните, с такой формой организации данных мы встречались, когда изучали строковые переменные. Действительно, переменные типа String очень близки по своим свойствам массивам типа Char. Отличия в следующем: строковые переменные можно было вводить с клавиатуры и распечатывать на экране (с обычным массивом это не проходит); длина строковой переменной была ограничена 255 символами (255 B), а для размера массива критическим объемом информации является 64 KB.


ОДНОМЕРНЫЙ МАССИВ (ВЕКТОР)

Направление изменения индекса.

Учебно-методическое пособие по дисциплине Основы программирования

1

2

3

4

5

n

А



Идентификатор:

ARRAY [диапазоны индексов] OF тип элемента массива;

Описание.

Var A:array[1..5] of integer;

const n=5;

Var A:array[1..n] of integer;

const n=5;

type vector=array[1..n] of integer;

var a:vector;

ВВОД И ВЫВОД МАССИВА


Var A:array[1..5] of integer;

i:integer;

Begin

For i:=1 to 5 do read(a[I]); ввод элементов массива.

For i:=1 to 5 do write(a[I]); вывод элементов массива.

В дальнейшем для учебных целей мы будем использовать массивы, заданные с помощью генератора случайных чисел. В языке Паскаль случайные числа формирует функция Random. Числа получаются дробными, равномерно расположенными в интервале от 0 до 1. Выражение, дающее целое случайное число в интервале [-50,50], будет выглядеть так:

Trunc(Random*101)-50

Пример:

Зададим и распечатаем случайный массив из сорока целых чисел:

Program M4;
Const
N=40; {Константа N будет содержать количество элементов массива}
Var

A : Array [1..N] Of Integer;
I : Integer;

Begin

For I:=1 To N Do
Begin

A[I]:= Trunc(Random*101)-50
Write(A[I],'VVV')

End

End.

Пример:

Заполнить массив значениями квадратов индексов элементов.

Program M3;
Const
N=50; {Константа N будет содержать количество элементов массива}
Var

A : Array [1..N] Of Integer;
I : Integer;

Begin

For I:=1 To N Do
A[I]:=I*I
For I:=1 To N Do
Write(A[I],'VVV')

End.

Решение задач:

  1. Дать понятие массива.

  2. Перечислите способы описания массива.

  3. Найдите ошибку:

    1. type masiv=array[5] integer;
      var m: masiv;

    2. var massiv: array [1..8] of integer=(1,2,3,4,5,6,7,8);

    3. type mas array[1..4] of real=(1,1,2,3);

    4. type mas array[1.4] of real
      const m:mas =(3,5,6,8,9);

  4. Перечислите способы заполнения массива.

  5. Объясните, для чего при вводе и выводе элементов массива используется оператор for.

  6. Что будет выведено на экран:

    1. const a:array[1..5] of char=('h','e','l' ,'l','o');
      begin
      writeln(a[3],a[2],a[1]);

    2. const mas: array[1..6]of integer=(4,7,9,0,6,5);
      var I:integer;
      begin
      for I:=1 to 6 do
      if I mod 2=0 then writeln(a[i]);

    3. const mas: array[1..6]of integer=(4,7,9,0,6,5);
      var I:integer;
      begin
      for I:=1 to 6 do
      if a[I] mod 2=0 then writeln(a[i]);

    4. const mas: array[1..6]of char=('4','7','9','0','6','5');
      var I:integer;
      begin
      for I:=6 downto 1 do
      writeln(a[i]);

  7. Решить задачи, предварительно составив блок-схему к каждой задаче(ввод и вывод массива писать через процедуры ):

  1. Вывести четные элементы массива и их номера.

  2. Найти сумму положительных элементов массива.

  3. Вывести элементы, стоящие на нечетных местах.

  4. Найти сумму всех элементов массива.

  5. Найти сумму всех четных элементов массива.

  6. Подсчитать сумму элементов, кратных 5.

  7. Найти сумму всех четных элементов массива, стоящих на четных местах, то есть имеющих четные номера.

  8. Вывести на экран элементы, кратные 5 или элементы, стоящие на местах, кратны 3 и их номера.

  9. Вывести на экран элементы, кратные 3 и их номера.

  10. Найти сумму первых пяти элементов массива, оформив задачу как подпрограмму.

  11. Найти сумму элементов, больших данного числа А (А вводить с клавиатуры).

  12. Найти сумму элементов, принадлежащих промежутку от А до В (А и В вводить с клавиатуры).

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

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

  15. Определить номер нулевого элемента массива, оформив задачу как подпрограмму.

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

  17. Найти минимальный (максимальный) элемент в массиве, оформив задачу как подпрограмму.

  18. Написать процедуру сортировки массива.

  19. Отсортировать массив по возрастанию несколькими способами.

Сортировка методом прямого выбора.

Type

Mas=array[1..size] of integer;

Const size=8;

Var

a:mas;

I, min, j, buf, k: integer;

Begin

Writeln('сортировка массива');

Writeln('введите через пробел', size:4, 'целых в одной строке и нажмите enter');

For k:=1 to size do

Read(a[k]);

Writeln('сортировка');

For I:=1 to size-1 do begin

Min:=I;

For j:=I+1 to size do begin

If a[j]

Buf:=a[i];

a[i]:=a[min];

a[min]:=buf;

for k:=1 to size do

write(a[k],' ');

end;

end;

writeln('массив отсортирован');

end.


Сортировка методом прямого обмена.

Type mas= array[1..size] of integer;

Const size=8;

Var

a: mas;

I, buf, k: integer;

Begin

Writeln('сортировка массива пузырьковым методом');

Writeln('введите через пробел', size:4, 'целых в одной строке и нажмите enter');

For k:=1 to size do

Read(a[k]);

Writeln('сортировка');

For I:=1 to size-1 do begin

For k:=1 to size-1 do begin

If a[k]>a[k+1] then begin

Buf:=a[k];

a[k]:=a[k+1];

a[k+1]:=buf;

end;

end;

for k:=1 to size do

write(a[k],' ');

writeln;

end;

writeln('массив отсортирован');

end.

Решение задач

Ввод и вывод осуществлять при помощи процедур.

  1. Найти максимальный элемент массива и его номер, при условии, что все элементы различные.

  2. Найти номера всех отрицательных элементов (вывести их на экран), если таких нет, то сообщить об этом.

  3. Найти номера всех элементов с максимальным количеством делителей, нахождение количества делителей оформить в виде функции.

  4. Найти среди элементов, простые числа.

  5. Найти количество нечетных элементов.

  6. Найти количество отрицательных элементов.

  7. Сколько элементов массива превосходят по модулю заданное число А?

  8. Найти все элементы, кратные 3 или 5. Сколько их?

  9. Есть ли в данном массиве два соседних положительных элемента? Найти номера первой (последней) пары.

  10. Есть ли в данном массиве элемент, равный заданному числу? Если есть, то вывести номер одного из них.

  11. Если существует треугольник со сторонами а, b и с, то напечатать "ДА", иначе напечатать "НЕТ" (значения a, b и с вводить с клавиатуры).

  12. Выяснить, есть ли в массиве совершенные числа, (поиск совершенного числа осуществить при помощи функции).

Методы работы с элементами одномерного массива

Решение задач

Ввод/вывод массива осуществить при помощи процедур.

1. Изменить знак у максимального по модулю элемента массива.

2. Заменить все четные элементы на их квадраты, а нечетные удвоить.

3. Вычесть из положительных элементов элемент с номером k1, а к отрицательным прибавить элемент с номером k2, нулевые элементы оставить без изменения.

4. К четным элементам прибавить А, а из элементов с четными номерами вычесть В.

5. Отрицательные элементы возвести в квадрат.

6. Даны два целочисленных массива, состоящие из одинакового числа элементов. Получить третий массив той же размерности, каждый элемент кото­рого равен большему из соответствующих элементов данного массива.
Например, даны два массива А и В, состоящие из пяти элементов. Получим из них массив С, состоящий тоже из пяти элементов, первый элемент этого массива равен большему из первых элемен­тов массивов А и В, второй - большему из вторых элементов данных массивов и так далее. Таким образом, получим массив С.

7. Дан первый член геометрической прогрессии и ее знаменатель. Найти первые п членов этой прогрессии.

8. Получить первые п чисел Фибоначчи - первые два числа равны 1, а каждое следующее равно сумме двух предыдущих.

9. Даны два массива. Найти среднее арифметическое элементов каждого и сравнить эти значения.

10. При выводе на экран:

a) после каждого элемента, кроме последнего, поставить точку;

b) пропустить все отрицательные.

Примечания.

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

2. В задаче 7 можно новый массив заполнять не 0 и 1, а значениями True и False, в зависимости от выполнения условия.

Удаление элемента

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


1. Удалить первый отрицательный элемент, если такой элемент есть.

2. Удалить все отрицательные элементы.

3. Удалить все элементы, большие данного числа А (А вводить с клавиатуры).

4. Удалить все четные элементы, стоящие на нечетных местах.

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

6. Удалить последний четный элемент.

7. Удалить все элементы, кратные 3 или 5.

8. Удалить все элементы, начиная с kl-то по k2-ой (k1 и k2 вводить с клавиатуры). Сделать проверку корректности ввода значений kl и k2 (kl <= k2). Ели ввод некорректный, то вывести сообщение об ошибке и закончить работу.

Вставка элементов в одномерный массив


1. Вставить элемент после первого отрицательного элемента.

2. Вставить элемент перед последним отрицательным элементом.

3. Вставить два элемента: первый - после максимального элемента, второй - перед максимальным элементом (удобнее всего применить именно такой порядок вставки).

4. Вставить по одному элементу перед всеми элементами, кратными заданному числу.

5. Вставить по одному элементу перед всеми отрицательными элементами.

6. Вставить два элемента: первый - после всех элементов, больших данного числа Р, а второй - перед всеми элементами, большими данного числа Р (Р вводить с клавиатуры).

7. Вставить число А перед всеми элементами, большими А, а число В - после всех элементов, меньших его.

Перестановки элементов массива


Перестановка двух элементов

1. Поменять местами:

a) первый элемент и максимальный;

b) второй и минимальный;

c) первый и последний отрицательный.

2. Дан одномерный массив А, состоящий из 2п элементов. Поменять его половины следующим образом: первый элемент поменять с последним, второй с предпоследним и так далее.

3. Дан одномерный массив В, состоящий из 2п элементов. Переставить его элементы по следующему правилу:

a) b[n+1], b[n+2],..., b[2n], b[l], b[2],.." b[n];

b) b[n+1], b[n+2],..., b[2n], b[n], b[n-1],..., b[l]:

c) b[l], b[n+1], b[2], b[n+2],..., b[n], b[2n];

d) b[2n], b[2n-l],.." b[n+1], b[l], b[2]...., b[n].

4. Дан одномерный массив. Переставить в обратном порядке элементы массива, расположенные между минимальным и максимальным элементами.


ДВУМЕРНЫЕ И МНОГОМЕРНЫЕ МАССИВЫ


Двумерный массив (матрица)


Направление изменения второго индекса.

Учебно-методическое пособие по дисциплине Основы программированияУчебно-методическое пособие по дисциплине Основы программирования

Учебно-методическое пособие по дисциплине Основы программирования

1

2

3

4

5

.

.

n

1



2


Учебно-методическое пособие по дисциплине Основы программирования


3





n




A[2,5] или
А[I,j] если
i=5, j=2
Учебно-методическое пособие по дисциплине Основы программирования


Идентификатор:

ARRAY [диапазоны индексов] OF тип элемента массива;

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

ОПИСАНИЕ.

  1. Var A:array[1..5:1..4] of integer;

  2. const n=5; m=4

Var A:array[1..n;1..m] of integer;

  1. const n=5; m=4

type vector=array[1..n;1..m] of integer;

var a:vector;

ВВОД И ВЫВОД МАССИВА.

Var A:array[1..5;1..4] of integer;

I,j : integer;

Begin

For I:=1 to 5 do

For j:=1 to 4 do read(a[I,j]); ввод элементов массива.

For I:=1 to 5 do begin

For j=1 to 4 do write(a[I,j]); вывод элементов массива.

Writeln;

End;


Для иллюстрации способов работы с двумерными массивами решим задачу:

"Задать и распечатать массив 10X10, состоящий из целых случайных чисел в интервале [1,100]. Найти сумму элементов, лежащих выше главной диагонали."

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

Program M5;
Var

A : Array[1..10,1..10] Of Integer;
I, K : Byte;
S : Integer;

Begin

S:=0;
For I:=1 To 10 Do
Begin
For K:=1 To 10 Do
Begin

A[I,K]:=Trunc(Random*100)+1;
Write(A[I,K]:6);
If K>I Then S:=S+A[I,K]

End;
Writeln
End;
Writeln('Сумма элементов выше гл. диагонали равнаV',S)

End.

Двумерные массивы

Описание. Работа с элементами

Повторение

1. Как описать одномерный массив?

2. Как задать его значение?

3. Как вывести на экран?

4. Как найти сумму элементов?

5. Как найти номер заданного элемента?

6. Как найти количество определенных элементов?


  1. Найдите ошибку:

    1. var a:array[1..2,1..3] of integer;
      i,j:integer;
      begin
      for i:=1 to 2 do
      readln(a[i,j])

    2. type mas= array[3,6] of char;
      var b:mas;
      begin
      writeln(b[2,3]);
      end.

    3. var c:array[1..2,1..2] of integer=(1,2,3,4);
      i,j:integer;
      begin
      for i:=1 to 2 do
      for j:=1 to 2 do
      readln(a[i,j]);
      end.

  2. Задать таблицу в виде массива.

    1

    2

    3

    4

    5

    6

    7

    8

    9

    2

    2

    4

    6

    8

    10

    12

    14

    16

    18

    3

    3

    6

    9

    12

    15

    18

    21

    24

    27

    4

    4

    8

    12

    16

    20

    24

    28

    32

    36

    5

    5

    10

    15

    20

    25

    30

    35

    40

    45

    6

    6

    12

    18

    24

    30

    36

    42

    48

    54

    7

    7

    14

    21

    28

    35

    42

    49

    56

    63

    8

    8

    16

    24

    32

    40

    48

    56

    64

    72

    9

    9

    18

    27

    36

    45

    54

    63

    72

    81

  3. Решить задачи:
    (при решении задач использовать процедуры и функции)

  1. Написать процедуру ввода и вывода массива на экран.

  2. Вывести нечетные элементы массива и их номера.

  3. Вывести нулевые элементы массива и их номера.

  4. Вывести элементы главной диагонали.

  5. Вывести элементы побочной диагонали.

  6. Найти сумму всех элементов массива.

  7. Найти сумму второго столбца и первой строки.

  8. Найти сумму четных элементов массива.

  9. Найти сумму каждой строки массива, разделить на эту сумму каждый элемент массива и результат записать в этот же массив.

  10. Найти максимальный элемент в первой строке (столбце).

  11. Найти максимальный (минимальный) элемент в массиве.

  12. Найти сумму и количество элементов каждого столбца с заданным условием (хранить эти значения в массивах):

    1. элементы, кратные k1 или k2,

    2. элементы, попадающие в промежуток от А до В;

    3. элементы, которые являются простыми числами.

  13. Найти сумму элементов в строках с k1-й по k2-ю.

  14. Найти номера:

    1. всех максимальных элементов;

    2. первых отрицательных элементов каждой строки (столбца);

    3. последних отрицательных элементов каждой строки (столбца).

  15. Найти количество элементов в каждой строке, больших (меньших) среднего арифметического элементов данной строки.

  16. Найти произведение двух двумерных массивов А и В, если массив А имеет размерность п *т, а В - т*п. Определить размерность результирующего массива и правило нахождения элемента с номерами i и j.

  17. Даны два квадратных массива А и В. Вывести на экран тот из них, у которого след меньше (сумма элементов главной диагонали).

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

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

  20. Определить:

    1. есть ли в данном массиве отрицательный элемент;

    2. есть ли два одинаковых элемента;

    3. есть ли данное число А среди элементов массива.

  21. Определить:

    1. Является ли массив логическим квадратом, то есть суммы по всем горизонталям, вертикалям и двум диагоналям должны быть равны;

    2. Добавить к предыдущему условию, что сумма должна быть равна данному числу А.

  22. Определить, есть ли в данном массиве строка (столбец):

    1. состоящая только из положительных элементов;

    2. состоящая только из положительных или нулевых элементов;

    3. состоящая только из элементов, больших числа А;

    4. состоящая только из элементов, принадлежащих промежутку от А до В.

  23. Вставить первую строку после строки, в которой находится первый встреченный максимальный элемент.

  24. Вставить нулевую строку и нулевой столбец перед строкой и столбцом, в которых находится первый минимальны элемент.

  25. Удалить столбец. В котором находится минимальный элемент. Если таких столбцов несколько, то удалить все.

  26. Удалить все строки и столбцы, на пересечении которых стоят отрицательные элементы.

  27. Поменять местами первый максимальный и последний минимальный элементы.

  28. В каждой строке поменять местами первый элемент и максимальный по модулю.

  29. В массиве поменять местами строки следующим образом: первую с последней, вторую с предпоследней и т.д.

  30. Элемент матрицы назовем седловой точкой, если он является наименьшим в своей строке и наибольшим в своем столбце или, наоборот, является наибольшим в своей строке и наименьшим в своем столбце. Для заданной матрицы размером 10х15 напечатать индексы всех ее седловых точек.

  31. Дана вещественная матрица размером 7х7 , все элементы которой различны. Найти скалярное произведение строки, в которой находится наибольший элемент матрицы, на столбец с наименьшим элементом.

  32. Определить, является ли заданная квадратная матрица 10-го порядка ортонормированной, т.е. такой, в которой скалярное произведение каждой пары различных строк равно 0, а скалярное произведение каждой строки на себя равно1.

  33. Определить, является ли заданная квадратная матрица 9-го порядка магическим квадратом, т.е. такой, в которой суммы элементов во всех строках и столбцах одинаковы.

Проверочные работы

Одномерные массивы. Работа с элементами.

Проверочная работа № 1

Вариант № 1

1. Правильно ли описан массив А? Если нет, то что надо изменить?

Type myarray=Airayf-10..nj Of Integer;

Var A: my array;

1. Что получится в результате выполнения про­граммы?

Program Varianti;

Const n=7;

Type myarray=Array{l..n] Of Integer;

Var С : ту array;

i: Byte; p : Integer;

Begin P-=0;

For i:=l Ton Do Begin

C[i}:=-50+Random(15I);

If C[i]>50 Then p^p+Cfi/;

End;

Writeln(p);

Readin;

End.

3. Дан массив целых чисел, состоящий из 20 элементов. Заполнить его с клавиатуры. Найти:

• сумму элементов, имеющих нечетное зна­чение;

• вывести индексы тех элементов, значения которых больше заданного числа А-

4. Определить, есть ли в данном массиве поло­жительные элементы, кратные k (k вводить с кла­виатуры).

Одномерные массивы. Работа с элементами

Проверочная работа № 2

Вариант № 1

1. Заменить максимальный по модулю отрицательный элемент нулем.

2. Заменить первые k элементов на противоположные по знаку.

3. Из элементов массива С сформировать массив А той же размерности по правилу: если номер четный, то Ai=Ci2, если нечетный, то Ai=2Ci.

Вариант № 2

1. Заменить минимальный по модулю положительный элемент нулем.

2. Заменить элементы с kl-vo no k2-w. на обратные.

3. Из элементов массива А сформировать массив D той же размерности по правилу: первые 10 элементов - Di=A;+i, остальные - Di=Ai-i.

Вариант № 3

1. Заменить первый отрицательный элемент нулем.

2. Умножить все элементы, кратные 3, на третий элемент массива.

3. Из элементов массива Р сформировать мас­сив М той же размерности по правилу: если номер четный, то Pi=i*Mi, если нечетный, то Рi=-Мi

Вариант № 4

1. Заменить максимальный элемент на противоположный по знаку.

2. Заменить нулями элементы между минимальным и максимальным, кроме них самих.

3. Из элементов массива С сформировать массив А той же размерности по правилу: элементы с 3-го по 12-й -Ai=-Ci2, все остальные -Ai=Ci-l.

Двумерные массивы, работа с элементами.

Проверочная работа № 3

Вариант № 1

Дан двумерный массив размером 5*6, заполненный случайным образом.

1. Заменить максимальный элемент каждой строки на противоположный.

2. Вставить после столбцов с максимальными элементами столбец из нулей.

3. Удалить среднюю строку.

4. Поменять местами средние столбцы.

Вариант № 2

Дан двумерный массив размером 8*7, заполненный случайным образом.

1. Заменить все элементы первых трех столбцов на их квадраты.

2. Вставить между средними строками первую строку.

3. Удалить все столбцы, в которых первый элемент больше последнего.

4. Поменять местами средние строки с первой и последней.

Вариант № 3

Дан двумерный массив размером 5*8, заполненный случайным образом.

1. Заменить все симметричные элементы на нули.

2. Вставить перед всеми строками, первый элемент которых делится на 3, строку из нулей.

3. Удалить столбец, в котором находится первый четный отрицательный элемент.

4. Поменять местами средние столбцы со вторым и предпоследним.

Вариант № 4

Дан двумерный массив размером 6*7, заполненный случайным образом.

1. Заменить максимальный элемент каждой строки на противоположный.

2. Вставить после столбцов с максимальными элементами столбец из нулей.

3. Удалить все столбцы, в которых первый элемент больше за-данного числа А.

4. Поменять местами средние строки.


РАБОТА С ФАЙЛАМИ


Тип-файл представляет собой последовательность компонент одного типа, расположенных на внешнем устройстве (например, на диске). Элементы могут быть любого типа, за исключением самого типа-файла. Число элементов в файле при описании не объявляется. Работа с физическими файлами происходит через так называемые файловые переменные.

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

Пример:
Type

N = File Of Integer; {Тип-файл целых чисел}
C = File Of Char; {Тип-файл символов}

Есть заранее определенный в Паскале тип файла с именем Text. Файлы этого типа называют текстовыми.

Введя файловый тип, можно определить и переменные файлового типа:

Var

F1 : N;
F2 : C;
F3 : Text;

Тип-файл можно описать и непосредственно при введении файловых переменных:

Var
Z : File Of Word;

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

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

Перед тем, как осуществлять ввод-вывод, файловая переменная должна быть связана с конкретным внешним файлом при помощи процедуры Assign.

Формат:
Assign
(<Имя файловой переменной>,<Имя файла>);


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

После этого файл должен быть открыт одной из процедур:

Reset(<Имя файловой переменной>);

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

Rewrite(<Имя файловой переменной>);

Открывается новый пустой файл для записи, ему присваивается имя, заданное процедурой Assign. Если файл с таким именем уже существует, то он уничтожается.

После работы с файлом он, как правило, должен быть закрыт процедурой Close.

Close(<Имя файловой переменной>);

Это требование обязательно должно соблюдаться для файла, в который производилась запись.

Теперь рассмотрим непосредственную организацию чтения и записи.

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

Read(<Имя файловой переменной>, <Список ввода>);

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

Вывод информации производит, как можно догадаться, оператор Write(<Имя файловой переменной>, <Список вывода>);

Данные из списка вывода заносятся в файл, открытый для записи.

Для текстовых файлов используются также операторы Readln и Writeln с соответствующими дополнениями, относящимися к файловому вводу-выводу. Любопытно, что вывод данных на монитор и ввод с клавиатуры в языке Паскаль тоже являются действиями с файлами. Они даже имеют свои предопределенные файловые переменные текстового типа: Output и Input соответственно. Переменная Output всегда открыта для записи, Input - для чтения. Если не указывать файловые переменные в операторах ввода-вывода (придем к формату, рассмотренному в теме "Операторы ввода-вывода"), то в случае записи по умолчанию выбирается файл Output, в случае чтения - Input.

Как вы знаете, любой файл конечен и продолжать чтение из него информации можно лишь до определенного предела. Как этот предел установить? Проверить, окончен ли файл, можно вызовом стандартной логической функции Eof(<Имя файловой переменной>). Она вырабатывает значение True, если файл окончен, и False - в противном случае.

Решим следующую задачу:

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

Так как заранее количество данных не известно, то для их хранения используем файл. Тип элементов - строковый.

Program L;
Var

I,N : Integer;
F : File Of String;
S : String;

Begin

Assign(F,'Spis.lst'); {Связываем переменную F с файлом Spis.lst}
Writeln('Введите количество учащихся');
Readln(N); {Вводим количество учащихся}
Rewrite(F); {Создаем файл для записи в него данных}
For I:=1 To N Do {Для всех учащихся}
Begin

Writeln('Введите фамилию');
Readln(S);
Write(F,S)

End;
Close(F);
Reset(F);
Writeln; Writeln('Список учащихся:');
While Not(Eof(F)) Do
Begin

Read(F,S);
If S[1]<>'Ш' Then
Writeln(S)

End;
Close(F)

End.


Задачи: работа с файлами


  1. Что такое файл?

  2. Как можно описать файловую переменную? Для чего необходима файловая переменная?

  3. Как связать файловую переменную с конкретным файлом?

  4. Перечислите режимы открытия файла для вывода в файл.

  5. Указать процедуру ввода из файла.

  6. Указать процедуру закрытия файла, конца файла.

  7. Решить задачи:

    1. написать процедуру решения квадратного уравнения и результаты записать в файл.

    2. вывести в файл только четные числа из промежутка от а до b.

    3. написать процедуру вывода массива в файл.

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

    5. удалить из файла все пробелы (нули).

    6. переписать данные из одного файла в другой.

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

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


пример 7 h):

uses crt;

const a:array[1..5]of string=('фамилия','имя','возраст','рост', 'вес');

var f: text;

s,s1,s2:string;

i,n,p:integer;

begin

clrscr;

assign(f,'c:\text.txt');

append(f);

i:=1;

repeat

writeln(a[i]);

readln(s);

writeln(f,s);

inc(i);

if i=6 then

begin

writeln(f,'#'); добавляем после данных пользователя разделитель

i:=1;

writeln('будете продолжать (n/y)');

readln(s2);

end;

until s2='n';

close (f);

i:=1;

writeln('введите начальные буквы фамилии');

reset(f);

readln(s);

n:=0;

p:=1;

while not eof(f) do

begin

readln(f,s1);

inc(n); считаем строки

if n=p then

begin

p:=p+6; фамилии стоят в каждой 7 строке

if pos(s,s1)<>0 then если есть такая фамилия, начинающаяся с фрагмента s

repeat

writeln(a[i]);

writeln(s1);

readln(f,s1);

inc(i);

if i=6 then begin i:=1; readln; end;

until s1='#';

end;

end;

close(f);

end.

Задачи

  1. Даны два файла. Поменять местами содержимое этих файлов.

  2. Дан файл, элементами которого являются символы. Переписать содержимое этого файла в другой в обратном порядке.

  3. Даны два файла А и В. Элементами файла А являются числа, а В- символы. Вывести на экран все числа из первого файла, а рядом с ними элементы из второго файла с соответствующими номерами. Если во втором файле нет элементов с данным номером, то вывести сообщение


РЕКУРСИЯ

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

ПРИМЕР:

Вычислить N-е число Фиббоначчи.

(Смотри тему Циклы)

program Fib;

var n:byte;

function F(k:byte):word;

begin

if k<2 then F:=1 else F:=F(k-1)+F(k-2); {рекурсивный вызов}

end;

begin

write('введите номер числа Фиббоначчи ');

readln(N);

writeln(N,'-е число Фиббоначчи =',F(N));

readln

end.

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

ПРИМЕР:

Неявная рекурсия.

Procedure B(x:byte); forward;

Procedure A(y:byte);

begin

- - -

B(y);

- - -

end;

Procedure B;

begin

- - -

A(x);

- - -

end;


ПРИЛОЖЕНИЯ


ТЕКСТОВЫЙ ВИДЕОРЕЖИМ

МОДУЛЬ CRT

(основные возможности)

Модуль Crt относится к стандартным модулям Турбо Паскаля и находится в файле turbo.tpl (Turbo Pascal Library). Для подключения модуля достаточно написать uses Crt. Модуль Crt содержит средства управления экраном в текстовом режиме и клавиатурой.

На экране используются два активных цвета: цвет текста и цвет фона. Их можно установить с помощью процедур TextColor и TextBackground, которые имеют по одному параметру: целому числу, задающему номер цвета. Для цвета текста используются числа от 0 до 15, а для цвета фона - от 0 до 7. Обе эти процедуры оказывают влияние только на последующий вывод.

Координаты на экране задаются следующим образом. Левый верхний угол имеет координаты (1,1), а правый нижний (80,25). Можно вводить относительные координаты, объявляя окно с помощью процедуры Window(x1,y1,x2,y2), где x1,y1 - абсолютные координаты левого верхнего, а x2,y2 - правого нижнего угла окна. После этого все процедуры и функции кроме Window используют относительные координаты. Вернуться к работе со всем экраном можно, написав Window(1,1,80,25). С помощью процедуры GotoXY(x,y) можно установить курсор в заданную позицию окна, а с помощью пары функций WhereX и WhereY без параметров можно узнать текущие координаты курсора. Процедура ClrScr не имеет параметров и закрашивает текущее окно цветом фона.

Модуль Crt позволяет осуществлять контроль клавиатуры. Известно, что информация о нажатых клавишах поступает сначала в буфер клавиатуры и только затем считывается компьютером. Также известно, что клавиши и комбинации клавиш делятся на обычные и управляющие. В результате нажатия обычной клавиши в буфер клавиатуры поступает ее код, который может быть от 1 до 255, а при нажатии управляющей клавиши в буфер клавиатуры поступает два кода, первый из которых 0. Функция KeyPressed не имеет параметров и возвращает истинный результат, если буфер не пуст. При этом содержимое буфера не изменяется. Функция ReadKey также не имеет параметров и забирает из буфера клавиатуры очередное число, возвращая в программу символ (тип char), код которого соответствует этому числу. В случае, когда буфер пуст, функция ReadKey ожидает нажатия на клавиатуре.


Управление курсором

В стандартном режиме на экране могут быть отображены до 25 строк текста длиной до 80 символов. Инструкции write и writeln выводят информацию, начиная с той точки экрана, где находится курсор. Положение курсора на экране определяется номером строки и номером позиции в строке, которые можно рассматривать как координаты курсора. Горизонтальная ко­ордината, определяющая номер позиции в строке, может меняться от 1 до 80 и обозначается X. Вертикальная координата, определяющая номер стро­ки, может меняться от 1 до 25 и обозначается Y, За начало координат при­нимают левый верхний угол экрана Левая верхняя точка экрана имеет координаты (1,1), правая нижняя - (80,25).

Если нужно вывести текст, начиная с определенной позиции экрана, то пе­ред выполнением инструкции вывода, надо установить курсор в эту пози­цию. Это можно сделать вызовом процедуры GoToXY, описание которой выглядит так:

GoToXY (координата X, Координата Y) ;

где координата х, координата y - выражения целого типа, значения которых задают новое положение курсора.

Например, инструкции

GoToXY(34,13);

Write('Turbo Pascal');

выводят сообщение примерно в середине экрана.

Можно вводить относительные координаты, объявляя окно с помощью процедуры Window(x1,y1,x2,y2), где x1,y1 - абсолютные координаты левого верхнего, а x2,y2 - правого нижнего угла окна. После этого все процедуры и функции кроме Window используют относительные координаты. Вернуться к работе со всем экраном можно, написав Window(1,1,80,25).

Управление цветом

Используя процедуры TextCoIor и TextBackGround библиотеки Crt можно задать цвет символов и цвет фона для текста, выводимого при помощи WRITE и WRITELN. В таблице перечислены возможные цвет - фона, названия и числа, используемые для их обозначения.

Процедура TextColor (Цвет Символов) используется для задания цвета симво­лов. Цвет Символов - выражение целого типа, обозначающее устанавливае­мый цвет для вывода символов.

Процедура TextBackGround (ЦветФона) используется для задания цвета фо­на. ЦветФона - выражение целого типа, обозначающее устанавливаемый цвет фона, на котором выводятся символы.

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

После выполнения инструкций TextColor(LightGray); TextBackGround(1); инструкции WRITE и WRITELN будут выводить текст светло-серым цветом на синем фоне.

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

Следующие инструкции:

TextbackGround(Blue);

TextColor(15) ;

write ( '1') ;

TextColor(7);

Writcln('Вывод на экран.');

TextColor(15} ;

write('2');

TextColor(7) ;

Writeln('Вывод на принтер.');

выводят на экран фрагмент меню. Названия выводятся на синем фоне свет­ло-серым цветом, а номера пунктов меню - ярко-белым.

Информация о текущем цвете символов и фона хранится в глобальной пе­ременной TextAttr (атрибуты текста) типа byte. Если процедура устанавлива­ет свои цвета для вывода на экран, то значение переменной можно исполь­зовать для того, чтобы восстановить цвета перед завершением работы процедуры. Например, следующая программа в начале работы текущие цвета, а в конце восстанавливает старые значения.

Uses Crt;

var

oldTextAttr:byte;

begin

{ сохраним цвет символов и фона }

oldTextAttr:=TextAttr;

{установим сввои цвета}

TextBackGround (Red) ;

TextColor (White) ;

{ инструкции программы }

{ восстановим цвет символов и фона)

TextAttr::=oldTextAttr;

end.

Помимо использования процедур TextColor и TextBackGround для установки цвета символов и цвета фона, установить атрибуты текста можно непосредственным присвоением значения переменной TextAttr, определяемого по формуле: НомерЦветаФона х 16 + НомерЦветаСимвола.

Например, чтобы установить белый цвет символов на красном фоне переменной TextAttr надо присвоить значение 79 (79 =4х 16+15). В качестве значения, присваиваемого TextAttr. удобно двузначную шестнадцатеричную константу, старший разряд которой определяет номер цвета фона, младший - номер цвета символов. Например, синий цвет фона обозначается числом 1, желтый цвет обозначается десятичным числом 14, которому соответствует шестнадцатеричное число Е. Таким образом, желтый цвет на синем фоне кодируется шестнадцатеричным числом 1Е. Так как в изображении шестнадцатеричных чисел используются буквы латинского алфавита от А до F, то для того чтобы компилятор различал шестнадцатеричные числа и имена переменных, перед шестнадцатеричным числом ставится символ "$". Так, инструкция:

TextAttr:=$lE;

задает синий фон (номер цвета 1) и желтый цвет символов (номер 14 в десятичной форме, и Е - в шестнадцатеричной).

Если к сообщению надо привлечь особое внимание, то можно установить его атрибуты так, что оно будет мигать. Чтобы это сделать, надо к константе, определяющей атрибуты, прибавить 128. Следующая последовательность инструкций выводит мигающее предупреждающее сообщение:

TextAttr:==$lE+12S;

write('Ошибка ввода данных") ;


Очистка экрана

Процедура ClrScr удаляет все символы с экрана (очищает экран), при этом экран закрашивается текущим цветом фона, заданным процедурой TextBackGround (если цвет фона в программе не задавался, то экран закра­шивается черным цветом). Кроме того, курсор устанавливается в точку эк­рана с координатами (1,1), т. е. в начало первой строки.

Например, в результате выполнения инструкций

TextBackGround(Blue);

ClrScr;

экран очищается и закрашивается синим цветом.


ОПРЕДЕЛЕНИЯ КОНСТАНТ-НАЗВАНИЙ ЦВЕТОВ
ПАЛИТРЫ В ТЕКСТОВЫХ РЕЖИМАХ (МОДУЛЬ CRT)

Цвет

символа

Цвет

фона

Название

Обозна-

чение

Черный

Черный

Black

0

Синий

Синий

Blue

1

Зеленый

Зеленый

Green

2

Бирюзовый

Бирюзовый

Cyan

3

Красный

Красный

Red

4

Сиреневый

Сиреневый

Magenta

5

Коричневый

Коричневый

Brow

6

Белый

Светло-серый

Lighttgray

7

Серый

Gray

8

Голубой

Blue

9

Светло-зеленый

Lightgreen

10

Светло-бирюзовый

Lightcyan

11

Светло-красный(алый)

Lightred

12

Светло-сиреневый

Lightmagente

13

Желтый

Yellow

14

Ярко-белый

White

15


Задания


  1. Напишите размер экрана в каждом из режимов:

    1. BW40

    2. CO40

    3. BW80

    4. CO80

  2. Напишите оператор установки текстового видеорежима.

  3. Чем отличаются друг от друга операторы textattr и textcolor.

  4. Напишите формулу установки атрибутов цвета оператора textattr.

  5. Решить задачи:

    1. Вывести слово по середине экрана разными цветами.

    2. Вывести разноцветное слово по вертикали, по диагонали.

    3. Окрасить экран при помощи окон в цвета нашего флага и вывести по середине слово «РОССИЯ».

    4. Вывести на экран список цветов, при выборе любого из них, экран меняет цвет.

    5. Написать программу-тест, включающую в себя следующие вопросы:
      Раздел описания переменных начинается со слова:
      1. begin
      2. mod
      3. var

      Целый тип это:
      1. real
      2. integer
      3. char

      Операторы расположены в порядке уменьшения приоритетности, выберите правильный ответ:
      1. or-not-and
      2. not-or-and
      3. not-and-or

      Оператор условного выбора это:
      1. if <условие> then <выражение> else <выражение>
      2. case <выражение> of
      3. gotoxy()

      Оператор texcolor необходим для
      1. окраски фона
      2. очистки экрана
      3. окраски символа.

      Оператор безусловного перехода это:
      1. gotoxy
      2. goto

3. begin

    1. Изобразить бегущую строку, используя функцию.

    2. Написать процедуры закраски экрана. По выбору пользователя закраска может быть вертикальная или горизонтальная.

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

    4. ИУчебно-методическое пособие по дисциплине Основы программированиязобразить бегущую букву по «застежке»( )


Пример h:
uses crt;

var

k:char;

i:integer;

begin

readln(k);

textmode(bw40);

while not keypressed do begin

for i:=2 to 30 do

begin

gotoxy(i,10);

write(k);

delay(5000);

gotoxy(i,10);

write(' ');

If keypressed then exit;

end;

for i:=40 downto 2 do

begin

gotoxy(i,10);

write(k);

delay(5000);

gotoxy(i,10);

write(' ');

if keypressed then exit;

end;

end;

end.

Проверочная работа

  1. Перечислите текстовые видеорежимы.

  2. Чем отличаются операторы textattr и textcolor

  3. Вывести в центре экрана окно 10x30 зеленого цвета, в центре которого выведено ваше имя красного цвета.

ГРАФИКА В ПАСКАЛЕ

Для того, чтобы использовать графические функции необходимо подключить библиотеку GRAPH:

Uses graph;


Инициализация графики подразумевает под собой перевод экрана из текстового видеорежима в графический, для этого необходимо загрузить специальные драйвера, указав к ним путь(egavga.bgi):

Var

Gdriver, Gmode: Integer;

begin

Gdriver := Detect;

InitGraph(Gdriver, Gmode, 'c:\pascal\bgi');


ПРОЦЕДУРЫ РИСОВАНИЯ ПРОСТЫХ ФИГУР И ЛИНИЙ

Процедура рисования дуги окружности в центре с координатами x,y и радиусом radius.

procedure Arc (X,Y{-координаты центра}; Integer; StAngle{-начальный угол}, EndAngle{-конечный угол}, Radius; Word);

Пример:

uses Graph;

var

Gd, Gm: Integer;

Radius: Integer;

begin

Gd := Detect;

InitGraph(Gd, Gm, '');

if GraphResult <> grOk then {проверка ошибки инициализации графики}

Halt(1);

for Radius := 1 to 5 do

Arc(100, 100, 0, 90, Radius * 10);

Readln;

CloseGraph; {функция закрытия графического режима}

end.

Процедура рисования окружности в центре с кординатами x,y и радиусом radius

procedure Circle(X,Y: Integer; Radius: Word);

Пример:

uses Graph;

var

Gd, Gm: Integer;

Radius: Integer;

begin

Gd := Detect;

InitGraph(Gd, Gm, '');

if GraphResult <> grOk then

Halt(1);

Circle(100, 100, Radius);

Readln;

CloseGraph;

end.

Процедура рисования сектора круга в центре с координатми x,y и радиусом radius procedure PieSlice(X, Y: Integer; StAngle{-начальный угол сектора}, EndAngle{-конечный угол сектора}, Radius: Word);

Пример:

uses Graph;

const Radius = 30;

var Gd, Gm: Integer;

begin

Gd := Detect;

InitGraph(Gd, Gm, '');

if GraphResult <> grOk then

Halt(1);

PieSlice(100, 100, 0, 270, Radius);

Readln;

CloseGraph;

end.

Процедура рисования дуги эллипса в центре с координатами x,y и радиусами XRadius, YRadius.

procedure Ellipse(X, Y: Integer; StAngle, EndAngle: Word; XRadius, YRadius: Word);

Пример:

uses Graph;

var Gd, Gm: Integer;

begin

Gd := Detect;

InitGraph(Gd, Gm, '');

if GraphResult <> grOk then

Halt(1);

Ellipse(100, 100, 0, 360, 30, 50);

Ellipse(100, 100, 0, 180, 50, 30);

Readln;

CloseGraph;

end.

Функции getmaxx() и getmaxy() возвращают максимальное значение координаты по x и y.

Процедура рисования фигуры эллипс в центре с координатами x,y и радиусами XRadius, YRadius.

procedure FillEllipse(X, Y: Integer; XRadius, YRadius: Word)

Пример:

uses Graph;

const R = 30;

var

Driver, Mode: Integer;

Xasp, Yasp: Word;

begin

Driver := Detect; { Put in graphics mode }

InitGraph(Driver, Mode, '');

if GraphResult < 0 then

Halt(1);

{ Draw ellipse }

FillEllipse(GetMaxX div 2, GetMaxY div 2, 50, 50);

GetAspectRatio(Xasp, Yasp);

{ Circular ellipse }

FillEllipse(R, R, R, R * Longint(Xasp) div Yasp);

Readln;

CloseGraph;

end.

Процедура рисования сектора эллипса.

procedure Sector(x, y: Integer; StAngle,EndAngle, XRadius, YRadius: Word);

Пример:

uses Graph;

const R = 50;

var

Driver, Mode: Integer;

Xasp, Yasp: Word;

begin

Driver := Detect;{ Put in graphics mode }

InitGraph(Driver, Mode, '');

if GraphResult < 0 then

Halt(1);

Sector(GetMaxX div 2, GetMaxY div 2, 0, 45, R, R);

Readln;

CloseGraph;

end.

Процедура рисования четырехугольника по верхней левой вершине (координаты x1,y1) и правой нижней вершине (координаты x2,y2)

procedure Bar(x1, y1, x2, y2: Integer);

Пример:

uses Graph;

var

Gd, Gm: Integer;

begin

Gd := Detect; InitGraph(Gd, Gm, '');

if GraphResult <> grOk then Halt(1);

Bar(10, 10, 200,200);

ReadLn;

CloseGraph;

end.

Процедура рисования параллелипипеда .

procedure Bar3D(x1, y1, x2, y2: Integer; Depth: Word;

Пример:

uses Graph;

var

Gd, Gm: Integer;

Y0, Y1, Y2, X1, X2: Integer;

begin

Gd := Detect;

InitGraph(Gd, Gm, '');

if GraphResult <> grOk then

Halt(1);

Y0 := 10;

Y1 := 60;

Y2 := 110;

X1 := 10;

X2 := 50;

Bar3D(X1, Y0, X2, Y1, 10, TopOn);

Bar3D(X1, Y1, X2, Y2, 10, TopOff);

Readln;

CloseGraph;

end.

Процедура рисования прямоугольника по двум вершинам.

procedure Rectangle(x1, y1, x2, y2: Integer);

Пример:

uses Crt, Graph;

var

GraphDriver, GraphMode: Integer;

begin

GraphDriver := Detect;

InitGraph(GraphDriver, GraphMode, '');

if GraphResult<> grOk then

Halt(1);

Rectangle(100, 50, 200, 100);

CloseGraph;

end.

Процедура рисования прямой, x1,y1-начало прямой, x2,y2- конец прямой

procedure Line(x1, y1, x2, y2: Integer);

Пример:

uses Crt, Graph;

var Gd, Gm: Integer;

begin

Gd := Detect;

InitGraph(Gd, Gm, '');

if GraphResult <> grOk then

Halt(1);

Line(200,200, 300, 300);

Readln;

CloseGraph;

end.

Процедура рисования прямой от текущей точки, x,y-конец прямой.

procedure LineTo(X, Y: Integer);

Пример:

uses Crt, Graph;

var Gd, Gm: Integer;

begin

Gd := Detect;

InitGraph(Gd, Gm, '');

if GraphResult <> grOk then

Halt(1);

LineTo(200, 200);

Readln;

CloseGraph;

end.

Процедура выбора текущей точки.

procedure MoveTo(X, Y: Integer);

Пример:

uses Graph;

var Gd, Gm: Integer;

begin

Gd := Detect;

InitGraph(Gd, Gm, '');

if GraphResult <> grOk then

Halt(1);

MoveTo(0, 0); { Upper left corner of viewport }

LineTo(GetMaxX, GetMaxY);

Readln;

CloseGraph;

end.


Работа с цветом

Процедура закраски фона.

procedure SetBkColor(ColorNum: Word)

Процедура закраски линий.

procedure SetColor(Color: Word)

Пример:

uses Crt, Graph;

var

GraphDriver, GraphMode: Integer;

begin

GraphDriver := Detect;

InitGraph(GraphDriver, GraphMode, '');

if GraphResult<> grOk then

Halt(1);

Setbkcolor(4); {красный фон}

Setcolor(2); {зеленый контур прямоугольника}

Rectangle(100, 50, 200, 100);

CloseGraph;

end.

Процедура закраски простых замкнутых фигур (pieslice, sector, fillellipse, bar, bar3d)

procedure SetFillStyle(Pattern: Word; Color: Word) -

первая цифра означает тип закраски, вторая номер цвета.

Пример:

uses Graph;

var

Gd, Gm: Integer;

begin

Gd := Detect; InitGraph(Gd, Gm, '');

if GraphResult <> grOk then Halt(1);

Setbkcolor(3); {красный фон}

Setcolor(2); {зеленый контур прямоугольника}

SetFillStyle(1,4); {сплошная закраска красным цветом}

Bar(10, 10, 200,200);

ReadLn;

CloseGraph;

end.

Процедура изменения цета внутри любой замкнутой области

procedure FloodFill(X, Y: Integer; Border: Word)


(x,y- координаты внутренней точки этой области, border-цвет), используется только вместе с setcolor, setfillstyle, необходимо соблюдать совпадение цветов в процедурах setfillstyle и floodFill.

Пример:

uses Graph;

var Gd, Gm: Integer;

begin

Gd := Detect;

InitGraph(Gd, Gm, '');

if GraphResult <> grOk then

Halt(1);

SetColor(GetMaxColor);

Setfillstyle(1, GetMaxColor);

Circle(50, 50, 20);

FloodFill(50, 50, GetMaxColor);

Readln;

CloseGraph;

end.

Процедура очистки графического экрана

Cleardevice()

Пример:

uses Crt, Graph;

var Gd, Gm: Integer;

begin

Gd := Detect;

InitGraph(Gd, Gm, '');

if GraphResult <> grOk then

Halt(1);

Moveto (100,100);

LineTo(200, 200);

Delay(30000);

ClearDevice;

Moveto (200,200);

LineTo(300, 300);

Readln;

CloseGraph;

end.

Процедура рисования точки с координатами x,y цветом - pixel.

procedure PutPixel(X, Y: Integer; Pixel: Word)

Пример:

uses Crt, Graph;

var

Gd, Gm: Integer;

Color: Word;

begin

Gd := Detect;

InitGraph(Gd, Gm, '');

if GraphResult <> grOk then

Halt(1);

Color := GetMaxColor;

PutPixel(100, 100, Color); { Plot "stars" }

Delay(10);

PutPixel(100, 100, Color);

Delay(10);

PutPixel(100, 100, Color);

Readln;

CloseGraph;

end.

Процедура вывода текста на экран

procedure OutText(TextString: string)

Пример:

uses Graph;

var Gd, Gm: Integer;

begin

Gd := Detect;

InitGraph(Gd, Gm, '');

if GraphResult <> grOk then

Halt(1);

OutText('Easy to use');

Readln;

CloseGraph;

end.

Процедура вывода текста в точке с указанными координатами.

procedure OutTextXY(X,Y: Integer; TextString: string)

Функции, возвращающие текущее значение по х и по y.

Getx(), Gety()

Пример:

uses Graph;

var

Gd, Gm: Integer;

begin

Gd := Detect;

InitGraph(Gd, Gm, '');

if GraphResult <> grOk then

Halt(1);

MoveTo(0, 0);

OutText('Inefficient');

Readln;

OutTextXY(GetX, GetY, 'Also inefficient');

Readln;

ClearDevice;

OutTextXY(0, 0, 'Perfect!'); { Replaces above }

Readln;

CloseGraph;

end.

Процедура устанавливает атрибуты шрифта (тип шрифта, положение и размер), можно указывать либо тип, либо номер.

procedure SetTextStyle(Font, Direction: Word; CharSize: Word)


Font

Тип

Номер типа

DefaultFont

0

TriplexFont

1

SmallFont

2

SansSerifFont

3

GothicFont

4


Direction (расположение):

HorizDir

0

VertDir

1

CharSize - размер.

Пример:

uses Graph;

var

Gd, Gm: Integer;

Y, Size: Integer;

begin

Gd := Detect;

InitGraph(Gd, Gm, '');

if GraphResult <> grOk then

Halt(1);

Y := 0;

begin

SetTextStyle(DefaultFont, HorizDir, 6);

OutTextXY(0, Y, 'Size = ' + Chr(Size + 48));

Readln;

CloseGraph;

end.

Функция, возвращающая высоту текста

function TextHeight(TextString: string): Word

Пример:

uses Graph;

var

Gd, Gm: Integer;

Y, Size: Integer;

begin

Gd := Detect;

InitGraph(Gd, Gm, '');

if GraphResult <> grOk then

Halt(1);

Y := 0;

SetTextStyle(DefaultFont, HorizDir, 20);

OutTextXY(0, Y, 'Turbo Graphics');

Inc(Y, TextHeight('Turbo Graphics'));

OutTextXY(0, Y, 'Turbo Graphics');

end;

Readln;

CloseGraph;

end.

Функция, возвращающая ширину текста.

function TextWidth(TextString: string): Word

Пример:

uses Graph;

label metka;

var

Gd, Gm: Integer;

Row: Integer;

Title: String;

Size: Integer;

begin

Gd := Detect;

InitGraph(Gd, Gm, '');

if GraphResult <> grOk then

Halt(1);

Row := 0;

Title := 'Turbo Graphics';

Size := 1;

Metka:

If TextWidth(Title) < GetMaxX then

begin

OutTextXY(0, Row, Title);

Inc(Row, TextHeight('M'));

Inc(Size);

SetTextStyle(DefaultFont, HorizDir, Size);

Goto metka;

end;

Readln;

CloseGraph;

end.

Процедура, выравнивающая текст по горизонтали и вертикали

procedure SetTextJustify(Horiz, Vert: Word)


Horizontal

Константа

Значение

LeftText

0

CenterText

1

RightText

2


Vertical

Константа

Значение

BottomText

0

CenterText

1

TopText

2

Пример:

uses Graph;

var Gd, Gm: Integer;

begin

Gd := Detect;

InitGraph(Gd, Gm, '');

if GraphResult <> grOk then

Halt(1);

{ Center text onscreen }

SetTextJustify(CenterText, CenterText);

OutTextXY( Succ(GetMaxX) div 2, Succ(GetMaxY) div 2, 'Easily Centered');

Readln;

CloseGraph;

end.


Задачи на графику


  1. Укажите, для чего используется каждая из данных функций:

    1. setfilstyle (тип, № цвета)

    2. setbkcolor (№ цвета )

    3. setcolor (№ цвета)

    4. setpalette (№, № цвета)

    5. floodfil(x,y, №цвета)

  2. Напишите функции, необходимые для отображения основных фигур (окружность, дуга окружности, сектор круга, эллипс, дуга эллипса, сектор эллипса, линия, прямоугольник ).

  3. Как при помощи функции pieslice (x,y, startangle, endangle, radius) нарисовать круг.

  4. Нарисовать разноцветный домик.

  5. Укажите, для чего используются данные функции:

    1. outtext ('текст')

    2. outtextxy (x,y, 'текст')

    3. settextstyle (шрифт, направление, размер)

    4. textheight ('текст')

    5. settextyustify (гориз. выравнивание, верт. выравнивание)

  6. Нарисовать человечка и сделать к нему надпись.

  7. Укажите функцию очистки экрана в графическом режиме, а также функцию задержки выполнения программы.

  8. Нарисовать мордочку, которая подмигнет 1 раз, 2 раза, 3 раза.

  9. Нарисовать мяч, который подпрыгивает 3 раза.

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

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

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

Пример 8

uses Graph,crt;

const Radius = 100;

var Gd, Gm: Integer;

begin

Gd := Detect;

InitGraph(Gd, Gm, '');

if GraphResult <> grOk then

Halt(1);

circle(300, 100, Radius);

arc(300, 130, 190,0,50);

setcolor(3);

setfillstyle(1,3);

pieslice(350, 100,0,360, 20);

pieslice(250, 100,0,360, 20);

delay (15000);

setcolor(0);

setfillstyle(1,0);

pieslice(250, 100,0,360, 20);

delay (15000);

setcolor(3);

setfillstyle(1,3);

pieslice(250, 100,0,360, 20);

delay (15000);

setcolor(0);

setfillstyle(1,0);

pieslice(250, 100,0,360, 20);

delay (15000);

setcolor(3);

setfillstyle(1,3);

pieslice(250, 100,0,360, 20);

delay (15000);

setcolor(0);

setfillstyle(1,0);

pieslice(250, 100,0,360, 20);

delay (15000);

setcolor(3);

setfillstyle(1,3);

pieslice(250, 100,0,360, 20);

delay (15000);

Readln;

CloseGraph; еnd.


© 2010-2022