Автор работы: Пользователь скрыл имя, 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
// Изменение значения компонента
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;
}
Задача решена.
Выводы
Несмотря на то, что кому-то могла показаться сложной работа с динамическим списком, на деле все оказывается не только довольно просто, но еще и удобно - компоненты создаются и удаляются динамически, размерность списка ограничивается лишь доступной памятью, после того, как компонент больше не используется, память можно сразу же высвободить для других узлов.
В любом случае, использовать связанные списки в своих программах или нет, придется решать вам, надеюсь, моя статья хоть немного поможет вам в этом.
В данной задаче использовались следующие данные:
исходные (входные) данные:
char num[20]; // Имя переменной для обозначения номера маршрута
char marsh[10]; // Значение маршрута
int hour; // Значение часа
int min;// Значение минут
char price[10]; // Значение переменной цены билета
выходные результаты решения:
• вывод на экран информации о билетах;
• выборка из списка билетов, проданных с 7 до 8 вечера;
• вывод всего списка;
• очистка всего списка;
• поиск элемента списка по заданному значению;
• удаление элемента по заданному значению;
Схема алгоритма отображает последовательность операций в программе.
Произведено выделение основных этапов в виде подпрограмм, выполняющих следующие действия:
ввод исходных данных;
вывод полученных результатов (поиск удовлетворяющей заявки, вывод всего списка) на экран .
Все подпрограммы выполнены в виде процедур. Основные процедуры и программа выполнены на листе. При этом описание функционального назначения блоков алгоритма приведено в комментариях.
Программа курсовой работы разработана в среде визуального программирования С++ и состоит из исполняемого файла с расширением .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;
}
Запуск программы производится из среды C++ нажатием клавиш F5. При запуске программа сама просит ввести все необходимые данные и сохраняет результаты в текстовый файл.
Основное окно программы имеет вид:
Рис. 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++