Работа со структурами данных: программирование списков на языке C /C++

Автор работы: Пользователь скрыл имя, 14 Мая 2012 в 15:59, курсовая работа

Описание работы

В течение многих лет стандартом C де-факто была версия, поставляемая для операционной системы UNIX System V. Растущая популярность компьютеров привела к созданию множества приложений для C.
C часто называют языком среднего уровня. Это определение означает, что он объединяет элементы языков высокого уровня с функциональностью ассемблера.
Известно, какое значение приобретает сегодня объектно-ориентированное программирование, учитывая возрастающие требования к качеству, надежности и пользовательскому интерфейсу приложений. Сложность и объем программ все время растут. В свете этого объектно-ориентированные языки, и прежде всего C++, становятся едва ли не единственным средством решения встающих перед программистом задач.

Содержание работы

ВВЕДЕНИЕ 3
1 ПОСТАНОВКА ЗАДАЧИ 4
1.1 Общая характеристика задачи 4
1.2 Динамические двусвязные списки 5
2 РАЗРАБОТКА АЛГОРИТМА ЗАДАЧИ 14
2.1 Описание данных, используемых для решения задачи 14
2.2 Описание схемы программы 14
3 КОДИРОВАНИЕ ПРОГРАММЫ 15
3.1 Описание структуры разрабатываемого пакета 15
4 ТЕСТИРОВАНИЕ ПРОГРАММЫ 20
4.1 Внешний вид программы 20
4.2 Работа программы 20
ЗАКЛЮЧЕНИЕ 24
СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ: 25
ПРИЛОЖЕНИЕ А (ДИНАМИЧЕСКИЙ ДВУНАПРАВЛЕННЫЙ СПИСОК) 26

Файлы: 1 файл

динамический двунаправленый список.doc

— 228.50 Кб (Скачать файл)

// Изменение значения компонента

void comp_edit(comp &c, char* v)

{

              strcpy_s(c.value, 10, v);

}

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

Тест функции

 

Ну, тут все просто, в цикле нам осталось лишь обратиться к функции добавления компонента в список. После цикла, тестируем остальные наши функции и выводим весь список в файл. Привожу здесь весь код функции main()

int main()

{

              char* fileName = new char[50];

              char* buf_name = new char[20];

              char* buf_value = new char [10];

              dyn_list vars; // Динамический список

              cout << "Enter name of file -> ";

              cin >> fileName;

              ifstream* inp = new ifstream(fileName);

              if (!inp->good())

              {

                            cout << "File opening error!\n";

                            system("PAUSE");

                            return 0;

              }

              constr_list(vars);

              while (!inp->eof())

              {

                            inp->getline(buf_name, 20, ' ');

                            inp->getline(buf_value, 10, ' ');

                            comp_in(vars, buf_name, buf_value);

              }

              inp->close();

              comp* p = new comp();

              p = search(vars, "z");

              if (p)

                            comp_del(vars, p);

              p = search(vars, "abc");

              if (p)

                            comp_edit(*p, "2");

              ofstream* out = new ofstream(fileName);

              while (vars.head != NULL)

              {

                            out->write(vars.head->name, strlen(vars.head->name));

                            out->write(" ",1);

                            out->write(vars.head->value, strlen(vars.head->value));

                            out->write(" ",1);

                            vars.head = vars.head->next;

              }

              out->close();

              system("PAUSE");

              return 0;

}

Задача решена.

Выводы

 

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

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2                    Разработка алгоритма задачи

2.1 Описание данных, используемых для решения задачи

В данной задаче использовались следующие данные:  

исходные (входные) данные:

char num[20]; // Имя переменной для обозначения номера маршрута

char marsh[10]; // Значение маршрута

int hour; // Значение часа

int min;// Значение минут

char price[10]; // Значение переменной цены билета

выходные результаты решения: 

• вывод на экран информации о билетах;

• выборка из списка билетов, проданных с 7 до 8 вечера;

• вывод всего списка;

• очистка всего списка;

• поиск элемента списка по заданному значению;

• удаление элемента по заданному значению;

2.2 Описание схемы программы

Схема алгоритма отображает последовательность операций в программе.

Произведено выделение основных этапов в виде подпрограмм, выполняющих сле­дующие действия:             

      ввод исходных данных;

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

Все подпрограммы выполнены в виде процедур. Основные процедуры и про­грамма выполнены на листе.  При этом описание функционального назначения блоков алгоритма приведено в комментариях.

3 Кодирование программы

3.1 Описание структуры разрабатываемого пакета

 

Программа курсовой работы разработана  в среде визуального  программирования  С++   и  состоит из исполняемого файла с расширением .cpp.

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

1)     Структура:

struct avtoticket {

                            char num[20]; // Имя переменной для обозначения номера

                            char marsh[10]; // Значение маршрута

                            int hour; // Значение часа

                            int min;// Значение минут

                            char price[10]; // Значение переменной цены

                            avtoticket* next; //Ссылка на следующий элемент списка

                            avtoticket* prev; //Ссылка на следующий элемент списка

};

                            struct dyn_list {

                            avtoticket* head; // Первый элемент (голова) списка

                            avtoticket* tail; // Последний элемент (хвост) списка

              };

 

2)     Основные процедуры и функции:

 

// Создание пустого списка

void constr_list(dyn_list &l)

{

              l.head = NULL;

}

// Проверка списка на пустоту

bool chk_empty(dyn_list l)

{

              return (l.head==NULL);

}

 

int kol;

int koll;

// Включение в список нового компонента

void avtoticket_in(dyn_list &l, char* m, char* o,int p, int r,char* a)

