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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.08.2016, 16:21   #1
Fentazi
 
Регистрация: 13.08.2016
Сообщений: 4
По умолчанию Динамические структуры данных C++

Задание работы:

Автоматизированная информационная система на железнодорожном вокзале содержит сведения об отправлении поездов дальнего следования.

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

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

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

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

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

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

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

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

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

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

Мой код:
Код:
#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; это понятно.
Но если убрать, будет бесконечно выводить данные о первом поезде с данным именем.
Собственно просьба помочь исправить )
Fentazi вне форума Ответить с цитированием
Старый 13.08.2016, 18:49   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Код:
 while (ptr != NULL) {//пока не конец списка
        if (strcmp(Name, ptr->name) == 0)
        {
            Show(ptr);
            return; //если убрать, будет выводить бесконечно данные первой структуры с данным именем
        }
        else ptr = ptr->next;
    }
строка
Код:
ptr = ptr->next;
выполняется только если поезд "не тот", а если "тот", то программа и крутит один и тот же поезд

else тут не нужен, просто ptr = ptr->next;
ну и ретурн можно убирать
eoln вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамические структуры данных Zaraaa Помощь студентам 5 26.10.2013 09:59
динамические структуры данных rinoolik Паскаль, Turbo Pascal, PascalABC.NET 0 24.12.2012 17:21
Динамические структуры данных, списковые структуры (надо разобраться что делает программа) _4Alex4_ Помощь студентам 1 14.11.2012 07:39
Динамические структуры данных doter Visual C++ 2 21.02.2011 12:23
Динамические структуры данных vasylka Помощь студентам 1 16.11.2010 20:16