Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.03.2017, 13:13   #1
dima2308
Пользователь
 
Регистрация: 03.10.2014
Сообщений: 29
По умолчанию Составить программу, которая содержит текущую информацию о заявках на авиабилеты.

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

Имеется код:
Код:
#include <iostream>
#include <string>
using namespace std;

struct Node
{
	char point[100];    //- пункт назначения;
    int reis;        //- номер рейса;
    char name[20];    //- фамилия пассажира;
    char surname[20];    //- имя
    char patr[20];    //- отчество
    char date[10];        //- желаемая дата вылета;
    Node * next;    // указатель на структуру заявка.
};

int Menu();
void addNode(Node *first); // - добавление заявок в список;
void deleteNode(Node *&first); // - удаление заявок по заданному номеру рейса
void outNode(Node *first); // - вывод всех заявок.
void outNodeNum(Node *first); // вывод одной заявки

int main()
{
	setlocale( LC_ALL,"Russian" );
	Node *first = new Node;
	int n=1;
	cout << "-------Данные о заявке-------\n\n";
	cout<<"Введите пункт назначения > ";
	cin>>first->point;
    cout << "Введите номер рейса > ";
    cin >> first->reis;
	cout << "Введите фамилию пассажира > ";
    cin >> first->name;
	cout << "Введите имя пассажира > ";
    cin >> first->surname;
	cout << "Введите отчество пассажира > ";
    cin >> first->patr;
	cout << "Введите дату вылета > ";
	cin >> first->date;
	cout << "\n";
	first->next = NULL;

	int k;
	while ((k=Menu())!=0)
	{
		switch(k)
		{
		case 1: addNode(first); break;
		case 2: outNode(first); break;
		case 3:	outNodeNum(first); break;
		case 4: deleteNode(first); break; 
		case 5: break;
		default: cout<<"Введите число от 1 до 5: ";
		}		
	}
	return 0;

    getchar(); // пауза


	return 0;
}


int Menu()
{
	cout<<"\n";
	cout<<"1 - Добавить заявку\n";
	cout<<"2 - Вывести все заявки\n";
	cout<<"3 - Вывести заявку по номеру рейса и дате вылета\n";
	cout<<"4 - Удалить заявку\n";
	cout<<"0 - Выход\n";
	cout<<"\n";
	cout<<"Введите нужный пункт: ";
	
	short k;
	cin>>k;
	cout<<"\n";
	return k;
}


void addNode(Node *first) 
{
	Node *pv = new Node;
	Node *p = first->next;
	

	cout << "\nДанные о заявке \n";
	cout<<"Введите пункт назначения > ";
	cin>>pv->point;
    cout << "Введите номер рейса > ";
    cin >> pv->reis;
	cout << "Введите фамилию пассажира > ";
    cin >> pv->name;
	cout << "Введите имя пассажира > ";
    cin >> pv->surname;
	cout << "Введите отчество пассажира > ";
    cin >> pv->patr;
	cout << "Введите дату вылета > ";
	cin >> pv->date;
	cout << "\n";

	first->next=pv;
	pv->next=p;
}

void outNode(Node *first)
{
	Node *pv = first;
	while (pv)
	{
		cout << "\nДанные о заявке \n";
		cout << "\nПункт назначения > " << pv->point;
		cout << "\nНомер рейса > "; cout << pv->reis;
		cout << "\nФамилия пассажира > " << pv->name;
		cout << "\nИмя пассажира > " << pv->surname;
		cout << "\nОтчество пассажира > " << pv->patr;
		cout << "\nДата вылета > " << pv->date << "\n\n\n";
		pv=pv->next;
	}
}

void outNodeNum(Node *first)
{
	int num;
	string dat;
	Node *pv = first;
	cout<<"Введите номер рейса: ";
	cin>>num;
	cout<<"Введите дату: ";
	cin>>dat;
    int n = 1, fl=0;
    while (pv)
	{
        if(pv->reis == num && pv->date == dat)
		{
            outNode(pv);
			break;
		}
		pv=pv->next;
    }
}


void deleteNode(Node *&first)
{
	int num;
	cout<<"Номер рейса, заявку по которому удалить: ";
	cin>>num;
    Node *temp = first;
    Node *el = NULL;
    if (first && first->reis == num)
    {
        el = first;
        first = first->next;
        delete el;
        return;
    }
    while (temp->next)
    {
        if (temp->next->reis == num)
        {
            el = temp->next;
            temp->next = el->next;
            delete el;
            break;
        }
        temp = temp->next;
    }
}
Возникли некоторые трудности:
1) при выводе заявок они выводятся не в том порядке (1-2-4-3)
2) при удалении всех заявок функция добавления вылетает с исключением

Прошу подсказать, что и где не так.

Последний раз редактировалось dima2308; 18.03.2017 в 13:29.
dima2308 вне форума Ответить с цитированием
Старый 18.03.2017, 16:36   #2
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Замени у себя (это лекарство от п.1):
Код:
void addNode(Node *first)
{
	Node *p = first;
	while (p->next != NULL)
	{
		p = p->next;
	}
	Node *pv = new Node;
	cout << "\nДанные о заявке \n";
	cout << "Введите пункт назначения > ";
	cin >> pv->point;
	cout << "Введите номер рейса > ";
	cin >> pv->reis;
	cout << "Введите фамилию пассажира > ";
	cin >> pv->name;
	cout << "Введите имя пассажира > ";
	cin >> pv->surname;
	cout << "Введите отчество пассажира > ";
	cin >> pv->patr;
	cout << "Введите дату вылета > ";
	cin >> pv->date;
	cout << "\n";
	pv->next = NULL;

	p->next = pv;
}
ura_111 вне форума Ответить с цитированием
Старый 18.03.2017, 20:18   #3
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Вроде забацал удаление (но пришлось возвращать ссылку) и вывод я тоже чуть-чуть пеменял:

Код:
#include <iostream>
#include <string>
#include <iomanip>
#include "windows.h"
using namespace std;

struct Node
{
	char point[20];    //- пункт назначения;
	int reis;        //- номер рейса;
	char name[12];    //- фамилия пассажира;
	char surname[12];    //- имя
	char patr[12];    //- отчество
	char date[12];  //- желаемая дата вылета;
	Node * next;    // указатель на структуру заявка.
};

int Menu();
void addNode(Node *first); // - добавление заявок в список;
Node *deleteNode(Node *first); // - удаление заявок по заданному номеру рейса
void outNode(Node *first); // - вывод всех заявок.
void outNodeNum(Node *first); // вывод одной заявки

int main()
{
	//setlocale(LC_ALL, "Russian");

	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);

	//Node *first = new Node;
	//int n = 1;
	//cout << "-------Данные о заявке-------\n\n";
	//cout << "Введите пункт назначения > ";
	//cin >> first->point;
	//cout << "Введите номер рейса > ";
	//cin >> first->reis;
	//cout << "Введите фамилию пассажира > ";
	//cin >> first->name;
	//cout << "Введите имя пассажира > ";
	//cin >> first->surname;
	//cout << "Введите отчество пассажира > ";
	//cin >> first->patr;
	//cout << "Введите дату вылета > ";
	//cin >> first->date;
	//cout << "\n";
	//first->next = NULL;

	////////////////////////////////////////////////////////
	Node *first = new Node;  first->reis = 1021;  strcpy_s(first->name, 20, "Шишов"); strcpy_s(first->surname, 20, "Иван");  strcpy_s(first->patr, 20, "Иванов"); strcpy_s(first->point, 20, "Москва");
	Node *f1 = new Node;     f1->reis = 20;       strcpy_s(f1->name, 20, "Шишеков");  strcpy_s(f1->surname, 20, "Иван");     strcpy_s(f1->patr, 20, "Сергеевич"); strcpy_s(f1->point, 20, "Владивосток");
	Node *f2 = new Node;     f2->reis = 3010;     strcpy_s(f2->name, 20, "Иванов");   strcpy_s(f2->surname, 20, "Станислав"); strcpy_s(f2->patr, 20, "Вислоонов"); strcpy_s(f2->point, 20, "Пекин");
	Node *f3 = new Node;     f3->reis = 4201;     strcpy_s(f3->name, 20, "Шив");      strcpy_s(f3->surname, 20, "Коля");      strcpy_s(f3->patr, 20, "Викторович"); strcpy_s(f3->point, 20, "Берлин");
	
	first->next = f1;
	f1->next = f2;
	f2->next = f3;
	f3->next = NULL;
	////////////////////////////////////////////////////////
	int k;
	while ((k = Menu()) != 0)
	{
		switch (k)
		{
		case 1: addNode(first); break;
		case 2: outNode(first); break;
		case 3:	outNodeNum(first); break;
		case 4: first = deleteNode(first); break;
		case 5: break;
		default: cout << "Введите число от 1 до 5: ";
		}
	}
	getchar(); // пауза	
	return 0;
}


int Menu()
{
	cout << "\n";
	cout << "1 - Добавить заявку\n";
	cout << "2 - Вывести все заявки\n";
	cout << "3 - Вывести заявку по номеру рейса и дате вылета\n";
	cout << "4 - Удалить заявку\n";
	cout << "0 - Выход\n";
	cout << "\n";
	cout << "Введите нужный пункт: ";
	short k;
	cin >> k;
	cout << "\n";
	return k;
}

void addNode(Node *first)
{
	Node *pv = new Node;
	cout << "\nДанные о заявке \n";
	cout << "Введите пункт назначения > ";
	cin >> pv->point;
	cout << "Введите номер рейса > ";
	cin >> pv->reis;
	cout << "Введите фамилию пассажира > ";
	cin >> pv->name;
	cout << "Введите имя пассажира > ";
	cin >> pv->surname;
	cout << "Введите отчество пассажира > ";
	cin >> pv->patr;
	cout << "Введите дату вылета > ";
	cin >> pv->date;
	cout << "\n";
	pv->next = NULL;	

	Node *p = first;
	if (first == NULL)
	{
		first = pv;
	}
	else
	{
		while (p->next != NULL)
		{
			p = p->next;
		}
		p->next = pv;
	}
}

void outNode(Node *first)
{
	//Node *pv = first;
	//while (pv)
	//{
	//	cout << "\nДанные о заявке \n";
	//	cout << "\nПункт назначения > " << pv->point;
	//	cout << "\nНомер рейса > "; cout << pv->reis;
	//	cout << "\nФамилия пассажира > " << pv->name;
	//	cout << "\nИмя пассажира > " << pv->surname;
	//	cout << "\nОтчество пассажира > " << pv->patr;
	//	cout << "\nДата вылета > " << pv->date << "\n\n\n";
	//	pv = pv->next;
	//}

	cout << setiosflags(ios::right);
	cout << "Данные по заявкам\n";
	cout << "       Пункт  Номер    Фамилия      Имя      Отчество        Дата\n";
	cout << "  назначения  рейса  ----------данные пассажира------      вылета\n";

	Node *pv = first;
	while (pv)
	{
		cout << setw(12) << pv->point << setw(7) << pv->reis << setw(11) << pv->name;
		cout << setw(10) << pv->surname << setw(13) << pv->patr << setw(12) << "12.11.2017" << endl;
		pv = pv->next;
	}
}

void outNodeNum(Node *first)
{
	int num;
	string dat;
	Node *pv = first;
	cout << "Введите номер рейса: ";
	cin >> num;
	cout << "Введите дату: ";
	cin >> dat;
	int n = 1, fl = 0;
	while (pv)
	{
		if (pv->reis == num && pv->date == dat)
		{
			outNode(pv);
			break;
		}
		pv = pv->next;
	}
}

Node *deleteNode(Node *first)
{
	cout << "Номер рейса, заявку по которому удалить: ";
	int num;
	cin >> num;

	Node *temp = first;
	int k = -1;
	int N = 0;
	while (temp)
	{
		if (temp->reis == num)
		{
			k = N;
		}
		temp = temp->next;
		N++;
	}
	N--;
	if (k != -1)
	{
		temp = first;
		// если нужно удалить 1-й узел и он единственный был в списке
		if (k == 0 && N == 0)
		{
			delete first;
			cout << "  Удаление прошло успешно!\n";
			return NULL;
		}
		// если нужно удалить 1-й узел и он НЕ единственный в списке
		if (k == 0 && N > 0)
		{
			temp = temp->next;
			delete first;
			cout << "  Удаление прошло успешно!\n";
			return temp;
		}
		// если нужно удалить узел где-то в середине списка, но не последнего
		Node *el = first;
		temp = first->next;
		while (temp->next)
		{
			if (temp->reis == num)
			{
				el->next = temp->next;
				delete temp;
				cout << "  Удаление прошло успешно!\n";
				return first;
			}			
			el = el->next;
			temp = temp->next;
		}
		// если нужно удалить последний узел
		el->next = NULL;
		delete temp;
		cout << "  Удаление прошло успешно!\n";
		return first;
	}
	else
	{
		cout << "  Такого рейса нет или список пуст!\n";
		return first;
	}
}
Протестируй хорошенько: удаляй, прибавляй в разных комбинациях и последовательности, выводи на экран (я переделал этот пункт)....
Данные-шаблон, это которые эти:

Код:
	////////////////////////////////////////////////////////
	Node *first = new Node;  first->reis = 1021;  strcpy_s(first->name, 20, "Шишов"); strcpy_s(first->surname, 20, "Иван");  strcpy_s(first->patr, 20, "Иванов"); strcpy_s(first->point, 20, "Москва");
	Node *f1 = new Node;     f1->reis = 20;       strcpy_s(f1->name, 20, "Шишеков");  strcpy_s(f1->surname, 20, "Иван");     strcpy_s(f1->patr, 20, "Сергеевич"); strcpy_s(f1->point, 20, "Владивосток");
	Node *f2 = new Node;     f2->reis = 3010;     strcpy_s(f2->name, 20, "Иванов");   strcpy_s(f2->surname, 20, "Станислав"); strcpy_s(f2->patr, 20, "Вислоонов"); strcpy_s(f2->point, 20, "Пекин");
	Node *f3 = new Node;     f3->reis = 4201;     strcpy_s(f3->name, 20, "Шив");      strcpy_s(f3->surname, 20, "Коля");      strcpy_s(f3->patr, 20, "Викторович"); strcpy_s(f3->point, 20, "Берлин");
	
	first->next = f1;
	f1->next = f2;
	f2->next = f3;
	f3->next = NULL;
	////////////////////////////////////////////////////////
нужны чтобы по сто раз не вводить данные вручную (на время отладки); но если они тебе мешают - удали.

Последний раз редактировалось ura_111; 18.03.2017 в 20:48.
ura_111 вне форума Ответить с цитированием
Старый 18.03.2017, 23:28   #4
dima2308
Пользователь
 
Регистрация: 03.10.2014
Сообщений: 29
По умолчанию

Тестил, удаляет всё хорошо, но когда все заявки удалил, пытаюсь добавить снова заявку, на выводе пустота.
То есть в пустой список он не хочет добавлять ничего.
dima2308 вне форума Ответить с цитированием
Старый 19.03.2017, 13:47   #5
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Код:
#include <iostream>
#include <string>
#include <iomanip>
#include "windows.h"
using namespace std;

struct Node
{
	char point[20];    //- пункт назначения;
	int reis;        //- номер рейса;
	char name[12];    //- фамилия пассажира;
	char surname[12];    //- имя
	char patr[12];    //- отчество
	char date[12];  //- желаемая дата вылета;
	Node * next;    // указатель на структуру заявка.
};

void Menu();
Node *addNode(Node *first); // - добавление заявок в список;
Node *deleteNode(Node *first); // - удаление заявок по заданному номеру рейса
void outNode(Node *first); // - вывод всех заявок.
void outNodeNum(Node *first); // вывод одной заявки

int main()
{
	//setlocale(LC_ALL, "Russian");

	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);

	//Node *first = new Node;
	//int n = 1;
	//cout << "-------Данные о заявке-------\n\n";
	//cout << "Введите пункт назначения > ";
	//cin >> first->point;
	//cout << "Введите номер рейса > ";
	//cin >> first->reis;
	//cout << "Введите фамилию пассажира > ";
	//cin >> first->name;
	//cout << "Введите имя пассажира > ";
	//cin >> first->surname;
	//cout << "Введите отчество пассажира > ";
	//cin >> first->patr;
	//cout << "Введите дату вылета > ";
	//cin >> first->date;
	//cout << "\n";
	//first->next = NULL;

	////////////////////////////////////////////////////////
	Node *first = new Node;  first->reis = 1021;  strcpy_s(first->name, 20, "Шишов"); strcpy_s(first->surname, 20, "Иван");  strcpy_s(first->patr, 20, "Иванов"); strcpy_s(first->point, 20, "Москва");
	Node *f1 = new Node;     f1->reis = 20;       strcpy_s(f1->name, 20, "Шишеков");  strcpy_s(f1->surname, 20, "Иван");     strcpy_s(f1->patr, 20, "Сергеевич"); strcpy_s(f1->point, 20, "Владивосток");
	Node *f2 = new Node;     f2->reis = 3010;     strcpy_s(f2->name, 20, "Иванов");   strcpy_s(f2->surname, 20, "Станислав"); strcpy_s(f2->patr, 20, "Вислоонов"); strcpy_s(f2->point, 20, "Пекин");
	Node *f3 = new Node;     f3->reis = 4201;     strcpy_s(f3->name, 20, "Шив");      strcpy_s(f3->surname, 20, "Коля");      strcpy_s(f3->patr, 20, "Викторович"); strcpy_s(f3->point, 20, "Берлин");

	first->next = f1;
	f1->next = f2;
	f2->next = f3;
	f3->next = NULL;
	////////////////////////////////////////////////////////
	int k = 5;
	while (k != 6)
	{	
		switch (k)
		{
		case 1: first = addNode(first); break;
		case 2: outNode(first); break;
		case 3:	outNodeNum(first); break;
		case 4: first = deleteNode(first); break;
		case 5: Menu(); break;
		case 6: break;
		default: cout << "  ОШИБКА! Числа от 1 до 6.\n";		
		}
		cout << "\nВведите нужный пункт: ";
		cin >> k;
	}
	getchar(); // пауза	
	return 0;
}


void Menu()
{
	system("cls");
	cout << "\n";
	cout << "1 - Добавить заявку\n";
	cout << "2 - Вывести все заявки\n";
	cout << "3 - Вывести заявку по номеру рейса и дате вылета\n";
	cout << "4 - Удалить заявку\n";
	cout << "5 - Очистить экран\n";
	cout << "6 - Выход\n";
}

Node *addNode(Node *first)
{
	cout << "______________________________________________\n";
	Node *pv = new Node;
	cout << "Данные о заявке: \n";
	cout << "Введите пункт назначения > ";
	cin >> pv->point;
	cout << "Введите номер рейса > ";
	cin >> pv->reis;
	cout << "Введите фамилию пассажира > ";
	cin >> pv->name;
	cout << "Введите имя пассажира > ";
	cin >> pv->surname;
	cout << "Введите отчество пассажира > ";
	cin >> pv->patr;
	cout << "Введите дату вылета > ";
	cin >> pv->date;
	cout << "\n";
	pv->next = NULL;
	cout << "______________________________________________\n";
	if (first == NULL)
	{
		first = pv;	
	}
	else
	{
		Node *p = first;
		while (p->next != NULL)
		{
			p = p->next;
		}
		p->next = pv;
	}
	return first;
}