{

              koll++;

              avtoticket* c = new avtoticket();

              strcpy_s(c->num, 20, m);

              strcpy_s(c->marsh, 10, o);

    c->hour=p;

              c->min=r ;

              strcpy_s(c->price, 10, a);

              c->next = NULL;

              if (chk_empty(l))

                            l.head = c;

              else

                            l.tail->next = c;

              l.tail = c;

}

void show(dyn_list &l) // Вывод всего списка

{

              cout <<"Number: Marshrut: Vremya(h): Vremya(m): Price  "<<endl;

     while (l.head != NULL)

              {

              cout <<l.head->num<<"        ";

              cout <<l.head->marsh<<"        ";

              cout <<l.head->hour<<"         ";

              cout <<l.head->min<<"          ";

              cout <<l.head->price<<endl;

              l.head = l.head->next;

              }

}

void showone(dyn_list &l,avtoticket* h)// Вывод одного элемента(используктся в теле функции поиска по параметру)

{

              cout <<"Number: Marshrut: Vremya(h): Vremya(m): Price  "<<endl;

    l.head != h;

              cout <<l.head->num<<"        ";

              cout <<l.head->marsh<<"        ";

              cout <<l.head->hour<<"         ";

              cout <<l.head->min<<"          ";

              cout <<l.head->price<<endl;

             

}

// Поиск компонента в списке по времени с 7 до 8

avtoticket* search(dyn_list l)

{

              while (l.head != NULL)

              {

                            if ((l.head->hour==7) | ((l.head->min==0) & (l.head->hour==8)))

 

                            {

                                          showone(l,l.head);

                            }

                            l.head = l.head->next;

              }

              return l.head;

}

avtoticket* searchnum(dyn_list l, char *a)// Поиск компонента в списке по номеру маршрута

{

              while (l.head != NULL)

              {

                            if (!strcmp(l.head->num,a))

                            {

                                          showone(l,l.head);

                            }

                            l.head = l.head->next;

              }

              return l.head;

}

 

avtoticket* searchdel(dyn_list l, char *a)// Поиск компонента в списке для удаления по определенному ключу(в данном случае по маршруту)

{

              while (l.head != NULL)

              {

                            if (!strcmp(l.head->marsh,a))

                            {

                                          return l.head;;

                            }

                            l.head = l.head->next;

              }

              return l.head;

}

 

// Удаление компонента из списка

void avtoticket_del(dyn_list &l, avtoticket* c)

{

              if (c == l.head)

              {

                            l.head = c->next;

                            return;

              }

              avtoticket* r = new avtoticket();

              r = l.head;

              while (r->next != c)

                            r = r->next;

              r->next = c->next;

              delete c;

}

 

void show_menu ()// реализация меню в программе

{

   cout << "Press any of this keys..." << endl;

   cout << setiosflags (ios::left)

        << setw (15) << "[ 1 - Add ] "<< endl

        << setw (15) << "[ 2 - Show all ] "

        << setw (15) << "[ 3 - Tickets 7-8 PM ]"

        << setw (15) << "[ 4 - Delete All ]"<< endl

                            << setw (15) << "[ 5 - Find of number marsh ]"

                            << setw (15) << "[ 6 - Delete on position]"

        << endl << endl;

}

4 Тестирование программы

 

4.1 Внешний вид программы

 

Запуск программы производится из среды C++ нажатием клавиш F5. При запуске программа сама просит ввести все необходимые данные и сохраняет результаты в текстовый файл.

4.2 Работа программы

Основное окно программы имеет вид:

Рис. 1 – Основное окно программы

это диалоговое окно-меню, где выбирается необходимая операция;

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

Рис. 2 – Выбор первой операции

 

При выборе второй операции (вывод всего списка) программа будет выглядеть следующим образом:

Рис. 3 – Выбор второй операции

 

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

Рис. 4 – Выбор третьей операции

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

 

Рис. 5 – Выбор четвертой операции

Рис. 6 – Выбор пятой операции

Рис. 7 – Выбор шестой операции

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Заключение

 

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

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Список используемой литературы:

 

1.                 Б.Керниган, Д.Ритчи, А.Фьюер. Язык программирования Си. Задачи по языку Си. М.: Финансы и статистика, 2008.

2.                 М.Уэйт, С.Прата, Д.Мартин. Язык Си. Руководство для начинающих. - М.: Мир, 1998.

3.                 М.Болски. Язык программирования Си. Справочник. - М.: Радио и связь, 1998.

4.                 Л.Хэнкок, М.Кригер. Введение в программирование на языке Си. - М.: Радио и связь, 1990.

5.                 Р.Берри, Б.Микинз. Язык Си. Введение для программистов. - М.: Финансы и статистика, 1988.

6.                 S.Dewhurst, K.Stark. Programming in C++. - Prentice Hall, 1989.

7.                 M.Ellis, B.Stroustrup. The annotated C++ Reference Manual. - Addison-Wesley, 19

8.                 ТО 04-2008

9.                 Герберт Шилдт  «Справочник программиста по C/C++, второе издание»   - Москва – Санкт-Петербург – Киев 2001 г.

10.            Т.А. Павловская  «C/C++  программирование на языке высокого уровня» - Москва – Санкт-Петербург 2005 г.

 

 

 

 

 

 

 

 

Приложение А (Динамический двунаправленный список)

Листинг программы:

#include <fstream>

#include <iostream>

#include <cstdlib>

#include <iomanip>

//TODO: Описание списка

//TODO: Операции со списком

using namespace std;

              struct avtoticket {

                            char num[20]; // Имя переменной для обозначения номера

                            char marsh[10]; // Значение маршрута

                            int hour; // Значение часа

                            int min;// Значение минут

                            char price[10]; // Значение переменной цены

Информация о работе Работа со структурами данных: программирование списков на языке C /C++