1 Востаннє редагувалося Logans (15.12.2013 19:35:48)

Тема: Опис класу та дії з ним

Добрий вечір.

Чергова лабораторна робота, яку я зробив, але також дали завдання на захист, з яким в мене тупняк.

Завдання програми:

1.    Описати клас з ім’ям TRAIN, що містить наступні поля:

  • назва пункту призначення;

  • номер потягу;

  • час відправлення.

2.    Написати програму, що виконує наступні дії:

  • введення з клавіатури даних в масив, що складається з восьми елементів типу TRAIN;

  • записи повинні бути впорядковані по номерах потягів;

  • виведення на екран інформації про потяг, номер якого введений з клавіатури;

  • якщо таких потягів немає, видати на дисплей відповідне повідомлення.

Зроблено!


Ось код.

Код програми
#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;

class Train
{
    private:
        string Name;
        int Number;
        string Time;
    public:
        void setTrainType(string trainName, int trainNumber, string trainTime)
        {
            Name = trainName;
            Number = trainNumber;
            Time = trainTime;
        };

        string getName()
        {
            return Name;
        };

        int getNumber()
        {
            return Number;
        };

        string getTime()
        {
            return Time;
        };

        void searchNumber(int trainNumber, int countNumber)
        {
            /*
            for (int i = 0; i < countNumber; i++)
                if (Number == trainNumber)
                */    
        };
};

int main()
{
    string Name;
    int Number, Count;
    int i = 0;
    string Time;
    
    setlocale(LC_ALL, "");

    cout << "Input number of record's: ";
    cin >> Count;

    Train Trains[15];

    for (i = 0; i < Count; i++)
    {
        cout << "Input Train name: ";
        cin >> Name;

        cout << "Input Train number: ";
        cin >> Number;

        cin.get();

        cout << "Input Train time: ";
        getline(cin, Time);

        Trains[i].setTrainType(Name, Number, Time);
        
        cout << endl;
    };
    
    for (int i = 0; i < Count; i++)
        for (int j = 0; j < Count - 1; j++)
            if (Trains[j].getNumber() < Trains[j + 1].getNumber())
            {
                Train newNumber = Trains[j];
                Trains[j] = Trains[j + 1];
                Trains[j + 1] = newNumber;
            };
    
    for (i = 0; i < Count; i++)
        cout << Trains[i].getName() << " " << Trains[i].getNumber() << " " << Trains[i].getTime() << endl;

    cout << endl;
    int searchTrainNumber;
    string yesNo;
    bool Wrong = true;
    do
    {
        cout << "Input Train Number for search: ";
        cin >> searchTrainNumber;

        for (int j = 0; j < Count; j++)
            if (Trains[j].getNumber() == searchTrainNumber)
            {
                cout << Trains[j].getName() << " " << Trains[j].getNumber() << " " << Trains[j].getTime() << endl;
                Wrong = false;
            };

        if (Wrong == true)
            cout << "Wrong number! Please, repeat again." << endl;

        cout << "Repeat? (Yes, No): ";
        cin >> yesNo;

        Wrong = true;
        cout << endl;
        i++;
    }
    while (yesNo != "No");

    return 0;
}

Програма працює таким чином:

Данні обробки
Введіть кількість записів: 3
/*Ввід данних*/
Введіть назву потягу: Львів-Київ /*Під назвою, мається на увазі маршрут*/
Введіть номер потягу: 10
Введіть час потягу: 10:20        /*Під часом, мається на увазі час відправки*/

Введіть назву потягу: Київ-Львів
Введіть номер потягу: 9
Введіть час потягу: 15:30

Введіть назву потягу: Харків-Київ
Введіть номер потягу: 11
Введіть час потягу: 12:10

/*Відсортований вивід даних*/
Харків-Київ 11 12:10
Львів-Київ 10 10:20
Київ-Львів 9 15:30

/*Пошук по номеру*/
Введіть номер потягу для пошуку: 10
Львів-Київ 10 10:20
Повторити? (так, ні): ...


Захист: Потрібно при пошуку, виводити потяг який їде за оберненим маршрутом. Наприклад.

Данні обробки
Введіть кількість записів: 3
Введіть назву потягу: Львів-Київ 
Введіть номер потягу: 10
Введіть час потягу: 10:20       

Введіть назву потягу: Київ-Львів
Введіть номер потягу: 9
Введіть час потягу: 15:30

Введіть назву потягу: Харків-Київ
Введіть номер потягу: 11
Введіть час потягу: 12:10

Харків-Київ 11 12:10
Львів-Київ 10 10:20
Київ-Львів 9 15:30

Введіть номер потягу для пошуку: 10
Львів-Київ 10 10:20
Київ-Львів 9 15:30
Повторити? (так, ні): ...

Ось програма яка має це відтворювати:

Код програми
#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;

class Train
{
    private:
        string Name;
        int Number;
        string Time;
    public:
        void setTrainType(string trainName, int trainNumber, string trainTime)
        {
            Name = trainName;
            Number = trainNumber;
            Time = trainTime;
        };

        string getName()
        {
            return Name;
        };

        int getNumber()
        {
            return Number;
        };

        string getTime()
        {
            return Time;
        };
};

int main()
{
    string Name;
    int Number, Count;
    int i = 0;
    string Time;
    
    setlocale(LC_ALL, "");

    cout << "Input number of record's: ";
    cin >> Count;

    Train Trains[15];

    for (i = 0; i < Count; i++)
    {
        cout << "Input Train name: ";
        cin >> Name;

        cout << "Input Train number: ";
        cin >> Number;

        cin.get();

        cout << "Input Train time: ";
        getline(cin, Time);

        Trains[i].setTrainType(Name, Number, Time);
        
        cout << endl;
    };
    
    for (int i = 0; i < Count; i++)
        for (int j = 0; j < Count - 1; j++)
            if (Trains[j].getNumber() < Trains[j + 1].getNumber())
            {
                Train newNumber = Trains[j];
                Trains[j] = Trains[j + 1];
                Trains[j + 1] = newNumber;
            };
    
    for (i = 0; i < Count; i++)
        cout << Trains[i].getName() << " " << Trains[i].getNumber() << " " << Trains[i].getTime() << endl;

    cout << endl;
    int searchTrainNumber;
    string yesNo;
    bool Wrong = true;
    do
    {
        cout << "Input Train Number for search: ";
        cin >> searchTrainNumber;
        /*Перевірка починається тут*/
        if ((searchTrainNumber % 2) == 1)
        {
            for (int j = 0; j < Count; j++)
                if (Trains[j].getNumber() == searchTrainNumber)
                {
                    cout << Trains[j].getName() << " " << Trains[j].getNumber() << " " << Trains[j].getTime() << endl;
                
                    if (Trains[j + 1].getNumber() == Trains[j].getNumber() + 1)
                        cout << Trains[j + 1].getName() << " " << Trains[j + 1].getNumber() << " " << Trains[j + 1].getTime() << endl;
                    else
                        cout << "Error! Train with this number don't exist" << endl;
                    
                    Wrong = false;
                };
        }
        else
            for (int j = 0; j < Count; j++)
                if (Trains[j].getNumber() == searchTrainNumber)
                {
                    cout << Trains[j].getName() << " " << Trains[j].getNumber() << " " << Trains[j].getTime() << endl;
                    
                    if (Trains[j - 1].getNumber() == Trains[j].getNumber() - 1)
                        cout << Trains[j - 1].getName() << " " << Trains[j - 1].getNumber() << " " << Trains[j - 1].getTime() << endl;
                    else
                        cout << "Error! Train with this number don't exist" << endl;
                    
                    Wrong = false;
                };

        if (Wrong == true)
            cout << "Wrong number! Please, repeat again." << endl;

        cout << "Repeat? (Yes, No): ";
        cin >> yesNo;

        Wrong = true;
        cout << endl;
        i++;
    }
    while (yesNo != "No");

    return 0;
}


Моя перевірка повинна працювати так:
"Якщо номер потягу непарне число, то перевіряємо елемент який стоїть після нього,
якщо цей елемент, що стоїть після непарного, більший від попереднього (непарного) на 1,
тоді виводимо його, інакше, "Помилка!"

"Якщо номер потягу парне число, то перевіряємо елемент який стоїть перед ним,
якщо цей елемент, що стоїть перед парним, меньший від попереднього (парного) на 1,
тоді виводимо його, інакше, "Помилка!"



Що в мене виходить:

Данні обробки
Введіть кількість записів: 3
Введіть назву потягу: Львів-Київ 
Введіть номер потягу: 10
Введіть час потягу: 10:20       

Введіть назву потягу: Київ-Львів
Введіть номер потягу: 9
Введіть час потягу: 15:30

Введіть назву потягу: Харків-Київ
Введіть номер потягу: 11
Введіть час потягу: 12:10

Харків-Київ 11 12:10
Львів-Київ 10 10:20
Київ-Львів 9 15:30

Введіть номер потягу для пошуку: 10
Львів-Київ 10 10:20
Помилка! Потяг з даним номером не існує.
Повторити? (так, ні): ...

Питання саме в тому, як зробити данну перевірку працюючою?

Перепробував декілька варіантів (переставляючи змінні і вивід) перевірки, але нажаль не можу дістати працюючу програму.

2

Re: Опис класу та дії з ним

Замість setTrainType краще конструктор і operator= перевизначити.
І зовсім не зрозуміло, чому зворотній поїзд має бути зі схожим номером, в умові про це ані слова нема.

3 Востаннє редагувалося Logans (15.12.2013 20:32:50)

Re: Опис класу та дії з ним

koala написав:

І зовсім не зрозуміло, чому зворотній поїзд має бути зі схожим номером, в умові про це ані слова нема.

В умові не сказано, тому що це на захист дали (переробити програму), я здається про це написав.

Захист: Потрібно при пошуку, виводити потяг який їде за оберненим маршрутом.

Вибачте, я забув вказати, як саме це потрібно виконати.

koala написав:

Замість setTrainType краще конструктор і operator= перевизначити.

Тобто зробити для Назви, Номеру і Часу окремі ф-ії? Типу void setName/setName/setTime?

4

Re: Опис класу та дії з ним

Logans написав:
koala написав:

Замість setTrainType краще конструктор і operator= перевизначити.

Тобто зробити для Назви, Номеру і Часу окремі ф-ії? Типу void setName/setName/setTime?

Ні, тобто зробити

    Train** Trains=new Train*[Count];
    for (i = 0; i < Count; i++)
    {
        ... 
        Trains[i]=new Train(Name, Number, Time);

або (менше вказівників)

    Train* Trains=new Train[Count];
    for (i = 0; i < Count; i++)
    {
        ... 
        Trains[i]=Train(Name, Number, Time);

5 Востаннє редагувалося Logans (15.12.2013 22:05:42)

Re: Опис класу та дії з ним

Спробував зробити так як ви сказали.
http://screenshot.su/img/4f/f8/bc/4ff8bc05c1b0fad565f772f2675cc919.jpg


А щодо перевірки, можете щось порадити?

6 Востаннє редагувалося incred (16.12.2013 07:09:50)

Re: Опис класу та дії з ним

Прихований текст

Здається, саме час застрелитися.

Оскільки записи впорядковані за номерами поїздів, а вам треба порівнювати маршрути(що визначає відповідне строкове поле), то чому ви порівнюєте номери, адже з них про маршрут нам нічого не відомо.

з.ю.

Код із першої частини я не бачив, але 2 проглянув.....

Яка версія стандартів С++ передбачає крапку з комою після фігурної дужки тіла функції, чи я марю?

Що ви перевіряєте? Чому не врахували швидкість вітру або ймовірність дострокового розпущення парламенту?

Я б радив користуватися бібліотечними функціями для сортування і пошуку відповідного рядка, та тоді у класі взагалі треба перевантажити operator==, operator< і таке інше..

Я в технікумі ще й не починав вивчати с++, але невже це ви вже пройшли лекційне заняття з даної теми?

Подякували: Logans1

7

Re: Опис класу та дії з ним

incred написав:
Прихований текст

Здається саме час застрелитися.

Оскільки записи впорядковані за номерами поїздів, а вам треба порівнювати маршрути(що визначає відповідне строкове поле), то чому ви порівнюєте номери, адже з них про маршрут нам нічого не відомо.

Код із першої частини я не бачив, але 2 проглянув.....

Яка версія стандартів С++ передбачає крапку з комою після фігурної дужки тіла функції, чи я марю?

Що ви перевіряєте? Чому не врахували швидкість вітру або ймовірність дострокового розпущення парламенту?

Я б радив користуватися бібліотечними функціями для сортування і пошуку відповідного рядка, та тоді у класі взагалі треба перевантажити operator==, operator< і таке інше..

Я в технікумі ще й не починав вивчати с++, але невже це ви вже пройшли лекційне заняття з даної теми?

Якщо вам потрібно - застрелюйтесь, а мені ще рано, хочаб сессію здати потрібно :)

1. Крапка з комою ролі для програми (у закінченні ф-ії) не грає, я використовую це лише для себе, щоб позначити закінчення тіла ф-ії.

2. Напевне так і зроблю, а що? Чудова ідея враховувати швидкість вітру, можливо ще і силу тяжіння і масу потягу порахую. *сарказм*

3. Функцію сортування використовую самописну (сказати чому, не можу, тому що і сам не знаю, можливо тому що ще не доводилось користуватися встроєною і за звичкою використовую самописну).
За перевантаження операторів, дякую.

4. В нас в пришвидшеному темпі за цих пів року з одного предмету вичитали Assembler і С++.

8

Re: Опис класу та дії з ним

Logans написав:

Спробував зробити так як ви сказали.

Я трохи вище казав конструктор визначити.


Logans написав:

А щодо перевірки, можете щось порадити?

Ви перевіряєте для j від 0 до Count-1, чи Trains[j - 1] має певні властивості, правильно? За межі масиву вилазите.

9

Re: Опис класу та дії з ним

koala написав:
Logans написав:

Спробував зробити так як ви сказали.

Я трохи вище казав конструктор визначити.

http://screenshot.su/img/6a/c0/ca/6ac0ca94a60b71227d926c7af38211a1.jpg
Я визначив, на нього компілятор не сварився.

10 Востаннє редагувалося Logans (16.12.2013 00:28:48)

Re: Опис класу та дії з ним

Все, проблему з перевіркою вирішено, просто я не врахував того, що записи було посортовано по спаданню. Посортував по зростанню і спрацювало :)

Ну і ще дещо переписав (замінив місцями).