Программирование на ЭВМ

Автор работы: Пользователь скрыл имя, 26 Апреля 2012 в 21:22, курсовая работа

Описание

За время существования профессии программиста сущность его труда изменилась коренным образом. В 50-х годах программы писали в командах ЭВМ (в “машинных кодах”). При этом вся информация переводилась в двоичную систему счисления. Это очень тяжелый и напряженный труд, требующий от человека особой аккуратности. Облегченно вздохнули программисты при появлении в 1956 г. специального языка для решения вычислительных задач. Это был FORTRAN (Formula Translator). С тех пор были разработаны другие, более совершенные языки, или специализированные применительно к какой-то конкретной области: КОБОЛ, АЛГОЛ, ПЛ/1, ЛИСП, СИМУЛА, ПАСКАЛЬ, СИ, АДА, ПРОЛОГ и др.

Работа состоит из  1 файл

Алгоритмы на Pascal.DOC

— 826.50 Кб (Скачать документ)

          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 и т.д.)

    5.2. Множества

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

    Пусть, например, выигрышные номера в игре "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.

    5.3. Файловые типы  данных

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

Информация о работе Программирование на ЭВМ