💬
Logga in
Fuska.se

C++ Meny

15 svar · startad

Nivå 9 · Veteranfuskare
Trådstartare #1

Hallå.

 

Det är så att jag försöker mig på en meny med hjälp av en switch-sats. När man då skriver in 1, 2 eller så kommer man då till en annan funktion. Det fungerar som det ska hitills.

 

Men nu vill jag komma tillbaka till menyn. Hur gör jag enklast det. Jag ska ju antagligen returnera någonting men har ni något tips om hur jag ska göra det. Skulle uppskatta hjälp!

 

Här är min kod just nu:

 

#include <iostream>

using namespace std;

int addition();
int subtraktion();

int main()
{
cout << "Välkommen. Vad vill du göra i menyn?" << endl << "1. Addition" << endl << "2. Subtraktion" << endl;
int menyval;
cin >> menyval;


switch (menyval) 
{
case 1: addition();
case 2: subtraktion();

}



system ("pause");
	return 0;
}

int addition()
{
int t1, t2;	

cout << "Skriv in två tal";
cin >> t1 >> t2;

int svar=t1+t2;

cout << svar;

return 0;
}

int subtraktion()
{
return 0;
}

 

Kanske kan man använda typ en ny switch-sats?

Om jag skriver in "1" så skickas den valet upp, men hur gör jag då för att den ska komma till menyn?

Senast ändrad:

Nivå 16 · Legendfuskare
#2

Kalla på main(); igen så borden den komma tillbaks dit.

Nivå 7 · Fuskare
#3
Vad hände med ";" efter "int main()"?
Nivå 16 · Legendfuskare
#4
↗ till inlägget

Vad hände med ";" efter "int main()"?

När man kallar på en funktion skriver man 'main();' men när man definierar den är det inget semikolon.
Nivå 9 · Veteranfuskare
Trådstartare #5
↗ till inlägget

Kalla på main(); igen så borden den komma tillbaks dit.

 

Då skrivs ju menyn ut igen. Det jag tänkt mig är att man bara ska få välja vart man går i menyn igen. Jag har gjort om den lite nu, men jag vet inte om det är dåligt eller bra gjort.

 

↗ till inlägget
Vad hände med ";" efter "int main()"?

Då avslutas int main() och det inom {} blir inte utskrivet. :)

 

Här är det nya, är det dåligt skrivet?

 

#include <iostream>

using namespace std;

int meny();
void addition();
void subtraktion();

int main()
{

cout << "Välkommen. Vad vill du göra i menyn?" << endl << "1. Addition" << endl << "2. Subtraktion" << endl;


meny();



system ("pause");
	return 0;
}

int meny()
{

int menyval;
cin >> menyval;

switch (menyval) 
{
case 1: addition();
case 2: subtraktion();
default: cout << "Du kan inte välja det numret, försök igen";
meny();
}

return 0;
}

void addition()
{
int t1, t2;	

cout << "Skriv in två tal" << endl;
cin >> t1 >> t2;

int svar=t1+t2;

cout << svar << endl << "Du återgår nu till menyn igen";

meny();

}

void subtraktion()
{

int t1, t2;

cout << "Skriv in två tal" << endl;
cin >> t1 >> t2;

int svar=t1-t2;

cout << svar << endl << "Du återgår nu till menyn igen";


meny();
}

Senast ändrad:

Nivå 16 · Legendfuskare
#6

Ja det funkar eller?

Nivå 9 · Veteranfuskare
#7

Ja, det är dåligt skrivet. Du kommer att erfara en stack overflow med det sättet om du anropar meny tillräckligt många gånger.

 

Enklast är att sätta in huvuddelen av programmet i en loop, såhär:

#include <iostream>

using namespace std;

int main()
{
int val;
cout << "meny";

while(true)
{
cin >> val;
if(!val) break; // Om val = 0, avsluta
switch(val)
{...}
}
}

 

↗ till inlägget

Vad hände med ";" efter "int main()"?

↗ till inlägget
När man kallar på en funktion skriver man 'main();' men när man definierar den är det inget semikolon.
Det är endast när man deklarerar eller anropar en funktion som man avslutar satsen med ett semikolon. En funktionsdeklaration är lika mycket en sats som en variabeldeklaration är.

int func1(int a, int b); // Deklarerande sats
extern int hejhej; // Deklarerande sats

Detta leder t.ex. till att det är möjligt att man inte behöver deklarera funktioner globalt, utan man kan göra det längre ner i räckvidden.

Senast ändrad:

Nivå 9 · Veteranfuskare
Trådstartare #8

Ska jag alltså lägga in själva menyn i main? Hur ska jag då kunna göra så jag kan välja från menyn igen, men inte att jag skriver ut själva cout-satsen igen.

 

Jag är en nybörjare på C++ så.. :P

 

Edit - nu när jag kollade insåg jag att det innehöll en while. Då förstår jag! :)

Så i menyer ska man använda loopar?

 

Men vad gör "true" i whileloopen? Har tidigare bara använt mig av mindre än där förut.

Senast ändrad:

Nivå 9 · Veteranfuskare
#9
↗ till inlägget

Ska jag alltså lägga in själva menyn i main? Hur ska jag då kunna göra så jag kan välja från menyn igen, men inte att jag skriver ut själva cout-satsen igen.

 

Jag är en nybörjare på C++ så.. :P

 

Edit - nu när jag kollade insåg jag att det innehöll en while. Då förstår jag! :)

Så i menyer ska man använda loopar?

 

Men vad gör "true" i whileloopen? Har tidigare bara använt mig av mindre än där förut.

"true" är ett reserverat nyckelord i C++ som representerar det booleska värdet sant. Alltså "if true = om sant".

Senast ändrad:

Nivå 9 · Veteranfuskare
Trådstartare #10

Men vad är då sant? :P

Stannar då aldrig loopen?

Senast ändrad:

Nivå 9 · Veteranfuskare
#11
↗ till inlägget

Men vad är då sant? :P

Stannar då aldrig loopen?

Nej precis, loopen stannar aldrig då villkoret aldrig utvärderas till falskt("false").

 

Man kan manuellt hoppa ut ur en loop genom att ange instruktionen "break;" i slingans associationsräckvidd, som jag gjorde:

while(true)
{
...
if(!val) break;
...
}

 

Notera att det inte går att hoppa ur en loop som befinner sig längre upp i räckvidden om man redan befinner sig i en inre loop:

while(true) // Fortsätter
{
while(true) // Hoppas ur
{
break;
}
}

Detta gäller för while, for & switch-slingor.

Senast ändrad:

Nivå 9 · Veteranfuskare
Trådstartare #12

Då kan man alltså hoppa ur en loop genom att skriva in detta i loopen?

if (tjabba<20){break;}

 

Om man alltså ökar "tjabba" med något tal för varje gång, då kommer den hoppa ur loopen då?

Nu är väl detta en omväg, men jag bara undrar.

 

--

 

Edit - Jag skrev en annan fråga men insåg hur dum jag var.

Senast ändrad:

Nivå 16 · Legendfuskare
#13

Ja du kan hoppa ur loopen på det sättet.

 

Det som du kanske vill göra är att skriva ut "meny" en gång. Och sedan låta while(true) ta emot input tills man säger stopp. Då skrivs bara meny ut en gång.

Nivå 9 · Veteranfuskare
Trådstartare #14

#include <iostream>

using namespace std;

void addition();
void subtraktion();
int main()
{
int val;
cout << "1. addition 2. subtraktion" << endl;

while(true)
{
cin >> val;
if(!val) break; 

switch(val)
{
case 1: addition();
case 2: subtraktion();

}
}
}

void addition()
{
int tal1, tal2, svar;
cout << "Skriv in dina tal för att räkna ut!" << endl;
cin >> tal1;
cout << "+" << endl;
cin >> tal2;

svar=tal1+tal2;

cout << svar << endl;


}



void subtraktion()
{ 
int tal1, tal2, svar;
cout << "Skriv in dina tal för att räkna ut!" << endl;
cin >> tal1;
cout << "-" << endl;
cin >> tal2;

svar=tal1-tal2;

cout << svar << endl;

}

 

Är det bra (bättre)? :)

Nivå 16 · Legendfuskare
#15

Ja det ser väl bra ut. Funkar det bra?

Nivå 9 · Veteranfuskare
#16
↗ till inlägget

Då kan man alltså hoppa ur en loop genom att skriva in detta i loopen?

if (tjabba<20){break;}

 

Om man alltså ökar "tjabba" med något tal för varje gång, då kommer den hoppa ur loopen då?

Nu är väl detta en omväg, men jag bara undrar.

Ja, precis. Men det är ingen omväg, det är ett bra sätt att lösa det. Det har att göra med hur C++-koden kompileras till Assembler för att sedan assembleras och länkas. Dagens kompilatorer är så smarta att ingen prestandaförsämring kommer att ske med detta sätt jämfört med om man skulle implementera villkoret i ett while-uttryck, t.ex.: while(tjabba >= 20){...}

 

Men om du är en av dem idioter som kollat någon C++-guide på internet som rekommenderar en utvecklingsmiljö kallad "Dev-C++", som standardutgåva använder sig utav en idag kanske 8 eller 9 år föråldrad C++-kompilator, ja då kanske det uppstår en prestandaförsämring. Kanske 33% av alla nybörjare jag mött av C++ är dumma nog att använda Dev-C++ och sedan be om hjälp av andra.

 

↗ till inlägget
Är det bra (bättre)? :)
Nja, det enda som verkar fel är att du inte hoppar ur switch-slingan efter ett switch-hopp som jag pratade om. Detta leder till att om det första fallet nås så kommer även det andra fallet att exekveras.

 

switch(val)
{
case 1: addition();
case 2: subtraktion();
}

Gör så här att du lägger till en break-instruktion efter varje fall för att hoppa ur switch-slingan efter att alla instruktioner i fallet har exekverats:

switch(val)
{
case 1: addition();
break; // Annars exekveras även subtraktion(); efter addition();
case 2: subtraktion();
break; // Behövs egentligen inte, men vissa väljer att skriva denna ändå
}

Senast ändrad:

Vill du vara med i diskussionen?

Bli medlem Logga in