- •Задание.
- •Содержание
- •Введение
- •Постановка задачи.
- •Метод решения задачи и ее формализация.
- •Выбор языка программирования.
- •Разработка состава и структуры исходных данных и результатов.
- •Разработка алгоритма.
- •Отладка и тестирование программы.
- •Заключение.
- •Библиографический список.
- •Приложение 2. Схемы программы.
Отладка и тестирование программы.
Для проверки правильности работы программы выполняется тестирование -исполнение программы с использованием некоторого набора входных данных, охватывающего всю область возможных значений для данного типа задач и проверяющего граничные условия, а также позволяющего посредством контроля промежуточных и конечных результатов решения задачи в ходе выполнения программы проверить выполнение операторов программы в требуемой последовательности и правильности всех алгоритмических конструкций.
Для обнаружения и устранения ошибок в программе выполняется её отладка.
Для этого в интегрированной среде Microsoft Visual Studio существуют встроенные средства – отладчик.
Примеры тестовых наборов разрабатываемой программы.
Вывод списка на экран:

Вывод в файл:

Удаление последнего элемента в списке:

После удаления:

Добавление нового элемента:

После добавления:

Обмен местами:

После обмена:

Заключение.
Для разработки программы были проведены следующие виды работ:
Вначале мы определились с методом решения задачи и её формализации, что позволило нам понять общий подход для решения поставленной задачи. Затем мы выбрали
язык программирования с помощью которого будем разрабатывать программу. Далее разработали состав и структуру исходных данных и результатов. Это позволило нам определиться какие данные будет принимать программа и каким должен быть результат её работы. После этого мы приступили к разработке алгоритма что позволило нам определить количество необходимых функций и задачи которые они должны решать. После этого мы приступили к разработке программы, определили необходимые операторы, стандартные заголовочные файлы, структуру программы. После написания программы произвели её отладку и тестирование для проверки всех критических условий. Для этого мы изменяли состав входных данных и порядок выполнения операций.
Библиографический список.
-
В.В Подбельский “ Язык Си++” Финансы и статистика 2001.
Приложение 2. Схемы программы.
Схема функции main()

Схема метода menu1()

Схема метода menu2()

Схема метода createList()

Схема метода outputToFile()

Схема метода addNodeAfterKey()

Схема метода delLastNode()

Схема метода interchange()

Схема метода printList() Схема метода changeKey()
Схема метода sHelp() Схема метода rCount()
Схема метода Count() Схема метода addNode()

Схема метода oneNode() Схема метода twoNode()

