Permalänk
Medlem

Hjälp med C++

Hej jag håller på med en uppgift(hänga gubbe) i C++.
i programmet har jag frågetecken som visas istället för det riktiga ordet.

Det jag behöver hjälp med är när man gissat en bokstav så skall dess respektive frågetecken ersättas med den rätta bokstaven.

Exempel:
riktigtOrd=hallå

?????
gissning= l

??ll?

Hur gör jag detta?
Skriv ifall ni inte fattar hur jag menar så skall jag försöka förklara bättre.

Permalänk
Medlem

Det jag skulle göra är nog att sätta varje '?' som en variabel och sedan jämföra gissningen med varje variabel och därefter sätta variabeln = den rätta bokstaven.

Ett annat sätt skulle vara att sätta hela '?????' som en string och sedan köra en for-sats som söker igenom ordet efter hur många bokstäver det fins( l i ditt fall) och sedan sätta den bokstaven på rätt plats i stringen

Permalänk
Hedersmedlem

Du skulle kunna börja med:

std::string riktigtOrd = "hallå"; std::string dold = std::string(ord.size(), '?');

När användaren gissar jämför du gissningen med bokstäverna i riktigtOrd och ersätter frågetecknet i dold med det riktiga tecknet om de överensstämmer.

Permalänk
Medlem

Har testat detta men kört fast. Min lärare tipsade om att använda
string find och string replace, och göra en for sats som söker igenom stringen flera gånger(ifall det finns flera av samma) men har som sagt inte lyckats med det. Nån som vet hur man gör?

Permalänk
Hedersmedlem

Ett tips är att

riktigtOrd.find('l')

returnerar 2

riktigtOrd.find('l',3)

returnerar 3
och

riktigtOrd.find('l',4)

returnerar std::string::npos

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Elgot
Ett tips är att

riktigtOrd.find('l')

returnerar 2

riktigtOrd.find('l',3)

returnerar 3
och

riktigtOrd.find('l',4)

returnerar std::string::npos

Citat:

Ursprungligen inskrivet av Elgot
Ett tips är att

riktigtOrd.find('l')

returnerar 2

riktigtOrd.find('l',3)

returnerar 3
och

riktigtOrd.find('l',4)

returnerar std::string::npos

Ursäkta om jag är lite korkad med jag förstod inte riktigt vad du gjorde, men om det skall kunna göra en return måste man väl ha det i en egen funktion?
Men är nybörjare på programering så

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av Rikard.J
Ursäkta om jag är lite korkad med jag förstod inte riktigt vad du gjorde, men om det skall kunna göra en return måste man väl ha det i en egen funktion?
Men är nybörjare på programering så

Nja, om du alltså kör

std::string s = "hallå"; int a, b, c; a = s.find('l'); b = s.find('l', 3); c = s.find('l', 4);

så kommer a, b och c innehålla 2, 3 och std::string::npos. Detta kan man till exempel använda för att med en loop hitta alla förekomster av ett tecken...

Permalänk
Medlem

Tackar. Nu kvarstår bara problemet att de skall ersätta frågetecknén med samma position, hur gör jag det?

Permalänk
Hedersmedlem

Om man till exempel vill ändra s från "hallå" till "hallä" kan man till exempel använda:

s[4] = 'ä';

Permalänk
Medlem

Här har du ett fungerande skal för hangman.
Jag gjorde det så enkelt jag kunde för jag antar att du är nybörjare inom c++.

Jag föreslår att du sätter dig och kollar igenom koden ordentligt och lär dig vad som händer, om detta är en skoluppgift som du ska klara av så kommer du inte långt utan hjälp om du bara förlitar dig på andra

#include <iostream> #include <String> using namespace std; int main() { //Det rätta ordet string answer = "hello"; string result; int count; //Sätter in frågetecken i det "okända" ordet for(int i=0; i<answer.length(); i++) result.push_back('?'); char guess = 'x'; while(true) { system("cls"); cout << "The word:" << result <<endl; cout << "Input guess: "; //Frågar efter din gissning cin >> guess; //Ersätter alla '?' med din gissning om den stämmer överens med svaret for(int i=0; i<answer.length(); i++) { if(answer.at(i) == guess) { result.at(i) = guess; } } count = 0; //Kollar om det finns några frågetecken kvar i strängen for(int i=0; i<result.length(); i++) { if(result.at(i) == '?') count++; } //Om det inte gör det så avslutas spelet if(count == 0) { system("cls"); cout << "The word was: " << result << endl; cout << "You won the game!" << endl; system("pause"); break; } } }

Permalänk
Medlem

tack för all hjälp lyckades att få ihop en kod:

#include<iostream> #include<string> using namespace std; int main() { cout<<"V\x84lkommen till h\x84nga gubbe."<<endl <<"Mata in ditt hemliga ord: "; string hemligtOrd; char gissning; int ratt; cin >>hemligtOrd; string utOrd(hemligtOrd.length(),'?'); system("CLS"); int fel=0; int klar=0; while(fel<11&&klar==0){ cout<<utOrd<<endl<<"Mata in din gissning:"; cin>>gissning;//matar in gissningen system("CLS"); std::string s = hemligtOrd; int a=0, n=0, j=0; while(a!=-1){ a = s.find(gissning, n); utOrd[a]= gissning; n=a; n++; j++; } if (j==1&&a==-1){ fel++; cout<<"Du har gissat fel "<<fel<<" g\x86nger: " <<endl; } if(utOrd==hemligtOrd){ cout<<"Grattis du har gissat r\x84tt"<<endl; klar=1; } if(fel==11){ cout<<"tyv\x84rr du har gissat fel för många g\x86nger"<<endl; } } system("PAUSE"); return 0; }

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av Rikard.J

cin>>gissning;//matar in gissningen system("CLS"); std::string s = hemligtOrd; int a=0, n=0, j=0; while(a!=-1){ a = s.find(gissning, n); utOrd[a]= gissning; n=a; n++; j++; }

Fundera dock på vad som händer om man matar in ett tecken som inte ingår i det hemliga ordet...