Программа не выводит заявки на авиабилеты
При запуске программы надо ввести по умолчанию первую заявку на авиабилеты, затем будет меню, где нужно выбрать определённую цифру (1 - добавить заявку, 2 - вывести все заявки, 5 - выход). Добавляю ещё одну заявку. После того, как нажимаю на цифру 2, программа ничего не выводит. Если нажать на цифру 5, то программа долго завершает работу. В чём может быть дело?
Мой код:
struct Airport {
string destination;
int flight_number;
string surname_and_initials;
string departure_date;
Airport *next;
};
class Stack {
// Нижняя и верхняя границы стека
enum {EMPTY = -1, FULL = 1000000};
// Указатель на вершину стека
int top;
// Массив для хранения данных
Airport* data = new Airport;
public:
// методы определены, но я их не указал для сокращения кода
};
// Прототипы функций
int Menu();
// Конструктор
Stack::Stack() {
top = EMPTY;
}
// Добавление заявки в список
void Stack::Push(Airport* first) {
// Если в стеке есть место, то увеличиваем указатель
// на вершину стека и вставляем новый элемент
if (!IsFull()) {
Airport *t;
Airport *tmp = new Airport;
cout << "Введите пункт назначения - ";
getline(cin, tmp->destination);
cout << "Введите номер рейса - ";
cin >> tmp->flight_number;
cin.ignore();
cout << "Введите фамилию и инициалы пассажира - ";
getline(cin, tmp->surname_and_initials);
cout << "Введите дату вылета - ";
getline(cin, tmp->departure_date);
data[++top] = *tmp;
t->next = tmp;
}
}
// Вывод всех заявок
void Stack::printRequests(Airport *first) {
for (int i = 0; i < top; i++) {
cout << "--------------- Билет " << i + 1 << " ---------------";
cout << "Пункт назначения: " << data[i].destination << endl;
cout << "Номер рейса: " << data[i].flight_number << endl;
cout << "Фамилия и инициалы пассажира: " << data[i].surname_and_initials << endl;
cout << "Дата вылета: " << data[i].departure_date << endl << endl;
}
}
int main() {
setlocale(LC_CTYPE, "rus");
Stack st;
Airport *first = new Airport;
first->next = NULL;
cout << "Введите пункт назначения - ";
getline(cin, first->destination);
cout << "Введите номер рейса - ";
cin >> first->flight_number;
cin.ignore();
cout << "Введите фамилию и инициалы пассажира - ";
getline(cin, first->surname_and_initials);
cout << "Введите дату вылета - ";
getline(cin, first->departure_date);
short k;
while ((k = Menu()) != 5) {
switch(k) {
case 1:
st.Push(first);
break;
case 2:
st.printRequests(first);
break;
case 5:
break;
}
}
delete[] first;
return 0;
}
int Menu() {
cout << "\n";
cout << "1 - Добавить заявку\n";
cout << "2 - Вывести все заявки\n";
cout << "3 - Удалить заявку\n";
cout << "4 - Вывести заявку по номеру рейса и дате вылета\n";
cout << "5 - Выход\n";
cout << "Введите нужный пункт: ";
short k;
cin >> k;
cin.ignore();
cout << "\n";
return k;
}
Результат выполнения у меня такой:
Ответы (1 шт):
Запустил вашу программу. Для этого её пришлось немного подправить, в оригинальном виде она не запускалась. Чтобы не было разночтений, вот список изменений:
Добавил заголовки для
iostreamиstringи директивуusing namespace std;. Иначе не компилируется.Объявил конструктор
Stack::Stackи методыStack::Push,Stack::IsFull,Stack::printRequestsв классе. Их не было.В реализациях
Stack::PushиStack::printRequestsубрал имя параметраfirst. Он не используется.Привёл результат вызова
Menu()кshort. Вообще ни на что не влияет, но компилятор упирается.Убрал декларацию
Airport *t;и операторt->next = tmp;. Компилятор жаловался на запись по не инициализированному указателю. Это серьёзное изменение: ваш вариант портил произвольную память, исправленный так не делает, что может исказить результаты моих тестов.Исправил
delete[] first;наdelete first;. Компилятор жаловался что так нельзя удалять скалярные указатели.Добавил реализацию и объявление метода
Stack::IsFull. Его нигде не было, но я поискал в ваших предыдущих вопросах и нашёл.
Так вот, теперь я смог запустить вашу программу. valgrind обнаружил всего две утечки памяти. Но они на результат не влияют, а других ошибок не было.
Тест полностью воспроизвёл поведение, которое вы описали в вопросе.
Теперь можно ответить на ваш вопрос: "Где печать?".
Печати нет, потому что записи печатаются от нуля до значения переменной top минус один (условие в цикле i < top). top в начале равна -1. Один раз она инкрементируется в методе Stack::Push и становится равной нулю. А раз она ноль, печатать нечего.
P.S. Здесь я собирался сказать много ласковых слов про ваш стиль написания программ и задавания вопросов. Но сдержался. С трудом.
