Obliczenie czasu pozostałego do dotarcia do celu w minutach – co robię źle?

0

Witam,
czy może mi ktoś podpowiedzieć jak mam to ugryźć, co robię źle?
Dane które mam podane to średnia prędkość w km/h, odległość od celu w milach szwedzkich (1mila = 10km). Program ma obliczyć czas pozostały do dotarcia do celu w minutach (i niestety już tutaj poległam) a następnie przedstawić go w formie hh:mm gdzie pewnie powinnam użyć / dzielenia oraz % modulo. Bardzo proszę o podpowiedź. Pozdrawiam

#include <iostream> 
#include <iomanip>
using namespace std;
void timeLeft();
int main()
{
	char answer;
	do
	{
		timeLeft();
		cout << "\nOne more time (Y/N) ?";
		cin >> answer;
	} while (answer == 'Y' || answer == 'y');
	return 0;
}

void timeLeft()
{
	int kmPerHr = 0;
	float kmPerMin = 60 / kmPerH;
	float distMil = 0;
	float distKm = distMil * 100;
	float travelTime = distKm * kmPerMin;
	cout << "Enter average speed in km/h : ";
	cin >> kmPerHr;
	cout << "Enter remaining distance in swedish miles : ";
	cin >> distMil;
	cout << "The remaining time is    : " << travelTime << endl;
}
0
    int kmPerHr = 0;
    float kmPerMin = 60 / kmPerHr;
    cin >> kmPerHr;

Pierw dzielisz przez zero, potem wczytujesz kmPerHr. Ponadto dzielenie 60 / kmPerH to dzielenie int/int, a więc znów utracisz część ułamkową wyniku.

Dlaczego używasz floatów? Dla liczb zmiennoprzecinkowych domyślnie używaj double, chyba że są dobre przesłanki aby używać typu o znacznie pogorszonej precyzji.

Powinno być:

double kmPerHr;
cin >> kmPerHr;
double kmPerMin = 60 / kmPerHr;

odległość od celu w milach szwedzkich (1mila = 10km)

float distKm = distMil * 100;

Hmm...


Idąc dalej, czas w minutach zapisałbym jako int, bo i tak większej precyzji nie potrzebujesz zgodnie z przedstawionym opisem. Użycie modulo powinno być zatem proste.

0

Witam i dziękuje bardzo za wszystkie podpowiedzi!
Czy mogę zapytać jeszcze, co robie nie tak w podanym kodzie? W przykładzie 83km/h i 13mil wychodzi mi 1 h i 33 minuty, natomiast powinno 1h 34min. Czy powinnam zaokrąglić wynik, zmienić typ danych ?

#include <iostream> 
#include <iomanip>
using namespace std;
void timeLeft();
int main()
{
    char answer;
    do
    {
        timeLeft();
        cout << "\nOne more time (Y/N) ?";
        cin >> answer;
    } while (answer == 'Y' || answer == 'y');
    return 0;
}
 
void timeLeft()
{
    cout << "Enter average speed in km/h : ";
    float kmPerHr = 0;
    cin >> kmPerHr;
    double kmPerMin = 60 / kmPerHr;
    cout << "Enter remaining distance in swedish miles : ";
    double distMil = 0;
    cin >> distMil;
    double distKm = distMil * 10;
    int travelTime = distKm * kmPerMin;
    int hours = travelTime / 60;
    int minutes = travelTime % 60;
    cout << "The remaining time is    : " << hours << " hours " << "and " << minutes << " minutes" << endl;
} 
2
int travelTime = distKm * kmPerMin;

to tutaj rzutuje automatycznie na int. Jezeli wynik bedzie 33.8239 to przez to ze rzutujesz automatycznie na int zostanie od razu 33.

uzyj tego

https://en.cppreference.com/w/cpp/numeric/math/round

0

Bardzo dziękuje za odpowiedz. Niestety jeszcze się z tym nie uporałam. Czy mogę poprosić o jeszcze jakaś podpowiedz?
Wytyczne które mam to:
Calculate the travel time in minutes as a floating point value, which you can then round off to an integer. Use integer division (/) to get the number of hours, and the modulo operator (%) for the minutes.
Z tym ze kiedy ustawie float travelTime to później nie mogę użyć na nim modulo, czegoś mi tutaj jeszcze brakuje. Spodziewam się ze źle używam double/int/float ale nie widze jeszcze wzorca w moich błędach.

void timeLeft()
{
    cout << "Enter average speed in km/h : ";
    double kmPerHr = 0;
    cin >> kmPerHr;
    double kmPerMin = 60 / kmPerHr;
    cout << "Enter remaining distance in swedish miles : ";
    double distMil = 0;
    cin >> distMil;
    double distKm = distMil * 10;
    float travelTime = distKm * kmPerMin;
    int travelTimeHM = (int)travelTime;
    int hours = travelTimeHM / 60;
    int minutes = travelTimeHM % 60;
    cout << "The remaining time is    : " << hours << " hours " << "and " << minutes << " minutes" << endl;
}
1

a gdzie uzylas funkcji ktora Ci podalem w linku?

zostaw tak jak bylo, jedynie zamiast zmieniania na float w traveltime uzyj round (i wynik zapisuj do traveltime)

0

Obawiam się że użycie tej funkcji to jeszcze dla mnie za ciężki kawałek chleba (przygodę z C++ zaczęłam wczoraj). Dziękuje bardzo za wszystkie podpowiedzi. Pewnie jest to oczywiste ale dla mnie niestety nadal abstrakcyjne, jeszcze mi się nie udało, będę próbować dalej. Dziękuje raz jeszcze.

2

int travelTime = std::round(distKm * kmPerMin);

0

Dziękuje ogromnie, oczywiście działa
Teraz (kiedy już zna sie odpowiedz) jest to logiczne. Raz jeszcze dziękuje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1