0

Помогите, пожалуйста, найти ошибки в коде. Задание: Описать класс "Автобусный билет" с соответствующими полями. Описать методы класса для ввода с консоли и файла, для вывода всех данных и о конкретном пассажира (поиск по одному из полей, например, по имени). Описать перегружен метод "Продажа", который будет инициализировать билеты введенными данными. Добавить закрытое статическое поле count, которое после каждого введенного билета будет выводить количество введенных билетов в текущий момент времени.

В main () я создаю динамический массив объектов класса, в которых хочу записать информацию о n билетов способом, в switch () выберет пользователь. Когда я хочу вывести эти данные, например, весь массив, то выводятся только номера билета, автобуса и места, которые программа генерирует сама, а также возможность перевозки багажа. Помогите, пожалуйста, понять где ошибка. Также есть проблема с выводом счетчика count. Программа выводит адрес count, а не само значение. Подскажите, пожалуйста, почему так?

#include <iostream>
#include <string>
#include <fstream>
#include <ctime>
#include <Windows.h>
#include <iomanip>
const int size_n = BUFSIZ;
using namespace std;

class bus_ticket { public: bus_ticket() { //конструктор по умолчанию srand(time(NULL)); number = rand() % 100000 + 100000; bus_number = rand() % 1000 + 1000; place_number = rand() % 50 + 10; count++; } bus_ticket(int Xnumber, int Xbus_number, int Xplace_number) { //конструктор с параметрами number = Xnumber; bus_number = Xbus_number; place_number = Xplace_number; count++; } bus_ticket(const bus_ticket& other) { //конструктор копирования this->number = other.number; this->bus_number = other.bus_number; this->place_number = other.place_number; this->passenger = other.passenger; this->sity_from = other.sity_from; this->sity_to = other.sity_to; this->date = other.date; this->baggage = other.baggage; this->sold_out = other.sold_out; this->control = other.control; count++; } ~bus_ticket() { //деструктор count--; } string passenger; //имя пассажира
string sity_from; //пункт отправления string sity_to; //пункт назначения string date; //дата отправления bool baggage; //возможность перевозки багажа

void output(int i) { //метод вывода информации о пассажирах и их билеты
    cout &lt;&lt; endl &lt;&lt; &quot;Информация о пассажире &quot; &lt;&lt; i + 1 &lt;&lt; &quot;: &quot; &lt;&lt; endl;
    cout &lt;&lt; left &lt;&lt; setw(40) &lt;&lt; &quot;Имя пассажира: &quot; &lt;&lt; left &lt;&lt; setw(10) &lt;&lt; passenger &lt;&lt; endl;
    cout &lt;&lt; left &lt;&lt; setw(40) &lt;&lt; &quot;Номер билета пассажира: &quot; &lt;&lt; left &lt;&lt; setw(10) &lt;&lt; number &lt;&lt; endl;
    cout &lt;&lt; left &lt;&lt; setw(40) &lt;&lt; &quot;Пункт отправления пассажира: &quot; &lt;&lt; sity_from &lt;&lt; endl;
    cout &lt;&lt; left &lt;&lt; setw(40) &lt;&lt; &quot;Пункт назначения пассажира: &quot; &lt;&lt; sity_to &lt;&lt; endl;
    cout &lt;&lt; left &lt;&lt; setw(40) &lt;&lt; &quot;Дата отправления пассажира: &quot; &lt;&lt; date &lt;&lt; endl;
    cout &lt;&lt; left &lt;&lt; setw(40) &lt;&lt; &quot;Возможность перевозки багажа пассажира: &quot;;
    if (baggage) {
        cout &lt;&lt; &quot;Предусмотрена&quot; &lt;&lt; endl;
    }
    else {
        cout &lt;&lt; &quot;Не предусмотрена&quot; &lt;&lt; endl;
    }
    cout &lt;&lt; left &lt;&lt; setw(40) &lt;&lt; &quot;Номер автобуса пассажира: &quot; &lt;&lt; bus_number &lt;&lt; endl;
    cout &lt;&lt; left &lt;&lt; setw(40) &lt;&lt; &quot;Номер места пассажира: &quot; &lt;&lt; place_number &lt;&lt; endl;
}

void input(int i) { //метод ввода информации о пассажирах и их билеты
    string str;
    cout &lt;&lt; &quot;Введіть имя пассажира &quot; &lt;&lt; i + 1 &lt;&lt; endl;
    cin &gt;&gt; passenger;
    cout &lt;&lt; &quot;Введіть пункт отправления пассажира &quot; &lt;&lt; i + 1 &lt;&lt; endl;
    cin &gt;&gt; sity_from;
    cout &lt;&lt; &quot;Введіть пункт назначения пассажира &quot; &lt;&lt; i + 1 &lt;&lt; endl;
    cin &gt;&gt; sity_to;
    cout &lt;&lt; &quot;Введіть дату отправления пассажира &quot; &lt;&lt; i + 1 &lt;&lt; endl;
    cin &gt;&gt; date;
    cout &lt;&lt; &quot;Необходимо ли место для багажа пассажиру &quot; &lt;&lt; i + 1 &lt;&lt; &quot;?&quot; &lt;&lt; endl;
    cin &gt;&gt; str;
    if (str == &quot;Да&quot;) {
        baggage = 1;
    }
    else {
        baggage = 0;
    }
}

void output_from_file() { //метод вывода информации о пассажирах и их билеты из файла
    string name = &quot;Tickets.txt&quot;;

    ifstream fin;
    fin.open(name);
    if (!fin.is_open()) {
        cout &lt;&lt; &quot;Не удалось открыть файл &quot; &lt;&lt; name &lt;&lt; endl;
    }
    else {
        string str;
        while (!fin.eof()) {
            str = &quot;&quot;;
            getline(fin, str);
            cout &lt;&lt; str &lt;&lt; endl;
        }
    }
    fin.close();
}

void input_to_file(bus_ticket ticket) { //метод ввода информации о пассажирах и их билеты из файла
    string name = &quot;Tickets.txt&quot;;
    ofstream fout;
    fout.open(name, ofstream::app);
    if (!fout.is_open()) {
        cout &lt;&lt; &quot;Не удалось открыть файл &quot; &lt;&lt; name &lt;&lt; endl;
    }
    else {
        fout.write((char*)&amp;ticket, sizeof(bus_ticket));
    }
    fout.close();
}

//перегруженный метод &quot;Продажа&quot; описанного класса
void selling(bus_ticket ticket, int i) {
    ticket.input(i);
    Set_sold_out(1);
}
void selling(bus_ticket ticket) {
    ticket.input_to_file(ticket);
    Set_sold_out(1);
}

bool Get_sold_out() {
    return sold_out;
}

bool Set_sold_out(bool new_sold_out) {
    sold_out = new_sold_out;
    return 0;
}

static int get_count() {
    return count;
}

protected: bool control; //контроль билета private: int number; //номер билета int bus_number; //номер автобуса int place_number; //номер места bool sold_out; //номер места static int count; //количество данных };

int bus_ticket::count = 0; //инициализация

int main() { setlocale(LC_ALL, "ru"); srand(time(NULL));

//ввод информации о пассажирах и их билеты
int n;
cout &lt;&lt; &quot;Введите количество пассажиров, которым нужны билеты&quot; &lt;&lt; endl;
cin &gt;&gt; n;
bus_ticket* tickets = new bus_ticket[n];
int a;
for (int i = 0; i &lt; n; i++) {
    cout &lt;&lt; endl;
    cout &lt;&lt; &quot;Для ввода информации о пассажире &quot; &lt;&lt; i + 1 &lt;&lt; &quot; и его билет в консоли введите 1&quot; &lt;&lt; endl;
    cout &lt;&lt; &quot;Для ввода информации о пассажире &quot; &lt;&lt; i + 1 &lt;&lt; &quot; и его билет из файла введите 2&quot; &lt;&lt; endl;
q:
    cout &lt;&lt; endl &lt;&lt; &quot;Введите номер нужной операции a=&quot;; cin &gt;&gt; a;
    if (!cin) {
        cin.clear(0);
        cin.ignore(10000, '\n');
        cout &lt;&lt; &quot;Введите корректные данные&quot; &lt;&lt; endl;
        goto q;
    }
    switch (a) {
    case 1:
        tickets[i].selling(tickets[i], i);
    case 2:
        tickets[i].selling(tickets[i]);
    }
    cout &lt;&lt; &quot;Текущее количество билетов m=&quot; &lt;&lt; bus_ticket::get_count &lt;&lt; endl;
}

cout &lt;&lt; endl;
cout &lt;&lt; &quot;Для вывода информации о конкретном пассажире и его билете введите 1&quot; &lt;&lt; endl;
cout &lt;&lt; &quot;Для вывода информации о всех пассажирах и их билетах введите 2&quot; &lt;&lt; endl;

z: cout << endl << "Введите номер нужной операции a="; cin >> a; if (!cin) { cin.clear(0); cin.ignore(10000, '\n'); cout << "Введите корректные данные" << endl; goto z; } string str_name; switch (a) { case 1: cout << "Введите имя пассажира для поиска" << endl; cin >> str_name; for (int i = 0; i < n; i++) { if (tickets[i].passenger == str_name) { tickets[i].output(i); } } case 2: for (int i = 0; i < n; i++) { tickets[i].output(i); } }

delete[] tickets;

}

Игорь
  • 13
  • 6
  • Программа выводит адрес count, а не само значение выводит не адрес count, а адрес метода get_count. Чего вы, интересно, еще хотели добиться, выводя в консоль cout << bus_ticket::get_count. Метод хоть вызовите – Стас Dec 02 '20 at 13:13
  • 2
    while (!fin.eof()) - см. https://ru.stackoverflow.com/q/833980/195342 – Harry Dec 02 '20 at 13:33

0 Answers0