Создание программы для работы с последовательностями

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    39,94 Кб
  • Опубликовано:
    2012-12-23
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Создание программы для работы с последовательностями

Содержание

Введение

1. Сравнительный анализ языков программирования высокого уровня Си и Паскаль

1.1 Структура программы

1.2 Типы данных

1.2.1 Стандартные типы

1.2.2 Пользовательские типы

1.3 Арифметические операции

1.4 Указатели и векторные типы данных

1.5 Операторы ветвления

1.5.1 Условные операторы с несколькими условиями

1.5.2 Операторы-переключатели

1.6 Циклы

1.6.1 Организация операторов циклов

1.6.2 Безусловный переход

1.7 Пользовательские подпрограммы

1.8 Итоги анализа сравнения языков программирования Паскаль и Си

2 Практическая реализация задания

2.1 Описание задачи и ограничений на ее выполнение

2.2 Реализация задания

2.3 Алгоритмы, реализованные в процессе решения задачи

Заключение

Список использованных источников

Введение

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

· постановка задачи;

· сбор данных, необходимых для решения задачи;

· реализация алгоритма обработки данных;

· трансляция алгоритма в структуру, способную решить поставленный алгоритм - программу или пакет программ;

· тестирование и отладка программы или пакета программ;

· применение программы или пакета программ к поставленной задаче;

· анализ полученных результатов.

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

2 Сравнительный анализ языков программирования высокого уровня Си и Паскаль

Язык высокого уровня - тип языка компьютерного программирования. Языки высокого уровня предназначены для выражения потребностей программиста, а не возможностей компьютера. Они используют абстрактные данные и контролируют структуры, символические обозначения и переменные. Существует много языков высокого уровня, в том числе Бейсик (BASIC), Кобол (COBOL), Паскаль (Pascal), Фортран (FORTRAN), Алгол (Algol) и Си (C). Чтобы можно было использовать программы, написанные на языках высокого уровня, их нужно перевести в машинные коды. Рассмотрим в противопоставлении языки высокого уровня Си и Паскаль.

1.1 Структура программы

Для определения множеств имен переменных используется понятие идентификатора [3]. Идентификаторами в Паскале является произвольный набор символов. Требования к идентификаторам:

· идентификатор состоит из латинских букв и цифр (заглавные и строчные буквы не различаются);

· идентификатора должен начинаться обязательно с буквы ("а1", а не "1а");

· идентификатор может состоять из любого количества символов, но распознаются только первые 63;

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

Программа составляется из операторов Паскаля, которые разделяются символом ";". Для выделения группы операторов используют операторные скобки: begin…..end. Несколько операторов, заключенных в операторные скобки, называют составным оператором. В тексте программы фигурными скобками выделяются комментарии, которые игнорируются при выполнении программы. В тексте лекций будем также использовать фигурные скобки для комментирования.

Структура программы на языке Турбо Паскаль:

· заголовок, название программы;

· подключение внешних модулей;

· описание констант;

· задание типов;

· раздел объявления переменных;

· описание функций;

· описание процедур;

· начало основной программы;

· тело основной программы;

· конец основной программы.

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

Структура Си-программ [4]. Идентификатором в языке Си называется последовательность цифр, букв и специальных символов. При этом первой стоит буква или специальный символ. Для получения идентификаторов можно использовать строчные или прописные буквы латинского алфавита. Специальным символом может служить символ подчеркивания «_».

Два идентификатора, для получения которых применяются совпадающие строчные и прописные буквы, считают различными. К примеру: abc, ABC, A328B, a328b. Компилятор допускает всякое количество символов в идентификаторе, но значим только первый 31 символ. Идентификатор образуется на этапе объявления переменной, функции, структуры и т. п. После этого его можно применять в последующих операторах разрабатываемой программы. Важно отметить некоторые особенности при выборе идентификатора. Во-первых, идентификатор и ключевое слово не должны совпадать. Также не должно быть совпадения с зарезервированными словами и названиями функций библиотеки компилятора языка СИ.

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

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

Ключевыми словами называются зарезервированные идентификаторы, наделенные определенным смыслом. Их можно применять только в соответствии со значением, известным компилятору языка СИ. Приведемсписокключевыхслов: auto double intstruct break else long switch register tupedef char extern return void case float unsigned default for signed union do if sizeof volatile continue enum short while. При этом в определенных версиях реализации языка СИ зарезервированными словами являются следующие: asm, fortran, near, far, cdecl, huge, pascal, interrupt. Ключевые слова far, huge, near дают возможность определить размеры указателей на области памяти.

Ключевые слова _asm, cdecl, fortran, pascal используются для организации связи с функциями, которые написаны на других языках, а также для применения команд языка ассемблера непосредственно в теле будущей программы на языке СИ. Ключевые слова не могут применяться в качестве идентификаторов.

1.2 Типы данных

.2.1 Стандартные типы

В Паскале все переменные должны объявляться в специально отведенном для этого месте - до начала блоковых скобок программы или функции и после ключевого слова var. Так же объявляются собственные типы (после ключевого слова type). Объявление переменных стандартного типа: идет допустимое название переменной, затем после двоеточия тип данных, хранящихся в этой переменной. Типы данных Паскаля перечислены в таблицах 2.2.1 - 2.2.3[5].

 

Таблица 2.2.1 - Целочисленные типы в Паскале

Тип

Диапазон

Знаковость

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

Byte

0..255

Unsigned

1

ShortInt

-128..127

Signed

1

SmallInt

-32768..32767

Signed

2

Word

0..65535

Unsigned

2

Integer

-32768..32767

Signed

2

Cardinal

0 .. 4294967295

Unsigned

4

LongWord

0 .. 4294967295

Unsigned

4

LongInt

−2147483648 .. 2147483647

Signed

4

 

Таблица 2.2.2 - Вещественные типы в Паскале

Тип

Диапазон

Значащих цифр

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

Single

7-8

4

Double

Зависит от платформы

-

8

Real

Зависит от платформы

-

6

Extended

19-20

10

 


Таблица 2.2.3 - Специальные типы в Паскале

Тип

Значения

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

Char

0..255 (символы ASCII)

1

String

Строки не длиннее 255 символов

1..256

Boolean

true/false

1

Pointer

Указатель

4


Не все типы данных поддерживаются компиляторами по умолчанию. К примеру, компилятор BorlandPascal 7.0 MS-DOS требует подключения математического сопроцессора для использования типа данных EXTENDED. Также есть особенность с использованием типа CHAR- несмотря на то, что он целочисленный, его нельзя использовать в математических выражениях, так как он является сугубо контейнером для символов. Тип BOOLEANможет содержать константные выражения TRUEи FALSE, соответствующие логическим 0 и 1, но при этом он занимает полный байт. Тип STRINGведет себя как массив элементов типа CHAR, но при этом длина этого массива хранится в нулевом элементе; этим объясняется ограниченность длины 255 символами. Также в языке Паскаль есть специальный тип указателя POINTER, характеризующийся отсутствием адреса переменной.

Типы данных Си отличаются структурированностью относительно типов в Паскале: все названия целочисленных типов представляется как комбинация ограниченного количества ключевых слов, из которой можно сразу сделать вывод о характере хранимого типа. К примеру, тип unsignedshortint обозначает беззнаковое короткое целое число. Вещественных типов намного меньше, чем в Паскале (их три), и для их работы не требуется дополнительных настроек компилятора. Типы данных Си приведены в таблицах 2.2.4 и 2.2.5 [6].

 


Таблица 2.2.4 - Целые типы в Си

Тип

Диапазон

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

(signed) char

-128...127

1

unsigned char

0…255

1

(signed) short (int)

-32768…32767

2

unsigned short (int)

0…65535

2

(signed) long (int)

−2147483648 .. 2147483647

4

unsigned long (int)

0 .. 4294967295

4

(signed) int

Зависит от компилятора

2/4

unsigned (int)

Зависит от компилятора

2/4

 

Таблица 2.2.5 - Вещественные типы в Си

Тип

Диапазон

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

Float

4

Double

8

longdouble

10


В языке Си отсутствуют специальные символьные типы; тип char может интерпретироваться как математическое значение или символ, в зависимости от использования. Специального типа для строк нет; строки представляются в виде массивов элементов типа char, концом строки считается первый с начала строки элемент, содержащий ноль. Вследствие этого в системе MS-DOS длина строк ограничена только размером сегмента (64 Кбайт). Логических типов в Си также нет; вместо этого реализована система, в которой любое целое число может быть представлено в виде логической константы: все, что не «0», эквивалентно истинному высказыванию, иначе ложному. В результате в Си возможно использовать математические выражения в качестве логических и наоборот, что добавляет гибкости языку. Типа аналогичного POINTERнет, взамен предоставлена гибкая система указателей, зависящих от типа разыменованного значения. Зато есть тип void, который характеризует отсутствие возвращаемого значения.

1.2.2 Пользовательские типы

В обоих языках реализована возможность создавать псевдонимы для существующих типов и новые типы. [7]Кроме стандартных типов данных Паскаль поддерживает скалярные типы, определенные самим пользователем. К ним относятся перечислимые типы (когда непосредственно, в разделе описания типов, заранее записываются все значения для переменных этого типа) и интервальные (когда задаются границы диапазона значений для данной переменной), указательные типы (кроме Pointer), структурированные типы и процедурные типы. Данные этих типов занимают в памяти один байт, поэтому скалярные пользовательские типы не могут содержать более 256 элементов. Их применение значительно улучшает наглядность программы, делает более легким поиск ошибок, экономит память.

Перечислимый тип данных задается непосредственно перечислением всех значений, которые может принимать переменная данного типа. При описании отдельные значения указываются через запятую, а весь список заключается в круглые скобки. Интервальный тип позволяет задавать две константы, определяющие границы диапазона значений для каждой переменной. Обе константы должны принадлежать одному и тому же стандартному типу (кроме real). Указательные типы - их значениями являются адреса памяти. В отличие от стандартного указательного типа Pointer, пользовательский тип определяет множество значений, которые указывают на динамические переменные определенного типа , называемого базовым типом. Указатель на какой-либо тип может быть описан до объявления самого типа.

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

[8] В языке Си существует пять способов создания пользовательских типов данных. Пользовательские типы данных можно создавать с помощью:

· структуры - группы переменных, имеющей одно имя и называемой агрегатным типом данных. Кроме того, еще известны термины: соединение или конгломерат;

· объединения, которое позволяет определять один и тот же участок памяти как два и более типов переменных;

· битового поля, которое является специальным типом элемента структуры или объединения, позволяющим легко получать доступ к отдельным блокам;

· перечисления - списка поименованных целых констант;

· ключевого слова typedef, которое определяет новое имя для существующего типа;

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

1.3 Арифметические операции

Арифметическая операция - вычислительная операция над числами. Во многих языках программирования определены двуместные арифметические операции: сложения, вычитания, умножения, деления, деления нацело, вычисление остатка от деления. Допустимые операции в языке Паскаль представлены в таблице 2.3.1 [9].

 

Таблица 2.3.1 Операции в Паскале

Приоритет операции

Символ

Выражение

Название операции

Тип переменных

Логические операции

1

Not

Not A

 «не»

Логический, целый

2

And

A and B

«и»


3

Or

A or B

«или»


3

Xor

A xor B

«искл. или»


Математические операции

2

*

A*B

Умножение

Целый, вещественный

2

/

A/B

Деление


2

Div

A div B

Деление без остатка

Целый

2

Mod

A mod B

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


3

+

A+B

Сложение

Целый, вещественный, строки

3

-

A-B

Вычитание

Целый, вещественный

Операции сравнения

4

=

A=B

Равно

Целый, вещественный, логический, строки

4

<> 

A<>B

Не равно


4

A>B

Больше


4

A<B

Меньше


4

>=

A>=B

Больше либо равно


4

<=

A<=B

Меньше либо равно


Специфические операции

1

@

@A

Адрес

Любой

1

^

A^

Разыменование

Указатель

2

Chl

A chl B

Сдвиг влево

Целый

2

Shr

A shr B

Сдвиг вправо


2

*

A*B

Пересечение

Множество

3

+

A+B

Объединение


3

-

A-B

Вычитание


4

In

A in B

Вхождение в множество

Элементы множества



Для строк операция сложения выступает как конкатенация - присоединение второй строки к «хвосту» первой. Как правило, для большинства операций характерно неявное приведение типов, поэтому они являются в некотором роде универсальными.

Операции в языке Си более универсальны из-за отсутствия логических типов и упразднения типов строк и символов, однако и они имеют свои особенности. Список допустимых операций в Си приведен в таблице 2.3.2 [10]. В языке существует жесткая иерархия по приоритету выполнения операций, что позволяет более детально прорабатывать структуру программ. Также введено понятие ассоциативности - приоритет выполнения операций может быть как слева направо, так и справа налево. Большинство операций допустимы для всех типов, исключения составляют побитовые и логические операции, а так же операции деления без остатка и остаток от деления для вещественных типов. Особенностью языка Си является тернарный оператор условия (x?y;z), который представляет простейший условный переход.

 

Таблица 2.3.2 - Операции языка Си

Оператор

Название

Класс

Приоритет

Ассоциативность

++/--

Инкремент, декремент

Постфиксный

16

Слева направо

++/--

Инкремент, декремент

Префиксный

15

Справа налево

~

Побитовое НЕ

Унарный

15

Справа налево

!

Логическое НЕ

Унарный

15

Справа налево

- +

Изменение знака, плюс

Унарный

15

Справа налево

&

Адрес

Унарный

15

Справа налево

*

Разыменование

Унарный

15

Справа налево

(имя типа)

Приведение типа

Унарный

14

Справа налево

* / %

Мультипликативные операции

Бинарный

13

+ -

Аддитивные операции

Бинарные

12

Слева направо

<<>> 

Сдвиг влево и вправо

Бинарный

11

Слева направо

<><= >=

Отношения

Бинарный

10

Слева направо

== !=

Равенство / неравенство

Бинарный

9

Слева направо

&

Побитовое И

Бинарный

8

Слева направо

^

Побитовое исключающее ИЛИ

Бинарный

7

Слева направо

|

Побитовое ИЛИ

Бинарный

6

Слева направо

&&

Логическое И

Бинарный

5

Слева направо

||

Логическое ИЛИ

Бинарный

4

Слева направо

? ;

Условие

Тернарный

3

Справа налево

= += -= *= /= %= <<= >>= &= ^= |=

Присваивание

Бинарный

2

Справа налево

Оператор

Название

Класс

Приоритет

Ассоциативность

,

Последовательная оценка

Бинарный

1

Слева направо


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

1.4 Указатели и векторные типы данных

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

Под векторным типом данных понимается организация типа по принципу структуры, в которой все элементы одного и того же типа. Это массивы и строки. Под строки в языке Паскаль выделен специальный тип, о котором говорилось выше. Массивы в языке Паскаль существуют как одномерные, так и многомерные. Для обозначения компонент массива используется имя переменной-массива и так называемые индексы, которые обычно указывают желаемый элемент. Тип индекса может быть только порядковым (кроме LONGINT). Чаще всего используется интервальный тип (диапазон). Описание типа массива задается следующим образом: TYPE имя_типа = ARRAY[список индексов] OF тип. Здесь имя типа - допустимый идентификатор; список индексов - список одного или нескольких индексных типов, разделенных запятыми; тип - любой тип данных. Вводить и выводить массивы можно только поэлементно, над массивами не определены операции отношения. Сравнивать два массива также можно только поэлементно. Глубина вложенности многомерных массивов произвольная, поэтому количество элементов в списке индексных типов (размерность массива) не ограничена, однако не может быть более 65520 байт [11].

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

Вернемся непосредственно к указателям. Так как указатель содержит адрес объекта, это дает возможность «косвенного» доступа к этому объекту через указатель. Унарная операция «&» в Си выдает адрес объекта; эта операция применима только к переменным и элементам массива, конструкции с использованием численных и строковых констант являются незаконными. Нельзя также получить адрес регистровой переменной. Унарная операция «*» рассматривает свой операнд как адрес конечной цели и обращается по этому адресу, чтобы извлечь содержимое [4]. Тип указателя неразрывно связан с информацией, хранимой по содержащемуся в нем адресу. Несколько указателей разных типов могут содержать один и тот же адрес, но при этом информация, которую они вернут при разыменовании, будет различаться. Исходя из этого, возникает следующая особенность адресной арифметики в Си: при увеличении указателя на n смещение в байтах будет равно произведению размера типа разименованного указателя на n. Таким образом, любой указатель рассматривает всю память как массив элементов своего типа, и перемещается по памяти поэлементно. В Паскале адресная арифметика отсутствует; набор допустимых действий с указателями это разыменовывание и получение адреса. Эти действия были рассмотрены в разделе 2.3.

1.5 Операторы ветвления

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

1.5.1 Условные операторы с несколькими условиями

В языке Паскаль имеет место синтаксис, согласно которому в ветвях условного оператора может быть помещена только одна команда. Поэтому для размещения там большего количества команд они группируются в составной оператор с помощью пары ключевых слов BEGIN и END. Ветвь ELSE необязательна. Ключевые слова BEGIN и END необходимы, только если операторов несколько (например, из соображений единообразия оформления кода) [12]. Оформление условного перехода IF … THEN … ELSE выглядит следующим образом: на первое место выносится ключевое слово IF, после которого следует через пробел выражение или переменная, возвращающие логический тип. В случае, если выражение составное, используются круглые скобки. Выражение закрывается ключевым словом THEN, после которого записывается оператор, выполняющийся в случае истинности условия. В случае, если необходимо обработать и случай ложности высказывания, используется ключевое слово ELSE. Перед ELSE недопустим знак завершения оператора «;». При необходимости после ELSEдопускается начинать новый оператор IF, который будет рассматриваться в общей совокупности с первым IF.

В языке Си условный оператор структурно аналогичен оператору в Паскале. Отличие состоит в том, что условие должно быть записано в круглых скобках, исчезает ключевое слово THEN, а вместо ключевых слов BEGIN и END используются фигурные скобки «{}» [12]. Условные операторы Си проигрывают условным операторам Паскаля в случае определения диапазонов и принадлежности к множествам, так как оператор принадлежности к множеству IN (раздел 2.3, операции Паскаля) работает быстрее двух операторов сравнения с верхней и нижней границей множества [5].

1.5.2 Операторы-переключатели

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

В языке Паскаль в переключателе допустимо использовать в качестве выражения переменные целого и символьного типа. В качестве меток переключения могут использоваться как константы указанных типов, так и диапазоны; переменные в качестве меток не допускаются. Синтаксис: на первое место выносится ключевое слово CASE, после которого следует выражение, завершающееся ключевым словом OF. После OF без дополнительных символов начинается перечисление меток переключения, указываемых как простые константные выражения. После самой метки следует через двоеточие оператор, выполняющийся для этой метки. В качестве метки «по умолчанию» при необходимости используют ключевое слово ELSE. Завершается оператор ключевым словом END.

В языке Си в качестве переключателя используется оператор switch. Синтаксис его описания следующий: вначале ставится ключевое слово switch, после которого в круглых скобках располагается выражение для переключения по меткам переключателя. Затем начинается тело переключателя, оформляемое фигурными скобками. Метки внутри тела переключателя обозначаются при помощи ключевого слова case, после которого располагают константное выражение или символьную переменную для определения значения метки. После ставится двоеточие и следует набор операторов, количество которых не ограничивается языком. Метка «по умолчанию» задается ключевым словом default.

У переключателей в Си есть особенность, которую можно охарактеризовать как «проваливание» [4]. Оно обрабатывается при помощи оператора break, использующегося для выхода из тела переключателя. В том случае, если в конце набора операторов метки и перед новой меткой нет оператора break, то управление перейдет к следующим операторам до первого оператора break либо до завершения тела переключателя. Эта особенность имеет как свои плюсы, так и свои минусы. К положительным качествам можно отнести то, что оно позволяет связать несколько случаев с одним действием; но в то же время оно обычно приводит к необходимости заканчивать каждый случай оператором break, чтобы избежать перехода к следующему случаю. Проваливание с одного случая на другой неустойчиво, поэтому не рекомендуется использовать его часто [4].

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

1.6 Циклы

.6.1 Организация операторов циклов

Цикл[7] - в программировании - оператор языка программирования, позволяющий многократно повторять одну и ту же последовательность команд (тело цикла). Различают:

- операторы циклов с заранее известным числом повторений;

- циклы с предусловиями;

- циклы с постусловиями.

Вследствие схожести структур рассмотрение всех типов циклов пройдет одним блоком.

Циклы в Паскале. [12]У циклов выделяют заголовок и тело. Заголовок определяет, до каких пор или сколько раз тело цикла будет выполняться. Тело содержит выражения, которые выполняются, если в заголовке цикла выражение вернуло логическую истину (True, не ноль). После того как достигнута последняя инструкция тела, поток выполнения снова возвращается к заголовку цикла. Снова проверяется условие выполнения цикла. В зависимости от результата тело цикла либо повторяется, либо поток выполнения переходит к следующему выражению после всего цикла. В языке программирования Паскаль существует три вида циклических конструкций. Цикл for используется, когда число повторений не связано с тем, что происходит в теле цикла. Т.е. количество повторений может быть вычислено заранее (хотя оно не вычисляется). В заголовке цикла указываются два значения. Первое значение присваивается так называемой переменной-счетчику, от этого значения начинается отсчет количества итераций (повторений). Отсчет идет всегда с шагом равным единице. Второе значение указывает, при каком значении счетчика цикл должен остановиться. Другими словами, количество итераций цикла определяется разностью между вторым и первым значением плюс единица. В Паскале тело цикла не должно содержать выражений, изменяющих счетчик. Цикл while является циклом с предусловием. В заголовке цикла находится логическое выражение. Если оно возвращает true, то тело цикла выполняется, если false - то нет. Когда тело цикла было выполнено, то ход программы снова возвращается в заголовок цикла. Условие выполнения тела снова проверяется (находится значение логического выражения). Тело цикла выполнится столько раз, сколько раз логическое выражение вернет true. Поэтому очень важно в теле цикла предусмотреть изменение переменной, фигурирующей в заголовке цикла, таким образом, чтобы когда-нибудь обязательно наступала ситуация false. Иначе произойдет так называемое зацикливание, одна из самых неприятных ошибок в программировании. Цикл while может не выполниться ни разу, если логическое выражение в заголовке сразу вернуло false. Однако такая ситуация не всегда может быть приемлемой. Бывает, что тело цикла должно выполниться хотя бы один раз, не зависимо оттого, что вернет логическое выражение. В таком случае используется цикл repeat - цикл с постусловием. В цикле repeat логическое выражение стоит после тела цикла. Причем, в отличие от цикла while, здесь всё наоборот: в случае true происходит выход из цикла, в случае false - его повторение.

Циклы в языке Си мало чем отличаются от циклов языка Паскаль. Также существует три конструкции для реализации цикла; это оператор «for(…;…;…)…;», оператор «while(…) …;» и оператор «do … while(…);». Первые два цикла предусловные, последний постусловный. Все циклы подразумевают выполнение одного оператора и в качестве условия продолжения цикла требуют логическую истину (неравенство нулю в Си). Условие выхода в операторе while помещается в круглые скобки и должно быть неравным нулю для продолжения работы цикла. Оператор for внутри скобок параметров цикла содержит следующие выражения: первый параметр выполняется один раз перед стартом цикла, второй является условием для выполнения цикла (также как и для while он не должен равняться нулю), а третий выполняется каждый проход в конце тела цикла. Каждый из параметров может быть опущен, однако символ точки с запятой опускать запрещается. Внутри параметров допускается использование оператора запятая.

Постусловный оператор do … while в Си устроен следующим образом: после ключевого слова do следует один оператор тела цикла, затем после символа точки с запятой следует ключевое слово while с условием выхода в круглых скобках. Для выхода из цикла значение условия должно быть равно нулю.

Циклы в обоих языках имеют примерно сходный синтаксис и мало отличаются; исключение из всего ряда составляет конструкция REPEAT … UNTIL, не вписывающаяся в общую концепцию подобия. Из этого можно сделать вывод, что циклы языка Си более удобны для восприятия.

1.6.2 Безусловный переход

Оператор BREAK существует в обоих языках программирования, и в обоих языках относительно циклов он несет одинаковую функциональную нагрузку - выход из текущего блока цикла. Оператор BREAK предназначен для досрочного завершения цикла. При его выполнении происходит немедленный выход из текущего цикла и переход к выполнению оператора, следующего за циклом. Оператор CONTINUE завершает текущую итерацию цикла, осуществляя переход к концу тела цикла. Главное различие для языков Си и Паскаль в использовании этих операторов в том, что в Си это именно операторы, а в ранних версиях Паскаля (включая BorlandPascal и DelphiPascal) это процедуры.

Оператор GOTO и система меток также имеется в обоих языках. В Паскале оператор GOTO осуществляет переход к оператору, помеченному специальной меткой, которая отделяется от самого оператора двоеточием. В качестве метки может быть использовано любое целое число без знака, содержащее более четырех цифр, или любое имя. Чтобы можно было использовать метку, она должна быть в обязательном порядке объявлена в разделе меток в описательной части программы. Этот раздел начинается служебным словом LABEL, после которого через запятую перечисляются метки [13]. В языке Си метки обозначаются таким же образом, но описывать их не нужно. В обоих языках использование этих операторов основано на аналоге оператора языка Ассемблер, поэтому и различий в их использовании нет.

1.7 Пользовательские подпрограммы

 

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

Подпрограммы языка Паскаль делятся на две категории: процедуры PROCEDURE, не возвращающие значений, и функции FUNCTION, возвращающие значения. Синтаксически процедуры и функции состоят из заголовка и тела, после которого ставится символ конца оператора «;». Заголовок содержит ключевое слово PROCEDURE или FUNCTION, затем следует имя подпрограммы. За именем находится необязательная конструкция из круглых скобок для передачи списка формальных параметров, и если подпрограмма является функцией, то далее располагается тип возвращаемого значения через символ двоеточия. Тело процедуры, как и программы, в свою очередь может содержать описания процедур и функций. Таким образом, процедуры и функции могут быть вложены друг в друга как угодно глубоко, при этом тело программы - самое верхнее в цепочке. Вслед за заголовком процедур/функций вместо тела может помещаться ключевое слово FORWARD, это делается в том случае, если описание процедуры/функции располагается в программе после её вызова, и связано с поддерживаемой в Паскале возможностью компиляции программы за один проход [5]. Возвращение значения из функции осуществляется через временную переменную, которая доступна по имени самой функции. Таким образом, для того, чтобы вернуть значение в точку вызова, необходимо присвоить это значение имени функции внутри ее описания.

Подпрограммы языка Си представляют основную структурную единицу языка и доступны в одном виде - функции. Каждая функция может иметь несколько этапов своего создания. Первый этап - объявление функции, которое состоит из заголовка функции, списка формальных параметров и пустого оператора. Объявление требуется компилятору на стадии линковки для того, чтобы указать существование данной функции. Заголовок функции состоит из типа возвращаемого значения (в случае, если функция не возвращает значения, ей присваивается тип void), имя функции и обязательного списка формальных параметров. Если список формальных параметров пуст, то по умолчанию в него записывается ключевое слово void. Второй этап - определение функции, в котором после заголовка в фигурных скобках идут операторы, выполняющиеся в теле данной функции. В случае, если необходимо вернуть значение, используется оператор return. Он передает требуемое значение в поток вызова и принудительно завершает функцию. В одной функции может быть сколь угодно операторов возврата, но выход будет осуществляться по первому из них. И третий этап - непосредственно вызов функции, который может проходить ниже объявления либо определения и может быть использован внутри самой функции (рекурсия).

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

1.8 Итоги анализа сравнения языков программирования Паскаль и Си

В рассмотренных языках программирования высокого уровня Си и Паскаль имеются как свои плюсы, так и свои минусы. Удобство в использовании языка программистом является важным фактором при оценке и сравнении языков, а гибкость языка позволяет расширить возможности при реализации алгоритмов разных уровней. Язык Паскаль громоздок и имеет ограниченный набор возможностей по сравнению со многими языками, однако он достаточно иерархичен и структурирован. Язык Си гибок и логичен в своей структуре, имеет гораздо больше возможностей для работы, однако таит в себе много опасностей. Керниган говорит: «Си - инструмент, острый, как бритва: с его помощью можно создать и элегантную программу, и кровавое месиво» [4]. Поэтому использование языка Си оправдано лишь при достаточном уровне знаний в сфере программирования. На сегодняшний день очевидно, что язык Паскаль не может достойно конкурировать с языком Си, так как при усложнении задач, встающих перед программистами, требуется в первую очередь гибкость и функциональность.

2. Практическая реализация задания

.1 Описание задачи и ограничений на ее выполнение

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

Ограничения, установленные для реализации задачи:

· многофайловость проекта;

· наличие меню с удобным интуитивно понятным графическим интерфейсом;

· возможность изменения параметров программы без изменения исходного кода;

· возможность производить поиск всех подпоследовательностей максимальной длины;

· работа с файлами.

.2 Реализация задания

При реализации задания были разработаны две структуры: для работы с последовательностями posled и для организации поиска подпоследовательности внутри последовательности search. Список файлов проекта представлен в таблице 3.2.1. Для удобства доступа к файлам в MAIN.CPP описаны макросы для быстрого изменения пути до файлов: с использованием склейки строк MSTR(p) для текстовых файлов и подстановки DISK(p) для подключаемых файлов.

Таблица 3.2.1 Файлы проекта

Название файла

Описание файла

EGAVGA.BGI

Файл графического драйвера

INCLUDE.H

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

ALG.CPP

Функции работы с последовательностями.

MENU.CPP

Функции графического интерфейса.

MAIN.CPP

Главный компилируемый файл проекта, содержащий функцию main().

ABOUT.TXT

Текстовый документ, его содержимое отображается в пункте меню ABOUT.

OPEN.TXT

Из этого файла загружается последовательность для дальнейшей обработки. Формат записи:

SAVE.TXT

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


Для реализации графического интерфейса была применена стандартная библиотека graphics.h, использующая видеодрайвер egavga.bgi. Функций взаимодействия с пользователем 4: menu(), options(), about(), start(). Меню построено на рекурсивном и взаимно рекурсивном принципе. Для уменьшения кода была создана функция отрисовки фонового изображения draw_note().

