Permalänk
Medlem

Hjälp med C++ program

Hej!

ska skriva ett program som läser in de tävlandes startnummer, tider och räknar ut vinnare.
vi får inte använda break,retur etc, utan endast av logisk uttryck. Jag har lyckats med att skriva koden men fastnat i loop.

Program som läser in startnummer, starttid och måltid för en godtycklig följd av tävlande idrottstävlingen. 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. Om program får start nummer -1 ska den säga ifrån och avslutas och inte fortsätta loppet. i mitt fall fortsätter program till starttid vilket det inte ska göra.
Skulle uppskatta hjälp.

#include <iostream> #include <math.h> using namespace std; int main () { int vinnandesek, vinnandenmin, vinnandetimme, start_min, start_tim, mal_sek, mal_min, mal_tim; int vinnarnummer = 0, startnummer, start_tid, start_sek, mal_tid, tid=0, minst=24*60*60, antal=0; const int dygn = 24*60*60; cout << "Startnummer? "; cin >> startnummer; if ( startnummer<=0) { cout << "Inga tävlande \n" << "Programmet avslutas " << endl; // Stoppar programmet direkt. } do { antal = antal + 1; // Program läser in antal tävlande, //startar på 0 för varje varv +1! cout << "Starttid? " << endl; cin >> start_tim>>start_min>>start_sek; // Räknar ut starttiden direkt. start_tid = start_tim*3600 + start_min*60 + start_sek; cout << "Måltiden? "<<endl; cin >> mal_tim>>mal_min>>mal_sek; // Program sparar måltiden direkt. mal_tid = (mal_tim*3600 + mal_min*60 + mal_sek); if (start_tid < mal_tid) { tid = mal_tid - start_tid; } else if (start_tid > mal_tid) { tid = mal_tid + (dygn - start_tid); // Om loppet passear midnatt måste program //ta dygnet minus starttiden. } if (tid < minst) // Program räknar jämför ny löpares tid med //tidigare löpares tid. { minst = tid; vinnarnummer = startnummer; } cout << "Startnummer? "; // Startar nästa tävlande. cin >> startnummer; } while (startnummer>0); vinnandetimme=minst/3600; vinnandenmin=minst/60 - vinnandetimme*60; vinnandesek=minst%60; cout << "Vinnare är Startnr: " << vinnarnummer << endl; cout << "Tid:" <<vinnandetimme<<"timmar "<<vinnandenmin<<"minuter "<<vinnandesek<<"sekunder "<<endl; cout << "Antal tävlande:" << antal << endl; cout << "Programmet avslutas" << endl; return 0; }

Resultatet ser ut så här:

Startnummer? -1
Inga tävlande
Programmet avslutas
Starttid? (detta ska inte komma med, och vi får inte använda break, retur...etc)

Permalänk
Skrivet av Stu123:

Hej!

ska skriva ett program som läser in de tävlandes startnummer, tider och räknar ut vinnare.
vi får inte använda break,retur etc, utan endast av logisk uttryck. Jag har lyckats med att skriva koden men fastnat i loop.

Program som läser in startnummer, starttid och måltid för en godtycklig följd av tävlande idrottstävlingen. 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. Om program får start nummer -1 ska den säga ifrån och avslutas och inte fortsätta loppet. i mitt fall fortsätter program till starttid vilket det inte ska göra.
Skulle uppskatta hjälp.

#include <iostream>
#include <math.h>
using namespace std;

int main ()
{
int vinnandesek, vinnandenmin, vinnandetimme, start_min, start_tim, mal_sek, mal_min, mal_tim;
int vinnarnummer = 0, startnummer, start_tid, start_sek, mal_tid, tid=0, minst=24*60*60, antal=0;

const int dygn = 24*60*60;

cout << "Startnummer? ";
cin >> startnummer;

if ( startnummer<=0) {

cout << "Inga tävlande \n" << "Programmet avslutas " << endl; // Stoppar programmet direkt.

}

do

{
antal = antal + 1; // Program läser in antal tävlande,
//startar på 0 för varje varv +1!

cout << "Starttid? " << endl;
cin >> start_tim>>start_min>>start_sek; // Räknar ut starttiden direkt.
start_tid = start_tim*3600 + start_min*60 + start_sek;

cout << "Måltiden? "<<endl;
cin >> mal_tim>>mal_min>>mal_sek; // Program sparar måltiden direkt.
mal_tid = (mal_tim*3600 + mal_min*60 + mal_sek);

if (start_tid < mal_tid)

{
tid = mal_tid - start_tid;

}

else if (start_tid > mal_tid)

{
tid = mal_tid + (dygn - start_tid); // Om loppet passear midnatt måste program
//ta dygnet minus starttiden.
}

if (tid < minst) // Program räknar jämför ny löpares tid med
//tidigare löpares tid.

{
minst = tid;
vinnarnummer = startnummer;
}

cout << "Startnummer? "; // Startar nästa tävlande.
cin >> startnummer;

} while (startnummer>0);

vinnandetimme=minst/3600;

vinnandenmin=minst/60 - vinnandetimme*60;

vinnandesek=minst%60;

cout << "Vinnare är Startnr: " << vinnarnummer << endl;
cout << "Tid:" <<vinnandetimme<<"timmar "<<vinnandenmin<<"minuter "<<vinnandesek<<"sekunder "<<endl;
cout << "Antal tävlande:" << antal << endl;
cout << "Programmet avslutas" << endl;
return 0;

}

Resultatet ser ut så här:

Startnummer? -1
Inga tävlande
Programmet avslutas
Starttid? (detta ska inte komma med, och vi får inte använda break, retur...etc)

Du måste avsluta programmet i if-satsen också, eller göra något så det inte går in i din do-while. t.ex. en else runt din do-while

Visa signatur

Corsair Vengeance LPX 4x8GB DDR4 2666MHz CL16 | Intel Core i7 6700 3,4 GHz 8MB | MSI Z170A KRAIT GAMING | Corsair Force Series 3 120 GB | Seagate SSHD Desktop 2 TB 7200 RPM 3,5" | Creative Sound Blaster Z PCIe | Western Digital 500 GB | Samsung Writemaster | Corsair TX750 V2 750 W | EVGA GeForce GTX 970 4GB SSC ACX 2.0+| Fractal Design Define R5 (Svart)

Permalänk
Medlem

@Stu123:

använd [ code ] [/code] så blir det lättare att läsa

#include <iostream> #include <math.h> using namespace std; int main () { int vinnandesek, vinnandenmin, vinnandetimme, start_min, start_tim, mal_sek, mal_min, mal_tim; int vinnarnummer = 0, startnummer, start_tid, start_sek, mal_tid, tid=0, minst=24*60*60, antal=0; const int dygn = 24*60*60; cout << "Startnummer? "; cin >> startnummer; if ( startnummer<=0) { cout << "Inga tävlande \n" << "Programmet avslutas " << endl; // Stoppar programmet direkt. } do { antal = antal + 1; // Program läser in antal tävlande, //startar på 0 för varje varv +1! cout << "Starttid? " << endl; cin >> start_tim>>start_min>>start_sek; // Räknar ut starttiden direkt. start_tid = start_tim*3600 + start_min*60 + start_sek; cout << "Måltiden? "<<endl; cin >> mal_tim>>mal_min>>mal_sek; // Program sparar måltiden direkt. mal_tid = (mal_tim*3600 + mal_min*60 + mal_sek); if (start_tid < mal_tid) { tid = mal_tid - start_tid; } else if (start_tid > mal_tid) { tid = mal_tid + (dygn - start_tid); // Om loppet passear midnatt måste program //ta dygnet minus starttiden. } if (tid < minst) // Program räknar jämför ny löpares tid med //tidigare löpares tid. { minst = tid; vinnarnummer = startnummer; } cout << "Startnummer? "; // Startar nästa tävlande. cin >> startnummer; } while (startnummer>0); vinnandetimme=minst/3600; vinnandenmin=minst/60 - vinnandetimme*60; vinnandesek=minst%60; cout << "Vinnare är Startnr: " << vinnarnummer << endl; cout << "Tid:" <<vinnandetimme<<"timmar "<<vinnandenmin<<"minuter "<<vinnandesek<<"sekunder "<<endl; cout << "Antal tävlande:" << antal << endl; cout << "Programmet avslutas" << endl; return 0; }

Skumt att ni inte får använda return när ni ändå ska avsluta programmet, men iaf anledningen till att du får det felet är att du saknar ett condition ovan "do" iom att du sätter while "checken" efter så "do" sker alltid engång först innan.

Visa signatur

"One is always considered mad, when one discovers something that others cannot grasp."
- Ed Wood

Permalänk
Medlem

Ni får mer än gärna ändra i programmet.

Vet inte om jag företåt er rätt, men det la till else till do satsen, då blir det fortfarande fel. Retur 0 får vi endast använda på slutet av programmet.
PS! har just börjat med programmering så ursäkta om jag har svårt att hänga med era kommentarer.

#include <iostream> #include <math.h> using namespace std; int main () { int vinnandesek, vinnandenmin, vinnandetimme, start_min, start_tim, mal_sek, mal_min, mal_tim; int vinnarnummer = 0, startnummer, start_tid, start_sek, mal_tid, tid=0, minst=24*60*60, antal=0; const int dygn = 24*60*60; cout << "Startnummer? "; cin >> startnummer; if ( startnummer<=0) { cout << "Inga tävlande \n" << "Programmet avslutas " << endl; // Stoppar programmet direkt. } else if(startnummer>=0) { antal = antal + 1; // Program läser in antal tävlande, //startar på 0 för varje varv +1! cout << "Starttid? " << endl; cin >> start_tim>>start_min>>start_sek; // Räknar ut starttiden direkt. start_tid = start_tim*3600 + start_min*60 + start_sek; cout << "Måltiden? "<<endl; cin >> mal_tim>>mal_min>>mal_sek; // Program sparar måltiden direkt. mal_tid = (mal_tim*3600 + mal_min*60 + mal_sek); if (start_tid < mal_tid) { tid = mal_tid - start_tid; } else if (start_tid > mal_tid) { tid = mal_tid + (dygn - start_tid); // Om loppet passear midnatt måste program //ta dygnet minus starttiden. } if (tid < minst) // Program räknar jämför ny löpares tid med //tidigare löpares tid. { minst = tid; vinnarnummer = startnummer; } cout << "Startnummer? "; // Startar nästa tävlande. cin >> startnummer; } while (startnummer>0); vinnandetimme=minst/3600; vinnandenmin=minst/60 - vinnandetimme*60; vinnandesek=minst%60; cout << "Vinnare är Startnr: " << vinnarnummer << endl; cout << "Tid:" <<vinnandetimme<<"timmar "<<vinnandenmin<<"minuter "<<vinnandesek<<"sekunder "<<endl; cout << "Antal tävlande:" << antal << endl; cout << "Programmet avslutas" << endl; return 0; }

Redigerat in [code]-taggar //mod
Permalänk

Du får vara lite mer konkret än att bara säga att det blir fel. På vilket sätt blir det fel?

Permalänk
Hedersmedlem
Skrivet av Stu123:

Vet inte om jag företåt er rätt, men det la till else till do satsen, då blir det fortfarande fel.

Försvann inte do nu?

Permalänk

Att byta ut do while mot en vanlig while borde funka.

#include <iostream> #include <math.h> using namespace std; int main () { int vinnandesek, vinnandenmin, vinnandetimme, start_min, start_tim, mal_sek, mal_min, mal_tim; int vinnarnummer = 0, startnummer, start_tid, start_sek, mal_tid, tid=0, minst=24*60*60, antal=0; const int dygn = 24*60*60; cout << "Startnummer? "; cin >> startnummer; if ( startnummer<=0) { cout << "Inga tävlande \n" << "Programmet avslutas " << endl; // Stoppar programmet direkt. } while (startnummer>0) { antal = antal + 1; // Program läser in antal tävlande, //startar på 0 för varje varv +1! cout << "Starttid? " << endl; cin >> start_tim>>start_min>>start_sek; // Räknar ut starttiden direkt. start_tid = start_tim*3600 + start_min*60 + start_sek; cout << "Måltiden? "<<endl; cin >> mal_tim>>mal_min>>mal_sek; // Program sparar måltiden direkt. mal_tid = (mal_tim*3600 + mal_min*60 + mal_sek); if (start_tid < mal_tid) { tid = mal_tid - start_tid; } else if (start_tid > mal_tid) { tid = mal_tid + (dygn - start_tid); // Om loppet passear midnatt måste program //ta dygnet minus starttiden. } if (tid < minst) // Program räknar jämför ny löpares tid med //tidigare löpares tid. { minst = tid; vinnarnummer = startnummer; } cout << "Startnummer? "; // Startar nästa tävlande. cin >> startnummer; } vinnandetimme=minst/3600; vinnandenmin=minst/60 - vinnandetimme*60; vinnandesek=minst%60; cout << "Vinnare är Startnr: " << vinnarnummer << endl; cout << "Tid:" <<vinnandetimme<<"timmar "<<vinnandenmin<<"minuter "<<vinnandesek<<"sekunder "<<endl; cout << "Antal tävlande:" << antal << endl; cout << "Programmet avslutas" << endl; return 0; }

Permalänk
Medlem

I första versionen:
Byt bara din do...while till en vanlig while.

Do
.
.
.
While
görs alltid minst en gång (kkollen görs vid while). Även fast startnummer är negativt så körs det 1 gång o SEN jämför du om startnr>0.

Skickades från m.sweclockers.com

Visa signatur

Processor: Motorola 68000 | Klockfrekvens: 7,09 Mhz (PAL) | Minne: 256 kB ROM / 512 kB RAM | Bussbredd: 24 bit | Joystick: Tac2 | Operativsystem: Amiga OS 1.3

Permalänk
Medlem

Tack så mycket, nu avslutas Loopet om man matar in värde mindre än noll och program fungerar som det är fler tävlande, men om man matar in värde mindre än noll som första tävlande räknar programmet ut vinnare ändå, trots att programet ska avslutas och inte gå igenom loop.

programkörning med -1 ger detta:

Startnummer? -1
Inga tävlande
Programmet avslutas
Vinnare är Startnr: 0 // Härifrån ska det inte finnas med.
Tim:24 Min: 0 Sek: 0
Antal tävlande:0
Programmet avslutas
Program ended with exit code: 0

Permalänk

@Stu123:
if satsen: if ( startnummer<=0) {

ska avslutas ovanför: } return 0;

inte ovanför: while (startnummer>0)

Lycka till

Visa signatur

"Victorious warriors win first and then go to war, while defeated warriors go to war first and then seek to win."

Permalänk
Medlem

@Stu123:
Det dyker upp för att de sista cout "callsen" är i main, du måste sätta någon form av condition test för dem med, en if sats vore nog smidigast, t.ex. kolla om vinnarnummer inte är 0 eller så?

EDIT:
Eller som nämnt ovan ska fungera med.

Visa signatur

"One is always considered mad, when one discovers something that others cannot grasp."
- Ed Wood

Permalänk
Medlem

Detta funkade. // Tack.

Permalänk
Medlem

Tackar så mycket.

Tack så mycket allihop nu fungerar program som det skall. La till if kondition till de sista cout satsen och det fixade slut problemet med. 🙏🏼🙏🏼🙏🏼