Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/25: Рейтинг темы: голосов - 25, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 03.12.2015
Сообщений: 6

Реализовать автоматизированную информационную систему железнодорожного вокзала (динамические структуры данных)

13.08.2016, 16:18. Показов 5569. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задание работы:
Кликните здесь для просмотра всего текста
Автоматизированная информационная система на железнодорожном вокзале содержит сведения об отправлении поездов дальнего следования.

Для каждого поезда указывается:

□ номер поезда;

□ станция назначения;

□ время отправления.

Данные в информационной системе организованы в виде линейного списка. Написать программу, которая:

□ обеспечивает первоначальный ввод данных в информационную систему и формирование линейного списка;

□ производит вывод всего списка;

□ вводит номер поезда и выводит все данные об этом поезде;

□ вводит название станции назначения и выводит данные обо всех поездах, следующих до этой станции.

Программа должна обеспечивать диалог с помощью меню и контроль ошибок при вводе.


Мой код:
Кликните здесь для просмотра всего текста

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
#pragma once
#include <iostream>
#include <math.h>
#include <iomanip>
#include <conio.h>
 
using namespace std;
 
struct train {
    int number;
    char *name = new char;
    float time;
    train* next;
};
 
//поиск элемента в однонаправленном списке
bool Find(train* Head, int NumberItem) {
    train *ptr; //вспомогательным указатель
    ptr = Head;
    while (ptr != NULL) {//пока не конец списка
        if (NumberItem == ptr->number) return true;
        else ptr = ptr->next;
    }
    return false;
}
 
//проверка на корректность введённого времени
bool Mistake(train* Head, float TimeItem)
{
    float fractpart, intpart;
    fractpart = modf(TimeItem, &intpart);
    if ((intpart > 24) || (fractpart > 0.60) || (TimeItem < 0))
        return true;
    else
        return false;
}
 
//вставка элемента с заданным номером в однонаправленный список
train* Make(train* Head, int Number) {
    Number--;
    train *NewItem = new(train);
    cout << "Number of the train: ";
    while (!(cin >> NewItem->number) || Find(Head, NewItem->number) == true)
    {
        cout << "This number is already listed!" << endl;
        cout << "Enter number again: ";
    }
 
    cout << "Destination: ";
    cin >> NewItem->name;
 
    cout << "Arrival time: ";
    while (!(cin >> NewItem->time) || Mistake(Head, NewItem->time) == true)
    {
        cout << "Time is entered incorrectly!" << endl;
        cout << "Enter time again: ";
    }
 
    NewItem->next = NULL;
 
    if (Head == NULL) {//список пуст
        Head = NewItem;//создаем первый элемент списка
    }
    else {//список не пуст
        train *Current = Head;
        for (int i = 1; i < Number && Current->next != NULL; i++)
            Current = Current->next;
        if (Number == 0) {
            //вставляем новый элемент на первое место
            NewItem->next = Head;
            Head = NewItem;
        }
        else {//вставляем новый элемент на не первое место
            if (Current->next != NULL)
                NewItem->next = Current->next;
            Current->next = NewItem;
        }
    }
    return Head;
}
 
//печать однонаправленного списка
void Print(train* Head)
{
    if (Head == NULL)
        cout << "List is empty!";
    else 
    {
        while (Head != NULL) {
            cout << "Number" << "\t" << "Destination" << "\t" << "Arrival time" << "\t" << endl;
            cout << Head->number << "\t" << Head->name << "\t" << "\t" << std::fixed << setprecision(2) << Head->time << endl;
            Head = Head->next;
            //переход к следующему элементу
        }
    }
}
 
//вывод элементов
void Show(train* Head)
{
    cout << "Number" << "\t" << "Destination" << "\t" << "Arrival time" << "\t" << endl;
    cout << Head->number << "\t" << Head->name << "\t" << "\t" << std::fixed << setprecision(2) << Head->time << endl;
}
 
 
//освобождение памяти, выделенной под однонаправленный список
void Delete(train* Head) {
    if (Head != NULL) {
        Delete(Head->next);
        delete Head;
    }
}
 
//поиск элемента (номера) в однонаправленном списке
void FindNumber(train* Head) {
    train *ptr; //вспомогательным указатель
    ptr = Head;
    int NumberItem = 0;
    cout << "Input train's number: ";
    cin >> NumberItem;
    while (ptr != NULL) {//пока не конец списка
        if (NumberItem == ptr->number) 
        {
            Show(ptr);
            return;
        }
        else ptr = ptr->next;
    }
    cout << "No such train was found" << endl;
}
 
//поиск элемента(имени) в однонаправленном списке (Нужно что бы выводила данные обо ВСЕХ поездах, следующих до этой станции)
void FindTime(train* Head) {
    train *ptr; //вспомогательным указатель
    ptr = Head;
    char *Name = new char;
    cout << "Input station's name: ";
    cin >> Name;
    while (ptr != NULL) {//пока не конец списка
        if (strcmp(Name, ptr->name) == 0)
        {
            Show(ptr);
            return; //если убрать, будет выводить бесконечно данные первой структуры с данным именем
        }
        else ptr = ptr->next;
    }
    cout << "No such station was found" << endl;
}
 