Схема метода pointToOneNode() Схема метода pointToTwoNode()
Приложение
2. Листинг программы.
Код файла main.cpp:
#include <iostream>
#include <stddef.h>
#include <fstream>
#include <conio.h>
#include "MY_MENU.h"//класс меню
#include "LIST.h"//класс списка
using namespace std;
int main(){
MY_MENU menu;//Экземпляр класса меню
CREATELIST oneList;//Экземпляр класса список
menu.menu1();//вызов первого метода класса меню
menu.menu2();//вызов второго метода класса меню
setlocale(LC_ALL,".1251");//русский язык
system("color 0F");//цвет консоли и шрифта
oneList.createList();
int v;
while(true){
v=_getch();// ожидание нажатия клавиши
switch(v){
case 49:oneList.outputToFole(oneList);break;
case 50:oneList.addNodeAfterKey();break;
case 52:oneList.interchange();break;
case 51:oneList.delLastNode();break;
case 27:exit(0);break;
case 59:oneList.printList();break;
case 9:oneList.sHelp();break;
default:cout << "WARNING!!!: вы нажали не на ту клавишу!!!"<<endl;break;
}
}
system("pause");
return 0;
}
Код файла List.h:
struct FURNITURE{//элемент списка
char name[20];
char countryOfProduction[20];
char price[20];
char mainColor[20];
int key;//ключь элемента
FURNITURE * next;// указатель на следующий элемент
};
class CREATELIST{
private:FURNITURE * head;//указатель на голову списка
public:
CREATELIST();//конструктор класса
void createList();
void addNode(char * n,char * cP,char * p,char * mC,int key);//добавление нового узла в конец
int outputToFole(CREATELIST list);//вывод в файл, принимает имя файла и
private:int count();//вспомогательная функция возвращает кол-во эл в списке - 1
public:
int rCount();//кол-во эл. в списке
int delLastNode();// удаляет последний элемент из списка
private:FURNITURE * oneNode(int a);
private:FURNITURE * twoNode(int b);
private:FURNITURE * pointToOneNode(int a);
private:FURNITURE * pointToTwoNode(int b);
private: void changeKey();
public:
void printList();//вывод списка на экран
int interchange();//меняет местами два элемента с заданными ключами.
int addNodeAfterKey();//добавляет эл. после элемента с заданным номером
void sHelp();//описание программы
};
Код файла List.cpp:
#include "LIST.h"
#include <iostream>
#include <fstream>
#include <string>
#include <conio.h>
using namespace std;
CREATELIST::CREATELIST(){
head=NULL;
}
void CREATELIST::createList(){
char* fileName=new char[20];//выделение динамической памяти для имени файла ввода
char * bufName=new char[20];
char * bufCountryP=new char[20];
char * bufPrice=new char[20];
char * bufMColor=new char[20];
int key=0;//ключ
point:
cout <<"Перед началом работы необходимо создать список для этого введите имя "<<endl<<"файла из которого введутся данные для создания списка(name.расширение)"<<endl;
cin>>fileName;
ifstream * inp=new ifstream(fileName);//создание экземпляра класса ifstream
if(!inp->good()){
cout <<"Такого файла нет"<<endl;
goto point;
}
else cout <<"Файл найден"<<endl;
while (!inp->eof()){//пока не конец файла
key++;
inp->getline(bufName, 10, ' ');//ввод из файла построчно
inp->getline(bufCountryP, 10, ' ');
inp->getline(bufPrice,10, ' ');
inp->getline(bufMColor,10, ' ');
addNode(bufName,bufCountryP,bufPrice,bufMColor,key);//вызов метода класса CREATELIST
}
inp->close();//закрытие файла
cout<<"Список создан."<<endl;
cout<<"Выбирите действие."<<endl;
cout<<"HELP[Tab]"<<endl;
cout <<"Для вывода списка на экран нажмите [F1]"<<endl;
cout <<"______________________________"<<endl;
}
//*********************************************************
void CREATELIST::addNode(char * n,char * cP,char * p,char * mC,int key){
FURNITURE * nd = new (FURNITURE);
strcpy_s(nd->name,10,n);
strcpy_s(nd->countryOfProduction,10,cP);
strcpy_s(nd->price,10,p);
strcpy_s(nd->mainColor,10,mC);
nd->key=key;
nd->next=NULL;
if (head==NULL){
head=nd;
}
else{
FURNITURE * going=head;
while(going->next!=NULL)
going=going->next;
going->next=nd;
}
}
//*********************************************************
int CREATELIST::outputToFole(CREATELIST list){
cout <<"Введите имя файла в который будет записаны данные списка (название.рас)"<<endl;
cout <<"Для отмены действия нажмите [Esc] "<<endl;
if (_getch()==27){
cout <<"Выберите действие."<<endl;
cout <<"______________________________"<<endl;
return 0;
}
char* fileName2=new char[20];//имя файла вывода
cin>>fileName2;
ofstream* out=new ofstream(fileName2);
while (list.head!=NULL){
out->write("\n Название товара : ",21);
out->write(list.head->name,strlen(list.head->name));
out->write("\n Страна производитель : ",26);
out->write(list.head->countryOfProduction,strlen(list.head- >countryOfProduction));
out->write("\n",2);
out->write("\n Цена товара : ",17);
out->write(list.head->price,strlen(list.head->price));
out->write("\n",2);
out->write(" Цвет : ",8);
out->write(list.head->mainColor,strlen(list.head->mainColor));
out->write("\n_________________________________________",44);
list.head=list.head->next;
}
out->close();
cout <<"Готово"<<endl;
cout <<"Выбирите действие."<<endl;
cout <<"______________________________"<<endl;
return 1;
}
//*********************************************************
int CREATELIST::count(){// для функции delLastNode()
FURNITURE * going = head;
int count=0;
while (going!=NULL){
if(going==NULL)
delete going;
going=going->next;
count++;
}
return (count-1);
}
//*********************************************************
int CREATELIST::rCount(){//размер списка
FURNITURE * going = head;
int count=0;
while (going!=NULL){
going=going->next;
count++;
}
return (count);
}
//*********************************************************
int CREATELIST::delLastNode(){
cout << "В списке "<<rCount()<<" эл."<<endl;
FURNITURE * going = head;
int c=count();
if (rCount()==1){
cout << "WARNING!!!: остался единственный элемент в списке"<<endl;
cout << "Хотите удалить единственный элемент из списка? ДА-1, НЕТ-2"<<endl;
cout << "Если удалить единственный элемент то выполнение программы прекратится!!!"<<endl;
int a;
cin >>a;
if (a==1){
delete going;
cout <<"Список полностью удалён ((("<<endl;
exit(0);
}
else {
cout <<"Выбирите действие."<<endl;
cout <<"______________________________"<<endl;
}
}
else{
for(int i=1;i<c;i++){
going=going->next;
}
going->next=NULL;
cout<<"Последний элемент в списке удалён."<<endl;
cout << "В списке осталось "<<rCount()<<" эл. "<<endl;
cout <<"Выбирите действие."<<endl;
cout <<"______________________________"<<endl;
return 1;
}
}
//*********************************************************
FURNITURE * CREATELIST::oneNode(int a){
FURNITURE * going = head;
for(int i=0;i<a-1;i++){
going=going->next;
}
return going;
}
//*********************************************************
FURNITURE * CREATELIST::twoNode(int b){
FURNITURE * going = head;
for(int i=0;i<b-1;i++){
going=going->next;
}
return going;
}
//*********************************************************
FURNITURE * CREATELIST::pointToOneNode(int a){
FURNITURE * going = head;
for(int i=0;i<a-2;i++){
going=going->next;
}
return going;
}
//*********************************************************
FURNITURE * CREATELIST::pointToTwoNode(int b){
FURNITURE * going = head;
for(int i=0;i<b-2;i++){
going=going->next;
}
return going;
}
//*********************************************************
int CREATELIST::interchange(){
if (rCount()==1){
cout <<"Эта функция не доступна т.к в списке всего ОДИН элемент."<<endl;
cout <<"Выбирите другое действие"<<endl;
cout <<"______________________________"<<endl;
return 0;
}
point:
cout <<"Введите порядковые номера двух элементов которые нужно поменять местами"<<endl;
cout <<"Для отмены действия нажмите [Esc] "<<endl;
if (_getch()==27){
cout <<"Выбирите действие"<<endl;
cout <<"______________________________"<<endl;
return 0;
}
int a,b;
cout<<"Введите номер первого элемента: ";cin>>a;
cout<<"Введите номер второго элемента: ";cin>>b;
if (a>rCount()){
cout<<"WARNING!!! "<<endl<<"В списке всего : "<<rCount()<<" эл."<<endl;
goto point;
}
if (b>rCount()){
cout<<"WARNING!!! "<<endl<<"В списке всего : "<<rCount()<<" эл."<<endl;
goto point;
}
if (a==1 || b==1){cout <<"Измененить положения первого элемента невозможно !!!"<<endl;
cout <<"Выбирите действие."<<endl;
cout <<"______________________________"<<endl;
return 1;
}
if (a==b-1){
FURNITURE * going1 = oneNode(a);//адресс 1 заменяемого
FURNITURE * going2 = twoNode(b);//адресс 2 заменяемого
FURNITURE * going22 = going2->next;
FURNITURE * pointOne=pointToOneNode(a);//адресс перед первым
pointOne->next=going1->next;
going2->next=going1;
going1->next=going22;
FURNITURE * nD = head;
//int numb=0;
changeKey();
cout <<"Обмен местами завершён."<<endl;
cout <<rCount()<<endl;
cout <<"Выбирите действие."<<endl;
cout <<"______________________________"<<endl;
return 1;
}
if (a-1==b){
FURNITURE * going1 = oneNode(b);//адресс 1 заменяемого
FURNITURE * going2 = twoNode(a);//адресс 2 заменяемого
FURNITURE * going22 = going2->next;
FURNITURE * pointOne=pointToOneNode(b);//адресс перед первым
pointOne->next=going1->next;
going2->next=going1;
going1->next=going22;
changeKey();
cout <<"Обмен местами завершён."<<endl;
cout <<rCount()<<endl;
cout <<"Выбирите действие."<<endl;
cout <<"______________________________"<<endl;
return 1;
}
FURNITURE * going1 = oneNode(a);//первый хранит адресс на следующий объект
FURNITURE * going1_2 = going1->next;//хранит промежуточное значение
FURNITURE * going2 = twoNode(b);//второй хранит адресс на следующий объект
FURNITURE * pointOne=pointToOneNode(a);//адресс первого из рокировочных узлов
FURNITURE * pointTwo=pointToTwoNode(b);
going1->next=going2->next;
going2->next=going1_2;
pointOne->next=going2;
pointTwo->next=going1;
changeKey();
cout <<"Обмен местами завершён."<<endl;
cout <<rCount()<<endl;
cout <<"Выбирите действие."<<endl;
cout <<"______________________________"<<endl;
return 1;
}
//*********************************************************
int CREATELIST::addNodeAfterKey(){
if (rCount()==1){
FURNITURE * going = head;
cout << "Заполните данными следующие поля:"<<endl;
FURNITURE * nd=new FURNITURE;
cout<< "Нозвание объекта : ";
cin>>nd->name;
cout<<"Страна производитель : ";
cin>>nd->countryOfProduction;
cout<<"Цена: ";
cin>>nd->price;
cout<<"Цвет: ";
cin>>nd->mainColor;
nd->key=2;
head->next=nd;
nd->next=NULL;
cout <<"Новый элемент добавлен. В списке "<<rCount()<<" эл."<<endl;
cout <<"Выбирите действие."<<endl;
cout <<"______________________________"<<endl;
return 1;
}
point:
cout <<"Введите порядковый номер элемента после которого будет добавлен новый элемент."<<endl;
cout <<"Для отмены действия нажмите [Esc] "<<endl;
if (_getch()==27){
cout <<"Выбирите действие."<<endl;
cout <<"______________________________"<<endl;
return 0;
}
int a;
cin>>a;
if (a>rCount()){
cout<<"WARNING!!! "<<endl<<"В списке всего : "<<rCount()<<" эл."<<endl;
goto point;
}
if (a==1){
FURNITURE * going = head;
FURNITURE * going1=NULL;
cout << "Заполните данными следующие поля:"<<endl;
FURNITURE * nd=new FURNITURE;
cout<< "Нозвание объекта: ";
cin>>nd->name;
cout<<"Страна производитель : ";
cin>>nd->countryOfProduction;
cout<<"Цена: ";
cin>>nd->price;
cout<<"Цвет: ";
cin>>nd->mainColor;
going1=going->next;
going->next=nd;
nd->next=going1;
changeKey();
cout <<"Новый элемент добавлен. В списке "<<rCount()<<" эл."<<endl;
cout <<"Выбирите действие."<<endl;
cout <<"______________________________"<<endl;
return 1;
}
FURNITURE * going = head;
FURNITURE * going1=NULL;
for(int i=0;i<a;i++){
going=going->next;
if (going->key==a){
cout <<"Элемент с заданным кльчом найден "<<endl;
cout << "Заполните данными следующие поля:"<<endl;
FURNITURE * nd=new FURNITURE;
cout<< "Нозвание объекта: ";
cin>>nd->name;
cout<<"Страна производитель : ";
cin>>nd->countryOfProduction;
cout<<"Цена: ";
cin>>nd->price;
cout<<"Цвет: ";
cin>>nd->mainColor;
going1=going->next;
going->next=nd;
nd->next=going1;
changeKey();
break;
}
}
cout <<"Новый элемент добавлен. В списке "<<rCount()<<" эл."<<endl;
cout <<"Выбирите действие."<<endl;
cout <<"______________________________"<<endl;
return 1;
}
//*********************************************************
void CREATELIST::printList(){
FURNITURE * going = head;
int numb=0;
cout <<"____________________________"<<endl;
cout <<"|Название|Страна |Цена|Цвет|"<<endl;
cout <<"____________________________"<<endl;
while (going!=NULL){
numb++;
cout <<" "<<going->name<<" "<<going->countryOfProduction<<" "<<going->price<<" "<<going->mainColor<<endl;
going=going->next;
}
cout <<endl<<"Выбирите действие."<<endl;
cout <<"____________________________"<<endl;
}
//*********************************************************
void CREATELIST::changeKey(){
FURNITURE * nd = head;
int numb=0;
while (nd!=NULL){
numb++;
nd->key=numb;
nd=nd->next;
}
}
//*********************************************************
void CREATELIST::sHelp(){
cout <<"\t\t\t course project 1.0/30V"<<endl;
cout <<"\t\t\t\t Help"<<endl;
cout <<"________________________________________________________________________________"<<endl;
cout <<"Эта програма создаёт и обрабатывает динамический список."<<endl;
cout <<"Список создаётся на основе текстового файла, для начала работы необходимо "<<endl<<"ввести имя файла и нажать клавишу [Enter]"<<endl;
cout <<"Над списком можно выполнять следущие действия :"<<endl;
cout <<"1) Вывод списка в файл. Для этого нужно нажать клавишу[1]"<<endl;
cout <<"2) Добавление нового элемента в список. Для этого нужно нажать клавишу[2]"<<endl;
cout <<"3) Удаление последнего элемента из списка. Для этого нужно нажать клавишу[3]"<<endl;
cout <<"4) Обмен местами двух элементов. Для этого нужно нажать клавишу[4]"<<endl;
cout <<"Для выхода из программы нужно нажать клавишу[Esc]."<<endl;
cout <<"________________________________________________________________________________"<<endl;
}
Код файла MY_MENU.h :
class MY_MENU{
public:
void menu1();
void menu2();
};
Код файла MY_MENU.cpp :
#include <iostream>
#include "MY_MENU.h"
#include <conio.h>
using namespace std;
void MY_MENU::menu1(){
unsigned char linehoz = 205 , topangleleft = 201 , topangleright = 187, linev = 186, downangleleft = 200, downangleright = 188;
cout << topangleleft;
for (int h = 72; h > 0; h--)
cout << linehoz;
cout << topangleright << endl;
cout<< linev <<"\t"<<" course project 1.0/30V Petrin Roman"<<"\t""\t""\t""\t "<<linev<<"\n"<< downangleleft;
for (int h = 72; h > 0; h--)
cout << linehoz;
cout << downangleright << endl;
}
void MY_MENU::menu2(){
unsigned char tutopll=218,tpl=196,ttnl=194,ttvl=193,tutoppl=191,tkl=197,tvptl=180,tvl=179,nyl=192,nyr=217;
cout <<tutopll;
for (int h = 17; h > 0; h--){
cout << tpl;
}
cout <<ttnl;
for (int h = 11; h > 0; h--){
cout << tpl;
}
cout <<ttnl;
for (int h = 16; h > 0; h--){
cout << tpl;
}
cout <<ttnl;
for (int h = 15; h > 0; h--){
cout << tpl;
}
cout <<ttnl;
for (int h = 9; h > 0; h--){
cout <<tpl;
}
cout <<tutoppl;
cout <<endl;
cout <<tvl;
cout <<"Output to file[1]"<<tvl<<"Add node[2]"<<tvl<<"Del.last node[3]"<<tvl<<"Change nodus[4]"<<tvl<<"Exit[Esc]"<<tvl<<endl;
cout <<nyl;
for (int h = 17; h > 0; h--){
cout << tpl;
}
cout <<ttvl;
for (int h = 11; h > 0; h--){
cout << tpl;
}
cout <<ttvl;
for (int h = 16; h > 0; h--){
cout << tpl;
}
cout <<ttvl;
for (int h = 15; h > 0; h--){
cout << tpl;
}
cout <<ttvl;
for (int h = 9; h > 0; h--){
cout <<tpl;
}
cout <<nyr;
cout <<endl;
}
