Styrande satser - max, for, while?
Hej!
Har en uppgift jag fastnat med och kommer inte vidare, programmet ska beräkna vilken av deltagarna i en tävling som hade lägsta tid från starttiden till måltiden.
antal deltagare ska vara oändligt, tills det att man skriver in 0 eller mindre.
Jag får inte till det hur jag ska loop mig igenom denna och hur den sedan ska räkna ut vilken som är minsta tiden när man matar in 0 eller mindre?
//***************************************************************************
//Syfte: Beräkna tider för samtliga deltagare och beräkna vilken deltagare som
//hade lägst tid.
//
//Inparametrar: startNr - startnummer för den tävlande
//
// startH - starttimme
// startM - startminuter
// startS - startsekunder
//
// malH - måltimme
// malM - målminuter
// malS - målsekunder
//
// diffTimme - differensen mellan starttimme och måltimme
// diffMinuter - differensen mellan startminuter och målminuter
// diffSekunder - differensen mellan startsekunder och målsekunder
//***************************************************************************
#include <iostream>
using namespace std;
int main() {
int startNr;
int startH, startM, startS; //variabler för starttid
int malH, malM, malS; //variabler för måltid
int diffTimme, diffMinuter, diffSekunder; //differensen mellan starttid och måltid
for (int i = 1; i = startNr; i++){
cout << "Deltagarens startnummer: " << endl;
cin >> startNr;
if (startNr >= 0){
cout << "Mata in tiden f\x94r start (format timmar, minuter och sekunder): " << endl; //skriver ut anvisningar till användaren
cin >> startH >> startM >> startS; //inparametrar för starttid (timmar, minuter, sekunder)
cout << "Mata in tid i m\x86l (format timmar, minuter och sekunder): " << endl; //skriver ut anvisningar till användaren
cin >> malH >> malM >> malS; //inparametrar för måltid (timmar, minuter, sekunder)
}
if (startH > malH) { //om starttimmen är större än måltimmen
diffTimme = (malH - startH) + 24;//ska differensen mellan timmar vara = måltimme minus (-) starttimme plus (+) 24
}
else {
diffTimme = malH - startH; //annars ska differensen mellan timmar vara = måltimme minus (-) starttimme
}
diffTimme = diffTimme * 3600; // det går 3600 sekunder på en timme
if (startM > malM) { //om startminuter är större än målminuter
--malH; // ska timmen minska med en (1)
diffMinuter = (malM - startM) + 60; //och differensen för minuter vara = målminuter minus (-) startminuter plus (+) 60
}
else {
diffMinuter = malM - startM; // annars ska differensen för minuter vara målminuter minus (-) startminuter plus
}
diffMinuter = diffMinuter * 60; //det går 60 sekunder på en minut
if (startS > malS) { //om startsekunder är större än målsekunder
--malM; //ska målminuter minska med en (1)
diffSekunder = (malS - startS) + 60; //och differensen mellan sekunder vara = målsekunder minus (-) startsekunder plus (+) 60
}
else {
diffSekunder = malS - startS; //annars ska differensen mellan sekunder vara = målsekunder minus (-) startsekunder
}
int differensen = diffTimme + diffMinuter + diffSekunder;
if (startNr <= 0){
cout <<"Sluttiden \x84r: " << differensen << endl; //skriver ut sluttiden, alltså differensen för timmar, minuter och sekunder
}
}
return 0;
}
Vad har du för kunskaper?
Kan vi använda OOP?
Har du gått igenom arrayer/Vectors eller något liknande?
Uppgiften blir då mycket mer begriplig att attackera eftersom vi då kan ta det systematiskt.,
Hej!
det är mitt första program, och vi har endast gått igenom while och for loopar i denna modul, så antar att detta ska göras med någon av dessa. Nu ändrade jag koden lite och fick en bättre utskrift med while loop.
Vi får inte använda några arrayer i denna uppgift.
Det jag inte får till är hur den ska beräkna vilken deltagare som hade lägst tid och hur den sedan ska skriva ut vilket deltagarnummer som är vinnaren?
#include <iostream>
using namespace std;
int main() {
int startH, startM, startS, malH, malM, malS, startNr, max; //variabler för starttid
int diffTimme, diffMinuter, diffSekunder; //differensen mellan starttid och måltid
cout << "Deltagarens startnummer: " << endl;
cin >> startNr;
while (startNr > 0){
cout << "Mata in tiden f\x94r start (format timmar, minuter och sekunder): " << endl; //skriver ut anvisningar till användaren
cin >> startH >> startM >> startS; //inparametrar för starttid (timmar, minuter, sekunder)
cout << "Mata in tid i m\x86l (format timmar, minuter och sekunder): " << endl; //skriver ut anvisningar till användaren
cin >> malH >> malM >> malS; //inparametrar för måltid (timmar, minuter, sekunder)
startNr++;
if (startH > malH) { //om starttimmen är större än måltimmen
diffTimme = (malH - startH) + 24;//ska differensen mellan timmar vara = måltimme minus (-) starttimme plus (+) 24
}
else {
diffTimme = malH - startH; //annars ska differensen mellan timmar vara = måltimme minus (-) starttimme
}
diffTimme = diffTimme * 3600; // det går 3600 sekunder på en timme
if (startM > malM) { //om startminuter är större än målminuter
--malH; // ska timmen minska med en (1)
diffMinuter = (malM - startM) + 60; //och differensen för minuter vara = målminuter minus (-) startminuter plus (+) 60
}
else {
diffMinuter = malM - startM; // annars ska differensen för minuter vara målminuter minus (-) startminuter plus
}
diffMinuter = diffMinuter * 60; //det går 60 sekunder på en minut
if (startS > malS) { //om startsekunder är större än målsekunder
--malM; //ska målminuter minska med en (1)
diffSekunder = (malS - startS) + 60; //och differensen mellan sekunder vara = målsekunder minus (-) startsekunder plus (+) 60
}
else {
diffSekunder = malS - startS; //annars ska differensen mellan sekunder vara = målsekunder minus (-) startsekunder
}
int differensen = diffTimme + diffMinuter + diffSekunder;
cout << "Deltagarens startnummer: " << endl;
cin >> startNr;
if (startNr <= 0){
cout <<"Sluttiden \x84r: " << differensen << endl; //skriver ut sluttiden, alltså differensen för timmar, minuter och sekunder
}
}
return 0;
}
Väldigt dåligt konstruerad uppgift.
Det du för göra är att låta användaren hela tiden ange nya värden och sedan räkna ut tiden. Sedan kan du kolla om detta är det största värdet som har förekommit. När användaren väljer att skriva 0 så är vi klara och skriver ut max.
Jag hade alltså gjort följande
Skapa en oändlig while loop
Ta emot värderna
Räkna ut totala tiden
Om första iterationen spara detta som max, annars jämför denna tid med den nya.
Om användaren skriver 0, bryt ut ur loopen och skriv ut max.
Ja jag förstår att den ser väldigt rörig ut, så kanske inte den bästa konstruktionen :/ men vet inte hur jag ska skriva annars, hade sett bättre ut om jag hade kunnat använda arrayer.
Jag tänker också så som du skriver, men ska väl vara min och inte max eftersom vinnaren är den med lägst tid?
jag vet bara inte hur koden ska skrivas för denna, är min = startNr?
har jag saker i helt fel ordning?
Nedan har jag skapat ett exempel. Notera att jag har introducerat en bug med mening, den är inte alls svår att hitta. Poängen är att jag inte vill göra hela uppgiften åt dig. Använd exemplet nedan för att försöka fixa till ditt program. Egentligen finns det fler buggar med denna konstruktionen, exempelvis så är det inte logiskt att man kan ange en negativ tid osv.
int main()
{
int min = -1;
int time = -1;
while(time != 0)
{
std::cout << " ange en tid ";
std::cin >> time;
if(min > time)
{
min = time;
}
}
std::cout << "min time: " << time;
return 0;
}
startNr är aldrig initialisead så din for loop kommer ibland att fungera ibland inte beroende
på vad för slumpmässigt värde startNr har.
Pröva istället
for(;;)
{
std::cout << "Mata in startnummer, 0 avslutar:" << std::flush;
std::cin >> startNr;
if (startNr==0)
{
break;
}
...
}
Nu har jag gjort såhär, den skriver ut minsta tiden i sekunder rätt, men den ska skriva ut startnumret på den som hade minst tid, och jag får inte det att fungera.
#include <iostream>
using namespace std;
int main()
{
int startNr, startH, startM, startS, malH, malM, malS, diffTimme, diffMinuter, diffSekunder, diff, min;
for(;;)
{
cout << "Mata in startnummer, 0 avslutar:" << flush << endl;
cin >> startNr;
if (startNr==0)
{
int diff = diffTimme + diffMinuter + diffSekunder;
min = diff;
cout << min;
break;
}
else {
cout << "starttid: " << endl;
cin >> startH >> startM >> startS;
cout << "måltid: " << endl;
cin >> malH >> malM >> malS;
}
if (startH > malH) { //om starttimmen är större än måltimmen
diffTimme = (malH - startH) + 24;//ska differensen mellan timmar vara = måltimme minus (-) starttimme plus (+) 24
}
else {
diffTimme = malH - startH; //annars ska differensen mellan timmar vara = måltimme minus (-) starttimme
}
diffTimme = diffTimme * 3600; // det går 3600 sekunder på en timme
if (startM > malM) { //om startminuter är större än målminuter
--malH; // ska timmen minska med en (1)
diffMinuter = (malM - startM) + 60; //och differensen för minuter vara = målminuter minus (-) startminuter plus (+) 60
}
else {
diffMinuter = malM - startM; // annars ska differensen för minuter vara målminuter minus (-) startminuter plus
}
diffMinuter = diffMinuter * 60; //det går 60 sekunder på en minut
if (startS > malS) { //om startsekunder är större än målsekunder
--malM; //ska målminuter minska med en (1)
diffSekunder = (malS - startS) + 60; //och differensen mellan sekunder vara = målsekunder minus (-) startsekunder plus (+) 60
}
else {
diffSekunder = malS - startS; //annars ska differensen mellan sekunder vara = målsekunder minus (-) startsekunder
}
}
return 0;
}
Tillägg: 18 jul 2022 18:45
såg nu att det blev fel, den räknar endast ut det sista värdet som skrivs in..
Du kan göra det lite mindre krångligt genom att räkna om tiderna till sekunder dvs så att startTid och målTid blir i sekunder.
long startTid = startH*3600L+startM*60L+startS;
Så slipper all den där koden du har med o jämföra timmar osv.
diffTime blir då helt enkelt
diffTime = std::abs(malTid-startTid)
sedan måste du ha en variabel för att spara startnummret av den som hade minst.
det sätter du när du får en diffTime mindre än snabbaste diffTime (t.ex. fastestDiffTime)
long fastestDiffTime{ 100'000L }; // ha utanför loopen
...
if (diffTime < fastestDiffTime)
{
fastestDiffTime = diffTime;
fastestStartNr = startNr;
}
Om du sedan vill skriva ut timmar, minuter och sekunder konverterar du bara tillbaks till h:m:s.
Visa spoiler
long h = fastestDiffTime / 24L; // timmar
long m = (fastestDiffTime - h*3600L)/60L; // minuter
long s = fastestDiffTime - h*3600L - m*60L;
Tack för alla svar, dock fungerar det inte eftersom jag inte förstår var jag ska placera koderna.
Jag kan inte ta bort vissa saker då tiden ska kunna räknas efter midnatt, ex att någon har startTid 23:00 och målTid 02:00.
Kurenaiida skrev:Tack för alla svar, dock fungerar det inte eftersom jag inte förstår var jag ska placera koderna.
Jag kan inte ta bort vissa saker då tiden ska kunna räknas efter midnatt, ex att någon har startTid 23:00 och målTid 02:00.
Säg att du har Start tid 23:00 och Mål tid 02:00
Räkna om dessa i sekunder
startTid = 23*3600; // 82800 sekunder
malTid = 2*3600; // 7200 sekunder
då blir tiden
diff = std::abs( malTid - startTid ); // 75600
// abs är absolut beloppet
// dvs samma som
// if (malTid > startTid)
// diff = malTid - startTid;
// else
// diff = startTid - malTid;
som du sedan kan räkna om i timmar,minuter,sekunder när du vill visa tiden. men när du jämför tider är det bättre att använda sekunder.
long h = diff / 3600L; // timmar
long m = (diff - h*3600L)/60L; // minuter
long s = diff - h*3600L - m*60L;
anders_k skrev:Du kan göra det lite mindre krångligt genom att räkna om tiderna till sekunder dvs så att startTid och målTid blir i sekunder.
long startTid = startH*3600L+startM*60L+startS;
Så slipper all den där koden du har med o jämföra timmar osv.
diffTime blir då helt enkelt
diffTime = std::abs(malTid-startTid)
sedan måste du ha en variabel för att spara startnummret av den som hade minst.
det sätter du när du får en diffTime mindre än snabbaste diffTime (t.ex. fastestDiffTime)
long fastestDiffTime{ 100'000L }; // ha utanför loopen ... if (diffTime < fastestDiffTime) { fastestDiffTime = diffTime; fastestStartNr = startNr; }
Om du sedan vill skriva ut timmar, minuter och sekunder konverterar du bara tillbaks till h:m:s.
Visa spoiler
long h = fastestDiffTime / 24L; // timmar
long m = (fastestDiffTime - h*3600L)/60L; // minuter
long s = fastestDiffTime - h*3600L - m*60L;
sorry skall vara long h = fastestDiffTime / 3600L; förstås
Jag fick det att funka! :D
dock skulle jag behöva få förklarat varför man skriver in 100'000L efter fastestDiffTime?
Körde fast på en testkörning :(
denna ska kunna köras:
Startnummer? 33
Starttid? 17 30 15
Måltid? 18 22 35
Startnummer? 14
Starttid? 23 35 00
Måltid? 0 12 24
Startnummer? 26
Starttid? 10 11 12
Måltid? 20 21 22
Startnummer? -1
Vinnare är startnr: 14
Tim: 0 Min: 37 Sek: 24
Antal tävlande: 3
Programmet avslutas
dock visar min att vinnaren är nummer 26.
kollar jag endast nummer 14 så visar den tiden 23:22:16
#include <iostream>
using namespace std;
int main()
{
int startNr, timmeS, minutS, sekundS, timmeM, minutM, sekundM, snabbastNr;
long snabbastTid {100'000L};
long startTid, malTid;
for (;;)
{
cout << "Skriv in startnummer, 0 avslutar: " << endl;
cin >> startNr;
long t = snabbastTid/3600L;
long m = (snabbastTid - t*3600L)/60L;
long s = snabbastTid - t*3600L - m*60L;
if (startNr==0)
{
cout << "Vinnaren \x84r nummer " << snabbastNr << endl;
cout << "Tim: " << t << " Min: " << m << " Sek: " << s;
break;
}
cout << "skriv in tid f\x94r start (timme, minut och sekund): " << endl;
cin >> timmeS >> minutS >> sekundS;
startTid = timmeS*3600L + minutS*60L + sekundS;
cout << "skriv in tid i m\x86l (timme,minut och sekund): " << endl;
cin >> timmeM >> minutM >> sekundM;
malTid = timmeM*3600L + minutM*60L + sekundM;
int diffTid;
if (startTid > malTid)
{
diffTid = startTid - malTid;
}
else
{
diffTid = malTid - startTid;
}
cout << diffTid << endl;
if (diffTid < snabbastTid)
{
snabbastTid = diffTid;
snabbastNr = startNr;
}
}
return 0;
}
Din logik ser inte ut att vara korrekt: om du har tiderna 23 och 01 så drar du bort 1 från 23 och får 22, men du borde dra bort den tidigare från den senare i samtliga fall, och få 1-23 = -22 här, som du sedan korrigerar genom att lägga till 24 för att det är negativt, så det blir 2.
Verkar bli rätt nu! tack alla för hjälpen!!