Trädvy Permalänk
Medlem
Registrerad
Jan 2016

C++ uppgift, ideér?

Hejsan!

Jag har fått i uppgift från skolan att skapa en kod.

"Den här uppgiften handlar om att skriva ett program som läser in startnummer, starttid och
måltid för en godtycklig följd av tävlande i en idrottstävling. Startnummer för en tävlande
kan vara ett heltal större än noll (0). Start- och måltid anges som tre heltal: timme, minut
och sekund. De tävlande kan starta tävlingen vid olika tider och går förstås i mål på olika
tider. Den tävlande som har kortast tid mellan start och mål vinner."

Då har jag gjort såhär, koden kan räkna ut tiden för startnumret, och skriva ut allting rätt. Det enda som jag har problem med är att när man skriver in mer än ett startnummer, så kommer den alltid att utse det sist inmatade startnumret som vinnare. Oavsett om det sist inmatade startnumret har längst tid.

Här är koden

#include <iostream> using namespace std; int main(){ int vinnarsek, vinnarmin, vinnartim, startsek, startmin, starttim, malsek, malmin, maltim, startnummer, vinnarnummer = 0, starttid, maltid, tid, vinnare=0, antal=0; // Variabler som används inom koden const int dygn = 24*60*60; // En konstant variabel som räknar antal sekunder på ett dygn cout << "Startnummer?: "; // Ber användaren att mata in startnummer på tävlande cin >> startnummer; // Sparar det numret i variabeln 'startnummer' do { // Funktionen 'do... while' antal++; // Lägger till en i 'antal' för varje gång användaren matar in ett snartnummer cout << endl; cout << "Skriv in starttiden: "; // Ber användaren att mata in en starttid för startnumret cin >> starttim>>startmin>>startsek; // Sparar de värden som användaren har matat in i de olika variablerna starttid = starttim*3600 + startmin*60 + startsek; // Räknar ut starttiden cout << endl; cout << "Skriv in m\x86ltid: "; // Ber användaren att mata in en måltid för startnumret cin >> maltim>>malmin>>malsek; // Sparar de värden som användaren har matat in i de olika variablerna maltid = maltim*3600 + malmin*60 + malsek; // Räknar ut måltiden cout << endl; if (starttid < maltid){ // Kollar om starttiden är mindre än måltiden tid = maltid - starttid; // Om starttiden Är mindre än måltiden, så kommer tiden att bli måltiden - starttid } else if (starttid > maltid){ // Kollar om tiden går över 00 00 00, midnatt, dygnspassage tid = maltid + (dygn - starttid); // Om starrttiden Är större än måltiden, så kommer tiden att bli måltid + (dygn - starttid) } vinnare = vinnare + tid; if (tid < vinnare);{ // ta inte bort detta semikolon. Kollar om tiden för detta startnummer är det minsta vinnare = tid; // Om tiden är mindre än minst, så blir minst tiden vinnarnummer = startnummer; // Vinnaren blir det startnummer för den kortaste tiden } cout << "Skriv in startnummer: "; // Ber användaren fortsätta mata in startnummer för att ta med en till tävlande i loppet, skriv 0 för att gå vidare cin >> startnummer; // Sparar startnumret i variabeln "startnummer } while (startnummer>0); // Fortsättningen av do... while loopen. Loopar koden så länge startnummer är mer än 0 // Räknar ut vinnartiden vinnartim = tid/3600; vinnarmin = tid/60 - vinnartim*60; vinnarsek = tid%60; // Skriver ut resultaten/statistiken cout << endl; cout << endl; cout << endl; cout << "Vinnaren \x84r: nr. " << vinnarnummer << endl; cout << endl; cout << "Med en tid p\x86: " << vinnartim << " timmar " << vinnarmin << " minuter " << vinnarsek << " sekunder" << endl; cout << endl; cout << "Antal talvande: " << antal << endl; cout << endl; cout << "Programmet avslutas"; cout << endl; return 0; }

Några ideér/tips på hur man kan få den att utse det startnummer med kortast tid som vinnare?

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av ChristoffeerM:

vinnare = vinnare + tid;

Vad är meningen med denna rad?

Skrivet av ChristoffeerM:

if (tid < vinnare); { // ta inte bort detta semikolon. Kollar om tiden för detta startnummer är det minsta vinnare = tid; // Om tiden är mindre än minst, så blir minst tiden vinnarnummer = startnummer; // Vinnaren blir det startnummer för den kortaste tiden }

Varför har du semikolonet bakom if-raden, som kommentaren dessutom säger att man inte ska ta bort? Denna kodsnutt blir ju då ekvivalent med följande:

Skrivet av ChristoffeerM:

if (tid < vinnare) { } vinnare = tid; vinnarnummer = startnummer;

D.v.s. if-satsen gör ingenting eftersom den avslutas av semikolonet. Och koden som borde vara i if-satsen kommer alltid att köras eftersom den är utanför if-satsen, så vinnare och vinnarnummer skrivs alltid över för varje inmatning. Inte för att det spelar någon större roll, för i koden längre ner så använder du ändå bara den senaste tiden som lästs in:

Skrivet av ChristoffeerM:

// Räknar ut vinnartiden vinnartim = tid/3600; vinnarmin = tid/60 - vinnartim*60; vinnarsek = tid%60;

Trädvy Permalänk
Medlem
Registrerad
Jan 2016

@perost: Du har hjälpt mig att inse mina fel i koden, tack!
Jag har bara programmerat i några månader, 2 ggr i veckan, så mycket av detta är jag själv som har försökt på mitt eget sätt, vilket ledde till en felfungerande kod.
Semikolonet visste jag att det inte skulle vara där, men jag experimenterade lite och det visade sig att när jag hade semikolonet efter parentesen så räknade koden rätt. Jag har nu dock fått koden att räkna rätt utan semikolonet, men jag vet ännu inte vad jag ska använda mig av för att jämföra de olika inmatade tiderna, och få den att välja den tid med minst värde.
Det är där jag har försökt använda mig av "if (tid < vinnare)", men som du säger så använder jag bara den senaste koden som matats in...

Trädvy Permalänk
Moderator
Plats
Linköping
Registrerad
Okt 2006
Skrivet av ChristoffeerM:

@perost: Du har hjälpt mig att inse mina fel i koden, tack!
Jag har bara programmerat i några månader, 2 ggr i veckan, så mycket av detta är jag själv som har försökt på mitt eget sätt, vilket ledde till en felfungerande kod.
Semikolonet visste jag att det inte skulle vara där, men jag experimenterade lite och det visade sig att när jag hade semikolonet efter parentesen så räknade koden rätt. Jag har nu dock fått koden att räkna rätt utan semikolonet, men jag vet ännu inte vad jag ska använda mig av för att jämföra de olika inmatade tiderna, och få den att välja den tid med minst värde.
Det är där jag har försökt använda mig av "if (tid < vinnare)", men som du säger så använder jag bara den senaste koden som matats in...

Det blir lätt att man tänker så. Nu råkade det fungera för jag gjorde såhär, då låter jag det vara. Problemet som du märker är att bara för att det fungerar i ett test betyder det inte att det alltid fungerar eller faktiskt är rätt. Se till att faktiskt tänka igenom vad du gör och förstå vad som faktiskt händer. Programmering är väldigt petigt, saker händer exakt som det beskrivs och utan någon ytterligare tolkning. På så vis är program dumma.

Har du åsikter om moderering, frågor eller något annat kan du kontakta mig via shimonu@sweclockers.com