Структуры

  • Автор темы Burshf
  • Дата начала
B

Burshf

#1
Задание такое:В справочной автовокзала хранится расписание движения автобусов. Для каждого рейса указаны его номер, тип автобуса, пункт назначения, время отправления и прибытия. Вывести информацию о рейсах, которыми можно воспользоваться для прибытия в пункт назначения раньше заданного времени.
Мой код:
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 "прекращена работа программы". Чем это вызвано?
 
R

rrrFer

#2
ошибка тут:
Код:
cin >> indexes[i].destination;
память кто выделять будет?
 
W

Whatka

#4
любое выделение
у тебя объявленны только указатели
 
B

Burshf

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

Burshf

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

Burshf

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

rrrFer

#8
память нужно выделять по указателю объекта структуры Trip

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

Burshf

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

Burshf

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

rrrFer

#12
cin.getline(dPoint, 20); проскакивает и переходит сразу к следующей.
в потоке остается символ-разделитель после предыдущего ввода. Считай этот символ методом get():
cin.get(); cin.getline ...
 
B

Burshf

#13
Переделал еще немного сам цикл вывода необходимого рейса,в итоге получилось вот так
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;
}
Может какому еще студенту понадобится.
Спасибо большое за помощь,долго я вас мучал вопросами своими)
Знал бы как поставить +,обязательно бы сделал.
 
R

rrrFer

#14
for ( i = 0; i < q; i++)
{
indexes.destination = new char[20];
indexes.type = new char[20];
}
for ( i = 0; i < q; i++)

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

char *str = indexes.destination;
if(strcmp(dPoint, str) == 0)

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

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

Burshf

#15
Это уже мелочи,главное что работает без проблем)
 
B

Burshf

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

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

rrrFer

#17
сойдет.

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

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

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

Burshf

#18
Значит есть все таки хоть какой смысл в том,чему нас учат в ВУЗах )
 
W

Whatka

#19
вообще смысл есть во всём,что ты учишь,просто чтобы разгядеть его тоже необходимы знания