int main()
{
    train *Head = NULL;
    int n = 1;
 
    char cKey;
    do {
        system("cls");
        cout << "1 - Add info about new train to the Database\n";
        cout << "2 - Show Database\n";
        cout << "3 - Show info about specific train\n";
        cout << "4 - Show info about arriving trains to the station\n";
        cout << "5 - Exit\n";
        cKey = _getch();
        system("cls");
        if (cKey == '1') {
            Head = Make(Head, n);
            n++;
        }
        else if (cKey == '2')
            Print(Head);
        else if (cKey == '3')
            FindNumber(Head);
        else if (cKey == '4')
            FindTime(Head);
        else if (cKey == '5')
        {
            cout << "Goodbye" << endl;
            Delete(Head);
        }   
        else
            continue;
        _getch();
    } while (cKey != '5');
    
    system("pause");
    return 0;
}


Суть проблемы:
Почему то не работает корректно поиск по названию станции.
Функция должна выводить данные обо ВСЕХ поездах, следующих до этой станции.
Выводит всего один раз с return; это понятно.
Но если убрать, будет бесконечно выводить данные о первом поезде с данным именем.
Собственно просьба помочь исправить )
Вложения
Тип файла: zip Laba 9.2.zip (3.63 Мб, 45 просмотров)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.08.2016, 16:18
Ответы с готовыми решениями:

Билетная касса железнодорожного вокзала. Моделирование СМО
Помогите разобраться с логикой. Условие задачи: &quot;На железнодорожном вокзале имеется 3 кассы: 2 обычные и 1 для военных. Пассажиры...

Как реализовать динамические структуры данных (стеки, списки, деревья и т.д.)
В общем такая ситуация, мне необходимо оперировать большими матрицами, которые связанны между собой в список, при этом необходимо изменять...

Динамические структуры данных: Реализовать функции для работы с двунаправленным списком
Реализовать следующие функции для работы с двунаправленным списком: - создание - удаление всех элементов с указанным значением -...

6
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
13.08.2016, 16:49
Лучший ответ Сообщение было отмечено parvova как решение

Решение

Цитата Сообщение от parvova Посмотреть сообщение
Выводит всего один раз с return; это понятно.
Но если убрать, будет бесконечно выводить данные о первом поезде с данным именем.
лекарство:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//поиск элемента(имени) в однонаправленном списке (Нужно что бы выводила данные обо ВСЕХ поездах, следующих до этой станции)
void FindTime(train* Head) {
    train *ptr; //вспомогательным указатель
    ptr = Head;
    char *Name = new char;
    cout << "Input station's name: ";
    cin >> Name;
 
    bool WasFound = false;
 
    while (ptr != NULL) {//пока не конец списка
        if (strcmp(Name, ptr->name) == 0)
        {
            Show(ptr);
            WasFound = true;
        }
        ptr = ptr->next;
    }
 
    if(!WasFound)
        cout << "No such station was found" << endl;
}
0
9 / 9 / 9
Регистрация: 04.08.2016
Сообщений: 24
13.08.2016, 17:02
Ну и ко всему прочему, наверняка имя у вас состоит не из одного символа, а память вы выделяете, как будто это так. Чревато ошибками памяти.
C++
1
2
char *Name = new char;
cin >> Name;
Вторая строчка запишет по этому адресу C-строчку, т.е. у вас не будет ошибки, только если вы введете пустоту.
0
Заблокирован
13.08.2016, 19:05
А такие задания точно надо делать на костылях и велосипедах? Нельзя использовать STL?
0
0 / 0 / 0
Регистрация: 03.12.2015
Сообщений: 6
14.08.2016, 19:03  [ТС]
Вот же я слепой, конечно ptr = ptr->next; было в else, глупая ошибка.
Всем спасибо !
Invoke Virtual, на моем этапе программирования, по заданию, пока нельзя
Devenmort, Т.е. будет правильнее изначально задать определенное количество символов ?
0
9 / 9 / 9
Регистрация: 04.08.2016
Сообщений: 24
14.08.2016, 19:12
Ну, вы и так изначально задали определенное количество - 1 символ. Я предлагаю написать хотя бы
C++
1
char *Name = new char[20];
И при считывании добавить
C++
1
cin>>setw(20);
Естественно, 20 взято от балды, выбор длины на ваше усмотрение.
0
0 / 0 / 0
Регистрация: 03.12.2015
Сообщений: 6
14.08.2016, 20:55  [ТС]
Devenmort, Спасибо !
Сделал даже так
C++ (Qt)
1
2
3
    char *Name = new char[20];
    cin.ignore();
    cin.getline(Name, 20);
Что бы заодно считывал символы после пробела
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.08.2016, 20:55
Помогаю со студенческими работами здесь

На основе структуры данных реализовать справочную систему
Здравствуйте. Дали задание написать программу на java. Но никогда в ней не работала. Прочитала что такое МVC. но не могу понять как...

Составить схему (сначала только схему) информационной системы железнодорожного вокзала
Доброго времени суток!!! :) суть вот в чем: мне нужно составить схему(сначала только схему) информационной системы железнодорожного...

Динамические структуры данных. Программа ввода в структуры и вывода информации из неё.
Автоматизированная информационная система на железнодорожном вокзале содержит сведения об отправлении поездов дальнего следования. Для...

Динамические структуры данных, списковые структуры (надо разобраться что делает программа)
дана программа, надо помочь выяснить что в ней делает каждая подпрограмма unit Unit6; interface uses Windows,...

Динамические структуры данных. Организация данных в списковые структуры
Написать программу вставки нового элемента в список за некоторым заданным по- рядковым номером элементом (вставка осуществляется не в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru