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

Министерство  транспорта и связи Украины

Одесская национальная академия связи им. А.С. Попова

 

 

 

Кафедра информационных технологий

 

 

 

 

 

Курсовая  работа

 

по дисциплине “Информатика”

на тему:

 

«Создание библиотек  подпрограмм

для обработки массивов»

 

 

 

 

                                                                                                       

                                                                                                        Выполнил:

                                                                                           Студент 1 курса

                                                                                              Факультета ИС

                                                                                   Дьяченко П.И.      

                                                                                          Руководитель:

Леонов Ю.Г.                                                                              

 

 

 

 

 

 

 

 

Одесса 2012

 

 

Содержание

 

 

  1. Курсовое задание 3
  2. Основные теоретические сведения 4
  3. Структурные схемы 16
  4. Окна форм 20
  5. Меню пользователя 22
  6. Тексты программ 23
  7. Результаты вычислений 31
  8. Вывод 32
  9. Список использованной литературы 33

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Задание

Поля структуры

Задание

Параметры сортировки

Текстовый

6

Номер поезда

Время прибытия

Время отправления

Направление

Растояние

Вывести среднюю скорость каждого поезда.

Расстояние по возрастанию.

Сведенья о поездах прибывающих после «12.00»


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Основные  теоретические   сведения:

1 Основные типы C++

В программе на языке C++ все переменные должны быть объявлены, т.е. для каждой переменной должен быть указан ее тип. Все типы языка C++ можно      |Д разделить на две большие группы: основные типы и производные.

К основным относятся char, int, float и double, а также их варианты с модификаторами short (короткий), long (длинный), signed (со знаком, подразумевается по умолчанию и обычно не пишется) и unsigned (без знака

Объявлять переменные можно в любом  месте программы перед их использованием.

Ниже приведена таблица 2.1 соответствия типов Delphi и основных типов

C++.

                      Таблица 2.1

C++ Char

Размер

(в байтах)

Диапазон

Delphi

 

1

-128...126

Char

Unsigne

d char

1

0...255

Byte

Short

2   "Л

-32 768...32 767

SmallInt

unsigned short

2

0...65 535

Word

Int

4

-2 147 483 648...2 147 483 647

Integer

unsigned int

4

0...4 294 967 295

Cardinal

Float

4

3.4-10-38...3.4*1038

Single

double

8

1.7-Ю-308... 1.7*10308

Real

long double

10

3.4-104932...1.1*104932            ,

Extended

bool

1  

true, false

Boolean


 

Константы в языке С

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

Тип данных Константа

char 'a', V, '9'

int       1, 123,-346

float 123.23,4.34Е-3,4Е+5

double 123.23,12312311,-0.987

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

В качестве цифр шестнадцатеричной  константы используются символы

            -0, 1, 2, 3,4, 5, 6, 7, 8, 9, А, В, С, D, E, F.

В языке С часто используются строковые константы. Строковая  константа или просто строка представляет собой набор символов, заключенный в двойные кавычки, например, "Это строка". Нельзя путать строковые константы с символьными константами. Так "а" - это строка, содержащая одну букву, в то время как 'а' - символ.

В языке С есть символьные константы, которые не соответствуют никакому из печатных символов. Это так называемые управляющие константы. Например, '\n' - перевод строки, '\0' - нулевой символ, нулевой байт.

Понятие функции  в С++

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

Функция – это совокупность объявлений и операторов, обычно предназначенная  для решения определенной задачи. Каждая функция должна иметь имя, которое используется для ее объявления, определения и вызова.

При вызове функции ей при помощи аргументов (формальных параметров) могут быть переданы некоторые значения (фактические параметры), используемые во время выполнения функции. Функция может возвращать некоторое (одно!) значение. Это возвращаемое значение и есть результат выполнения функции, который при выполнении программы подставляется в точку вызова функции, где бы этот вызов ни встретился. Допускается также использовать функции, не имеющие аргументов, и функции, не возвращающие никаких значений. Действие таких функций может состоять, например, в изменении значений некоторых переменных.

Операции  отношения и логические операции

Операции сравнения: = (равно), != (не равно), <, >, <=, >= используются при сравнении двух выражений. Результатом  такого сравнения могут быть значения true (истина) или false (ложь). Однако результатом логического выражения может являться и целочисленное арифметическое значение. При этом значение 0 расценивается как false, а любое ненулевое значение - как true. Рассмотрим пример:

int tr, ftl;

tr = (101<=105);

fal=(101>105);

В результате выполнения этих операторов переменная tr получит значение 1, а переменная fal станет равной 0.

Не следует путать операторы  типа

if(A = =2)...; И

if (А =2)...;

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

В С имеется три логические операции: && — логическое И (AND) || - логическое ИЛИ (OR) ! - логическое НЕ (NOT)

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

 

 

 

 

 

 

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

В С определен ряд  операций присваивания

 

Обозначение

Операции

Типы операндов и  результата

Пример

 

=

присваивание

любые

X = Y

 

+=

присваивание со сложением

арифметические, указатели, структуры, объединения

 

X+=Y

 

— =

присваивание с вычитанием

арифметические, указатели, структуры, объединения

 

X- = Y

 

 

*=

Присваивание с умножением

арифметические

 

X*=Y

 

/=

присваивание

с делением

арифметические

 

X/=Y

 

 

%=

присваивание остатка целочисленного деления

целые

 

X%=Y

 

<~

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

целые

 

X<=Y

 

>=

присваивание со сдвигом вправо

целые

 

X>=Y

 

&=

присваивание с поразрядной операцией И

целые

 

X&=Y

 

 

^=

присваивание с поразрядной операцией исключающее ИЛИ

целые

 

 

X^=Y

 

|=

присваивание с поразрядной операцией ИЛИ

целые 

X|=Y


Особенностью обычного оператора присваивания является то, что он может использоваться в выражениях, например:

if((f=x-y)>0)...; и допускает многократное использование, например:

а=Ь=с=х*у;

Выполняются операции присваивания справа налево, т. е. сначала вычисляется значение выражения х*у, затем это значение присваивается с, потом b и лишь затем а.

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

Например, выражение X+=Y эквивалентно выражению X=X+Y, но записывается компактнее и выполняется быстрее.

 

Поразрядные операции

Поразрядные операции (табл. 2.4) работают с целыми числами и  оперируют с их двоичными представлениями. Они позволяют обеспечить доступ к каждому биту информации.

             Таблица 2.4

Обозначение

Операция

Пример

  ~

отрицание

-1011=0100

  &

И

X&Y

1011 &1010=1010

   |

или

 X | Y

101111010=1011

     

    ^

исключающее ИЛИ

 X ^ Y

1011л1010=0001

  <<

сдвиг влево

 Х«2

1011 «2=1100

  >>

сдвиг вправо

 Y»I

1011» 2=0010


Операция поразрядного отрицания (~) инвертирует каждый бит  операнда: на 1, 1 -наО.

Поразрядные операции &, |, л работают в соответствии со следующей таблицей, где а и b — сравниваемые биты операндов:

 

а

b

a&b

a^b

a|b

0

0

0

0

0.

1

0

0

1

1

0

1

0

1

1

1

1

1

0

1


Поразрядные операции удобны для организации хранения в сжатом виде информации о состоянии on/of (включен/выключен). В одном байте можно хранить 8 таких флагов. Если переменная ch является хранилищем таких флагов, то проверить, находится ли флаг, содержащийся в третьем бите, в состоянии on, можно следующим образом:

if(ch&4)... Эта проверка основывается на двоичном представлении числа 4=00000100.

Заметьте, что выражение a^b^a всегда возвращает а. Эта закономерность часто используется в растровой графике. Выражение a^a всегда возвращает 0.

Операции поразрядного сдвига » и « сдвигают биты левого операнда на число разрядов, указанное правым операндом, соответственно вправо или влево. Недостающие значения битов дополняются нулями. Сдвиг целого числа на п разрядов вправо эквивалентен целочисленному делению его на 2". Сдвиг целого числа на п разрядов влево эквивалентен умножению его на 2".

Пример: двоичное представление числа  х=9: 00001001, тогда

х=9«3        01001000

х=9»3        00000001

х=9 » 5         00000000

При применении операции сдвига может происходить потеря старших или младших разрядов. Применение операций » и « по очереди к одной и той же переменной может изменить значение этой переменной из-за потери разрядов.

 

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

Ниже приведена таблица  операций, расположенных в порядке  убывания их приоритетов.

( )

++ -- ~  !

*  /  %

+   -

>>     <<

<    <=   > >=

==      !=

&

^

|

&&

||




 

 

 

 

 

 

 

 

 

 

 

 

 

 

Функции языка  С

Функция описывается следующим  образом:

тип  имя_функции (список параметров)

{

тело функции

}

Тип функции Может быть любым, кроме массива и функции. Могут быть функции, не возвращающие никакого значения. Тип таких функций объявляется как void.

Список параметров состоит из имен параметров и указаний на их тип. Например:

double Sum (double XI, double X2, int A)

В этом примере параметры передаются по значению. Другой способ передачи параметров — по ссылке. В этом случае в функцию передается не сама переменная, а ее адрес, полученный операцией адресации (&). Например:

void square(int &a)

Если функция не принимает никаких  параметров, то скобки либо остаются пустыми, либо в них записывается ключевое слово void. Например:

void F 1(void) или

voidFl()

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

   return выражение;

где выражение должно формировать  выходное значение и совпадать по типу с типом функции.

       Прервать выполнение  функции также можно при помощи  функции Abort. Эта функция осуществляет выход из подпрограммы и передает управление в точку вызова функции.

 

Операторы языка  С

 

Условный  оператор if

Оператор if имеет две формы: краткую и полную.

Краткая форма имеет вид:

            if(условие) оператор;

Полная форма этого оператора  следующая:

            if(условие) оператор;

             else оператор;

Если значение условия истинно, то выполняется оператор, следующий за условием. Если же условие ложно, то выполняется оператор, стоящий после  слова  else. Если else-часть отсутствует, то выполняется следующий оператор программы.

   В качестве условия может  выступать любое выражение. Если  значение-нуль, оно считается ложным. Ненулевое выражение считается истинным.

Операторы цыклов

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

– оператор цикла  for;

– оператор цикла с предусловием  while;

– оператор цикла с постусловием   do-while.

 

Оператор  цикла с параметром for

Синтаксис оператора следующий:

for (выражение1; выражение2; выражение3) оператор;


где выражение1 задает начальное значение параметра цикла, выражение2 является условием продолжения цикла, а выражениеЗ изменяет параметр цикла.

 

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

Работает оператор следующим  образом: сначала выполняется выражение т. е. задается начальное значение переменной, управляющей циклом. Затем проверяется выражение. Если условие истинно (имеет ненулевое значение), то выполняется тело цикла. После завершения тела цикла выполняется выражениеЗ, определяющее обычно изменение параметра цикла. Затем опять проверяется условие, записанное как выражение2, и при истинности этого условия выполнение цикла продолжается. Как только на очередном витке цикла выражение2 примет значение false (нулевое значение), цикл прерывается и управление передается следующему оператору программы.

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

 

 

                                                          Вложенные циклы

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

for (k=1; k<=10; k++)   

{  … 

   for (i=1; i<=10; i++)

     { …

        for (m=1; m<=10; m++)

        {    ...

         }

       }

  }

 

 

 

 

 

Операторы  цикла c предусловием  while  и постусловием  do-while

  while  (условие)

  { последовательность ператоров };


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

Вначале вычисляется и проверяется  условие. Если оно изначально ложно, то последовательность операторов не выполняется и управление передается на следующий оператор программы. Если условие истинно (не нуль), то выполняется последовательность операторов. Повторение выполнения тела оператора  происходит до  тех  пор, пока условие остается истинным.

 

do { последовательность операторов } while  (условие);


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

Вначале выполняется последовательность операторов, затем вычисляется и  проверяется условие. Если условие  ложно, то оператор завершается и  управление передается следующему оператору  в программе. Если условие истинно  (не равно нулю), то тело оператора выполняется снова и снова проверяется условие. Выполнение тела оператора  продолжается до тех пор, пока условие не станет ложным.

Если тело цикла состоит из одного оператора, то операторные скобки {} не обязательны. Операторы while и do-while могут также завершиться при выполнении  операторов  break,  goto, return внутри тела.

Оператор цикла вида for (выражение1; выражение2; выражение3)  оператор;

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

           выражение1;

           while (выражение2)

           {  операторы;

               выражение3;     }

Так же как и при выполнении оператора for, в операторе while вначале происходит проверка условия. Поэтому оператор while удобно использовать в ситуациях, когда тело оператора не всегда нужно выполнять.

 


 

 

 

Понятие массива

Массив (Array) в  программировании – это упорядоченная совокупность однотипных элементов. Массивы широко используют для хранения и обработки однородной информации, например, таблиц, векторов, матриц, коэффициентов уравнений и др.

Каждый элемент  массива однозначно определяется именем и индексами. Имя массива (идентификатор) подбирают за теми же правилами, что  и для переменных. Индексы определяют местоположение элемента в массиве. Например, элементы вектора имеют один индекс – номер по порядку; элементы матриц и таблиц имеют по два индекса: первый определяет номер строки, второй - номер столбца. Количество индексов определяет размерность массива. Например, векторы в программах – это одномерные массивы, матрицы – двумерные. В этой лекции рассмотрим только одномерные массивы.

Объявление  одномерных массивов

Одномерный массив объявляется  в программе следующим образом:

тип_данных   имя_массива [размер_массива];


Имя_массива – это идентификатор массива. Тип_данных задает тип элементов объявляемого массива. Элементами массива не могут быть функции и элементы типа void. Размер_массива в квадратных скобках задает количество элементов массива. В отличие от языка Pascal в С не проверяется выход за пределы массива, поэтому, чтобы избежать ошибок в программе, следите за размерами описанных массивов. Значение размер_массива при объявлении массива может быть опущено в следующих случаях:

– при объявлении массив инициализируется,

– массив объявлен как формальный параметр функции,

– массив объявлен как ссылка на массив, явно определенный в другом файле.

Используя имя массива и индекс, можно адресоваться к элементам  массива:

имя_массива [ значение_индекса ]


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

Например:   int A[10];

объявляет массив с именем А, содержащий 10 целых чисел. А[0] – значение первого элемента, А[1] – второго, А[9] – последнего.

Типу массив соответствует память, которая требуется для размещения всех его элементов. Элементы массива  с первого до последнего запоминаются в последовательных возрастающих адресах  памяти. Между элементами массива  в памяти разрывы отсутствуют. Элементы  массива  запоминаются друг за другом поэлементно. Так под размещение элементов одномерного массива   int В[5]   выделяется по 4 байта под каждый из 5 элементов массива – всего 20 байтов.

Элементы

В[0]

В[1]

В[2]

В[3]

В[4]

Байты

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20




Таким образом, чтобы получить доступ к i-тому элементу массива В, можно написать В[i]. При этом величина i умножается на размер типа int и представляет собой адрес i-го элемента массива В от его начала, после чего осуществляется выборка элемента массива В по сформированному адресу.

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

 

Указатели

Указатель – переменная, которая указывает на другую переменную (содержит местоположение другой переменной в форме адреса). В этом смысле имя переменной «отсылает» к ёё значению непосредственно, а указатель – косвенно. Ссылка на значение указателя называется косвенной адресацией.

Указатели, подобно любым другим переменным, перед своим использованием должны быть объявлены. При объявлении переменной типа указатель, необходимо определить тип объекта данных, адрес которых будет содержать переменная, и имя указателя с предшествующей звездочкой (или группой звездочек). Формат объявления указателя:

тип_данных *имя_указателя 


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