Разработка и реализация программы на языке С++ с использованием класса статических массивов структур и текстовой базы данных «Train»
В основе структурного тестирования лежит концепция максимально полного тестированиявсех маршрутов программы. Так, если алгоритм программы включает ветвление, то при одномнаборе исходных данных может быть выполнена последовательность операторов, реализующаядействия, которые предусматривает одна ветвь, а при втором — другая. Соответственно, дляпрограммы будут существовать маршруты, различающиеся… Читать ещё >
Разработка и реализация программы на языке С++ с использованием класса статических массивов структур и текстовой базы данных «Train» (реферат, курсовая, диплом, контрольная)
- программа рейс поезд алгоритм
- Аннотация
- Введение
- 1. Постановка задачи
- 1.1 Условия задачи
- 1.2 Конечные цели решения задачи
- 1.3 Формы выдачи результатов
- 1.4 Описание используемых данных
- 2. Задание
- 3. Анализ и исследование задачи
- 3.1 Типы решения задачи
- 3.2 Математическая модель
- 4. Алгоритм решения задачи
- 4.1 Метод проектирования алгоритма
- 4.2. Блок-схемы функций
- 4.3 Метод тестирования
- 5. Создание программы
- 5.1 Дерево функций
- 5.2 Последовательность создания программы
- 5.3 Сценарий диалога программы
- Заключение
- Приложение
- Аннотация
- Данная курсовая работа посвящена разработке и реализации программы на языке С++ с использованием класса статических массивов структур и текстовой базы данных «TRAIN» .
- Программа обеспечивает возможность работы над существующей базой данных, в которой хранится информация о пункте назначения, пункте отправления, номере поезда, количестве мест в поезде, также выполнение требуемых функций по работе с этими данными. Курсовая работа содержит описание разработанных функций, листинг программы, блок-схемы алгоритмов, дерево функции, программы всех используемых функций и тестирование программы.
- Введение
- В данной курсовой работе будет рассмотрена разработка программы по решению приведенной задачи средствами языка программирования C++. В нашей программе будут использоваться статические массивы и структуры данных, для хранения информации о рейсах «TRAIN», а также предусмотрены возможности добавления, удаления, просмотра данных, а также их сортировка и поиск по нескольким критериям.
- 1. Постановка задачи
1.1 Условия задачи
Разработать программу на С++ с использованием статических массивов структур. Обработка данных должна включать следующие функции:
1) Просмотр существующей базы данных (чтение данных осуществляется из файла);
2) Редактирование базы данных (с сохранением изменений в файле);
3) Дополнение базы данных новыми записями (с сохранением в файле);
4) Удаление записей из базы данных (с сохранением в файле);
5) Поиск в базе данных (по одному и двум поисковым признакам) с выводом на экране найденных записей или сообщения о неуспешном поиске;
6) Сортировку данных по заданному полю.
Программа должна обеспечивать режим доступа к функциям в виде меню в режиме консоли.
1.2 Конечные цели решения задачи
Перед нами стоит задача разработки программы «TRAIN», возможности которой приведены выше.
Следовательно, нашей конечной целью является разработка программы, реализующей требуемые задачи, а также не содержащей ошибки и с понятным для пользователя интерфейсом.
1.3 Формы выдачи результатов
Так как наша программа представляет собой окно в консоли, то результаты будут выдаваться в виде диалога в окне консоли.
Также добавленные записи можно сохранить в текстовый файл, а затем просмотреть его любой программой, поддерживающей открытие документов формата «txt» .
1.4 Описание используемых данных
В программе используется структура «TRAIN», содержащая в себе 4 поля, два из которых символьные и два числовые целого типа:
structtrain char po[l] char pnl[l] intkm intnp | — структура «TRAIN» — пункт отправления — пункт назначения — количество мест — номер поезда | |
2. Задание
Цель работы:
Описать структуру с именем TRAIN, содержащую следующие поля:
Пункт отправления | Пункт назначения | Количество мест | Номео поезда | |
Написать программу, выполняющую следующие действия:
Описать структуру с именем TRAIN, содержащую следующие поля:
? название пункта отправления и назначения;
? номер поезда;
? количество мест.
Написать программу, выполняющую следующие действия:
? Ввод с клавиатуры данных в файл, состоящий из восьми элементов типа TRAIN;
? Загрузка и печать на экране данных из файла
? Добавление записи
? Удаление записи
? Вывод на экран данных и результатов их обработки:
— упорядоченных записей по номерам поездов;
— информации о поезде, номер которого введен с клавиатуры; если таких поездов нет, выдать на дисплей соответствующее сообщение.
— поиск поездов по пункту назначения, начинающемуся с определенной буквы.
— поиск поездов по количеству мест.
3. Анализ и исследование задачи
3.1 Типы решения задачи
Решение задач определяется выбором способа ее решения. Для реализации задачи мы построили модель проектирования структуры программы в виде блок — схем и последовательных шагов к конечному результату.
К каждой подпрограмме составлены блок — схемы, которые служат алгоритмом к написанию кода на языке программирования С++. Также построена модель «Дерева функций» — служит «меню» в структуре построения.
Итогом исследования являются конечные результаты работы программы (ввод, вывод, сортировка, поиск по определенным полям в таблице структуры)
Для решения данной задачи была применена сортировка методом пузырька, последовательный поиск.
3.2 Математическая модель
Для решения поставленной задачи была использована сортировка методом пузырька.
Сортировка простыми обменами, сортиромвкапузырькомм (англ. bubblesort) — простой алгоритм сортировки. Для понимания и реализации этот алгоритм — простейший, но эффективен он лишь для небольших массивов. Сложность алгоритма: O (nІ).
Алгоритм считается учебным и практически не применяется вне учебной литературы, вместо него на практике применяются более эффективные алгоритмы сортировки. В то же время метод сортировки обменами лежит в основе некоторых более совершенных алгоритмов, таких как шейкерная сортировка, пирамидальная сортировка и быстрая сортировка.
Алгоритм состоит из повторяющихся проходов по сортируемому массиву. За каждый проход элементы последовательно сравниваются попарно и, если порядок в паре неверный, выполняется обмен элементов. Проходы по массиву повторяются N-1 раз или до тех пор, пока на очередном проходе не окажется, что обмены больше не нужны, что означает — массив отсортирован. При каждом проходе алгоритма по внутреннему циклу, очередной наибольший элемент массива ставится на своё место в конце массива рядом с предыдущим наибольшим элементом, а наименьший элемент перемещается на одну позицию к началу массива («всплывает» до нужной позиции как пузырёк в воде, отсюда и название алгоритма).
На входе: массив A[N], состоящий из N элементов, с нумерацией от A[1] до A[N]
ЦИКЛ ДЛЯ J=1 ДО N-1 ШАГ 1 ЦИКЛДЛЯI=1ДОN-JШАГ1 ЕСЛИ A[I]>A[I+1]ТООБМЕН A[I], A[I+1] СЛЕДУЮЩЕЕ I СЛЕДУЮЩЕЕ J | FOR J=1TO N-1 STEP 1 FOR I=1TO N-J STEP 1 IF A[I]>A[I+1]THEN SWAP A[I], A[I+1] NEXT I NEXT J | |
Блок-схема 1 — Блок схема алгоритма пузырька
Для поиска, из имеющихся методов, был выбран метод последовательного поиска.
Суть метода заключается в том, что последовательно просматривается массив, пока не будет найден нужный элемент массива. Последовательный поиск в среднем случае выполнит проверку ½n элементов. В наилучшем случае она выполнит проверку только одного элемента, а в наихудшем — n элементов. Если объем данных не велик, эта производительность будет приемлемой.
4. Алгоритм решения задачи
4.1 Метод проектирования алгоритма
Методы проектирования алгоритмов включают: нисходящее проектирование, модульность, структурное программирование.
Нисходящее проектирование предполагает последовательное разбиение исходной задачи на подзадачи до такой конкретизации, когда подзадача сможет быть реализована одним оператором выбранного для программирования языка.
По ходу нисходящего проектирования та или иная подзадача может сформировать самостоятельный модуль. Тогда может быть применен принцип модульного программирования.
Он обеспечивает легкость составления алгоритмов и отладки программ, легкость сопровождения и модификации, а также возможность одновременной разработки различных модулей разными специалистами с использованием разных языков программирования.
При работе над модулем можно применить принцип структурного программирования.
Его цель — повышение читабельности и ясности алгоритма (и программы), более высокой производительности программистов и упрощение отладки. В соответствии с этим принципом для построения любого алгоритма (программы) требуются три типовых блока:
1. Функциональный. Используется для представления линейных алгоритмов. Описывается языком графических символов следующим образом:
2. Циклический. Используется для представления циклических алгоритмов. Описывается языком графических символов одним из двух способов:
3. Конструкция принятия двоичного решения. Применяется для представления разветвляющихся алгоритмов. Описывается языком графических символов следующим образом:
При решении нашей курсовой работы мы будем придерживаться модульного метода проектирования.
Вся наша программа будет состоять из нескольких модулей, у каждой из которых будет своя функция. Это позволит проще отслеживать ошибки, а также каждый модуль будет работать независимо от наличия ошибок в других частях программы (модулях).
Далее приведеныблое-схемы модулей.
4.2 Блок-схемы функций
1. Ввод БД из txt файла
2. Сохранение текущей БД в txt файл
3. Вывод текущей БД на экран
4. Добавление новой строки с данными в БД
5. Удаление строки из БД
6. Cортировка БД по номерам поездов
7. Информация о поезде по его номеру
8. Поиск поездов по первой букве пункта назначения
9. Поиск поездов по количеству мест
4.3 Метод тестирования
Тестирование — очень важный и трудоемкий этап процесса разработки программногообеспечения, так как правильное тестирование позволяет выявить подавляющее большинствоошибок, допущенных при составлении программ.
Процесс разработки программного обеспечения предполагает три стадии тестирования: автономное, комплексное и системное, каждая из которых соответствует завершениюсоответствующей части Системы.
Различают два подхода к формированию тестов: структурный и функциональный. Каждый изуказанных подходов имеет свои особенности и области применения.
Структурное тестирование.
Структурное тестирование называют также тестированием по «маршрутам», так как в этомслучае тестовые наборы формируют путем анализа маршрутов, предусмотренных алгоритмом.
Под маршрутами при этом понимают последовательности операторов программы, которыевыполняются при конкретном варианте исходных данных.
В основе структурного тестирования лежит концепция максимально полного тестированиявсех маршрутов программы. Так, если алгоритм программы включает ветвление, то при одномнаборе исходных данных может быть выполнена последовательность операторов, реализующаядействия, которые предусматривает одна ветвь, а при втором — другая. Соответственно, дляпрограммы будут существовать маршруты, различающиеся выбранным при ветвлениивариантом.
Считают, что программа проверена полностью, если с помощью тестов удается осуществитьвыполнение программы по всем возможным маршрутам передач управления. Однако нетрудновидеть, что даже в программе среднего уровня сложности число неповторяющихся маршрутовможет быть очень велико, и, следовательно, полное или исчерпывающее тестированиемаршрутов, как правило, невозможно.
Структурный подход к тестированию имеет ряд недостатков. Так тестовые наборы, построенные по данной стратегии:
§ не обнаруживают пропущенных маршрутов;
§ не обнаруживают ошибок, зависящих от обрабатываемых данных, например, в операторе if (a — b)
§ не дают гарантии, что программа правильна, например, если вместо сортировки по убыванию реализована сортировка по возрастанию.
Для формирования тестов программу представляют в виде графа, вершины которогосоответствуют операторам программы, а дуги представляют возможные варианты передачиуправления.
Функциональное тестирование.
Одним из способов проверки программ является тестирование с управлением по данным или попринципу «черного ящика». В этом случае программа рассматривается как «черный ящик», и цельютестирования является выяснение обстоятельств, в которых поведение программы не соответствуетспецификации.
Для обнаружения всех ошибок в программе, используя управление по данным, необходимовыполнить исчерпывающее тестирование, т. е. тестирование на всех возможных наборах данных. Длятех же программ, где исполнение команды зависит от предшествующих ей событий, необходимопроверить и все возможные последовательности. Очевидно, что проведение исчерпывающеготестирования для подавляющего большинства случаев невозможно. Поэтому обычно выполняют" разумное" или «приемлемое» тестирование, которое ограничивается прогонами программы нанебольшом подмножестве всех возможных входных данных. Этот вариант не дает гарантииотсутствия отклонений от спецификаций.
Правильно выбранный тест должен уменьшать, причем более чем на единицу, число другихтестов, которые должны быть разработаны для обеспечения требуемого качества программногообеспечения.
Мы будем использовать именно этот способ тестирования, так как он менее трудоемкий, чем метод «белого ящика» (структуный анализ).
5. Создание программы
5.1 Дерево функций
5.2 Последовательность создания программы
Мы проанализировали и исследовали задачу курсовой работы, выбрали метод проектирования алгоритма, определили функции и возможности, которые будет предоставлять программа. Теперь можно приступить непосредственно к разработке программы и её модулей.
5.3 Сценарий диалога программы
№ вершины графа | Операция | |
Запуск программы | ||
Меню программы | ||
Создание файла | ||
Вывод таблицы на экран | ||
Сохранение таблицы в файл | ||
Добавление записи | ||
Удаление записи | ||
Сортировка по номерам поездов | ||
Информация о поезде | ||
Поиск поездов по первой букве пункта назначения | ||
Поиск поездов по количеству мест | ||
Завершение работы программы | ||
Заключение
В данной курсовой работе была разработана программа, позволяющая работать с базой данных «TRAIN» в соответствии с поставленными требованиями. Программа включает в себя процедуры, обеспечивающие выполнение всех поставленных задач для работы с базой данных. Главное меню программы позволяет обеспечить доступ к функциям программы и к сведениям, хранящимся в базе данных «TRAIN» .
С помощью класса статических массивов эффективно использовалась память, необходимая для работы программы. Проведенное тестирование показало работоспособность программы и соответствие её требованиям задания на курсовой проект.
Приложение 1
Описание разработанных функций
Название функции | Назначение функции | |
voidoutputfile () | Сохранение текущей БД в txt файл | |
voidinputfile () | Ввод БД из txt файла | |
voidadd () | Добавление новой строки с данными в БД | |
voiddeletetrain () | Удаление строки из БД | |
voidoutput () | Вывод текущей БД на экран | |
voidsort_np () | Сортировка по номерам поездов | |
voidpoisk_no () | Информация о поезде по его номеру | |
voidpoisk_pb () | Поиск поездов по первой букве пункта назначения | |
voidpoisk_km () | Поиск поездов по количеству мест | |
Описание глобальных переменных
struct train char po[l] char pnl[l] int km intnp | — структура «TRAIN» — пункт отправления — пункт назначения — количество мест — номер поезда | |
Приложение 2
Листинг программы
#include
#include
#include
#include
#include
#include
#include
constint l=30;
struct train
{charpo[l], pn[l]; int km, np; };
constint N=100;
classtrai
{private: train x[N];
public:
int n;
voidoutputfile ();
voidinputfile ();
void add ();
voiddeletetrain ();
void output ();
voidsort_np ();
voidpoisk_no ();
voidpoisk_pb ();
voidpoisk_km ();
};
int main ()
{ trai a;
a.n=0;
int j;
while (1)
{ cout<<" 1. Zagruzka is faila. n" ;
cout<<" 2. Vivodnaekran. n" ;
cout<<" 3. Sokhranenietablici v fail. n" ;
cout<<" 4. Dobavleniezapisi. n" ;
cout<<" 5. Udaleniezapisi. n" ;
cout<<" 6. Sortirovkaponomerampoezdov. n" ;
cout<<" 7. Vivodinformacii o poezdepo ego nomeru. n" ;
cout<<" 8. Poiskpoezdovpo 1 bukvepunktanaznacheniya. n" ;
cout<<" 9. Poiskpoezdovpokolichestvumest. n" ;
cout<<" 10. Vixod. nn" ;
cout<<" Vashvibor (1%10):" ;
cin>>j;
switch (j)
{ case 1: a. inputfile (); break;
case 2: a. output (); break;
case 3: a. outputfile ();break;
case 4: a. add (); break;
case 5: a. deletetrain (); break;
case 6: a. sort_np ();break;
case 7: a. poisk_no ();break;
case 8: a. poisk_pb ();break;
case 9: a. poisk_km ();break;
case 10: cout<<" Konecprogrammi."; getch (); exit (0);
default:cout<<" Net takogopunkta menu! n"; getch (); break;}
}
}
voidtrai:inputfile ()
{ifstream fin;
char file[l];
cout<<" File name:"; cin>>file;
fin.open (file);
if (fin==NULL) {cout<<" Doesn’t open. n"; getch (); exit (1);}
n=0;
do{fin>>x[n]. po>>x[n].pn>>x[n].km>>x[n].np;
n++;
}while (fin.good ());
n—;
cout<<" File was inputted. n"; getch ();
fin.close ();
output ();
}
voidtrai:output ()
N
voidtrai:add ()
{ train t;
if (n==N) {cout<<" Massivperepolnen. n"; getch (); exit (0);}
cout<<" Punktotpravleniya:"; cin>>x[n]. po;
cout<<" Punktnaznacheniya:"; cin>>x[n]. pn;
cout<<" Kolichestvomest:"; cin>>x[n]. km;
cout<<" Nomerpoezda:"; cin>>x[n]. np;
n++;
cout<<" Zapisdobavlena. n" ;
getch ();
output ();
}
voidtrai:deletetrain ()
{charch;
inti, j;
output ();
cout<<" Nomerudalennoistroki:" ;
cin>>j;
if (j<1||j>n) {cout<<" Net takoistroki. n"; getch (); exit (0);}
cout<<<
cout<<" Udalit?(y/n):"; cin>>ch;
if (ch=='y')
{for (i=j;i
x[i-1]=x[i];
n—;
}
cout<<" Zapisudalena. n"; getch ();
}
voidtrai:outputfile ()
{ofstream out;
char file[l];
inti;
cout<<" File name:" ;
cin>>file;
out.open (file);
if (out==NULL) {cout<<" Ne naiden"; getch (); exit (1);}
for (i=0;i
{out<<<
<<<
<<<
<<<<
out.close ();
cout<<" Fail soxranenn"; getch ();
}
voidtrai:sort_np ()
{intfl, nn;
train t;
inti, j;
chara, b;
for (i=0; i
{
for (j=i; j
{
if (x[i]. np>x[j].np) {t=x[i]; x[i]=x[j]; x[j]=t;}
}
}
output ();
}