Gå til innhold

Drep whiletest viss "stop" er tasta inn.


Anbefalte innlegg

Hei!

Her er tingen:

Eg har ei while-løkke der brukaren skal taste inn ei rekkje verdiar.

Brukaren skal kunne taste inn alle tal mellom 0 og 99 så mange ganger han vil, og samle sette i ein vector (vector.push_back(verdi)).

Viss han taster inn "stop", skal while-testen mislykkest, og viss han tastar inn tal som er 100<, så skal den returnere 1 og programmet skal stoppe med noe sånnt: "Beklager, verdien var ugyldig."

 

Her var det eg tenkte meg:

while(cin >> temp) {
if(temp = "stop")
break;
if (!temp < 100)
return 1;
else {
value.push_back(temp);
}
}

... men breaken på "if nr 1" vil vel ikkje virke slik eg vel ha det, sidan den berre vil gå ut av if-testen. Eg må ha den til å gå ut av while-testen.

 

Dette er ikkje noko eg serriøst treng, men dette tenkte eg var noko vikteg å lære.

Endret av Fjott
Lenke til kommentar
Videoannonse
Annonse

std::string temp;
int value;
std::vector<int> values;

while(cin >> temp) 
{
 if(temp.compare("stop") == 0)
   break;
 int value = std::atoi(temp.c_str());
 if(!value < 100)
 {
   std::cout << "Ugyldig verdi: " << value << std::endl;
   return 1;
 }
 else 
 {
   values.push_back(value);
 }
}

 

Ingen garanti for at det kompilerer off-the-shelf, men det gir i hvertfall idéer om hva du bør gjøre.

Lenke til kommentar

Eg lurar litt på ein ting:

while (cin >> x && run){
         if (x = "stop")
         while_run = false;
         if(!x < 100 || !x > 0){
         cout << "Inputtet er ikkje gyldig";
         return 1;
         }
value.push_back(x);
         }

I det tilfelle at x = stop, då vil if test nr 2 blir false, sidan x= "stop", og dermed vil programmet returenere, og misslykkes.

 

Btw, koleis kan eg lage ein var som kan helde både tal og bokstavar?

string variabelnavn = "hei på deg";

 

Vil eg då kunne endre same strengen frå "hei på deg" til f eks. 23?

Lenke til kommentar

Så vidt jeg vet ja, men du kan ikke bruke det i matematiske beregninger. Med mindre du endrer det til int via ostringstream og str().

 

edit:

nei, søren det var feil vei. :p hvis det er string gjør du slik:

int tall = atoi(tekst.c_str());

Endret av MapSter
Lenke til kommentar
Eg lurar litt på ein ting:

while (cin >> x && run){
         if (x = "stop")
         while_run = false;
         if(!x < 100 || !x > 0){
         cout << "Inputtet er ikkje gyldig";
         return 1;
         }
value.push_back(x);
         }

 

1. Når du gjør en sammenligning, bruk '==', ikke '='.

2. Bruk string::compare i stedet for 'var == "streng"'.

3. Å sjekke om 'run' er true i while-evalueringa, er ikke en god idé. I dette tilfellet ender du med å dytte x opp på bufferen, selv om "stop" er det som skrives inn. Bruk break, eller continue etter å ha satt flagget.

4. Hvorfor leste du ikke koden jeg la inn som svar? Den burde løse det meste.

Lenke til kommentar

Takk, men eg lurte på om det er nokon enklare måtar å gjere det på.

 

Trur kanskje enkelte misforsod her, det var faktisk ikkje ironi det med at det var mange hjelpsame folk her. :)

Så, du får slutte å vere vannabi kul sjølv, Oracel.

 

Koden til einaros er sikkert super, den.

Det er berre det at det er ein god del nye ting i den, men eg spør når eg lurar på noko.

 

Eg plar ikkje vere særleg ironisk...

 

Grunnen til at eg gjekk rett på zirener sitt var, var at det var så enkelt.

 

atoi og c_str forstod eg ikkje mykje av.

 

EDIT: Eg har ein mistanke om at atoi-linja gjer om int'en til ein string.

Endret av Fjott
Lenke til kommentar

atoi gjør om en char* til en integer. Dvs. den returnerner de første tallene i char-arrayet(char*). Dette er dog ikke noen god c++-måte å gjøre det på. (C++-måten bruker stringstream)

c_str() returner et char-array(char*) fra et std::string-objekt

Lenke til kommentar
atoi gjør om en char* til en integer. Dvs. den returnerner de første tallene i char-arrayet(char*). Dette er dog ikke noen god c++-måte å gjøre det på. (C++-måten bruker stringstream)

c_str() returner et char-array(char*) fra et std::string-objekt

6041324[/snapback]

 

StringStream brukes ikke for å gjøre char* til int, nei. Motsatt, derimot.

Lenke til kommentar
#include <iostream>
#include <sstream>
int main (int argc, char **argv)
{
   char* s1 = "432", *s2 = "234.432";
   int x1=0;
   float x2 = 0.0f;
   
   std::stringstream str1, str2;

   std::cout << "s: " << s1 << std::endl;
   std::cout << "s2: " << s2 << std::endl;
   std::cout << "x1: " << x1 << std::endl;
   std::cout << "x2: " << x2 << std::endl;

   str1 << s1;
   str1 >> x1;
   std::cout << "x1: " << x1 << std::endl;

   str2 << s2;
   str2 >> x2;
   std::cout << "x2: " << x2 << std::endl;
   std::cin.get();
  return 0;
}

Endret av Nazgul
Lenke til kommentar
atoi og c_str forstod eg ikkje mykje av.

 

EDIT: Eg har ein mistanke om at atoi-linja gjer om int'en til ein string.

6041080[/snapback]

 

Når du lærer mer om tekststrenger så lærer du også om funksjonen c_str().

For å gjøre ett tall i en tekststreng (string) om til int gjør du slik:

string tallStreng = "124";
int tall = atoi(tallStreng.c_str());

c_str() funksjonen gjør tekststrengen om til en nullterminert tekststreng, noe som er det eneste atoi() funksjonen kan bruke. labs() og atof() brukes for datatypen long og flyttall.

Lenke til kommentar

break "hopper ut av" den innerste while, do eller for-løkken .. den brukes også i sammenheng med switch

 

selv om det hadde gitt mening (edit: altså semantisk sett) å bruke break i f.eks. if-sammenheng er ikke dette definert i C/C++-standarene, og dermed ikke mulig .. man kan i stedet neste med en ekstra if (edit: eller bruke goto, så klart :) )

Endret av dayslepr
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...