Silmukan päättäminen eri ehdoilla?

Pulmanani on se, että haluan saada silmukan päättymään ohjelmassa seuraavasti:

-silmukkalaskurille on vakioarvo, jonka tullessa vastaan arvojen syöttäminen silmukkaan lopetetaan ja ohjelma poistuu silmukasta. Siis esimerkiksi vakioarvo on 5, jolloin viidennen arvon syöttämisen jälkeen ohjelma poistuu silmukasta.

JA

-silmukkalaskurille on annettu vakiona vartija-arvo, jonka syöttäminen saa ohjelman poistumaan silmukasta. Esim vartija on määritelty -1000:ksi, jolloin tuo syöttötieto lopettaa silmukan.

Pulmanani on, että en tahdo saada noita kahta ehtoa (maksimiarvo ja vartija) toimimaan samaan aikaan. Jos käytän maksimiarvoa, niin silmukkalaskuri ei noteeraa vartija-arvoa ja päinvastoin. Miten tuo samanaikaisuus mahdetaan tehdä?
11979
Äänestä

Muut lukivat myös

Vastaukset 11

Vanhimmat

pistät sinne looppiisi tämmösen jutun:
if(annettu_arvo == -1000)
break;

eli jos annettu_arvo on -1000 hypätään ulos loopista breakilla.

Äänestä
  • Hyi hyi, break ja continue ovat hyvin läheistä sukua goto-lauseelle ja ne ovat siksi syvältä. Ainoa paikka missä noita voi käyttää on switch ja sekin syntaktisista syistä.

    Äänestä

  • C-veteraani kirjoitti:

    Hyi hyi, break ja continue ovat hyvin läheistä sukua goto-lauseelle ja ne ovat siksi syvältä. Ainoa paikka missä noita voi käyttää on switch ja sekin syntaktisista syistä.

    siinä tuli taas niin asiantunteva kommentti ettei mitään rajaa

    Äänestä

  • C-veteraani kirjoitti:

    Hyi hyi, break ja continue ovat hyvin läheistä sukua goto-lauseelle ja ne ovat siksi syvältä. Ainoa paikka missä noita voi käyttää on switch ja sekin syntaktisista syistä.

    Usein on parempi käyttää rehellisesti break ja continue käskyjä, kuin epämääräisiä apumuuttujia tai syviä ehtorakenteita. Näin ohjelma pysyy selkeämpänä, kuin myös nopeampana. Varsinkin While lauseen kanssa break ja continue ovat usein näppäriä.

    Äänestä

  • C-noviisi kirjoitti:

    Usein on parempi käyttää rehellisesti break ja continue käskyjä, kuin epämääräisiä apumuuttujia tai syviä ehtorakenteita. Näin ohjelma pysyy selkeämpänä, kuin myös nopeampana. Varsinkin While lauseen kanssa break ja continue ovat usein näppäriä.

    käyttänny breakkia muussa kuin switchimielessä. Puolipistettä on nopeanpi käyttää ihan huvikseenkin kuin, että alkaa kirjottaan kokonaista breakkia vaikka oiskin autocompletet ja kaikki päällä.

    Äänestä

  • Multimeedio kirjoitti:

    käyttänny breakkia muussa kuin switchimielessä. Puolipistettä on nopeanpi käyttää ihan huvikseenkin kuin, että alkaa kirjottaan kokonaista breakkia vaikka oiskin autocompletet ja kaikki päällä.

    break ja continuen käyttö selkeyttää koodia huomattavasti ja ehkäisee bugeja. otetaampas joitain esimerkkejä

    for(int i = 0; i < luku; i )
    {
    ...
    if(joku == jotain) i = luku; // poistu loopista
    }

    vs

    for(int i = 0; i < luku; i )
    {
    ...
    if(joku == jotain) break; // poistu loopista
    }

    nyt jos for-silmukan yläarvo muuttuu niin ensimmäisen esimerkin if-ehto voi helposti unohtua päivittämättä. sitäpaitsi break on selkeä ja ymmärtää heti ensi näkemältä että nyt ollaan poistumassa silmukasta. break kaiken lisäksi poistuu välittömästi, ja ilman sitä aiheutuu helposti vain ylimääräistä if-else-sotkua.

    entäs continue?

    while(ehto)
    {
    ...
    if(syöte == arvo1)
    {
    ...
    if(syöte2 == arvo2)
    {
    ... // tee jotain
    }
    }
    }

    vs

    while(ehto)
    {
    if(syöte != arvo1) continue;
    ...
    if(syöte2 != arvo2) continue;
    ... // tee jotain
    }

    continuen käyttö vähentää sisäkkäisten blokkien määrää ja tässä tapauksessa tekee koodista huomattavasti selkeämpää.

    kyllä molempia, break ja continue, kannattaa käyttää aina sen sijaan että alkaa kikkailemaan ylimääräisillä apumuuttujilla tai iffeillä...

    Äänestä

  • dsajföjasdfasöäas kirjoitti:

    break ja continuen käyttö selkeyttää koodia huomattavasti ja ehkäisee bugeja. otetaampas joitain esimerkkejä

    for(int i = 0; i < luku; i )
    {
    ...
    if(joku == jotain) i = luku; // poistu loopista
    }

    vs

    for(int i = 0; i < luku; i )
    {
    ...
    if(joku == jotain) break; // poistu loopista
    }

    nyt jos for-silmukan yläarvo muuttuu niin ensimmäisen esimerkin if-ehto voi helposti unohtua päivittämättä. sitäpaitsi break on selkeä ja ymmärtää heti ensi näkemältä että nyt ollaan poistumassa silmukasta. break kaiken lisäksi poistuu välittömästi, ja ilman sitä aiheutuu helposti vain ylimääräistä if-else-sotkua.

    entäs continue?

    while(ehto)
    {
    ...
    if(syöte == arvo1)
    {
    ...
    if(syöte2 == arvo2)
    {
    ... // tee jotain
    }
    }
    }

    vs

    while(ehto)
    {
    if(syöte != arvo1) continue;
    ...
    if(syöte2 != arvo2) continue;
    ... // tee jotain
    }

    continuen käyttö vähentää sisäkkäisten blokkien määrää ja tässä tapauksessa tekee koodista huomattavasti selkeämpää.

    kyllä molempia, break ja continue, kannattaa käyttää aina sen sijaan että alkaa kikkailemaan ylimääräisillä apumuuttujilla tai iffeillä...

    kyllä niitä voi käyttää(siks kai ne on mukaan ympätty) ja break; ja continue; selkeyttää koodia, mutta pitää myös muistaa se, että jos silmukka halutaan suorittaa vielä viimeisen kerran "loppuun" niin silloin tuo break ei käy kun sehän poistuu silmukasta välittömästi. continue;:sta en juuri nyt muista miten se käyttäytyi. tietenkin se mitä arvoja vertaillaan ja minkä takia ja mihin niitä myöhemmin käytetään, vaikuttaa aika paljon break;:in käyttöön.

    if(jokuluku == 5 && jokutoinenluku == -1000){break;}

    Äänestä

  • puusilima_ kirjoitti:

    kyllä niitä voi käyttää(siks kai ne on mukaan ympätty) ja break; ja continue; selkeyttää koodia, mutta pitää myös muistaa se, että jos silmukka halutaan suorittaa vielä viimeisen kerran "loppuun" niin silloin tuo break ei käy kun sehän poistuu silmukasta välittömästi. continue;:sta en juuri nyt muista miten se käyttäytyi. tietenkin se mitä arvoja vertaillaan ja minkä takia ja mihin niitä myöhemmin käytetään, vaikuttaa aika paljon break;:in käyttöön.

    if(jokuluku == 5 && jokutoinenluku == -1000){break;}

    Niin, kyllä breakille, ja continuellekin jopa on aikansa ja paikkansa, mutta loopin lopettamikseksi järkevintä on kuitenkin laittaa ne lopetusehdot niille kuuluviin paikkoihin:

    for (;a == loppu && b == loppu;)
    while (a!=loppu || b!=loppu)

    ennalta tiedettyjen lopetusehtojen tarkistaminen if-lauseella loopin sisällä ja sen jälkeen breakin käyttäminen on typerää ja huonoa ohjelmointia.

    Äänestä

  • dsajföjasdfasöäas kirjoitti:

    break ja continuen käyttö selkeyttää koodia huomattavasti ja ehkäisee bugeja. otetaampas joitain esimerkkejä

    for(int i = 0; i < luku; i )
    {
    ...
    if(joku == jotain) i = luku; // poistu loopista
    }

    vs

    for(int i = 0; i < luku; i )
    {
    ...
    if(joku == jotain) break; // poistu loopista
    }

    nyt jos for-silmukan yläarvo muuttuu niin ensimmäisen esimerkin if-ehto voi helposti unohtua päivittämättä. sitäpaitsi break on selkeä ja ymmärtää heti ensi näkemältä että nyt ollaan poistumassa silmukasta. break kaiken lisäksi poistuu välittömästi, ja ilman sitä aiheutuu helposti vain ylimääräistä if-else-sotkua.

    entäs continue?

    while(ehto)
    {
    ...
    if(syöte == arvo1)
    {
    ...
    if(syöte2 == arvo2)
    {
    ... // tee jotain
    }
    }
    }

    vs

    while(ehto)
    {
    if(syöte != arvo1) continue;
    ...
    if(syöte2 != arvo2) continue;
    ... // tee jotain
    }

    continuen käyttö vähentää sisäkkäisten blokkien määrää ja tässä tapauksessa tekee koodista huomattavasti selkeämpää.

    kyllä molempia, break ja continue, kannattaa käyttää aina sen sijaan että alkaa kikkailemaan ylimääräisillä apumuuttujilla tai iffeillä...

    niin joka kerta vielä yhdellä turhalla elsellä looppias täytät. Kannattaa heti ohjelmoinnin alussa itsellensä selvittää, kuinka iffiäkin pitää käyttää, niin ei tartte koodia turhilla ponppukomennoilla täyttää: oikeaoppisestihan se menee paljon vähemmillä näppäilyilläkin näin, että:

    for(int i = 0; i < luku; i )
    {
    ...
    if(joku == jotain); //break; tuo oli ihan turhaa nappailyasi jo siitakin syysta, etta iillasi ei ole mitaan virkaa tuon lohkon ulkopuoleisessa koodissa, joten kommentoin sen siitakin syysta, mutta jatin kuitenkin sen iffin siihen että ymmärrät, kuinka puolipistettä käytetään// poistu loopista

    //nainhan se menee kaiken oikean ohjelmointijärjen mukaisesti

    i--;

    // jos ii olisi maaritelty siten, etta silla olisi jotain virkaa eli kayttoa taman lohkon ulkopuoleisessa koodissa. Talla oikealla tavalla saastettiin nain pienessa ohjelmointiajassa jo kaksi (2) nappailya ja miljoonassa loopissa se tekee kaksimiljoonaa (2000000) näppäilyä...
    }

    Äänestä

