Структуры

Тема в разделе "C/C++/C#", создана пользователем Burshf, 10 дек 2012.

  1. Burshf

    Burshf Гость

    Задание такое:В справочной автовокзала хранится расписание движения автобусов. Для каждого рейса указаны его номер, тип автобуса, пункт назначения, время отправления и прибытия. Вывести информацию о рейсах, которыми можно воспользоваться для прибытия в пункт назначения раньше заданного времени.
    Мой код:
    Код (C++):
    #include <iostream>
    #include <string.h>
    #include <iomanip>
    using namespace std;

    struct Trip                                      
    {                                                

    int  number;                                 
    char     type;                           
    char     *destination;                       
    double  otTime;                            
    double  prTime;                        
    };
    int main() {
    struct Trip indexes[100];
    char dPoint[20];
    char *str;
    double time = 0.0;
    int p,q,i,j;


    cout << "Vvedite kolichestvo reisov: ";
    cin >> q;

    for ( i = 0; i < q; i++)
    {
    cout << "-------------------------------" << endl;
    cout << "Nomer reisa: ";
    cin >> indexes[i].number;
    cout << "Tip reisa: ";
    cin >> indexes[i].type;
    cout << "Mesto nazhacheniya: ";
    cin >> indexes[i].destination;
    [b]cout << "Vremya otpravleniya: "; [/b]
    cin >> indexes[i].otTime;
    cout << "Vremya pribitiya: ";
    cin >> indexes[i].prTime;
    cout << "-------------------------------" << endl;

    }

    cout <<"Vvedite mesto naznacheniya: "<<endl;
    cin.getline(dPoint, 20);
    cout<<"Vvedite vremya pribitiya(hours.minutes): ";
    cin >> time;
    cout<<endl<<"-----------------------------------------------" <<endl;
    for( i = p = 0; i < q; i++)
    {
    str = indexes[i].destination;
    if(strcmp(dPoint, str) == 0)
    {

    p++;
    }
    }
    for(j = 0; j < p; j++)
    {
    if(indexes[i].prTime < time)
    {
    cout.width(21);
    cout <<"Nomer reysa: "<<indexes[i].number<<endl;
    cout.width(21);
    cout<<"Tip reysa: "<<indexes[i].type<<endl;
    cout.width(21);
    cout<<"Mesto nazhacheniya: "<<indexes[i].destination<<endl;
    cout.width(19);
    cout<<"Vremia otpravleniya: "<<fixed<<setprecision(2)<<indexes[i].otTime<<endl;
    cout.width(21);
    cout<<"Vremya pribitiya: "<<fixed<<setprecision(2)<<indexes[i].prTime << endl;
    cout <<"-----------------------------------------------" << endl;

    }

    }

    return 0;
    }
    Компилятор ошибки не выдает,но при переходе в программе на строку "cout << "Vremya otpravleniya: ";" выдает ошибку Windows "прекращена работа программы". Чем это вызвано?
     
  2. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    ошибка тут:
    Код (Text):
    cin >> indexes[i].destination;
    память кто выделять будет?
     
  3. Burshf

    Burshf Гость

    Вы имеете ввиду динамическое выделение?
     
  4. Whatka

    Whatka Well-Known Member

    Регистрация:
    9 окт 2011
    Сообщения:
    433
    Симпатии:
    4
    любое выделение
    у тебя объявленны только указатели
     
  5. Burshf

    Burshf Гость

    Помогите пожалуйста выделить память для char *type(преподаватель попросила сделать через указатель) и char *destination,не понимаю как,чтобы не потерялось условие,необходимое для if(strcmp(dPoint, str) == 0)(т.е. destination должен быть * char).
     
  6. Burshf

    Burshf Гость

    Очень нужно в четверг сдать,помогите пожалуйста добиться работоспособности кода.
     
  7. Burshf

    Burshf Гость

    Код (C++):
        char* type = new char[20];
    char* destination= new char[20];
    Это динамическое выделение памяти под указатели,почему оно не работает,если его вставить сразу после Int main() { ?
     
  8. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    память нужно выделять по указателю объекта структуры Trip

    Добавлено: indexes.destination = new char ...
     
  9. Burshf

    Burshf Гость

    сейчас попробую,спасибо
     
  10. Burshf

    Burshf Гость

    что то не получается,можете подсказать куда в программе всунуть это. Там выходит надо цикл на кол-во i вставить?
     
  11. Burshf

    Burshf Гость

    Код (C++):
    for ( i = 0; i < q; i++)
    {
    indexes[i].destination = new char[20];
    indexes[i].type = new char[20];
    }
    Вставил такой цикл,заполнение структуры работает,спасибо.Только появилась новая проблема: строчку cin.getline(dPoint, 20); проскакивает и переходит сразу к следующей.
     
  12. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    в потоке остается символ-разделитель после предыдущего ввода. Считай этот символ методом get():
    cin.get(); cin.getline ...
     
  13. Burshf

    Burshf Гость

    Переделал еще немного сам цикл вывода необходимого рейса,в итоге получилось вот так
    Код (C++):
    #include <iostream>
    #include <string.h>
    #include <iomanip>
    using namespace std;
    struct Trip                                      
    {                                                

    int  number;                                 
    char*   type;                            
    char*    destination;                        
    double  otTime;                            
    double  prTime;                        
    };
    int main() {
    char* type = new char[20];

    struct Trip indexes[100];
    char dPoint[20];
    double time = 0.0;
    int q,i;



    cout << "Vvedite kolichestvo reisov: ";
    cin >> q;
    for ( i = 0; i < q; i++)
    {
    indexes[i].destination = new char[20];
    indexes[i].type = new char[20];
    }
    for ( i = 0; i < q; i++)
    {
    cout << "-------------------------------" << endl;
    cout << "Nomer reisa: ";
    cin >> indexes[i].number;
    cout << "Tip reisa: ";
    cin >> indexes[i].type;
    cout << "Mesto nazhacheniya: ";
    cin >> indexes[i].destination;
    cout << "Vremya otpravleniya: ";
    cin >> indexes[i].otTime;
    cout << "Vremya pribitiya: ";
    cin >> indexes[i].prTime;
    cout << "-------------------------------" << endl;

    }

    cout <<"Vvedite mesto naznacheniya: "<<endl;
    cin.get();
    cin.getline(dPoint, 20);
    cout<<"Vvedite vremya pribitiya(hours.minutes): ";
    cin >> time;
    cout<<endl<<"-----------------------------------------------" <<endl;
    for( i=0; i < q; i++)
    {
    char *str = indexes[i].destination;
    if(strcmp(dPoint, str) == 0)
    if(indexes[i].prTime < time)
    {
    cout.width(21);
    cout <<"Nomer reysa: "<<indexes[i].number<<endl;
    cout.width(21);
    cout<<"Tip reysa: "<<indexes[i].type<<endl;
    cout.width(21);
    cout<<"Mesto nazhacheniya: "<<indexes[i].destination<<endl;
    cout.width(19);
    cout<<"Vremia otpravleniya: "<<fixed<<setprecision(2)<<indexes[i].otTime<<endl;
    cout.width(21);
    cout<<"Vremya pribitiya: "<<fixed<<setprecision(2)<<indexes[i].prTime << endl;
    cout <<"-----------------------------------------------" << endl;

    }

    }

    return 0;
    }
    Может какому еще студенту понадобится.
    Спасибо большое за помощь,долго я вас мучал вопросами своими)
    Знал бы как поставить +,обязательно бы сделал.
     
  14. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36

    последние 2 строчки можно безболезненно удалить, программа от этого работать только быстрее будет )


    можно заменить на
    if(strcmp(dPoint, indexes.destination) == 0)

    потом стоит удалить неиспользуемые переменные (type), устранить утечки памяти, отформатировать код и можно показывать преподу)
     
  15. Burshf

    Burshf Гость

    Это уже мелочи,главное что работает без проблем)
     
  16. Burshf

    Burshf Гость

    Рационально ли тут для описания времени использовать вложенную структуру,или это просто прихоть преподавателя?И какие типы значений тогда использовать?я добавил так
    Код (C++):
    struct Time

    {
    double otTime;
    double prTime;
    };
    Но по факту от этого ничего не поменялось,кроме того что я показал что я знаю как использовать вложенную структуру.
     
  17. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    сойдет.

    Вложенную структуру стоит использовать если вне родительской структуры она никогда не потребуется. Вложение структур разгружает пространство имен, и это хорошо.

    Добавлено: Хотя... в изначальном коде имени Time вообще не было => было лучше :)

    Если выделить структуру Time в этом коде, то может быть он станет более удобным, но это проявится на более адекватной задаче. Ваша же задача настолько тривиальна, что вообще неважно что тут и как сделано )
     
  18. Burshf

    Burshf Гость

    Значит есть все таки хоть какой смысл в том,чему нас учат в ВУЗах )
     
  19. Whatka

    Whatka Well-Known Member

    Регистрация:
    9 окт 2011
    Сообщения:
    433
    Симпатии:
    4
    вообще смысл есть во всём,что ты учишь,просто чтобы разгядеть его тоже необходимы знания
     
Загрузка...
Похожие Темы - Структуры
  1. TSoprano
    Ответов:
    1
    Просмотров:
    1.007
  2. vlada
    Ответов:
    6
    Просмотров:
    1.457
  3. Anastasia18
    Ответов:
    1
    Просмотров:
    1.204
  4. b0006
    Ответов:
    0
    Просмотров:
    1.174
  5. dimat
    Ответов:
    0
    Просмотров:
    2.290

Поделиться этой страницей