2 svar
90 visningar
Idaxa 1
Postad: 7 jul 2023 16:15 Redigerad: 8 jul 2023 11:04

Räkna ut tider vid midnatt vid en loop

Hej!

Jag ska skriva ett program som ska spara in tider som man skriver in och den ska även spara de siffrorna till numret på den tiderna tillhör. Tiden kan gå över efter midnatt. Är för ett lopp om det ger lite kontext. Jag är helt ny till programmering och det här är våran andra uppgift och jag fattar ingenting känns det som. Jag förstår inte varför programmet inte vill spara start numret som är skrivet som tillhör varje loop och spara det till vinnandesiffra. Programmet ballade ur totalt när den skulle räkna så allt blev fel. Den började skriva ut sekunder vid timmar eller vad den nu gjorde, innan det stod det typ -22. Jag vet inte vad jag ska göra. Kan någon ge mig tips? 

#include <iostream>

using namespace std;
int main()
{
	cout << "Ange startnummer: " << endl;
	int start;
	cin >> start;

	int tidt, tidm, tids; //starttider
	int malt, malm, mals; //Måltider
	int tidtsekunder, tidmsekunder; //starttid i sekunder
	int tidsumma; //Summa av starttid i sekunder
	int maltsekunder, malmsekunder; //Måltider i sekunder
	int malsumma; // Summa av måltid i skunder
	int difftid; // Verklig sprindgtid i sekunder.
	int difftimmar, diffminuter, diffsekunder; //Difftid i timmar, minuter och sekunder.
	int vinnartid; // sparade vinnartid
	int vinnandesiffra; //Siffran på personen som vann.
	int vinntimmar, vinnminuter, vinnsekunder; //För att spara springtider


	if (start < 1)
	{
		cout << "Inga tävlande. Programm avslutas" << endl;
	}
	while (start >= 1)
	{

		cout << "Ange starttid i timmar, minuter och sekunder: ";
		cin >> tidt >> tidm >> tids;
		cout << "Ange maltid i timmar, minuter och sekunder: ";
		cin >> malt >> malm >> mals;

		tidtsekunder = tidt * 3600;
		tidmsekunder = tidm * 60;
		tidsumma = tidtsekunder + tidmsekunder + tids;

		maltsekunder = malt * 3600;
		malmsekunder = malm * 60;
		malsumma = maltsekunder + malmsekunder + mals;


		if (maltiden < starttiden)
		{
			difftid = starttiden - maltiden + (24 * 3600); (Skrev det här för att få ett positivt svar då det annars blev negativa tal.
				difftimmar = difftid / 3600;
			diffminuter = (difftid - (difftimmar * 3600)) / 60;
			diffsekunder = (difftid - (difftimmar * 3600) - (diffminuter * 60));
		}

		else
		{
			difftid = maltiden - starttiden;
			difftimmar = difftid / 3600;
			diffminuter = (difftid - (difftimmar * 3600)) / 60;
			diffsekunder = (difftid - (difftimmar * 3600) - (diffminuter * 60));
		}


		if (difftid < vinnartid) //Gör så att vinnartid och startnummer sparas för uppräkning.
		{

			vinnartid = difftid;
			vinnandesiffra = start;
			vinntimmar = difftimmar;
			vinnminuter = diffminuter;
			vinnsekunder = diffsekunder;

		}

		cout << "Ange startnummer: " << endl; //För att avsluta eller fortsätta loop.
		cin >> start;
	}



	cout << "Vinnaren är: " << vinnandesiffra << "." << endl;


	cout << "Springtiden är. Timmar " << vinntimmar << ", minuter " << vinnminuter << ", sekunder " << vinnsekunder << "." << endl;


	return 0;

 

Innan det var koden såhär men då blev tiderna helt fel men den räknade iallafall ett. Men det blir fortfarande fel med startnummret på personen tiden tillhör: 

#include <iostream>

using namespace std;
int main()
{
	cout << "Ange startnummer: " << endl;
	int start;
	cin >> start;

	int tidt, tidm, tids; //starttider
	int malt, malm, mals; //Måltider
	int tidtsekunder, tidmsekunder; //starttid i sekunder
	int tidsumma; //Summa av starttid i sekunder
	int maltsekunder, malmsekunder; //Måltider i sekunder
	int malsumma; // Summa av måltid i skunder
	int difftid; // Verklig sprindgtid i sekunder.
	int difftimmar, diffminuter, diffsekunder; //Difftid i timmar, minuter och sekunder.
	int vinnartid; // sparade vinnartid
	int vinnandesiffra; //Siffran på personen som vann.
	int vinntimmar, vinnminuter, vinnsekunder; //För att spara springtider


	if (start < 1)
	{
		cout << "Inga tävlande. Programm avslutas" << endl;
	}
	while (start >= 1)
	{

		cout << "Ange starttid i timmar, minuter och sekunder: ";
		cin >> tidt >> tidm >> tids;
		cout << "Ange maltid i timmar, minuter och sekunder: ";
		cin >> malt >> malm >> mals;

		tidtsekunder = tidt * 3600;
		tidmsekunder = tidm * 60;
		tidsumma = tidtsekunder + tidmsekunder + tids;

		maltsekunder = malt * 3600;
		malmsekunder = malm * 60;
		malsumma = maltsekunder + malmsekunder + mals;


		difftid = malsumma - tidsumma;


		difftimmar = difftid / 3600;
		diffminuter = (difftid - (difftimmar * 3600)) / 60;
		diffsekunder = (difftid - (difftimmar * 3600) - (diffminuter * 60)); //Göra om springtiden till timmar/minuter/sekunder.


		if (difftid < vinnartid) //Gör så att vinnartid och startnummer sparas för uppräkning.
		{

			vinnartid = difftid;
			vinnandesiffra = start;
			vinntimmar = difftimmar;
			vinnminuter = diffminuter;
			vinnsekunder = diffsekunder;

		}

		cout << "Ange startnummer: " << endl; //För att avsluta eller fortsätta loop.
		cin >> start;
	}



	cout << "Vinnaren är: " << vinnandesiffra << "." << endl;


	cout << "Springtiden är. Timmar " << vinntimmar << ", minuter " << vinnminuter << ", sekunder " << vinnsekunder << "." << endl;


	return 0;

Kod indenterad och inlagd med {:} - verktyget för att underlätta förståelsen av koden. /Dracaena

Laguna Online 30713
Postad: 7 jul 2023 16:26

Det är alltid lättare att läsa om koden är indenterad korrekt. Du kan lägga in den med verktyget som ser ut som {} (men inte på mobilen).

anders_k 237
Postad: 7 jul 2023 16:51 Redigerad: 7 jul 2023 17:11

Sätt "vinnartid" till något stort värde så att din if-sats verkligen fungerar annars får den ett slumpmässigt värde

int vinnartid = 10000; // sparade vinnartid

...

if (difftid < vinnartid) //Gör så att vinnartid och startnummer sparas för uppräkning.

Rent generellt skall man alltid initialisera alla variabler innan man använder dem i C++, ivf variabler av POD typ (Plain Old Data).

För att underlätta för dig själv kan du skriva en liten funktion som räknar ut sekunder givet h,m,s

När du räknar ut skillnaden mellan tiderna, tänk på att starttiden kan vara större än stopptiden (t.ex. börjar 22:00 slutar 02:00) som det är nu, skriver du ut negativa tider.

Svara
Close