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

  • Автор темы marsiputkin
  • Дата начала
M

marsiputkin

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

Введите время прибытия поезд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>

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

Вложения

M

marsiputkin

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

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

rrrFer

Гость
#4
довай по порядку, что конкретно не работает? - мне лень запускать все это и устанавливать соответствие между кодом и задачей.
Программа превышает выделенное максимальное время работы
Программа принудительно закончилась: 2,003 с (предел: 2.000 сек)
чтобы выдать такое сообщение понадобится еще один поток с таймером
 
M

marsiputkin

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

rrrFer

Гость
#6
чтобы при вводе неправильных символов в строке время не вылетала программа
что должно происходить в этом случае?

Добавлено:
scanf("%d:%d", &b1_h, &b1_m);
ты ожидаешь ввода данным юзером. Т.е. ты рассчитываешь что юзер введет данные быстрее чем за 2 секунды? )
 
M

marsiputkin

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

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

rrrFer

Гость
#8
обычно тестирующая программа хранит набор файлов с тестами и подсовывает эти файлы по очереди тестируемой. Поэтому оговаривается имя входного файла и файла результат, у вас программа использует scanf(), все конечно может быть, но МБ в этом причина?

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

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

marsiputkin

Гость
#9
я, конечно, извиняюсь) но не мог бы ты подсказать куда и как это вставить :(
 
M

marsiputkin

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

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

rrrFer

Гость
#12
книга...тебе пойдет любая по С++(учебник бери)
сайт.. codeby.net :(

о не мог бы ты подсказать куда и как это вставить sad.gif
не, подсказать не смогу, выложено слишком много странного кода, я не могу его быстро понять )
вот такой пример написал, пользуйся:
Код:
#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;
}
 
M

marsiputkin

Гость
#13
мне просто С нужен плюс код не подходит, к сожалению(
 
R

rrrFer

Гость
#14
тогда считывай строку, например через gets, а дальше проверяей ее соответствие через sscanf
примерно так:
Код:
str = gets();
sscanf(str,"%d%c%d", h, c, m);
более подробно описание sscanf и gets можно наверное на cplusplus.com почитать