Trädvy Permalänk
Medlem
Registrerad
Mar 2016

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)

Trädvy Permalänk
Medlem
Plats
Lund
Registrerad
Okt 2011
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

Corsair Vengeance LPX 2x8GB 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)

Trädvy Permalänk
Medlem
Plats
Zion
Registrerad
Apr 2004

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

[ i5-6600K @ 4.7Ghz || Corsair H110 GTX || 16GB DDR4 || ASUS Z170 Pro Gaming || Asus ROG 1080 Strix @ 2100+/11Ghz+ ]
Unigine Superposition 1080p; 17487 @ Medium; 4594 @ Extreme
"One is always considered mad, when one discovers something that others cannot grasp."
- Ed Wood

Trädvy Permalänk
Medlem
Registrerad
Mar 2016

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
Trädvy Permalänk
Medlem
Plats
Uppsala
Registrerad
Dec 2008

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

Trädvy Permalänk
Moderator
Plats
Linköping
Registrerad
Apr 2004
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?

Trädvy Permalänk
Medlem
Plats
Kronobergs Län
Registrerad
Mar 2012

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; }

Chassi: Fractal Design Arc, MB: Gigabyte Z77X-UD3H, Telefon: : LG G4 32GB
CPU:Intel i5 3570k, CPU Kylare: Phanteks PH-TC14PE,
GPU: MSI GTX 970, Ljudkort: Asus Xonar DGX, Hörlurar: Sennheiser HD598,
Nätagg: Corsair RM850x 850W, RAM: Corsair Vengeance 4x 4GB

Trädvy Permalänk
Medlem
Plats
Götet
Registrerad
Okt 2013

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

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

Trädvy Permalänk
Medlem
Registrerad
Mar 2016

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

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Apr 2014

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

ska avslutas ovanför: } return 0;

inte ovanför: while (startnummer>0)

Lycka till

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

Trädvy Permalänk
Medlem
Plats
Zion
Registrerad
Apr 2004

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

[ i5-6600K @ 4.7Ghz || Corsair H110 GTX || 16GB DDR4 || ASUS Z170 Pro Gaming || Asus ROG 1080 Strix @ 2100+/11Ghz+ ]
Unigine Superposition 1080p; 17487 @ Medium; 4594 @ Extreme
"One is always considered mad, when one discovers something that others cannot grasp."
- Ed Wood

Trädvy Permalänk
Medlem
Registrerad
Mar 2016

Detta funkade. // Tack.

Trädvy Permalänk
Medlem
Registrerad
Mar 2016

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