Форум программистов, компьютерный форум CyberForum.ru

нахождение времени, потраченного на прохождение путником половины пути - C++

Восстановить пароль Регистрация
 
Uraniya
 Аватар для Uraniya
0 / 0 / 0
Регистрация: 16.12.2010
Сообщений: 11
14.03.2011, 11:26     нахождение времени, потраченного на прохождение путником половины пути #1
помгите найти ошибку, по чему программа не правильно считает
условие
Путник двигался t1 часов со скоростью v1 км/ч, затем t2 часов — со скоростью v2 км/ч и t3 часов — со скоростью v3 км/ч. За какое время он одолел первую половину пути? Если путник не двигался, то рассматривать эту ситуацию как неверный ввод данных.


код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include "stdafx.h"
#include <conio.h>
#include <iostream>
#include "testing.h"
int _tmain(int argc, _TCHAR* argv[])
{
    TESTING
        setlocale(LC_CTYPE,"Russian"); 
    float   v1, v2, v3, v0, s0, s1, s2, s3;                                         // объявление  переменных скорости
    int  t1, t2, t3, t0, chas1, min1, chas2, min2, chas3, min3, chas0, min0;        // объявление  переменных времени
    
    // Ввод значений времени
    input_printf("Введите время прохождения первого учвстка в формате часы:минуты\n");
    scanf("%d:%d", &chas1, &min1);
    //ошибка ввода
    if (chas1<=0 || chas1>4 || min1>=60)                                                
    {
        error_printf("Значение за пределом промежутка\n");
        WAIT_ANY_KEY
        return 0;
    }
    //перевод времени из формата чч_мм в часы
    
    t1 = chas1*60 + min1;   
 
 
// Ввод значений скорости
    input_printf("Введите скорость на первом участке\n");
    scanf ("%f", &v1);
    //ошибка ввода
    if (v1<=0 || v1>7)                                                      
    {
        error_printf("Значение за пределом промежутка\n");
        WAIT_ANY_KEY
        return 0;
    }
    v1 = v1/60;
 
    input_printf("Введите время прохождения второго учвстка в формате часы:минуты\n");
    scanf("%d:%d", &chas2, &min2);
    if (chas2<=0 || chas2>4 || min2>=60)                                                
    {
        error_printf("Значение за пределом промежутка\n");
        return 0;
        WAIT_ANY_KEY
    }
    t2 = chas2*60 + min2;
 
 
    input_printf("Введите скорость на втором участке\n");
    scanf ("%f", &v2);
    if (v2<=0 || v2>7)                                                      
    {
        error_printf("Значение за пределом промежутка\n");
        WAIT_ANY_KEY
        return 0;
    }
    v2 = v2/60;
 
 
    input_printf("Введите время прохождения третьего учвстка в формате часы:минуты\n");
    scanf("%d:%d", &chas3, &min3);
    if (chas3<=0 || chas3>4 || min3>=60)                                                
    {
        error_printf("Значение за пределом промежутка\n");
        WAIT_ANY_KEY
        return 0;
    }
    t3 = chas3*60 + min3;
 
    
    input_printf("Введите скорость на третьем участке\n");
    scanf ("%f", &v3);
    if (v3<=0 || v3>7)                                                      
    {
        error_printf("Значение за пределом промежутка\n");
        WAIT_ANY_KEY
        return 0;
    }
    v3=v3/60;
 
    //вычисление половины пройденного пути
    s1 = v1 * t1;
    s2 = v2 * t2;
    s3 = v3 * t3;
    s0 = (s1 + s2 + s3)/2;                                                      
    
    //расчет времени для каждого случая 
    if (s0>0 && s0<=s1)                                                 
        t0 = s0/v1;
    if (s0>s1 && s0<=s1+s2)
        t0 = s1/v1 + (s0-s1)/v2;
    if (s0>=s1+s2 && s0<s1+s2+s3)
        t0 = s1/v1 + s2/v2 + (s0-s1-s2)/v3;     
    
    //приведение времени к формату чч,мм
    chas0 = t0/60;
    min0 = t0 - chas0*60;
                                                            
    input_printf("результат %i:%i", chas0, min0);
    
    //ожидание нажатия клавиши enter
    WAIT_ANY_KEY
    return 0;
}
тест 1:30 2.0 3:0 3.7 2:0 1.0
ответ 2.35
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.03.2011, 11:26     нахождение времени, потраченного на прохождение путником половины пути
Посмотрите здесь:

Нахождение критического пути C++
Нахождение эйлерова пути C++
Столбцы левой половины массива поменять местами со столбцами правой половины C++
Графы. Нахождение максимального пути C++
Нахождение кратчайшего пути в графе, алгоритм Уоршелла C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dexter
 Аватар для Dexter
284 / 144 / 16
Регистрация: 13.10.2009
Сообщений: 164
14.03.2011, 12:21     нахождение времени, потраченного на прохождение путником половины пути #2
2.35 это полученный ответ или нужно получить?


(время) (скорость) (расстояние)
1) 1.30 2 3км
2) 3.00 3.7 11.1км
3) 2.00 1 2
Итого общее расстояние - 16.1км, половина тогда 8.05
Очевидно что это было во второй период, из 11.1км он прошел только 5.05
60*5.05/3.7=81 - то есть он во втором периоде топал 81 минуту, и в первой еще 1.30, в сумме будет 2.51

Мне на выводе 2.51 и дает, ошибок внутри кода я не заметил.
Uraniya
 Аватар для Uraniya
0 / 0 / 0
Регистрация: 16.12.2010
Сообщений: 11
14.03.2011, 20:11  [ТС]     нахождение времени, потраченного на прохождение путником половины пути #3
Цитата Сообщение от DexterUa Посмотреть сообщение
2.35 это полученный ответ или нужно получить?


(время) (скорость) (расстояние)
1) 1.30 2 3км
2) 3.00 3.7 11.1км
3) 2.00 1 2
Итого общее расстояние - 16.1км, половина тогда 8.05
Очевидно что это было во второй период, из 11.1км он прошел только 5.05
60*5.05/3.7=81 - то есть он во втором периоде топал 81 минуту, и в первой еще 1.30, в сумме будет 2.51

Мне на выводе 2.51 и дает, ошибок внутри кода я не заметил.
это нам дали тесты...
я тоже потом заметила ошибку...
но все дело в том что программа автотестер, которая наши программы проверяет, выдает целую кучу ошибок...
3:0 6.0 2:0 6.0 1:0 6.0 выдает 2:59 вместо 3
при пошаговой отладке мне вообще "нравится" переменные времени присваивает каким-то кустарным способом в t2 нормальное значение, а в t1 и t3 мусор... и если с t3 он как-то приходит к нормальному знчению s3, a в s1 получается откровенно неправильное значение
вот это мне не понятно... особенно если учесть, что куски кода были тупо скопированы, только номера переменных изменены на нужные
Dexter
 Аватар для Dexter
284 / 144 / 16
Регистрация: 13.10.2009
Сообщений: 164
15.03.2011, 10:35     нахождение времени, потраченного на прохождение путником половины пути #4
3:0 6.0 2:0 6.0 1:0 6.0 выдает 2:59 вместо 3
При компиляции обычно выдается предложение типа такого:
warning C4244: =: преобразование "float" в "int", возможна потеря данных
Вот именно из-за этого оно и происходит, когда вы считаете t0, то преобразовываете float в int.
float - это дробное число, которое основывается на значении с плавающей точкой.
Например в этом случае если t0 сделать типа float, то оно будет равно, что-то типа 179.9999999999
и при преобразовании в инт - усекается остаток, потому и получим 179 вместо 180.
Чтобы такого небыло, можно округлить с помощью функции round.

C
1
2
3
4
5
6
if (s0>0 && s0<=s1)                                                                                                     
  t0 = round(s0/v1);
if (s0>s1 && s0<=s1+s2)
  t0 = round(s1/v1 + (s0-s1)/v2);
if (s0>=s1+s2 && s0<s1+s2+s3)
  t0 = round(s1/v1 + s2/v2 + (s0-s1-s2)/v3);
Ответ тогда будет как-раз 3

P.S. Если вдруг не будет функции round в библиотеке math.h, то ее можно объявить как:
C
1
2
3
4
int round(float x)
{
    return floor (x + 0.5);
}
floor и ceil у меня там есть, а вот раунда нету)
Uraniya
 Аватар для Uraniya
0 / 0 / 0
Регистрация: 16.12.2010
Сообщений: 11
15.03.2011, 19:44  [ТС]     нахождение времени, потраченного на прохождение путником половины пути #5
спасибо за совет... нам к сожалению не разрешают функции применять, зато у меня появилась идея как ее заменить
Yandex
Объявления
15.03.2011, 19:44     нахождение времени, потраченного на прохождение путником половины пути
Ответ Создать тему
Опции темы

Текущее время: 00:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru