Электронный журнал

                   ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ 

Государственное образовательное учреждение высшего 

профессионального образования

Нижегородский государственный университет им. Н.И. Лобачевского 
 

Экономический факультет

Кафедра экономической информатики 

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

По дисциплине: «Высокоуровневые методы информатики и программирования»

на тему:

«Электронный журнал» 
 

Выполнил(а) студент(ка)

2-го курса очного отделения

Группы  

Научный руководитель: 
 
 
 
 

Нижний  Новгород, 2011 год

Содержание 

Введение………………………………………………………………….…… 3
Глава 1. Выбор метода реализации……………………...………………... 5
1.1 Обоснование  выбора языка программирования………………………... 5
Техническое описание языка программирования…………………… 6
1.3 Технические требования к компьютеру  для решения задачи …………. 7
Глава 2.  Теоретические основы……………………...…………………… 8
2.1Динамические  массивы …………………………………………………... 8
2.2Динамическое  распределение памяти …………………………………… 9
2.3 Классы …………………………………………………………………….. 9
2.4 Структуры ……………………...…………………………………………. 10
Глава 3.  Руководство программиста……………………...……………… 12
Глава 4. Руководство пользователя ……………………...………………. 15
Глава 5.  Математическое и программное обеспечение ………………. 16
5.1.Математическое  обеспечение……………………...………………………................................. 16
5.2.Спецификация  функций ……………………...………………………….. 19
Глава 6. Тестирование программы ……………………...……………….. 25
Заключение…………………………………………………...………………. 31
Список  литературы…………………………………………………………. 32
Приложение…………………………………………………...……………… 33
 
 
 
 
 
 
 
 
 

                                           Введение 

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

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

Цель  работы заключается в создание программы на языке С++ с использованием динамических массивов структур для обработки базы данных «Электронный журнал», представленной виде следующей таблицы:

N ФИО Город C номера На номер Время Ед.
 

               Постановка задачи: разработать программу на С++  с использованием динамических массивов структур. Обработка данных должна включать следующие функции:

1) создание новой базы данных ;

2) редактирование  базы данных ;

4) дополнение  базы данных новыми записями ;

5) удаление  записей из базы данных ;

6) поиск  в базе данных ( по одному и  двум поисковым признакам) с выводом на экране найденных записей или сообщения о неуспешном поиске;

7)сортировку данных по заданному полю (с сохранением в файле результатов сортировки).

      Программа должна обеспечивать режим доступа  к функциям в виде меню в режиме консоли. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

    Глава 1. Выбор метода реализации 

1.1 Обоснование выбора языка программирования 

      Microsoft Visual Studio 2008 - один из самых популярнейших систем программирования. Он является объектно-ориентированным языком высокого уровня. Его среда прекрасно подходит для разработки приложений практически любого типа. Можно создавать мощные автономные приложения, служебные утилиты, математические задачи, игры, библиотеки dll, файлы ресурсов, затратив на это меньше времени, чем при работе с любым другим языком программирования. Различные технологии позволяет писать приложения с поддержкой Internet, возможности которых ограничиваются только фантазией программиста. MS Visual Studio 2008 содержит графическую среду, в которой можно наглядно контролировать экранные формы и управляющие элементы, используемые в ваших приложениях.

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

      Также в MS Visual Studio 2008 можно создавать программы не только на языке C++, но и на языках C#, VB и прочих.

      Для быстрого создания диалоговых программ можно использовать MFC, то есть это базовый набор классов, написанных на языке С++ и предназначенных для упрощения и ускорения процесса программирования под Windows. Перед изучением библиотеки MFC и ее использованием для создания Windows-приложений, следует вспомнить, как работает сама Windows и каковы принципы взаимодействия программ с ней, какова структура типичной Windows-программы. 
 

1.2  Техническое описание языка программирования 

      Основная  программная единица на языке  С++ - это текстовый файл с названием <имя>.cpp, где cpp – принятое расширение для программ на С++, а имя выбирается достаточно произвольно. Для подключения таких файлов к проекту, используется директива препроцессора #include. Эта директива вставляет в программу заранее подготовленные тексты из включаемых файлов. Сформированный таким образом измененный текст программы поступает на компиляцию. 

      В алфавит языка С++ входят:

            - прописные и строчные  буквы латинского алфавита;

            - цифры 0, 1, 2, 3, 4, 5, 6, 7, 8, 9;

              - специальные знаки: "   {}  ,  |   []   ()  +   -   /   %   \   ;   '   :  ?   <  =  >  _ !   &  #   ~   ^    .    * 

      Из  символов алфавита формируются лексемы  языка:

            - идентификаторы;

            - ключевые (зарезервированные)  слова;

            - константы;

            - знаки операций;

            - разделители (знаки  пунктуации). 

      Для определения и описания переменных основных типов используются следующие ключевые слова, каждое из которых в отдельности может выступать в качестве имени типа:

            - char (символьный);

            - short (короткий целый);

            - int (целый);

            - long (длинный целый);

            - float (вещественный);

            - double (вещественный с удвоенной точностью);

            - void (отсутствие значения).

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

      Также в определении типа может использоваться одновременно несколько служебных  слов (long double <имя>), то есть объявляется переменная <имя> вещественного типа повышенной точности. 

1.3 Технические требования к компьютеру для решения задачи 

      Для работы программы необходимы следующие  ресурсы:

        - процессор: Pentium 4 (а также другие  современные процессоры других  производителей);

        - объем   оперативной   памяти: 512   Мбайт;

        - место на жестком диске: 25 Мбайт;

        - операционная система: Windows 2000, Windows XP, Windows 2003, Windows Vista, Windows 7;

        - устройство чтения компакт-дисков;

        - манипулятор типа мышь;

        - устройство ввода (клавиатура). 
         
         
         
         

Глава 2.  Теоретические основы 

2.1Динамические массивы

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

        Когда пользователь создает объект класса-оболочки, конструктор класса выделяет память под массив, который имеет либо указанный пользователем размер, либо размер, заданный по умолчанию. Если по мере заполнения массива вся выделенная память окажется занятой, то при добавлении очередного элемента выделенная ранее память освобождается, все хранящиеся в массиве значения сохраняются во временном массиве. Затем выделяется память под массив большего размера и в него помещаются сохраненные значения. Таким образом, изменение размера массива происходит автоматически, невидимо для пользователя.

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

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

2.2Динамическое распределение памяти 

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

      Система динамического распределения  памяти – это средство получения  программы некоторой области  памяти во время ее  выполнения.

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

2.3 Классы 

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

    Определяя класс, объявляются  данные которые он содержит, и  код, который выполняется над  этими данными. 

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

       Объявление класса начинается  с ключевого слова class.

 Объявление класса синтаксически подобно объявлению структуры.

      По умолчанию члены класса  являются закрытыми (private-членами   Имя структуры – это ее спецификатор типа).

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

2.4 Структуры 

      Структура – это группа связанных  переменных.

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

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

     Член структуры – это переменная, которая является частью структуры. 

      В общем случае все члены структуры должны быть логически связанны

друг  с другом.  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Глава 3.  Руководство программиста

Описание  разработанных функций 

3.1.Информационное обеспечение 

Таблица 1. Перечень классов

Идентификатор Описание
1 elem Класс, содержащий элементы списка
2 list Класс, содержащий непосредственно список с элементами и функции, обеспечивающие работу с  ним
       
Таблица 2. Описание функций класса elem
Идентификатор Тип данных Описание
1 operator = elem Функция, осуществляющая перегрузку оператора копирования элементов
       
Таблица 3. Описание других элементов класса elem
Идентификатор Тип данных Описание
Общедоступные (public)
1 teleph Символьный заказываемый  номер телефона
2 tel Символьный номер телефона заказчика
3 name Символьный ФИО заказчика
4 city Символьный вызываемый  город
5 time Целочисленный беззнаковый длительность  оплаченного разговора, в секундах
6 index Целочисленный беззнаковый Номер заказа в  общей очереди
7 next elem указатель на следующий  элемент списка
8 prev elem указатель на предыдущий элемент списка
       
Таблица 4. Описание функцийкласса list
Идентификатор Тип данных Описание
1 indexing Функция, не возвращающая значение Функция по изменению  нумерации списка в связи со вставкой или удалением элемента
2 getElem elem Функция, осуществляющая получение указателя на элемент  в списке по его номеру в списке
3 addElem Функция, не возвращающая значение Функция, осуществляющая добавление элемента в список
4 findCity elem Функция, осуществляющая поиск номера заказа для заданного города
5 removeElem Функция, не возвращающая значение Функция, осуществляющая удаление элемента по его номеру
6 add Функция, не возвращающая значение Функция по добавлению заказа в список
7 remove Функция, не возвращающая значение Функция, осуществляющая удаление элемента по его номеру
8 operator<< Поток вывода (ostream) Функция, осуществляющая перегрузку оператора вывода списка
9 sortTime Функция, не возвращающая значение Функция, осуществляющая сортировку списка по длительности разговора
10 printCallsToCity Функция, не возвращающая значение Функция, осуществляющая вывод списка звонков в указанный  город
       
Таблица 5. Описание других элементов класса list
Идентификатор Тип данных Описание
Защищенные  члены (private)
1 head elem указатель на начальный  элемент списка
2 tail elem указатель на конечный элемент списка
3 N Целочисленное беззнаковое количество  элементов в списке
       
Таблица 6.Описание входных данных
Идентификатор Тип данных Описание
1 teleph Символьный заказываемый  номер телефона
2 tel Символьный номер телефона заказчика
3 name Символьный ФИО заказчика
4 city Символьный вызываемый  город
5 time Целочисленный беззнаковый длительность  оплаченного разговора, в секундах
6 index Целочисленный беззнаковый Порядковый  номер элемента
       
Таблица 7. Описание выходных данных
Идентификатор Тип данных Описание
1 ls list Список заказов

Глава 4. Руководство пользователя 

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

Требования  к решению задачи.

По каждому  заказу хранятся:

    - вызываемый город;

    - заказываемый номер телефона;

    - ФИО заказчика;

    - номер телефона заказчика;

    - длительность оплаченного разговора.

Задача  должна решаться с помощью диалоговой системы, позволяющей выполнить :

    - прием заказа;

    - исполнение очередного заказа(удаление заказа);

    - определение номера заказа в  общей очереди заказов;

    - определение номера заказа для  заданного города;

    - включение срочного заказа в  очередь под номером N;

    - формирование списка заказов  в заданный город;

- упорядочение  заказов по возрастанию времени  заказанного разговора

 

Глава 5. Математическое и программное обеспечение

Алгоритм  решения задачи

1.Математическое обеспечение:

  1. Описание  ограничений на входную информацию
    1. Time> 0
    2. Index > 0
    1. Структурная декомпозиция.

Формирование  списка.

  1. Прием заказа
  2. Удаление заказа
  3. Включение заказа в список
  4. Вывод списка на экран
  5. Формирование списка в указанный город и вывод списка
  6. Сортировка по времени разговора и вывод списка
  7. Организация интерфейса пользователя
    1. Описание  алгоритма решения.
  1. drawMenu
    1. Применяем оператор Switch
    2. Описываем все возможные варианты работы с меню
  2. main
    1. Описываем переменные, присваиваем значения.
    2. Вызов функции drawmenu уровня 0
    3. Оператор Switch
    4. Работа с блоком «Управление списком»
    5. Вызов функции drawmenu уровня 1
    6. Цикл пока key≠0
      1. Оператор switch
      2. Добавление заказа
        1. Ввод данных
        2. Вызов функции add
      3. Добавление срочного заказа
        1. Ввод данных
        2. Вызов функции add
      4. Удаление заказа
        1. Выбор порядкового номера заказа для удаления
        2. Вызов функции remove
      5. Формирование общего списка
        1. Вывод списка на экран
      6. Формирование списка в указанный город
        1. Ввод названия города из списка
        2. Вызов функции printCallsToCity
      7. Сортировка относительно длительности разговора
        1. Вызов функции sortTime
        2. Вывод списка на экран
      8. Конец цикла
    7. Работа с блоком «О программе»
    8. Вызов функции drawmenu уровня 2
    9. Цикл пока key ≠ 0
    10. Блок выхода из меню
    11. Цикл пока не нажата клавиша esc
      1. Если нажат enter возврат к меню
  3. indexing
    1. Объявляем переменные
    2. Проходим по списку и изменяем нумерацию
  4. getElem
    1. Объявляем переменные
    2. Если индекс некорректен (>=Nили<0) то возвращаем NULL
    3. Цикл пока не конец списка
      1. Если нашли номер, возвращаем указатель на него
      2. В противном случае идем дальше
    4. Возвращаем NULL
  5. addElem
    1. Объявление переменных
    2. Если конец списка
      1. Делаем новый элемент «Хвостом» списка
    3. Если список пуст
      1. Вставляем элемент
    4. Если начало списка
      1. Делаем новый элемент «Головой» списка
    5. В противном случае вставляем элемент перед указанным номером
    6. Вызов функции indexing
    7. Увеличиваем число элементов списка на 1
  6. findCity
    1. Объявляем переменные
    2. Указатель на элемент в списке при помощи функции getElemставим на номер искомого элемента
    3. Цикл пока есть список
      1. Если название совпадает с искомым
        1. описываем его номер
        2. Возвращаем указатель на элемент в списке
      2. Переставляем указатель на следующий элемент
    4. Зануляем номер элемента с которого надо начинать поиск
  7. аdd
    1. Объявляем переменные
    2. Проверяем условия, при которых могут возникнуть ошибки
    3. Создаем новый элемент списка
    4. Копируем в него все необходимые параметры
    5. Применяем функцию addElem
  8. remove
    1. Объявляем переменные
    2. Если не найден номер, то выводим сообщение о том, что номер не найден
    3. Если указатель на предыдущий элемент не NULL, то при помощи двух указателей «затираем дырку» в списке
    4. В противном случае, если конец списка, делаем «хвостом» предыдущий элемент
    5. Затираем указатель
    6. Вызов функции indexing
  9. operator<<
    1. Объявляем переменные
    2. Устанавливаем выравнивание слева
    3. Выводим табличкой данные
  10. sortTime
    1. Объявление переменных
    2. Ставим указатель на начало списка, в «голову»
    3. Цикл пока можно передвинуть указатель на следующий элемент
      1. Приравниваем два указателя: один к указателю, указанному как «голова», другой к указателю на элемент, следующий за «головой»
      2. Цикл пока есть следующий элемент
        1. Ставим указатель на позицию элемента, следующего за «головой»
        2. Сравниваем время
          1. Сортировка пузырьком
        3. Передвигаем указатель на следующую позицию
        4. Конец цикла
      3. Передвигаем указатель на следующую позицию
    4. Конец цикла
  11. printCallsToCity
    1. Объявляем переменные
    2. Если не найден город, выводим сообщение об ошибке
    3. Вызываем функцию findCity
    4. Выравниваем по левому краю
    5. Выводим табличку на экран

1.2.Спецификация функций

 
1.     Функция indexing – для изменения нумерации списка в связи со вставкой или удалением элемента
1.1.        Возвращаемые значения - отсутствуют
1.2.        Параметры - отсутствуют
1.3.        Локальные переменные
Идентификатор Тип Описание
1 tmp elem Указатель на элемент
2 id Цилочисленноебеззнаковое Номер элемента
       
2. ФункцияgetElem–для получения указателя на элемент в списке по его номеру в списке
1.1.        Возвращаемые значения
Идентификатор Тип Описание
1 tmp elem Указатель на элемент
       
