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

Тема в разделе "C/C++/C#", создана пользователем Kilin, 17 ноя 2010.

Наш партнер Genesis Hackspace
Статус темы:
Закрыта.
  1. Kilin

    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

    Код (Text):
    #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;}
     
  2. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Ну как то так реализация будет выглядить
    Код (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
      Размер файла:
      87,9 КБ
      Просмотров:
      33
  3. Kilin

    Kilin Гость

     
  4. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

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

    Kilin Гость

    Я вот написал код, но есть какая то шибка никак не могу эту ошибку найти.Посмотрите пожалуйста, где ошибка?
    Код (Text):
    #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;
    }
     
  6. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Код (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;
    }
     
  7. Kilin

    Kilin Гость

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

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Проверку при вводе организуй, для этого дополни цикл таким образом что бы получилось:
    Код (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(); 

    }
     
Загрузка...
Статус темы:
Закрыта.

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