void outNode(Node *first)
{
	//Node *pv = first;
	//while (pv)
	//{
	//	cout << "\nДанные о заявке \n";
	//	cout << "\nПункт назначения > " << pv->point;
	//	cout << "\nНомер рейса > "; cout << pv->reis;
	//	cout << "\nФамилия пассажира > " << pv->name;
	//	cout << "\nИмя пассажира > " << pv->surname;
	//	cout << "\nОтчество пассажира > " << pv->patr;
	//	cout << "\nДата вылета > " << pv->date << "\n\n\n";
	//	pv = pv->next;
	//}

	cout << setiosflags(ios::right);
	cout << "_________________________________________________________________\n";
	cout << "Данные по заявкам:\n";
	cout << "       Пункт  Номер    Фамилия      Имя      Отчество        Дата\n";
	cout << "  назначения  рейса  --------- ДАННЫЕ ПАССАЖИРА -----      вылета\n";

	Node *pv = first;
	while (pv)
	{
		cout << setw(12) << pv->point << setw(7) << pv->reis << setw(11) << pv->name;
		cout << setw(10) << pv->surname << setw(13) << pv->patr << setw(12) << "12.11.2017" << endl;
		pv = pv->next;
	}
	cout << "_________________________________________________________________\n";
}

void outNodeNum(Node *first)
{
	int num;
	string dat;
	Node *pv = first;
	cout << "Введите номер рейса: ";
	cin >> num;
	cout << "Введите дату: ";
	cin >> dat;
	int n = 1, fl = 0;
	while (pv)
	{
		if (pv->reis == num && pv->date == dat)
		{
			outNode(pv);
			break;
		}
		pv = pv->next;
	}
}

Node *deleteNode(Node *first)
{
	cout << "______________________________________________\n";
	cout << "Номер рейса, заявку по которому удалить: ";
	int num;
	cin >> num;

	Node *temp = first;
	int k = -1;
	int N = 0;
	while (temp)
	{
		if (temp->reis == num)
		{
			k = N;
		}
		temp = temp->next;
		N++;
	}
	N--;
	if (k != -1)
	{
		temp = first;
		// если нужно удалить 1-й узел и он единственный был в списке
		if (k == 0 && N == 0)
		{
			delete first;
			cout << "  Удаление прошло успешно!\n";
			cout << "______________________________________________\n";
			return NULL;
		}
		// если нужно удалить 1-й узел и он НЕ единственный в списке
		if (k == 0 && N > 0)
		{
			temp = temp->next;
			delete first;
			cout << "  Удаление прошло успешно!\n";
			cout << "______________________________________________\n";
			return temp;
		}
		// если нужно удалить узел где-то в середине списка, но не последнего
		Node *el = first;
		temp = first->next;
		while (temp->next)
		{
			if (temp->reis == num)
			{
				el->next = temp->next;
				delete temp;
				cout << "  Удаление прошло успешно!\n";
				cout << "______________________________________________\n";
				return first;
			}
			el = el->next;
			temp = temp->next;
		}
		// если нужно удалить последний узел
		el->next = NULL;
		delete temp;
		cout << "  Удаление прошло успешно!\n";
		cout << "______________________________________________\n";
		return first;
	}
	else
	{
		cout << "  Такого рейса нет или список пуст!\n";
		cout << "______________________________________________\n";
		return first;
	}
}
ura_111 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Составить программу в паскале, которая содержит текущую информацию о сотрудниках лаборатории Your mother Помощь студентам 2 28.12.2016 23:21
Составить программу, которая содержит текущую информацию о книгах в библиотеке Your mother Помощь студентам 0 28.12.2016 19:45
составить программу, которая для указанных государств СНГ вводит информацию и печатает название государства sasharom97 Паскаль, Turbo Pascal, PascalABC.NET 4 06.12.2015 22:42
Программа которая содержит динамическую информацию об автобусах в автобусном парке.С++ Malino4ka Помощь студентам 0 12.05.2014 22:27
Написать программу для Паскаль 9 класс: составить программу которая печатает таблицу умножения и сложения натуральных чисел goodula Помощь студентам 0 23.01.2014 17:39