1.2.        Параметры
Идентификатор Тип Описание
1 index Целочисленное беззнаковое Номер элемента в списке
       
1.3.        Локальные переменные
Идентификатор Тип Описание
1 tmp elem Указатель на элемент списка
       
 
2.     ФункцияaddElem–для добавления элемента в список
2.1.        Возвращаемые значения - отсутствуют
2.2.        Параметры
Идентификатор Тип Описание
1   element elem Указатель на новый элемент списка
 
2.3.        Локальные переменные
Идентификатор Тип Описание
1 id Целочисленное безнаковое номер
2 f elem Указатель на элемент списка
       
3.     ФункцияfindCity–для поиска элемента по указанному городу
3.1.        Возвращаемые значения
Идентификатор Тип Описание
1 tmp elem Указатель на элемент списка
       
3.2.        Параметры
Идентификатор Тип Описание
1 id Целочисленное беззнаковое номер
2 City символьный Указатель на искомый город
       
3.3.        Локальные переменные
Идентификатор Тип Описание
1 tmp elem Указатель на элемент списка
       
4.     Функцияadd  - для добавления нового элемента в список
4.1.        Возвращаемые значения - отсутствуют
4.2.        Параметры
Идентификатор Тип Описание
1 Teleph Символьный Указатель  на номер вызываемого абонента
2 Tel Символьный Указатель на номер вызывающего абонента
3 Name Символьный Указатель на имя абонента
4 city Символьный Указатель на город
5 time Целочисленный беззнаковый Время разговора
6 index Целочисленный беззнаковый Номер позиции, в какую необходимо добавить элемент  списка
       
4.3.        Локальные переменные
Идентификатор Тип Описание
1 tmp elem Указатель на элемент списка
       
 
 
 
 
5.     Функцияremove–для удаления элемента по его номеру
5.1.        Возвращаемые значения - отсутствуют
5.2.        Параметры – отсутствуют
Идентификатор Тип Описание
  index Целочисленный беззнаковый Номер позиции
       
5.3.        Локальные переменные
Идентификатор Тип Описание
tmp elem Указатель на элемент списка
2 Tmp2 elem Указатель на элемент списка
       
6.     Функция operator<<–для вывода списка в виде таблицы на экран.
6.1.        Возвращаемые значения
Идентификатор Тип Описание
1 stream оstream (системный  класс для управления выводом) Переменная  для вывода на экран
       
 
6.2.        Параметры
Идентификатор Тип Описание
stream оstream (системный  класс для управления выводом) Переменная  для вывода на экран
2 ls list Список  звонков
       
6.3.        Локальные переменные
Идентификатор Тип Описание
1 tmp elem Указатель на элемент списка
 
 
 
 
7.     ФункцияsortTime–для сортировки списка по времени разговора
7.1.        Возвращаемые значения - отсутствуют
7.2.        Параметры - отсутствуют
7.3.        Локальные переменные
Идентификатор Тип Описание
tmp elem Указатель на элемент списка
2 tmp2 elem Указатель на элемент списка
3 f elem Указатель на элемент списка
4 t elem Указатель на элемент списка
5 srt elem Переменная  для сортировки данных
       
8.     ФункцияprintCallsToCity – для выводазвонков в указанный город
8.1.        Возвращаемые значения - отсутствуют
8.2.        Параметры
Идентификатор Тип Описание
  City символьный Указатель на город
       
8.3.        Локальные переменные
Идентификатор Тип Описание
1     i Целочисленный Универсальный счетчик
беззнаковый
2 id Целочисленный Номер элемента
беззнаковый
       
 
 
 
 
 
 
9.     ФункцияdrawMenu - для отрисовки меню
9.1.        Возвращаемые значения - отсутствуют
9.2.        Параметры
Идентификатор Тип Описание
1     Level Целочисленное беззнаковое Уровень вложенности
       
9.3.        Локальные переменные
Идентификатор Тип Описание
1      i Целочисленный Универсальный счетчик
беззнаковый