15 svar
309 visningar
Kurenaiida behöver inte mer hjälp
Kurenaiida 10
Postad: 18 jul 2022 10:32

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;
}
Fermatrix 7841 – Fd. Medlem
Postad: 18 jul 2022 10:47

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.,

Kurenaiida 10
Postad: 18 jul 2022 11:29

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;
}
Fermatrix 7841 – Fd. Medlem
Postad: 18 jul 2022 11:34

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.

Kurenaiida 10
Postad: 18 jul 2022 11:43

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?

Fermatrix 7841 – Fd. Medlem
Postad: 18 jul 2022 11:54

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;
}
anders_k 237
Postad: 18 jul 2022 14:43

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;
  }
  ...
}
Kurenaiida 10
Postad: 18 jul 2022 18:08 Redigerad: 18 jul 2022 18:09

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.. 

anders_k 237
Postad: 19 jul 2022 12:00 Redigerad: 19 jul 2022 12:08

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;

 

Kurenaiida 10
Postad: 19 jul 2022 15:16

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. 

anders_k 237
Postad: 20 jul 2022 06:28 Redigerad: 20 jul 2022 06:51
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 237
Postad: 20 jul 2022 06:35
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

Kurenaiida 10
Postad: 23 jul 2022 12:46

Jag fick det att funka! :D 

dock skulle jag behöva få förklarat varför man skriver in 100'000L efter fastestDiffTime?

Kurenaiida 10
Postad: 23 jul 2022 21:00

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;
}
Laguna Online 30496
Postad: 24 jul 2022 19:51

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.

Kurenaiida 10
Postad: 25 jul 2022 12:17

Verkar bli rätt nu! tack alla för hjälpen!!

Svara
Close