Функция menu() содержит графическое оформление меню, а так же информацию о взаимодействии с пользователем посредством клавиатуры. Для этих целей используется переменная типа static, указывающая, какой элемент меню был выбран сейчас. В случае нажатия на клавишу enter в зависимости от значения этой переменной вызывается одна из четырех функций start(), options(), about() или стандартная функция exit(int). В конце при естественном ходе программы функция menu() вызывает сама себя.

Функция start() запускает алгоритм решения задачи и содержит в себе подменю для определения источника последовательности. В случае выбора пункта меню “Createwith->File” последовательность загружается из файла Z:\open.txt. Если этого файла не существует, программа сообщает об этом и переходит в меню. Если был выбран пункт меню “Createwith->Generator”, то

Таблица 3.2.2 - Функции для работы с последовательностями - ALG.CPP

Название функции

Описание функции

void posled_new (int n, posled*p);

Функция заполняет структуру posled*p, передаваемую по указателю, пустой последовательностью размера n.

void posled_delete (posled*p);

Функция освобождает память, занимаемую последовательностью.

void posled_rand (posled*p);

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

void posl_save (char*path, posled*p)

Функция сохраняет последовательность в файле с путем доступа, указанным в строке path.

void posl_open (char*path, posled*p)

Функция загружает последовательность из файла с путем доступа, указанным в строке path, в структуру p.

search index_search (posled*p, int n)

Функция выполняет поиск длиннейшейподпоследовательности одинаковых чисел, встречающейся n-й раз. Если таковой не находится, индекс первого символа подпоследовательности равен -1.


При помощи функции posled_rand (posled*); генерируется последовательность из 48 элементов. Верхняя граница для генератора чисел задается в “MENU->OPTIONS” и равна по умолчанию 10. После генерации последовательности она распечатывается на экране и происходит поиск подпоследовательностей. Затем выделяются элементы подпоследовательностей, и внизу экрана выводится их длина. Функция рекурсивно вызывает себя в конце естественного хода программы.

Функция options() создает графический интерфейс для изменения параметров работы основного алгоритма.

Эти параметры - возможность записывать и считывать из разных файлов (open.txt и save.txt) либо из одного и того же (open.txt), а так же верхний предел генератора случайных чисел randmax. Управление производится стрелками вправо и влево с клавиатуры, выбор нужного пункта меню - стрелками вверх и вниз. Переменная randmax ограничена интервалом значений [1..99]. Функция рекурсивна.

Функция about() позволяет получить информацию, записанную в файле about.txt. Если этого файла нет, программа пишет об этом пользователю. По завершению выполнения функции после нажатия любой клавиши вызывается функция menu().

2.3 Алгоритмы, реализованные в процессе решения задачи

Рассмотрим алгоритм поиска длиннейшей подпоследовательности одинаковых чисел, встречающейся некоторый раз внутри основной последовательности. Этот алгоритм был реализован в файле ALG.CPP в функции searchindex_search(posled*,int).

Для определения длиннейшей подпоследовательности одинаковых символов достаточно одного цикла, проходящего через всю основную последовательность. Сравнение происходит после того, как определены размеры группы одинаковых чисел, и новый результат либо записывается вместо нового с указанием координаты его нахождения, либо обнуляется. Для того, чтобы найти следующее вхождение этой последовательности, достаточно ввести дополнительный параметр, определяющий, на какой раз после череды совпадений допускается записать координату начала подпоследовательности. В случае обнаружения более длинной группы этот счетчик обнуляется. Алгоритм выбора подпунктов меню (файл MENU.CPP, функции menu(); start(); options();).

Событие нажатия кнопки на клавиатуре отлавливается функцией getch(), код клавиши записывается в переменную. Для определения значимости кода используется переключатель switch, отлавливающий требуемые значения. Для сохранения позиции выбора меню используются переменные класса static. В зависимости от нажатой клавиши они либо изменяют свое значение, либо остаются неизменными. После нажатия клавиши enter (код 13) в зависимости от значения переменной выбора через switch запускается та или иная функция, как правило с выходом из текущей при помощи оператора return.

Заключение

По результатам проделанной работы можно сделать следующие выводы:

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

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

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

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

· возможность сохранять последовательность в файлы;

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

программирование последовательность си паскаль

Приложение

Листинг.H

#include <graphics.h>

#include <stdio.h>

#include <conio.h>

#include <dos.h>

#include <string.h>

#include <stdlib.h>menu();*gpath="C:\\BORLANDC\\Progs\\kurs\\open.txt";*gpath_1="C:\\BORLANDC\\Progs\\kurs\\about.txt";*gpath_2="C:\\BORLANDC\\Progs\\kurs\\save.txt";=10;_so=0;{size;*element;

};search {index;size;

};

#include "C:\BORLANDC\Progs\kurs\alg.cpp"

#include "C:\BORLANDC\Progs\kurs\menu.cpp".CPP_new(intn,posled*p) {>size=n;>element=new int[n];

}_delete(posled*p) {p->element;

}_rand(posled*p) {(inti=0;i<p->size;i++) {

  p->element[i]=random(randmax);

}

}_search(posled*p,intnum) {=1,len=1,indmax=-1;=1;(inti=1;i<=p->size;i++) {

  if(p->element[i]==p->element[i-1]&&i<p->size) len++;

  else {

        if(len>lenmax) {

              lenmax=len;

              if(num==1) indmax=i-len;

              elseindmax=-1;

              nummax=1;

              }

        else if(len==lenmax) {

              nummax++;

              if(nummax==num) indmax=i-len;

              }

        len=1;

        }

}={0};.index=indmax;.size=lenmax;;

}_save(char*path,posled*p) {

FILE*f;

f=fopen(path,"w+");(!f) return;(f,"%d ",p->size);(inti=0;i<p->size;i++) fprintf(f,"%d ",p->element[i]);(f);

}_open(char*path,posled*p) {

FILE*f;=0,i=0;

f=fopen(path,"r");(!f) {

  posled_new(0,p);

  return;

}(f,"%d ",&buf);_new(buf,p);(!feof(f)) {=0;(f,"%d ",&buf);>element[i++]=buf;

}(f);

}.CPP_note() {(1,15);(180,50,460,430);(1,0);(inti=0;i<3;i++) fillellipse(i*80+240,75,10,10);(1,2);(i=0;i<3;i++) {

  bar(i*80+236,73,i*80+238,40);

  bar(i*80+242,73,i*80+244,40);

}

}start() {_set=0;work=0;(start_set<0) start_set=1;if(start_set>1) start_set=0;();_note();(0,0,2); setcolor(4);(320,120,"Create with:");(1);(320,200,"File");(320,280,"Generator");(9);(210,140,430,140);(240,215+start_set*80,400,215+start_set*80);p={0};*posl=&p;key=getch();(key) {

  case 27: menu(); return;

  case 80: start_set++; break;

  case 72: start_set--; break;

  case 13:

        work=1;

        switch(start_set) {

              case 0: posl_open(gpath,posl); break;

              case 1: posled_new(48,posl); posled_rand(posl); break;

        }

        break;

}(work) {

  draw_note();

  charbuf[15]={0};

  int j=1;

  search m={0};

  if(!posl->size) {

        outtextxy(320,220,"Cannot open file");

        getch(); menu(); return; }

  for(inti=0;i<posl->size;i++) {

        char b1[5]={0};

        sprintf(b1,"%d",posl->element[i]);

        strcat(buf,b1);

        outtextxy(220+(i%6)*40,130+(i/6)*30,buf);

        buf[0]=0;

  }

  while(m.index>=0) {

        m=index_search(posl,j++);

        if(m.index==-1) break;

        for(int k=0;k<m.size;k++) {

              int l=m.index+k;

              rectangle(201+(l%6)*40,116+(l/6)*30,

                         239+(l%6)*40,144+(l/6)*30);

              }

        }

  sprintf(buf,"Size: %d",m.size);

  outtextxy(320,125+(i+1)*5,buf);

  if(bool_so) posl_save(gpath_2,posl);

  elseposl_save(gpath,posl);

  getch(); menu();

}();

}options() {_note();_sel=0;(opt_sel<0) opt_sel=1; else if(opt_sel>1) opt_sel=0;(0,0,3); setcolor(4);(320,120,"OPTIONS");[20]={0};(0,0,1); setcolor(1);(buf,"Max rand num: %d",randmax); outtextxy(320,200,buf);(buf,"Similar i/o files:%s",(bool_so?" yes":" no"));(320,280,buf);(280,215+opt_sel*80,360,215+opt_sel*80);key=getch();=0;(key) {

  case 27: menu(); return;

  case 75: dir--; break;

  case 77: dir++; break;

  case 72: opt_sel--; break;

  case 80: opt_sel++; break; }(opt_sel) {

  case 0: if(randmax>20) dir*=10; randmax+=dir; break;

  case 1: if(dir) bool_so=1-bool_so; break;

}(randmax<1) randmax=1; else if(randmax>100) randmax=99;();

}about() {_note();(0,0,2); setcolor(4);(320,100,"ABOUT");*f=fopen(gpath_1,"r+");(0,0,1);(230,130,410,130);(f) {

  charbuf[30]={0};

  inti=0;

  while(!feof(f)) {

        buf[0]=0;

        fgets(buf,30,f);

        buf[strlen(buf)-1]=0;

        outtextxy(320,160+i*30,buf);

        if(strlen(buf)) i++;

        }

  line(230,160+i*30,410,160+i*30);

  }{

  char error[50]={0};

  sprintf(error,"Cannot open \"%s\"",gpath_1);

  outtextxy(320,160,error);

  }();(f);();

}menu() {_set=0;(menu_set<0) menu_set=3;if(menu_set>3) menu_set=0;();_note();(CENTER_TEXT,CENTER_TEXT);(0,0,3);(4);(320,120,"MENU");(0,0,2);(1);(320,200,"START");(320,250,"OPTIONS");(320,300,"ABOUT");(320,350,"EXIT");(9);(210,140,430,140);(240,215+menu_set*50,400,215+menu_set*50);key=getch();(key) {

  case 27: exit(0); break;

  case 13: switch(menu_set) {

        case 0: start(); return;

        case 1: options(); return;

        case 2: about(); return;

        case 3: exit(0);

   } break;

  case 72: menu_set--; break;

  case 80: menu_set++; break; }();

}

Похожие работы на - Создание программы для работы с последовательностями

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!