onnistunee vaikka näin käyttäen &&(JA) operaattoria ja for silmukkaa

int laskuri, arvo;
for(laskuri=0, arvo=0; arvo != -1000 && laskuri < 5; laskuri )
{
cin>>arvo;
jne..
}

Äänestä

Kommentoi aloitusta


silmulaskuri kirjoitti:

Pulmanani on se, että haluan saada silmukan päättymään ohjelmassa seuraavasti:

-silmukkalaskurille on vakioarvo, jonka tullessa vastaan arvojen syöttäminen silmukkaan lopetetaan ja ohjelma poistuu silmukasta. Siis esimerkiksi vakioarvo on 5, jolloin viidennen arvon syöttämisen jälkeen ohjelma poistuu silmukasta.

JA

-silmukkalaskurille on annettu vakiona vartija-arvo, jonka syöttäminen saa ohjelman poistumaan silmukasta. Esim vartija on määritelty -1000:ksi, jolloin tuo syöttötieto lopettaa silmukan.

Pulmanani on, että en tahdo saada noita kahta ehtoa (maksimiarvo ja vartija) toimimaan samaan aikaan. Jos käytän maksimiarvoa, niin silmukkalaskuri ei noteeraa vartija-arvoa ja päinvastoin. Miten tuo samanaikaisuus mahdetaan tehdä?

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu