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

  • Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Задача : Нахождение введенного маршрута [Структуры, строки]

  • Автор темы Kilin
  • Дата начала
Статус
Закрыто для дальнейших ответов.
K

Kilin

Нужно написать прогу которая находит введенный маршрут,если есть такие несколько маршрутов,выводит маршрут с наименьшим время отправления.Сперва вводится количество маршрутов,а потом сами маршруты. При этом маршруты вводятся таким образом:
Первый - номер поезда [тип int ]
Второй - адрес назначения [тип char*]
Третий - время отправления [тип char*];
И на последную строку вводится название города.При выводе название маршрута должен выводит большими буквами.
Если нет введенного маршрута выводит "NO"
Вот примеры ввода:
4
01 Moscow 23:00
45 Piter 15:00
306 Ural 18:23
78 Piter 13:00
PITER

Вывод
78 PITER 13:00

Еще один пример;
2
01 MoScow 10:10
306 Ural 18:23
MoscoW

Вывод;
01 MOSCOW 10:10

Если не трудно напишите код используя указатель,динамический массив и структуру
А вот код который я написал,выводится ошибка при вводе.А сравнение времени отправки не смог написать.

Код:
#include <iostream>
using namespace std;
char* a=new char[1000];
char* b=new char[1000];
char* c=new char[1000];
int* z=new int[1000];
int main(){
int n;

cin >> n;
for (int i=0;i<n;i++){
cin >>*(z+i)>> *(b+i) >> *(a+i);
}
cin>>*c;
for(int i=0;i<strlen(b);i++)
if(islower(b[i]))
b[i]=toupper(b[i]);
for(int i=0;i<strlen(c);i++)
if(islower(c[i]))
c[i]=toupper(c[i]);
if(strlen(c)==strlen(b))
for(int i=0;i<strlen(b);i++){
if(b[i]==c[i])
cout <<*(z+i)<< *(b+i) << *(a+i);
else
cout<<"NO";}
delete [] (c);
delete [] (z);
delete [] (a);
delete [] (b);

return 0;}
 
D

DarkKnight

Ну как то так реализация будет выглядить
C++:
/*
Нужно написать прогу которая находит введенный маршрут,если есть такие несколько маршрутов,выводит маршрут с наименьшим время отправления.Сперва вводится количество маршрутов,а потом сами маршруты. При этом маршруты вводятся таким образом:
Первый - номер поезда [тип int ]
Второй - адрес назначения [тип char*]
Третий - время отправления [тип char*];
*/
/*
codeby.net
Autor: DarkKnight125
*/
#include <iostream>

using namespace std;

struct Marshrut //Структура маршрут
{
unsigned int num; //Номер маршрута
char addr[64]; //Адресс назначение
char timestart[8]; //Время отправления
};

void main(void)
{
setlocale(LC_ALL,"Russian"); //Установка локали .1251 - кодовая страница
int cnt; //Кол-во маршрутов
Marshrut *Arr; //Динамический массив маршрутов
cout<<"Введите кол-во маршрутов : ";
cin>>cnt; 
Arr = new Marshrut[cnt]; //Выделим память для хранения маршрутов

for (int i =0; i<cnt; i++)
{
cout<<"Запись №"<<i+1<<" :"<<endl;
cout<<"Введите номер маршрута : ";
cin>>Arr[i].num;
getchar();
cout<<"Введите назначение маршрута : ";
cin.getline(Arr[i].addr,63);
cout<<"Введите время отправления : ";
cin.getline(Arr[i].timestart,7);
cout<<"-------------------------"<<endl;
}

//Поиск
cout<<endl<<endl;
char StrFind[64]; //Строка в которой будет строка-поиска
cout<<"Введите Назначение для поиска : ";
cin.getline(StrFind,64);
bool FindisTrue = false; //Флаг успешен ли поиск
for (int i = 0; i<cnt; i++) //Обойдем весь массив
{
setlocale(LC_ALL,".866"); //Это что бы у меня русский нормально выводился... Код - cp1251, а ввод в консоле cp866 , вот и приходится прыгать
if (strcmp(strupr(Arr[i].addr), strupr(StrFind)) == 0) //Сравним строки в верхнем регистре
{
setlocale(LC_ALL,"Russian"); //Установим опять .1251
cout<<"Запись найдена"<<endl; //Что бы тут не было кракозябр
setlocale(LC_ALL,".866"); //Установим опять .866, что бы правельно вывести данные введенные с клавиатуры
cout<<Arr[i].num<<"\t"<<strupr(Arr[i].addr)<<"\t"<<Arr[i].timestart<<endl; 
setlocale(LC_ALL,"Russian");
FindisTrue = true; //Если найдена хоть одна позиция поставим флаг 
}
}

if (!FindisTrue) //Если же все же запись не была найдена
cout<<"Запись не найдена в справочнике Маршрутов"<<endl;


delete[] Arr; //Освободим память
}
 

Вложения

  • z39211.jpg
    z39211.jpg
    37,8 КБ · Просмотры: 487
K

Kilin

DarkKnight125
если есть такие несколько маршрутов,выводит маршрут с наименьшим временем отправления.Этот код не выполняет именно это условия.Поясню:если введено 2 или больше маршрутов с одинаковым адресом назначения,прога должна выводит маршрут с наименьшим временем отправления. При этом время отправления должна быть не больше 24.00 часов.Например:
Ввода:
4
01 Moscow 23:00
45 Piter 15:00
30 Ural 18:23
78 Piter 13:00
PITER

