• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Структуры

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

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 "прекращена работа программы". Чем это вызвано?
 
B

Burshf

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

Burshf

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

Burshf

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

rrrFer

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

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

Burshf

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

Burshf

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

cin.getline(dPoint, 20); проскакивает и переходит сразу к следующей.

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

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

rrrFer

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

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

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

rrrFer

сойдет.

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

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

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

Whatka

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!