Permalänk
Medlem

nybörjar hjälp c++

Hej!

precis börjat med en distanskurs med c++. detta är precis i början så jag har väl inte riktigt kommit in i rätt tänk än...

men mitt problem är att jag ska skapa ett program som ska lista ut ett tal som jag tänker på. man ska ha tre alternativ där 1 är rätt tal, 2 är att talet är lägre och att 3 är att talet är högre.

jag vill inte att någon ska göra en fungerande kod bara hjälpa mig vad som är fel på min kod och hur jag ska tänka för att det ska bli bra!

det som jag vet är fel är vad som ska hända när man trycker 2 och 3. då jag inte får något bra sätt att få den att ta nästa tal i mellan 50 och 100 eller 1 och 50. tänkt så att den ska ta det mellersta talet hela tiden så om det är lägre än 50 så ska den gissa på 25 t.ex.

dock som det är nu så kommer den inte stanna inom 1-100 om t.ex. tar högre hela tiden.

har jag tänkt helt fel??

#include <iostream> using namespace std; int main() { int gissning = 50; int nr; int antal = 0; cout << " tänk på ett tal mellan 1 och 100. Tryck enter när du är klar."; cin.get() <<endl; while (nr !=1) cout << "Jag gissar på nr " << gissning << endl; cout << "Tryck 1 om det var rätt tal." <<endl; cout << "Tryck 2 om ditt tal är lägre." <<endl; cout << "Tryck 3 om ditt tal är högre." <<endl; cout << "Avsluta med ENTER." <<endl; cin >> nr; if (nr == 1) { cout << "YES! jag gissa rätt på " << antal << "gissningar! " <<endl ; cin.get(); return 0; } if (nr == 2) { gissning/2; antal++; } if (nr == 3) { gissning/0.5; antal++; } cin.get(); cin.get();

Permalänk

Tänk på indentering: som det är nu är det väldigt blandat.
Din while-sats saknar måsvingar.

Visa signatur

Citera, tack!
Har du läst tråden om strandhögtalare och andra musiklådor?

Permalänk
Medlem

Jag skulle gjort så att vid fall 2 gissa på värdet som är (föregående gissning) /2 du bör även spara din gissning ett varv så du inte fastnar i en loop T.ex.
talet är 40:
50?
Lägre.
25?
Högre.
50?
...

Och slutligen måste du göra en kontroll så att alla gissningar datorn gör ligger mellan 1-100 om inte ändra till värdet närmast, dvs 1 eller hundra.

Visa signatur

Dator: Ryzen 5900X, 32GB RAM, RTX3080
Ljud: SMSL SU-8, HDVA600, HD800.

Permalänk
Medlem

ta talet 74, då blir ditt program följande

Jag gissar på nr 50; högre
Jag gissar på nr 100; lägre
Jag gissar på nr 50; högre
Jag gissar på nr 100; lägre
.....osv

Jag skulle använt mig av varibler för max och min, och sedan låtit gissningen vara medelvärdet av dessa två. Sedan uppdatera max och min variblen beroende av svaret du ger.
Tänk på om jag säger att talet är högre än 50, så kan talet vara 51-100.
Tänk även på att med den här metoden behöver du tänka till hur du hanterar dina heltal.

Permalänk
Medlem

Förstår nu att jag tänkte rätt fel haha, men ändå hänger jag nog inte riktigt med... är andra dagen jag jobbar med c++ så detta lär ta ett tag.

men förstår nu lite mer hur jag ska tänka för att komma vidare i alla fall!

tack som mycket!!!

Permalänk
Medlem

Hej igen!

har fått till den här koden nu!

#include <iostream> using namespace std; int main() { int max = 100; int min = 1; int gissning = ((max+min)/2); int nr; int antal = 1; cout << " tänk på ett tal mellan 1 och 100. Tryck enter när du är klar."; cin.get(); while (nr !=1) { cout << "Jag gissar på nr " << gissning << endl; cout << "Tryck 1 om det var rätt tal." <<endl; cout << "Tryck 2 om ditt tal är lägre." <<endl; cout << "Tryck 3 om ditt tal är högre." <<endl; cout << "Avsluta med ENTER." <<endl; cin >> nr; if (nr == 1) { cout << "YES! jag gissa rätt på " << antal << "gissningar! " <<endl ; cin.get(); return 0; } if (nr == 2) { max = gissning; min = 1; gissning = ((max+min)/2); antal++; } if (nr == 3) { max= 100; min= gissning; gissning = ((max+min)/2); antal++; } } cin.get(); cin.get(); }

nu fungerar det nästan!

jag har forfarande kvar problemet att inte variablen "gissning" följer med. säg att jag säger att det är högre än 50 men sen lägre än 75 så går gissningen ner till 38...

någon som kan skicka mig i rätt riktining om vad som är fel eller hur jag kan göra??

Permalänk
Medlem
Skrivet av xoften:

Hej igen!

har fått till den här koden nu!

#include <iostream> using namespace std; int main() { int max = 100; int min = 1; int gissning = ((max+min)/2); int nr; int antal = 1; cout << " tänk på ett tal mellan 1 och 100. Tryck enter när du är klar."; cin.get(); while (nr !=1) { cout << "Jag gissar på nr " << gissning << endl; cout << "Tryck 1 om det var rätt tal." <<endl; cout << "Tryck 2 om ditt tal är lägre." <<endl; cout << "Tryck 3 om ditt tal är högre." <<endl; cout << "Avsluta med ENTER." <<endl; cin >> nr; if (nr == 1) { cout << "YES! jag gissa rätt på " << antal << "gissningar! " <<endl ; cin.get(); return 0; } if (nr == 2) { max = gissning; min = 1; gissning = ((max+min)/2); antal++; } if (nr == 3) { max= 100; min= gissning; gissning = ((max+min)/2); antal++; } } cin.get(); cin.get(); }

Dold text

nu fungerar det nästan!

jag har forfarande kvar problemet att inte variablen "gissning" följer med. säg att jag säger att det är högre än 50 men sen lägre än 75 så går gissningen ner till 38...

någon som kan skicka mig i rätt riktining om vad som är fel eller hur jag kan göra??

ta bort raderna med:
min = 1;
max= 100;
så skall det nog lösa sig, min och max skall ju var gränserna på intervallet, som minskar efter varje fråga.

Permalänk
Medlem
Skrivet av mattoys:

ta bort raderna med:
min = 1;
max= 100;
så skall det nog lösa sig, min och max skall ju var gränserna på intervallet, som minskar efter varje fråga.

Oj! var det så lätt!

måste ha stirrat sönder på den här koden i timmar nu!!

Tack så mycket!!

Permalänk
Medlem

[OT]
Python-lösning för de som vill se likheter etc....

class Guesser: def __init__(self, low=1, high=100): self._low = low self._high = high self.llim = low self.ulim = high def reset(self): self.llim = self._low self.ulim = self._high @property def current_guess(self): return (self.llim + self.ulim)/2 def guess(self): print "I guess:", self.current_guess def play(self): self.reset() n_guesses = 1 while True: self.guess() s = raw_input('High [h], Low[l] or Correct[c]?').lower() if s == 'h': self.ulim = self.current_guess n_guesses += 1 elif s == 'l': self.llim = self.current_guess n_guesses += 1 elif s == 'c': print "Yey, I won after", n_guesses, "guesses" break else: print "Unknown command, try again" if n_guesses > ceil(log2(self._high-self._low)): print "Hey, you are cheating! You need to remember the number you picked. Tired of this, lets play again!" self.play() break g = Guesser() g.play()

Visa signatur

weeeee

Permalänk
Medlem
Skrivet av xoften:

Oj! var det så lätt!

måste ha stirrat sönder på den här koden i timmar nu!!

Tack så mycket!!

Offtopic, men jag måste bara säga det är riktigt roligt att se du är intresserad utav att faktiskt lära dig.
De flesta som kommer med programmeringsfel ber om en lösning för att kunna gå vidare med koden, men du frågade efter ledtrådar så du själv kunde lösa det vilket är riktigt bra.

Mer folk som du skulle inte sitta fel i denna värld.

(Jag är trött och kan inte formulera mig korrekt, men jag hoppas du förstår vad jag menar)

Visa signatur

14700k @ Stock . 32GB @ 4000MHz . 3070 @ +100/+800MHz
240+360 rad custom loop

Permalänk
Hedersmedlem

*Tråd rensad*

Tagit bort trådkapning. "Jag har fått en uppgift, lös den åt mig" hör inte hemma här (ej riktad mot ts).
/moderator

Visa signatur

Danskjävel så krattar som en skrivare...

Permalänk
Medlem

försöker på nytt efter att screamin-daemon känt sig tvunget att rensa.
kan någon enkelt förklara begreppen Klass, Attrubut och Konstruktorn?

Permalänk
Skrivet av maneri01:

försöker på nytt efter att screamin-daemon känt sig tvunget att rensa.
kan någon enkelt förklara begreppen Klass, Attrubut och Konstruktorn?

Det är inte riktigt det denna tråden handlar om. Pröva göra en ny tråd där du kan få vägledning.

Permalänk
Hedersmedlem
Skrivet av maneri01:

försöker på nytt efter att screamin-daemon känt sig tvunget att rensa.
kan någon enkelt förklara begreppen Klass, Attrubut och Konstruktorn?

Läs här:
http://www.cplusplus.com/doc/tutorial/classes/

Visa signatur

Använd gilla för att markera nyttiga inlägg!