- •ПРЕДИСЛОВИЕ
- •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) функции, реализующие операции отношения (равно, не равно,
- •Используя этот модуль, решить задачи:
- •При разработке модуля рекомендуется такая последовательность
- •Задания
- •Приведем текст программы целиком.
- •ЗАДАНИЯ ПО ТЕМЕ “ЛИНЕЙНЫЕ АЛГОРИТМЫ”
- •ЦЕЛОЧИСЛЕННАЯ АРИФМЕТИКА
- •Сортировка массивов
- •ЗАДАЧИ ПО ТЕМЕ “ОБРАБОТКА СТРОК”
- •ЗАДАНИЯ ПО ТЕМЕ “МОДУЛИ”
- •ЗАДАНИЯ ПО ТЕМЕ “ДИНАМИЧЕСКИЕ ПЕРЕМЕННЫЕ”
- •Задачи, предлагавшиеся на школьных олимпиадах по программированию (Пермская область)
- •Учебное издание
Тогда следующие операции отношения дадут следующие результаты:
М |
= |
[ 4 , |
7 , |
|
3 , |
9 ] |
— |
true, |
|
М |
<> |
[ 7 , |
4 , |
3 , |
9 ] |
— |
false, |
||
[ 3 , |
4 ] |
<= |
М |
|
— |
true, |
|||
[] |
< = |
М |
|
|
|
|
— |
true, |
|
М |
> = |
[ 1 . . 1 0 |
] |
|
— |
false, |
|||
М |
<= |
[ 3 . . 9 |
] |
|
|
— |
true. |
Операция вхождения. Это операция, устанавливающая связь между множеством и скалярной величиной, тип которой совпадает с базовым типом множества. Если х — такая скалярная величина, а М — мно жество, то операция вхождения записывается так:
хin М.
Результат — логическая величина true, если значение х входит в мно жество М , и false — в противном случае. Для описанного выше мно жества
4 |
in |
М |
- |
true, |
5 |
in |
М |
- |
false. |
12.3.Примеры использования множеств
Пример 1. Дана символьная строка. Под^штать в ней количество знаков препинания (. - , * ! ?).
Program Р1; |
|
|
|
|
Var S |
String; |
|
|
|
I, К |
Byte; |
|
|
|
Begin |
|
|
|
|
ReadLn(S); |
|
|
|
|
К := 0; |
|
|
|
|
For I :* 1 To Length(S) Do |
’I'l |
|||
If SCI] In |
l>.> •->, V , |
|||
Then К |
:= К |
+ |
1; |
К) |
WriteLn('Число |
знаков препинания равно |
End.
В этом примере использована множественная константа с сим вольным типом элементов. Эту задачу можно решить и без мно жества, записав в операторе if длинное логическое выражение.
(S[I] = ’ ) Or (SCI] = ' - О и т.д. Использование множества со кращает запись.
П ример 2. Даны две символьные строки, содержащие только строчные латинские буквы. Построить строку 53, в которую войдут только общие символы 51 и 52 в алфавитном порядке и без повторе ний.
Program |
Р2; |
|
|
|
|
|
Type Meet = Set Of >a*..'z*; |
|
|
||||
Var SI, |
S2, |
S3 |
String; |
|
|
|
MSI, |
MS2, MS3 |
Mset; |
|
|
||
C |
Char; |
String; Var MS |
Mset); |
|
||
Procedure SM(S |
содержащее_______ |
|||||
{__________ Процедура |
формирует множество MS, |
|||||
__________ все символы |
строки |
S________________________________ } |
||||
Var I |
Byte; |
|
|
|
|
|
Begin MS := [] ; |
|
|
|
|
||
For I |
:= 1 to Length(S) Do |
|
||||
End; |
MS |
:= MS |
+ [S[I]] |
|
|
|
|
|
|
|
|
|
|
Begin {____ Ввод исходных строк____ } |
|
|||||
ReadLn(Sl); |
|
|
|
|||
ReadLn(S2); |
|
|
|
символов____ |
||
{____ Формирование множеств MSI и MS2 из |
____ строк S1 и S2__________________________________ }
SM(S1, MSI);
SM(S2, MS2);
{__ Пересечение множеств - выделение общих элементов___
__ в множество MS3___________________________________ }
MS3 := MSI * MS2;
{____ Формирование результирующей строки S3___________ }
S3 := |
|
|
For С := >а> То >z> Do |
|
|
If С |
In MS3 |
|
Then |
S3 := S3 + С; |
S3) |
WriteLn( Результат |
End.
П ример 3. Составить программу, по которой из последовательно сти натуральных чисел от 2 до N будут выбраны все простые числа.
Существует алгоритм, известный под названием ’’ Решето Эра тосфена” Суть его в следующем:
а) из числовой последовательности выбираем минимальное значе ние, это будет простое число;
б) удаляем из последовательности все числа, кратные выбранному;
в) |
веди после удаления послецова/гельность не стала пустой, то воз |
|||||||||||
вращаемся к выполнению пункта а. |
|
|
|
|
||||||||
Вот пример работы такого алгоритма для N = 15 (подчеркнуты |
||||||||||||
выбранные простые числа): |
|
|
|
|
|
|
|
|||||
1 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
3 |
5 |
7 |
9 |
11 |
13 |
15 |
|
|
|
|
|
|
5 |
7 |
11 |
13 |
|
|
|
|
|
|
|
|
|
1 |
11 |
13 |
|
|
|
|
|
|
|
|
|
|
И |
13 |
|
|
|
|
|
|
|
|
|
|
|
13 Решение этой задачи удобно программировать, используя множе
ственный тип.
Program Eratosfen;
Const N = 201;
{___ Возможно любое значение 1 < N < 256___ } Var А, В Set Of 2..N;
К, Р Integer;
Begin {Формирование исходного множества А;
В- искомое множество простых чисел, сначала - пустое}
А[2..N];
В
Р := 2; Repeat
{____ Поисх минимального числа в рожестве А____ } While Not(P In A) Do
|
Р |
Р + 1; |
В |
{____ Включение найденного числа в множество В___ } |
|
:* В + [Р] ; |
||
К |
:= Р; |
|
|
{_______ Исключение из А чисел, кратных р________ } |
While К <= N Do
Begin
А := А - [К] ; К := К + Р; End
Until А = [] ;
{___ Вывод результата, т.е. всех чисел из множества В в порядке возрастания________________________ 1
For Р :■ 2 То Н Do
If Р In В Then WriteLn(P)
End.
Красивая программа! К сожалению, ею нельзя воспользоваться для
а) |
[2] |
<> [2, |
2, |
2] |
|
|
б) |
[ ’ а\ |
’ Ь’ ] = |
[ ’ Ь’ , |
’ а ’ ] |
|
|
||||
в) |
[4, |
5,6] |
= |
[4, 5, |
6] |
|
г) |
[ 'с ’ , |
’ Ъ’ ] = |
[ ’ с ’ . . ’ Ь’ ] |
|
|
|||||
д) |
[2, |
3,5, |
7] |
<= [1. .9] |
|
е) [3, |
6 ..8 ] |
<= |
[2 ..7 , |
9] |
|
|
|
||||
ж) |
Trunc(3.9) |
In [1, |
3, |
5] |
о) Odd(4) In [] |
|
|
|
|
|
|
||||||
3. Вычислить значения выражений: |
|
|
|
|
|
|
|
|
|
||||||||
а) |
[1, |
3,5] |
+ |
[2, 4] |
б) |
[1, |
3, |
5] |
* |
[2, |
4] |
в) |
[1, |
3, |
5] |
- |
[2, 4] |
г) |
[1 ..6 ]+ [3. .8] |
д) |
[1 ..6] |
* |
[3. .8] |
|
ej |
[1 ..6 ] |
- |
[3. |
.8] |
||||||
ж) |
[] |
+ [4] |
|
|
з) |
[] |
* |
[4] |
|
|
|
и) [] - [4] |
|
|
4.Составить программу подсчета количества различных значащих цифр в десятичной записи натурального числа.
5.Составить программу, печатающую в возрастающем порядке все целые числа из диапазона 1. .255, представимые в виде n2 -Ьга2, где
п, т > 0.
6.Дана строка из строчных русских букв. Между соседними сло вами — запятая, за последним словом — точка. Напечатать в алфа витном порядке:
а) все гласные буквы, которые входят в каждое слово; б) все согласные буквы, которые не входят ни в одно слово;
в) все согласные буквы, которые входят только в одно слово; г) все гласные буквы, которые входят более чем в одно слово.
обработки (записи или чтения). Этот адрес называется указателем или окном файла.
Для того чтобы начать запись в файл, его следует откры ть для записи. Это обеспечивает процедура
Rewrite(FV)\
где FV — имя файловой переменной. При этом указатель устанавли вается на начало файла. Если в файле до этого была информация, то она исчезает. Схематически выполнение процедуры ReWrite можно представить так:
До: |
эл. 0 ЭЛ. 1 |
M . K. |
Rewrite(FV);
После: м. к.
Т
Стрелка внизу отмечает позицию указателя. Запись в файл осуществляется процедурой
Write(FV,V)i
где V — переменная того же типа, что и фалл FV Запись проис ходит в то место, на которое установлено окно (указатель). Сначала записывается значение, затем указатель смещается в следующую по
зицию. |
Если новый элемент вносится в конец файла, то сдвигается |
|||
маркер конца. Схема выполнения оператора: |
|
|||
До: |
эл. 0 |
ЭЛ. 1 |
эл. N |
м. K. |
|
|
|
W rite(FV,V)\ |
|
|
эл. 0 |
ЭЛ. 1 |
эл. N |
< v > M . K . |
|
|
|
|
Т |
П ример. В файловую переменную Fx занести 20 вещественных чисел, последовательно вводимых с клавиатуры.
Var Fx |
File Of Real; |
X |
Real; |
I |
Byte; |
Принцип последовательного доступа: для того чтобы прочитать п-ю запись файла, сначала нужно прочитать все предыдущие записи с 1-й по (п - 1)-ю.
П ример. В переменной х получить 10-й элемент вещественного файла F x.
Program |
А; |
Var Fx |
File Of Real; |
X |
Real; |
Begin |
|
Reset(Fx);
For I :* 1 To 10 Do
Read(Fx, X)
End.
Функция E of(FV ) — проверяет маркер конца файла (end of file). Это логическая функция, которая получает значение true, если указа тель установлен на маркер конца, в противном случае — false.
П ример. Просуммировать все числа из файла F T , описанного в предыдущем примере.
Reset(Fx);
Sx := 0;
While Not Eof(Fx) Do
Begin
Read(Fx, X);
Sx := Sx + X
End;
Или то же самое с помощью цикла Repeat:
Repeat
Read(Fx, X);
Sx := Sx + X
Until Eof(Fx);
Во втором варианте возможна ошибка чтения, если файл Fx — пустой. Первый вариант от такой ошибки застрахован, поэтому он более пред почтителен.
13.2.Внешние файлы
ВТурбо-Паскале все внешние устройства (дисплей, клавиатура, принтер, диски и др.) трактуются как логические устройства с фай ловой структурой организации данных. Все немагнитные внешние ус тройства — однофайловые. Иначе говоря, с каждым из них связан один
файл со стандартным именем, предназначенный для обмена с внутрен ней памятью ЭВМ текстовой (символьной) информацией.
Стандартные имена логических устройств определяются операцион ной системой, в среде которой работает Паскаль. В системе MS DOS определены следующие имена:
CON (консоль) — логическое устройство, связанное при вводе с кла виатурой, при выводе — с экраном;
PRN (принтер) — логическое имя файла, связанного с устройством печати;
AUX — логическое имя коммуникационного канала, который ис пользуется для связи ПК с другими машинами;
INPUT — стандартное устройство ввода, связанное с клавиатурой; при этом вводимые с клавиатуры символы отражаются на экране дис плея;
OUTPUT — стандартное устройство вывода на экран.
Магнитный диск — многофайловое устройство. На нем могут хра ниться как стандартные (системные) файлы, так и файлы, создаваемые пользователем. На магнитном диске могут создаваться файлы любых типов. Файлы на МД могут использоваться как в режиме чтения, так и в режиме записи.
Список файлов на диске хранится в директории (каталоге) диска. Каталог вызывается на экран системной командой DIR. В полной форме каталог содержит идентификаторы файлов, объем занижаемой памяти, дату и время создания файла. Идентификатор файла состоит из имени и типа файла:
< имя файла > < тип файла >
Имя содержит от 1 до 8 латинских букв и (или) цифр; тип — необя зательный элемент (от 0 до 3 символов), указывающий на Характер информации, хранимой в файле.
Например:
PROGRAM.PAS — в файле текст программы на Паскале; NUMBER.DAT — файл числовых данных;
NAMES.TXT — текстовый файл.
Для организации связи между файловой переменной и внеш не фай лом в ТУрбо-Паскалё используется процедура назначения:
ASSIGN(<имя файловой переменной>, «идентификатор внешнего файлам).
Здесь < идентификатор внешнего файла> — строковая величина (кон станта или переменная). Например:
ASSIGN(Fi,1Number.dat');
После выполнения процедур Assign и Rewrite создается новый внешний файл, имя которого заносится в директорий.
Если файл открывается для чтения (Assign и Reset), то в текущем каталоге уже должен содержаться указанный внешний файл. В проти вном случае будет обнаружена ошибка.
Работа с файлом в программе завершается его закрытием с по мощью процедуры
CLOSE{<mAs. файловой переменной>);
Например: CLOSE(Fi).
Подведем итог сказанному. Для создания и заполнения файла тре буется следующая последовательность действий:
— описать файловую переменную;
— описать переменную того же типа, г го и файл;
—произвести назначение (Assign);
—открыть файл для записи (Rewrite);
—записать в файл данные (Write);
—закрыть файл (Close).
П ример 1. Создать файл, содержащий среднесуточно темпера туры за некоторое количество дней. При этом не обязательно пред варительно указывать количество чисел во вводимой информации. Можно договориться о каком-то условном значении, которое будет признаком конца ввода. Пусть, например, признаком конца ввода будет число ” 9999”
Program Taskl;
Var Ft |
File Of Real; |
T Real;
Begin
Assign(Ft, ,Temp.dat,)j
Rewrite(Ft);
WriteLnCВводите данные. Признак конца - 9999’);
ReadLn(T);
While Т <> 9999 Do
Begin
WriteCFt, T);