- •ПРЕДИСЛОВИЕ
- •1.1. История и классификация языков программирования высокого уровня
- •1.2. Первое (знакомство с Паскалем
- •Задания
- •Лекция 2
- •2.1. Некоторые сведения о системе ТУрбо-Паскаль
- •2.2. Способы описания языка программирования
- •Лекция 3
- •3.2. Типы данных
- •4.1. Структура Паскаль-программы
- •4.2. Арифметические операции, функции, выражения Арифметический оператор присваивания
- •Форматы процедуры write
- •Задания
- •1. Что будет напечатано программой
- •если последовательно вводятся три числа: 36, -6, 2345?
- •5.2. Функции, связывающие различные типы данных
- •Задания
- •Теперь посмотрим, как это программируется наТЛаскале.
- •Здесь
- •<параметр цикла>::= <имя простой переменной порядкового типа>
- •Задания
- •7.1. Подпрограммы-процедуры
- •7.2. Подпрограммы-функции
- •7.4. Рекурсивные подпрограммы
- •8.1. Что такое рекуррентная последовательность
- •8.2. Программирование вычислений рекуррентных последовательностей
- •Задания
- •Задания
- •6. Вывод результата.
- •Теперь будем составлять подпрограммы.
- •Задания
- •12.2. Операции над множествами
- •12.3. Примеры использования множеств
- •Красивая программа! К сожалению, ею нельзя воспользоваться для
- •В этой программе использована функция определений размера файла:
- •.Fiiesize(<HMH файловой переменной>);
- •Задания
- •14.2. Работа с файлами записей
- •Задания
- •15.2. Связанные списки
- •Лекция 16
- •16.1. Организация внешних подпрограмм
- •16,2. Создание и использование модулей
- •распечаткой текста программы с подробными комментариями.
- •выполнения следующих операции над обыкновенными дробями вида -q
- •(Р — целое, Q — натуральное):
- •1) сложение;
- •2) вычитание;
- •3) умножение;
- •4) деление;
- •5) сокращение дроби;
- •7) функции, реализующие операции отношения (равно, не равно,
- •Используя этот модуль, решить задачи:
- •При разработке модуля рекомендуется такая последовательность
- •Задания
- •Приведем текст программы целиком.
- •ЗАДАНИЯ ПО ТЕМЕ “ЛИНЕЙНЫЕ АЛГОРИТМЫ”
- •ЦЕЛОЧИСЛЕННАЯ АРИФМЕТИКА
- •Сортировка массивов
- •ЗАДАЧИ ПО ТЕМЕ “ОБРАБОТКА СТРОК”
- •ЗАДАНИЯ ПО ТЕМЕ “МОДУЛИ”
- •ЗАДАНИЯ ПО ТЕМЕ “ДИНАМИЧЕСКИЕ ПЕРЕМЕННЫЕ”
- •Задачи, предлагавшиеся на школьных олимпиадах по программированию (Пермская область)
- •Учебное издание
Задания
1. Даны декартовы координаты N точек на плоскости. Составить программы решения следующих задач:
а) найти две самые близкие друг к другу точки; б) найти две самые удаленные друг от друга точки;
в) найти три точки, лежащие в вершинах треугольника с наибольшим периметром; г) найти две ближайшие точки, отрезок между которыми может слу
жить радиусом окружности, заключающей внутри себя все остальные точки; указать, какая из них является центральной.
2.Изменить программу Labirint таким образом, чтобы на печать выводился лишь кратчайший путь из центра лабиринта до края.
3.Составить программу, в соответствии с которой шахматный конь обойдет всю доску, побывав на каждом поле всего один раз.
4.Составить программу расстановки на шахматной доске восьми ферзей так, чтобы они не угрожали друг другу.
Для решения поставленной задачи потребуется выполнение следую щих действий:
1)ввод длинного числа;
2)собственно умножение двух “длинных” чисел;
3)вывод длинного числа;
4)определение количества цифр в записи числа.
Каждую из подзадач реализуем в виде отдельной подпрограммы. Начнем с ввода. Ввести большое число целесообразно в виде строки, после чего эта строка преобразуется в массив цифр.
{Процедура преобразования длинного числа., записанного в виде строки, в массив цифр} Procedure Translate(S Stroka; Var A DIChislo);
Var I, Code |
Integer; |
Begin |
|
Zero(A);
For I :» StrLen(S) - 1 DownTo 0 Do
Val(S[I], A[StrLen(S) - I], Code);
End;
В процедуре используется подпрограмма Zero (А), которая предна значена для записи нуля в каждый разряд длинного числа. Вот текст этой процедуры:
{Процедура обнуления длинного числа}
Procedure Zero(Var A DIChislo);
Var I Integer;
Begin
For I := 1 To NMax Do
A[I] :* 0;
End;
Таким образом, длинное число записано в массив, в котором пер выми элементами могут оказаться незначащие нули. При выполнении вычислений и выводе результата они не будут учитываться. В проце дуре Translate использована функция StrLen(S) из модуля Strings, которая позволяет определить длину строки S.
Разработаем функцию определения количества значащих цифр в за писи числа, поскольку она потребуется при реализации подпрограммы умножения.
{Функция определения количества цифр в записи длинного числа}
Function Dlina(C DIChislo) Integer;
Var I Integer;
Begin
I := NMax;
While (I > 1) And (С[I] = 0) Do
I := I - 1;
Dlina := I
End;
При разработке функции исходим из следующего соображения: если число не равно нулю, то количество цифр в его записи равно номеру первой цифры, отличной от нуля при просмотре числа слева направо. Если же длинное число равно нулю, то количество цифр в его записи окажется равным единице.
Ну и, наконец, главная процедура, ради которой и была проделана вся предшествующая работа. При составлении алгоритма использу ется идея умножения “столбиком” В отличие от “ручного” умноже ния, в процедуре сложение выполняется не после окончания умножения, а по ходу его. После перемножения очередных цифр результирующая цифра добавляется в нужный разряд и формируется перенос в следу ющий разряд.
PROCEDURE |
Multiplication^, В DIChislo; Var С DIChislo); |
||
Var I, |
J, |
VspRez |
Integer; |
P |
Digit; |
|
|
Begin |
|
|
|
Zero(C);
For I := 1 To Dlina(A) Do {Цикл по количеству цифр в первом чи
сле} Begin
Р := 0; {Первоначально перенос равен нулю}
For J := 1 То Dlina(B) Do {Цикл по количеству цифр во втором числе}
Begin
VspRez := А [I] * B[J] + Р + С [I + J - 1] ;
С [I + J - 1] := VspRez Mod 10; {Очередное значение цифры
вразряде I + J - 1}
Р:= VspRez Div 10 {Перенос в следующий разряд}
End;
C[I + J] :» Р
End
End;