Автор работы: Пользователь скрыл имя, 26 Апреля 2012 в 21:22, курсовая работа
За время существования профессии программиста сущность его труда изменилась коренным образом. В 50-х годах программы писали в командах ЭВМ (в “машинных кодах”). При этом вся информация переводилась в двоичную систему счисления. Это очень тяжелый и напряженный труд, требующий от человека особой аккуратности. Облегченно вздохнули программисты при появлении в 1956 г. специального языка для решения вычислительных задач. Это был FORTRAN (Formula Translator). С тех пор были разработаны другие, более совершенные языки, или специализированные применительно к какой-то конкретной области: КОБОЛ, АЛГОЛ, ПЛ/1, ЛИСП, СИМУЛА, ПАСКАЛЬ, СИ, АДА, ПРОЛОГ и др.
FEB < OCT,
APR > JAN, и т.д.
Для данных перечислимого типа (так же, как и для целых) определены стандартные функции
PRED (<аргумент>) – предшествующий элемент (PREDECESSOR – предшественник);
SUCC(<аргумент>) – последующий элемент (SUCCESSOR – преемник). Например,
PRED (JUN) = MAY;
SUCC (FEB) = MAR;
Если к данным перечислимого типа применить функцию ORD, то получим порядковый номер этого значения в списке определения перечислимого типа (номер первого элемента равен 0). Таким образом,
ORD (MAR) = 2.
Данные перечислимого типа нельзя использовать в операторах READ и WRITE (в списке ввода-вывода).
Можно организовать цикл, например,
FOR K:=MAR TO DEC DO <оператор>
2. Интервальный или ограниченный
(отрезочный) тип данных: 1..31. Этот
тип задается двумя
Константы, определяющие верхнюю и нижнюю границы, могут быть целого, символьного или перечисляемого типа. Вещественными они быть не могут.
Этот тип данных мы используем при описании массива: тип индекса – всегда интервальный, с целыми границами.
К переменным интервального типа применимы все действия, которые применимы к константам, ограничивающим интервал.
Возвращаясь к нашему примеру, мы можем ввести в употребление некоторую переменную типа DATE
VAR D: DATE;
Чтобы определить значение этой переменной, нужно присвоить значения всем ее полям (то есть всем частичным переменным), например:
D.DAY:=1;
D.MON:=MAR;
D.YEAR:=1990;
Используя приведенные описания, можно решить, например, следующую задачу. Пусть требуется определить число дней в месяце для любого года. Тогда надо описать еще одну переменную интервального типа:
VAR NDAY: 28 .. 31;
Фрагмент программы, решающей нашу задачу, будет выглядеть так:
IF (D.MON = SEP) OR (D.MON = NOV) OR (D.MON =APR) OR (D.MON =JUN)
THEN NDAY:=30
ELSE IF (D.MON <> FEB)
THEN NDAY:=31
ELSE IF (D.YEAR MOD 4 = 0) AND (D.YEAR MOD 100 <> 0) OR (D.YEAR MOD 400 = 0)
THEN NDAY := 29
ELSE NDAY := 28;
(Високосным считается каждый год, число которого делится на 4, кроме годов, числа которых оканчиваются на два нуля, но не делятся на 4: 1700, 1800 и т.д.)
Кроме массивов и записей в Паскале имеется еще одна фундаментальная структура данных: множество. В математике это одно из основных понятий. Необходимость введения множественного типа возникает при решении ряда задач, в которых упорядоченность элементов массива в соответствии с их местоположением (индексом) является излишне строгим требованием к структуре данного.
Пусть, например, выигрышные номера в игре "3 из 15" – 3, 7, 11. При этом неважно, в каком порядке назовет их игрок: 7, 11, 3 или 11, 3, 7. В любом случае они будут угаданы. Если же рассматривать эти последовательности как массивы, то они будут разными, так как нарушен порядок их взаимного расположения (задачу можно решать и через массивы, но алгоритм будет длиннее). Для определения таких данных удобно использовать множественный тип.
Служебное слово для описания такого типа: SET (множество). Множество – любой неупорядоченный набор объектов одного типа. Объекты называют элементами множества. Тип объектов, из которых состоит множество, называют базовым типом. На базовый тип в Паскале накладывается ограничение: это может быть любой простой (скалярный) тип, кроме REAL, то есть INTEGER, CHAR, BOOLEAN, интервальный и перечислимый. В практических реализациях языка возможны и другие ограничения, например, на число элементов множества.
Определение типа выглядит так:
TYPE <имя> = SET OF <базовый тип>;
Пример.
CONST OGR = 15;
TYPE VID = 1 .. OGR;
LOTOCART = SET OF VID;
VAR POSL1, POSL2 : LOTOCART;
Здесь базовый тип задается как интервальный. Переменные POSL1 и POSL2 – два множества, элементами которых могут быть целые числа из ограниченного диапазона от 1 до 15.
Значения переменных множественного типа задаются как заключенные в квадратные скобки последовательности выражений базового типа, отделяемые друг от друга запятыми. Так, для нашего примера значениями переменных POSL1 и POSL2 могут быть такие конкретные множества:
[1, 7, 11, 5] - множество из четырех элементов,
[13, 15] - множество из двух элементов,
[9] - множество из одного элемента,
[] - пустое множество.
Имена переменных и значения множественного типа могут использоваться в операторах присваивания.
Над переменными множественного типа могут выполняться те же операции, что и над множествами. При этом знаки операций:
+ - объединение множеств,
* - пересечение множеств,
- - разность множеств.
Операции отношения:
= - равенство множеств (совпадение их элементов);
<> - неравенство множеств;
>= - множество содержит операции
<= - множество содержится включения
Удобной операцией для данных множественного типа является операция IN – проверка на принадлежность элемента множеству. Это двуместная операция. В ней первый операнд – базового типа, а второй – множественного. Результат операции равен TRUE, если первый операнд является элементом второго и FALSE – в противном случае. Эта операция помогает в программе обходиться без проверки длинных и сложных условий. В отличие от множества, для проверки вхождения какого-либо элемента в массив нужно сравнивать его со всеми элементами массива.
Ранги операций над множествами:
+, - - тот же, что и для операции сложения,
* - тот же, что и для операции умножения.
Достоинством данных множественного типа является компактность записи программных преобразований и быстрота их выполнения.
Отметим, что сам по себе язык Паскаль не налагает никаких ограничений на количество элементов множества. Размер множества ограничивается памятью ЭВМ.
Рассмотрим несколько примеров выражений с данными множественного типа (множественных выражений):
[1, 2, 5, 6, 7]*[2 .. 6] + [3, 9] равно [2, 3, 5, 6, 9],
( [3, 4, 5] + [1, 3, 6, 7] ) * [5 .. 7] – [6] равно [5, 7].
Пусть множественный тип задан как SET OF 1 .. 3. Тогда значениями переменной этого типа являются
[ ], [1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3].
Если множество задано как SET OF BOOLEAN, то этот тип определяет совокупность значений:
[ ], [TRUE], [FALSE], [TRUE, FALSE].
Пусть переменная М описана как SET OF 1 ..10 и выполнен оператор
M := [2, 3, 5, 7];
Тогда возможны выражения
6 in M - равно FALSE
[3, 5, 7] <= M - равно TRUE
M = [1, 2, 3, 7] - равно FALSE
[ ] <= M - равно TRUE
(7 in M) and ([7] <= M) - равно TRUE
В большинстве версий языка Паскаль в процедуре WRITE нельзя называть переменные множественного типа.
Примеры использования множеств
Пример 1. В заданной последовательности символов (литер), состоящей из букв латинского алфавита и оканчивающейся точкой, определить общее число вхождений в нее букв A, E, C, H.
Идея решения состоит в следующем: будем по очереди вводить символы исходной последовательности и для каждой очередной литеры проверять, является ли она одной из интересующих нас букв. Сравнивать ее с каждой из букв слишком громоздко. Проще работать с множеством и операцией IN.
PROGRAM COUNT (INPUT, OUTPUT);
VAR
CHISBK: INTEGER;
LITERA: CHAR;
BEGIN
CHISBK := 0;
READ (LITERA);
WHILE LITERA <> ‘.’ DO
BEGIN
IF LITERA IN [‘A’, ’E’, ‘C’, ‘H’]
THEN CHISBK:=CHISBK+1;
READ (LITERA);
END;
WRITELN (‘Общее число вхождений равно : ’CHISBK’)
END.
Пример 2. Найти и напечатать в убывающем порядке все простые числа из диапазона 2 .. 201.
Существует метод, называемый "решето Эратосфена" и заключающийся в следующем. Из последовательности чисел вычеркивают числа, делящиеся на 2, затем на 3, на 5 и т.д., пока не кончится последовательность. Мы используем его в следующем варианте. Пусть No – множество анализируемых чисел, Pr – множество простых чисел. Начальные значения множеств:
No = [2, 3, 4, 5, 6, 7, 8, 9, 10, …, 201],
Pr = [].
Рассмотрим первое число из No. Это 2 – простое число. Заносим его в Pr, а из No удаляем 2 и все числа, делящиеся на 2. Тогда получим
No = [3, 5, 7, 9, 11, … , 201],
Pr = [2].
Теперь из No берем наименьшее число 3 – оно простое – и добавляем его в Pr, а из No удаляем 3 и все числа, кратные трем. Получим
No = [5, 7, 11, … , 199]
Pr = [2, 3]
В конце концов, множество No станет пустым, а в Pr перейдут все простые числа. Остается их просмотреть и напечатать в порядке убывания.
Удаление и добавление чисел запишется с помощью операторов
No :=No – [K];
Pr := Pr + [K];
а вся программа:
PROGRAM PROSTCHIS (OUTPUT);
CONST
N = 201;
TYPE
MNOCHIS = SET OF 2 .. N;
VAR
Pr, No : MNOCHIS
P,K: 2 .. N;
BEGIN
No:= [2 .. N]; - присвоение начальных значений;
Pr := [ ];
P:=2; - первое простое число; REPEAT
WHILE NOT (P IN No) DO P:= P+1; - выбор в No наименьшего числа;
Pr:=Pr+[P]; - занесение найденного числа в Pr;
K:=P;
REPEAT
No:=N-[K]; - удаление из No числа Р и всех кратных ему,
K:=K+P;
UNTIL K>N;
UNTIL No = [ ];
FOR K:=N DOWNTO 2 DO - печать простых чисел в
IF K IN Pr THEN WRITE (K); обратном порядке
WRITELN;
END.
Мы знаем, что в ЭВМ происходит постоянный обмен информацией между внутренней памятью ЭВМ и внешними устройствами (терминалами). Свойства этих устройств различны. Различен и характер информации, которая поступает в ЭВМ. Одни наборы данных настолько велики, что поместить их целиком в оперативной памяти ЭВМ невозможно. Другие данные не могут быть полностью помещены в память компьютера, так как они порождаются в процессе работы программы. Запись информации на внешний носитель особенно желательна, если объем информации велик и если в дальнейшем предполагается использовать эту информацию в других программах. Поэтому, естественно, нужны языковые средства, позволяющие одинаковым образом работать с разными наборами данных. Таким средством в Паскале является файловая структура данных.