Вывод
78 PITER 13:00
 
D

DarkKnight

Ну так в чем проблема то, добавь еще одно условие на проверку строк (время) и все....
При условии, что время будет вводится строго по формату HH:MM то проблем не возникнит....
Функция strcmp тебе в помощь, добавь для удобство одну переменную типа int и храни в ней индекс требуемого элемента, чье время меньше
 
K

Kilin

Ну так в чем проблема то, добавь еще одно условие на проверку строк (время) и все....
При условии, что время будет вводится строго по формату HH:MM то проблем не возникнит....
Функция strcmp тебе в помощь, добавь для удобство одну переменную типа int и храни в ней индекс требуемого элемента, чье время меньше

Я вот написал код, но есть какая то шибка никак не могу эту ошибку найти.Посмотрите пожалуйста, где ошибка?
Код:
#include <iostream>
#include <iostream>
#include <string>

using namespace std;

struct Marshrut 
{
unsigned int ID; 
char addr[50]; 
char timestart[5]; 
};

int main()
{

int cnt,t=0,s,d = 0; 
string min = "2400";  
int z[100];
char kerekMar[50]; 
Marshrut *Arr;	 
cin>>cnt; 
Arr = new Marshrut[cnt]; 

for (int i =0; i<cnt; i++)
{			 
cin>>Arr[i].ID>>Arr[i].addr>>Arr[i].timestart;
getchar();	

}			 
cin.getline(kerekMar,50); 
for (int i = 0; i<cnt; i++) 
if(Arr[d].timestart[i]==':')

for (int i = 0; i<cnt; i++) 
{

if (strcmp(strupr(Arr[i].addr), strupr(kerekMar)) == 0) 
{
if(min > Arr[i].timestart){
min = Arr[i].timestart;
d = i;}
}
} 
if(d > -1 && strcmp(strupr(Arr[d].addr), strupr(kerekMar)) == 0 && Arr[d].timestart<=min && (Arr[d].timestart[3]=='0'||Arr[d].timestart[3]=='1'||Arr[d].timestart[3]=='2'||Arr[d].timestart[3]=='3'||Arr[d].timestart[3]=='4'||Arr[d].timestart[3]=='5'||Arr[d].timestart[3]=='6'))
cout<<Arr[d].ID<<"_"<<Arr[d].addr<<"_"<<Arr[d].timestart<<endl;
else 
cout <<"Impossible"<<endl; 
delete[] Arr; 
return 0;
}
 
D

DarkKnight

C++:
#include <iostream>
#include <iostream>
//#include <string>

using namespace std;

struct Marshrut 
{
unsigned int ID; 
char addr[50]; 
char timestart[6]; 
};

int main()
{

int cnt,t=0,s,d = -1; 
/*string* - стринг тут излишне*/ char min[6]={0};
strcpy(min,"24:00");//Смотри убирать : не имеет смысл сравнит и так хорошо  
int z[100];
char kerekMar[50]; 
Marshrut *Arr;	 
cin>>cnt; 
Arr = new Marshrut[cnt]; 

for (int i =0; i<cnt; i++)
{			 
cin>>Arr[i].ID>>Arr[i].addr>>Arr[i].timestart;
getchar();	

}			 
cin.getline(kerekMar,50); 
// for (int i = 0; i<cnt; i++) 
//if(Arr[d].timestart[i]==':') //Эту строку не совсем понял

for (int i = 0; i<cnt; i++) //Обходим массив
{

if (strcmp(strupr(Arr[i].addr), strupr(kerekMar)) == 0) //Сравниваем название 
{
if(strcmp(Arr[i].timestart,min)<0) //Если вермя меньше MIN
{
strcpy(min,Arr[i].timestart); //То присвоим min новое значение
d = i; //Присвоим индекс текущего элемента
}
}
} 
if(d >-1) //Тут много условий было, они лишнии, достаточно проверить d
cout<<Arr[d].ID<<"_"<<Arr[d].addr<<"_"<<Arr[d].timestart<<endl;
else 
cout <<"Impossible"<<endl; 
delete[] Arr; 
return 0;
}
 
K

Kilin

DarkKnight125
Вся проблема в минутах, они не должны быть больше 60-ти ,вроде я все правильно указал ,но есть какая - то ошибка, найдите пожалуста если сможете.
 
D

DarkKnight

Проверку при вводе организуй, для этого дополни цикл таким образом что бы получилось:
C++:
	for (int i =0; i<cnt; i++)
{			 
cin>>Arr[i].ID>>Arr[i].addr>>Arr[i].timestart;
//Проверим на правельность ввода времени
char temp[3]={0}; //Введем переменную в которую запихаем 2 первых символа строки XX:YY (XX)
strncpy(temp,Arr[i].timestart,2); //Получим 2 этих символа
int hh = atoi(Arr[i].timestart); //Переведем их в целочисленный тип
int mm = atoi(strstr(Arr[i].timestart,":")+1); //И переведем в целочисленный тип строку после ":" это наши минуты
if (hh<0 || hh>24 || mm<0 || mm>60) //Проверим все если что то не то выйдем с ошибкой
{
cout<<"Error: enter time is error"<<endl;
return 1;
}

getchar();	

}
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

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