С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Uraniya
0 / 0 / 0
Регистрация: 16.12.2010
Сообщений: 11
#1

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

14.03.2011, 11:26. Просмотров 1059. Ответов 4
Метки нет (Все метки)

помгите найти ошибку, по чему программа не правильно считает
условие
Путник двигался 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
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.03.2011, 11:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос нахождение времени, потраченного на прохождение путником половины пути (C++):

Функция подсчета времени потраченного на вычисления - C++
Нужно найти время, потраченное программой на математические исчисления. Я сделал с помощью ф-ции clock(), но она подсчитывает время от...

Задача на прохождение пути - C++
Некий мужчина отправляется на работу, которая находится на расстоянии 100 км от дома. Дойдя до места работы, он вдруг вспоминает, что перед...

Столбцы левой половины матрицы поменять местами со столбцами правой половины - C++
Написать программу с выделением памяти для динамического массива с рандомными значениями. Условие: Дан двумерный массив из четного...

Столбцы левой половины массива поменять местами со столбцами правой половины - C++
Дан двумерный массив из четного числа столбцов. Столбцы левой половины массива поменять местами со столбцами правой половины

Нахождение кратчайшего пути - C++
Нужно сделать программу,чтоб она находила кратчайший путь от города 1 до города 2 на карте. Как реализовать в коде не знаю, помогите. ...

Нахождение эйлерова пути - C++
Реализовать в виде программы и исследовать алгоритм нахождения эйлерова пути в неориентированном графе.

4
Dexter
286 / 146 / 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 и дает, ошибок внутри кода я не заметил.
1
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 получается откровенно неправильное значение
вот это мне не понятно... особенно если учесть, что куски кода были тупо скопированы, только номера переменных изменены на нужные
0
Dexter
286 / 146 / 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 у меня там есть, а вот раунда нету)
1
Uraniya
0 / 0 / 0
Регистрация: 16.12.2010
Сообщений: 11
15.03.2011, 19:44  [ТС] #5
спасибо за совет... нам к сожалению не разрешают функции применять, зато у меня появилась идея как ее заменить
0
15.03.2011, 19:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.03.2011, 19:44
Привет! Вот еще темы с ответами:

Нахождение критического пути - C++
Есть орграф. Что нужно изменить в методе Дейкстры для того, чтобы искать путь не наименьшей,а наибольшей длины? Если просто сменить все...

Графы. Нахождение максимального пути - C++
Добрый день. Пытаюсь написать программу для помощи в криптоанализе методом двойной перестановки и столкнулся с проблемой. Изложу суть...

Нахождение пути к папке с файлом - C++
Есть запускаемый бинарник. Есть задача - запустить файл .wav, лежащий в той же папке, что и запускаемый бинарник. Как это сделать...

Нахождение кратчайшего пути, поиск с возвратом - C++
Описание проблемы: Есть матрица MxN, на матрицы есть дом школьника и школа. Школьник может двигаться в 4 направления. На прохождения 1ой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.