Ошибка В Задаче. Помогите Найти

Тема в разделе "C/C++/C#", создана пользователем marsiputkin, 2 ноя 2012.

  1. marsiputkin

    marsiputkin Гость

    Доброго всем времени суток)..Моя проблема заключается в том, что в субботу надо сдавать задачу, а код, который внизу, программа не принимает.
    Программа должна работать по принципу:

    Введите время прибытия поездa A:
    12:00
    Введите время отправления поезда A:
    12:30
    Введите время прибытия поезда B:
    12:10
    Введите время отправления поезда B:
    12:20
    Введите время прибытия поезда C:
    12:40
    Введите время отправления поезда C:
    13:00
    С поезда А можно перейти в поезда B и C.
    С поезда В можно перейти в поезда А и C.
    С поезда С нельзя переступить.

    Введите время отправления поезда:
    12:65
    Неправильный ввод.
    Введите время отправления поезда:
    12: ABC
    Неправильный ввод.



    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>

    int main(int argc, char **argv) {

    int a1_h, a1_m, a2_h, a2_m; /*
    * Arrival time (hours, minutes)
                          * And departure time (hours, minutes)
                          * Train A.
                          */

    int b1_h, b1_m, b2_h, b2_m; /* Similarly for train B.*/

    int c1_h, c1_m, c2_h, c2_m; /* Similarly for train C. */

    time_t a1_u, a2_u; /*
                      * Time of arrival and departure of the train A
                      * In UNIX-format
                      * (Number of seconds since 1970-01-01 00:00:00 UTC)
                      */

    time_t b1_u, b2_u; /* Similarly for train B. */
    time_t c1_u, c2_u; /* Similarly for train C. */

    struct tm *newtime;
    time_t change = 5 * 60; /*
                      * Time required for transplant
                      * from train to train, in seconds.
                      */

    time_t wait = 30 * 60; /*
                      * Stand by time
                      * the next train, in seconds.
                      */

    int transfer; /* Is it possible to change? */

    time_t t;
    t = time(NULL);
    newtime = localtime(&t);
    newtime->tm_sec = 0;

    printf("\n");
    printf("Enter the arrival and departure of trains" \
    " in hh: mm.\n");

    printf(" arrival of the train A: ");
    scanf("%d:%d", &a1_h, &a1_m);
    newtime->tm_hour = a1_h;
    newtime->tm_min = a1_m;
    a1_u = mktime(newtime);
    do {
    printf(" departure of the train A: ");
    scanf("%d:%d", &a2_h, &a2_m);
    newtime->tm_hour = a2_h;
    newtime->tm_min = a2_m;
    a2_u = mktime(newtime);
    } while (a1_u >= a2_u);


    printf(" arrival of the train B: ");
    scanf("%d:%d", &b1_h, &b1_m);
    newtime->tm_hour = b1_h;
    newtime->tm_min = b1_m;
    b1_u = mktime(newtime);
    do {
    printf(" departure of the train B: ");
    scanf("%d:%d", &b2_h, &b2_m);
    newtime->tm_hour = b2_h;
    newtime->tm_min = b2_m;
    b2_u = mktime(newtime);
    } while (b1_u >= b2_u);


    printf(" arrival of the train C: ");
    scanf("%d:%d", &c1_h, &c1_m);
    newtime->tm_hour = c1_h;
    newtime->tm_min = c1_m;
    c1_u = mktime(newtime);
    do {
    printf(" departure of the train C: ");
    scanf("%d:%d", &c2_h, &c2_m);
    newtime->tm_hour = c2_h;
    newtime->tm_min = c2_m;
    c2_u = mktime(newtime);
    } while (c1_u >= c2_u);

    printf("\n");

    /* If the train arrives at A */
    transfer = 0;
    if (b2_u - a1_u >= change && b2_u - a1_u <= wait) {
    printf("With the A train can be a train B.\n");
    ++transfer;
    }
    if (c2_u - a1_u >= change && c2_u - a1_u <= wait) {
    printf("With the A train can be a train C.\n");
    ++transfer;
    }
    if (transfer == 0) {
    printf("From train A transfer is not possible.\n");
    }

    /* If the train arrives at B */
    transfer = 0;
    if (a2_u - b1_u >= change && a2_u - b1_u <= wait) {
    printf("With the B train can be a train A.\n");
    ++transfer;
    }
    if (c2_u - b1_u >= change && c2_u - b1_u <= wait) {
    printf("With the B train can be a train C.\n");
    ++transfer;
    }
    if (transfer == 0) {
    printf("From train B transfer is not possible.\n");
    }

    /* If the train arrives at C */
    transfer = 0;
    if (a2_u - c1_u >= change && a2_u - c1_u <= wait) {
    printf("With the C train can be a train A.\n");
    ++transfer;
    }
    if (b2_u - c1_u >= change && b2_u - c1_u <= wait) {
    printf("With the C train can be a train B.\n");
    ++transfer;
    }
    if (transfer == 0) {
    printf("From train C transfer is not possible.\n");
    }

    printf("\n");
    return EXIT_SUCCESS;
    }

    <pre><code class="cpp"></code></pre>

    Заранее большое спасибо тем, кто мне поможет :(
     

    Вложения:

  2. rrrFer

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

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

    marsiputkin Гость

    скопируйте и попробуйте запустить код. когда вводишь неправильные символы во времени - программа вылетает + автомат ругается, что у нее неправильный выход. Цитирую:

    Программа превышает выделенное максимальное время работы
    Программа принудительно закончилась: 2,003 с (предел: 2.000 сек)
     
  4. rrrFer

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

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    довай по порядку, что конкретно не работает? - мне лень запускать все это и устанавливать соответствие между кодом и задачей.
    чтобы выдать такое сообщение понадобится еще один поток с таймером
     
  5. marsiputkin

    marsiputkin Гость

    смотри. мне надо, чтобы при вводе неправильных символов в строке время не вылетала программа + автомат (прога из универа) ругается, что она долго работает (превышен лимит). Я просто действительно не понимаю, как ето обьяснить. Писал я её в Dev-C++. Скомпилируй и посмотри что получится. Все сразу станет ясно. Это дело 3 минут.
    пс. возможно, лимит превышен именно из-за того, что при вводе каких-либо других символов, кроме цифр, которые должны обозначать время, программа вылетает.
     
  6. rrrFer

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

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    что должно происходить в этом случае?

    Добавлено:
    ты ожидаешь ввода данным юзером. Т.е. ты рассчитываешь что юзер введет данные быстрее чем за 2 секунды? )
     
  7. marsiputkin

    marsiputkin Гость

    Введите время отправления поезда:
    12:65
    Неправильный ввод.
    Введите время отправления поезда:
    12: ABC
    Неправильный ввод.

    как-то так. я сверху писал.
    нет. прогу тестит автомат. я ему отсылаю этот код, а он ругается, что прога не заканчивается сама, ему приходится насильно её заканчивать.
     
  8. rrrFer

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

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    обычно тестирующая программа хранит набор файлов с тестами и подсовывает эти файлы по очереди тестируемой. Поэтому оговаривается имя входного файла и файла результат, у вас программа использует scanf(), все конечно может быть, но МБ в этом причина?

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

    Код (Text):
    std::string str;
    std::stringstream sstr;
    // ввод строки str (туда помещается время)
    // проверка корректности строки
    if (если строка корректна) {
    sstr.flush();sstr.clear();
    sstr << str;
    // считываешь время с sstr
    }
    else { /* сообщаешь об ошибке */ }
     
  9. marsiputkin

    marsiputkin Гость

    я, конечно, извиняюсь) но не мог бы ты подсказать куда и как это вставить :(
     
  10. Whatka

    Whatka Well-Known Member

    Регистрация:
    9 окт 2011
    Сообщения:
    433
    Симпатии:
    4
    а ты сам писал выложеный код?
     
  11. marsiputkin

    marsiputkin Гость

    не совсем. у меня с этим туго. друг помог. а я в Чехии учусь месяц как, и так нихрена не успеваю, тем более месяц назад я понятия никакого не имел, вот только учить начал(

    Добавлено: и ещё вопросик) может посоветуешь книгу какую, сайт или что-то типо того для учёбы?
     
  12. rrrFer

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

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    книга...тебе пойдет любая по С++(учебник бери)
    сайт.. codeby.net :(

    не, подсказать не смогу, выложено слишком много странного кода, я не могу его быстро понять )
    вот такой пример написал, пользуйся:
    Код (Text):
    #include <string>
    #include <sstream>
    #include <iostream>
    #include "time.h"

    int main() {
    std::stringstream sstr;
    char str[255], c;
    int h, m; //час, минута

    std::cout << "enter the time: ";
    std::cin.getline(str, 255);

    sstr.flush(), sstr.clear();
    sstr << str;
    sstr >> h;
    c = sstr.get();
    sstr >> m;
    if (false == sstr.eof() || ':' != c
    || h < 0 || m < 0
    || h > 23 || m > 59 )
    std::cout << "error";
    else
    std::cout << std::endl << h << ":" << m << std::endl;
    return 0;
    }
     
  13. marsiputkin

    marsiputkin Гость

    мне просто С нужен плюс код не подходит, к сожалению(
     
  14. rrrFer

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

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    тогда считывай строку, например через gets, а дальше проверяей ее соответствие через sscanf
    примерно так:
    Код (Text):
    str = gets();
    sscanf(str,"%d%c%d", h, c, m);
    более подробно описание sscanf и gets можно наверное на cplusplus.com почитать
     
Загрузка...
Похожие Темы - Ошибка Задаче Помогите
  1. Lamerman
    Ответов:
    0
    Просмотров:
    26
  2. Enima
    Ответов:
    0
    Просмотров:
    51
  3. Baindt
    Ответов:
    1
    Просмотров:
    73
  4. anna
    Ответов:
    2
    Просмотров:
    79
  5. gramzer
    Ответов:
    1
    Просмотров:
    120

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