Mendel Skrevet 31. august 2010 Del Skrevet 31. august 2010 Hei folkens, Jeg har laget et program i forbindelse med oppgave på skolen. Kriteriene var at den skulle regne gjennomsnittet på 3 "karakterer" dette fikk jeg da til, men så fant jeg ut at jeg ville legge til en loop på dette programmet og gikk for Do-While, men opplever problemer med programmet hvis jeg skriver for eksempel Ja istedenfor J for å restarte programmet. Finnes det noe bedre måte å fikse en loop? Legger ved koden #include <iostream> using namespace std; int main() {char valg; do{ const double strykGrense = 2.0; double tall1; double tall2; double tall3; double total; //Totalkarakter cout << "Skriv inn 3 karakterer med mellomrom/enter mellom:" << endl; cin >> tall1 >> tall2 >> tall3; total = tall1 + tall2 + tall3; total = total/3.0; cout << endl; cout << "Gjennomsnittet ditt er: " << total << endl; cout << endl; if (total < 2) {cout <<"Du har dessverre ikke best\x86tt!" << endl;} else {cout <<"Gratulerer, du har best\x86tt!" << endl;} cout << endl; cout << endl; cout <<"Vil du fortsette J/N?"; cin >> valg; } while((valg !='N')&&(valg !='n'));} Lenke til kommentar
Gjest Slettet-Pqy3rC Skrevet 31. august 2010 Del Skrevet 31. august 2010 (endret) Jeg benytter ofte; while(true) { . . . if (something) break; } eller while(something) { . . . } Siden jeg personlig leser dette lettere. Endret 31. august 2010 av Slettet-Pqy3rC Lenke til kommentar
janjonern Skrevet 1. september 2010 Del Skrevet 1. september 2010 } while((valg !='N')&&(valg !='n'));} til } while((valg !='N') || (valg !='n'));} Den kan ikke være begge deler Lenke til kommentar
Mendel Skrevet 1. september 2010 Forfatter Del Skrevet 1. september 2010 Okai, takker for svar Får se hva jeg får til her Lenke til kommentar
etse Skrevet 1. september 2010 Del Skrevet 1. september 2010 husk og at "cin" leser input frem til den kommer til første punkt som ikke stemmer for "inputen" den forventer. F.eks, hvis den forventer å få en char, lese den 1 bokstav og stopper der. Er det da skrever mer enn en bokstav i input vil den kunne gå i failmode. Dette må du da håndtere. (f.eks. hvis du skriver Ja, men forventer J.) Dette kan håndteres på flere måter, skal ta for meg tilfellene i koden din: cin >> tall1 >> tall2 >> tall3; Her forventer du tall. Men om noen skriver inn en bokstav så vil Cin ikke godta dette, Tall1, tall2, og tall3 vil ikke få noen verdi utover sin standardverdi, i tillegg vil "cin" gå i failmode og vil derfor ikke godta input lengre - og dermed får du en evighetsloop. Dette kan du fikse ved å bruke en enkel if-test: if(cin >> tall1 >> tall2 >> tall3) { // Koden din for å regne ut her }else{ // Cin går i failmode, ugyldig input cout << "UGYLDIG INPUT!\n"; cin.clear(); // Fjerner fail-mode flagget cin.ignore(1000, '\n'); // Ignorer opp-til 1000-første tegn valg = 'y'; // Siden fikk en feil må han prøve på nytt } Du har også en annen feil i koden: cout << "Vil du fortsette J/N?"; cin >> valg; Her forventer du en enkel char som inpit, men om man skriver et ord eller et setningen vil den kun lese den første bokstaven for så å fortsette koden. Om første bokstav da ikke var N, så vil den gå tilbake til toppen og fortsette der og prøve de andre bokstavene som input andre steder i koden. For å fikse dette er det enkelt å bruke ignore-funksjonen igjen: cin >> valg; cin.ignore(1000,'\n'); Koden blir da til slutt seende ut slik: #include <iostream> using namespace std; int main() { char valg; do{ const double strykGrense = 2.0; double tall1; double tall2; double tall3; double total; //Totalkarakter cout << "Skriv inn 3 karakterer med mellomrom/enter mellom:" << endl; if(cin >> tall1 >> tall2 >> tall3) { total = tall1 + tall2 + tall3; total = total/3.0; cout << endl; cout << "Gjennomsnittet ditt er: " << total << endl; cout << endl; if (total < 2) { cout <<"Du har dessverre ikke best\x86tt!" << endl; }else{ cout <<"Gratulerer, du har best\x86tt!" << endl; } cout << endl; cout << endl; cout << "Vil du fortsette J/N?"; cin >> valg; cin.ignore(1000,'\n'); }else{ cout << "Ugyldig input, prøv igjen!" << endl; cin.clear(); cin.ignore(1000, '\n'); valg = 'y'; } } while((valg!='N')||(valg!='n')); } PS: Jeg vil ikke anbefale deg å ta inn input på denne måten, jeg ville heller tatt å brukt getline, og så sjekket at inputen var slik jeg ønsket den. Lenke til kommentar
Mendel Skrevet 1. september 2010 Forfatter Del Skrevet 1. september 2010 Ok, takker meget for god tilbakemelding her Begynte med C++ koding her i forrige uke og har bare gjordt det jeg har lært (til nå), men syntes dette var svært nyttig informasjon. Lenke til kommentar
Mendel Skrevet 5. september 2010 Forfatter Del Skrevet 5. september 2010 Hei igjen, Var en liten feil i koden du hadde gitt meg så den gikk i loop selv om jeg skrev N, n, Nei eller nei, men har nå fått det til å funke. La også til en liten funksjon til i koden din om ugyldig input slik at en får den meldingen når en skriver et tall på 7 eller over. Fikk dette iallefall til å fungere for meg, men takker ikke nei til noe input. Legger ved nye kode #include <iostream> using namespace std; int main() {char valg; do{ const double strykGrense = 2.0; double tall1; double tall2; double tall3; double total; //Totalkarakter cout << "Skriv inn 3 karakterer med mellomrom/enter mellom:" << endl; if (cin >> tall1 >> tall2 >> tall3 && tall1 < 7 && tall2 < 7 && tall3 < 7) { total = tall1 + tall2 + tall3; total = total/3.0; cout << endl; cout << "Gjennomsnittet ditt er: " << total << endl; cout << endl; if (total < 2) {cout <<"Du har dessverre ikke best\x86tt!" << endl;} else {cout <<"Gratulerer, du har best\x86tt!" << endl;} cout << endl; cout << endl; cout <<"Vil du fortsette J/N?"; cin >> valg; cin.ignore(1000,'\n');} else{ cout << "Ugyldig input, pr\x9Bv igjen!" << endl; cout << endl; cin.clear(); cin.ignore(1000, '\n'); valg = 'y';} } while((valg !='N')&&(valg !='n'));} Lenke til kommentar
etse Skrevet 5. september 2010 Del Skrevet 5. september 2010 første jefg ser er at jeg ikke helt liker måten du strukturer koden på, det kunne vært finere. F.eks. skal du alltid ha et intrykk på neste linje etter if-tester eller løkker. Personlig liker jeg og at selv om du kun skal ha et funksjonskall etter en if-test så vil jeg ha denne på egen linje for å få det mer oversiktlig. Lenke til kommentar
Mendel Skrevet 5. september 2010 Forfatter Del Skrevet 5. september 2010 (endret) Ja, jeg slet litt med å få denne til å fungere med de nye kodene i, så var redd for å gjøre for mye i tilfelle jeg skulle klare å ødelegge litt av koden. Setter pris på tilbakemeldinger på koden slik at jeg kan gjøre den bedre/mer oversiktlig Endret 5. september 2010 av Mendel Lenke til kommentar
etse Skrevet 5. september 2010 Del Skrevet 5. september 2010 C++ bryr seg generelt lite om whitepaces, i motsetning til f.eks. python. Hvordan man strukturer koden er og litt smal og behag. om jeg skal rydde koden din ville den blitt noe slikt: #include <iostream> using namespace std; int main() { char valg; do{ const double strykGrense = 2.0; double tall1; double tall2; double tall3; double total; //Totalkarakter cout << "Skriv inn 3 karakterer med mellomrom/enter mellom:" << endl; if ((cin >> tall1 >> tall2 >> tall3) && (tall1 < 7) && (tall2 < 7) && (tall3 < 7)) { total = tall1 + tall2 + tall3; total = total/3.0; cout << endl; cout << "Gjennomsnittet ditt er: " << total << endl; cout << endl; if (total < 2) cout <<"Du har dessverre ikke best\x86tt!" << endl; else cout <<"Gratulerer, du har best\x86tt!" << endl; cout << endl; cout << endl; cout <<"Vil du fortsette J/N?"; cin >> valg; cin.ignore(1000,'\n'); }else{ cout << "Ugyldig input, pr\x9Bv igjen!" << endl; cout << endl; cin.clear(); cin.ignore(1000, '\n'); valg = 'y'; } }while((valg !='N')&&(valg !='n')); } Lenke til kommentar
[kami] Skrevet 6. september 2010 Del Skrevet 6. september 2010 vil råde deg til alltid å ha med {} på if/else/do/while etc, selv om det er fullt lovlig å ikke ha det om du bare har en linje. if (foo) { bar(); } else { std::cout << "meh"; someotherfunction(); } while (foo) { bar(); } do { bar(); } while (foo); - Det er mer oversiktlig. (ie, når du ser over koden ser du umiddlbart if/else/do/while blokken) - vanskeligere å skrive feil. - ganske vanlig å ha denne regelen i større programmeringsfirmaer, så er en grei vane å innarbeide seg tidlig det viktigste er uansett at du er konsekvent med formatteringen din! ikke bland flere stiler ala: if (foo) { bar(); } else { if (other) { some_function_call(); } else { SomeFunctionCall(); } } - da blir det fort rotete og tungt å lese! Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå