söka efter specifika bokstäver.

Permalänk

söka efter specifika bokstäver.

Hej! har en liten övning jag sitter och klurar på för tillfället.

uppgiften är att jag ska skriva ett program som frågar efter ett tecken och avgör om tecknet finns i följande mening, avsluta med att skriva 0: "att vara eller inte vara"

finns bra exempel men i exemplet använder de sig av tal istället för bokstäver så jag antar att jag ska använda mig av string och char, det ända är att det skrivs inte ut nått när jag skriver in en bokstav eller nått så tror jag gjort fel med min deklaration av char och min for loop (första gången jag jobbar med char variabeln), och sen just i for loopen har jag sett att et ofta ser ut just så här "for (int i; i<=10;i++)" och jag har lite svårt att förklara programmets gång för mig själv med just det så om någon vill förklara det lite snabbt och pedagogiskt så får ni gärna det!

så här ser min kod ut.

tack på förhand.

#include <iostream> using namespace std; int main () { char bokstav; char mening [10]= {'a','t', 'v', 'r', 'e', 'l', 'i', 'n',}; /* hemliga meningen är "att vara eller inte vara"*/ bool ok = false; cout << "Ange en bokstav och se fall den finns med i den hemliga meningen" << endl; cin >> bokstav; for (int i; i<=10;i++) if (mening [i]== bokstav) { ok=true; break; } if (ok) cout<<"bokstaven är med i den hemliga meningen!"<<endl; else cout << "fel! bokstaven är inte med i den hemliga meningen whomp whomp whooooomp :("<<endl; return 0; }

MhatteBoi

Permalänk
Hedersmedlem

Ett sätt för att få bättre förståelse är att lära sig stega programmet i debugern. Då kan du se vad som händer med olika variabler.

Verkligen imponerande att ha skrivit ett program som detta utan att förstå vad det gör. Du måste vara en naturbegåvning.

Visa signatur

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

Permalänk
Medlem

Om du inte får någon varning när du kompilerar den där koden så bör du ta reda på hur man höjer varningsnivån på kompilatorn du använder, för just nu är i oinitialiserad i din for-loop. Så i kan få vilket värde som helst, och om det råkar vara större än 10 så hoppas loopen över. Detta är något din kompilator borde varna dig för.

Permalänk
Medlem

Tänk först på hur du löser det manuellt. En mening består av en radda bokstäver. För att hitta en viss bokstav så kollar du meningens bokstäver en efter en tills du antingen hittar den eftersökta bokstaven eller meningen tar slut.

Testa följande kod för en hint om hur det kan lösas smidigt:

int main() { string sentence = "att vara eller inte vara"; for(char ch : sentence) { cout << ch << endl; } return 0; }

Visa signatur

Laptop: Dell Latitude E7270 | 12,5" FHD IPS | i5-6300U | 16GB RAM | 500GB SSD
Laptop: MacBook Air 13"
NUC: Intel i5-4250U | 8GB RAM | 250GB SSD

Permalänk
Skrivet av PeCe:

Tänk först på hur du löser det manuellt. En mening består av en radda bokstäver. För att hitta en viss bokstav så kollar du meningens bokstäver en efter en tills du antingen hittar den eftersökta bokstaven eller meningen tar slut.

Testa följande kod för en hint om hur det kan lösas smidigt:

int main() { string sentence = "att vara eller inte vara"; for(char ch : sentence) { cout << ch << endl; } return 0; }

tack så mycket löste det! vad gör den kolon i for loopen? provade utan och då funkade det inte, har inte lärt mig alla operators variablar och sådant!
tack igen!

Permalänk
Medlem
Skrivet av MhatteBoi:

vad gör den kolon i for loopen? provade utan och då funkade det inte, har inte lärt mig alla operators variablar och sådant!

Det är en for each-loop, en förenklad variant av for som kan användas när man bara vill loopa igenom en hel sekvens (i det här fallet en sträng) och inte behöver iteratorvärdet.

Permalänk
Skrivet av perost:

Det är en for each-loop, en förenklad variant av for som kan användas när man bara vill loopa igenom en hel sekvens (i det här fallet en sträng) och inte behöver iteratorvärdet.

ah ok! tack så mycket för svar!

Permalänk
Medlem
Skrivet av MhatteBoi:

tack så mycket löste det! vad gör den kolon i for loopen? provade utan och då funkade det inte, har inte lärt mig alla operators variablar och sådant!
tack igen!

Skrivet av perost:

Det är en for each-loop, en förenklad variant av for som kan användas när man bara vill loopa igenom en hel sekvens (i det här fallet en sträng) och inte behöver iteratorvärdet.

Skrivet av MhatteBoi:

ah ok! tack så mycket för svar!

Som perost nämnde så är det en specialvariant av for. Man kan skriva det på följande vis med en klassisk for-loop:

int main() { string sentence = "att vara eller inte vara"; for(int idx = 0; idx < sentence.length(); idx++) { cout << mening[idx] << endl; } return 0; }

Om uppgiften exempelvis går ut på att hitta var i meningen en viss bokstav finns så är indexet av intresse, men skall du göra precis samma sak med alla element i en array/lista så är foreach-varianten användbar.

------
En liten jämförelse:

C++/Java

for(char ch : sentence)

C#

foreach(char ch in sentence)

I båda fallen utläses det for each char in sentence, men C#-varianten är något mer lättläst.

Visa signatur

Laptop: Dell Latitude E7270 | 12,5" FHD IPS | i5-6300U | 16GB RAM | 500GB SSD
Laptop: MacBook Air 13"
NUC: Intel i5-4250U | 8GB RAM | 250GB SSD

Permalänk

ok nu funkar det och jag tror jag har lite svårt att förstå loopar och sådant för just nu avslutar programmet efter jag skrivit en bokstan i inmatningen men jag vill kunna fortsätta skriva in liksom, har provat lite olika sätt men antingen gör den bara en infinite loop eller så kan jag fortsätta skriva in men jag får bara ut mina COUT svar en gång, vill att man ska kunna avsluta med 0.

så här ser det ut än sålänge

#include <iostream> using namespace std; int main () { char bokstav; string mening = "att vara eller inte vara"; /* hemliga meningen */ bool ok = false; cout << "Ange en bokstav och se fall den finns med i den hemliga meningen" << endl; cin >> bokstav; for (char i: mening) if (bokstav == i) { ok=true; } if (ok) cout<<"bokstaven är med i den hemliga meningen!"<<endl; else cout << "fel! bokstaven är inte med i den hemliga meningen whomp whomp whooooomp :("<<endl; do { return 0; } while (bokstav == 0);

Permalänk
Medlem

@MhatteBoi: Något som kanske inte är helt uppenbart för en nybörjare är att bokstäver representeras som siffror, t.ex. 'a' = 97. När du kollar om bokstav == 0 så kollar du alltså om användaren matat in en null-karaktär (\0) och inte siffran 0 (som i själva verket har värdet 48). Vad du istället vill göra är bokstav == '0', d.v.s. jämföra med karaktären 0 och inte värdet 0.