Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Silmukkarakenne

Sivun loppuun

Azure [12.01.2006 17:14:14]

#

Olisko teillä joku hyvä ohje silmukkojen tekoon, en halua vastaukseksi lue opasta, koska oon lukenu ja en ole ymmärtäny mitään noista while,do, break ja continue silmukan tekemisestä?

Ja samalla kysyn tästä alla olevasta koodistani, että miksi tämä ei toimi:

#include <iostream>
using namespace::std;

int main()

while (1){
int luku = 0;

 cout << "Arvaa luku! ";
 cin >> luku;
 if (luku == 3)
 {
 cout << "OIKEIN, se luku kolme";
 break;
 }
  else if (luku > 3)
  {
  cout << "VÄÄRIN";
  continue;
  }
   else if ( luku < 3)
   {
   cout << "VÄÄRIN";
   continue;
   }
    else
    {
    cout << "VÄÄRIN";
    continue;
    }
}

Mikä tässä oli väärin? =(

KIITOS ETUKÄTEEN KAIKISTA VASTAUKSISTA! =D

rndprogy [12.01.2006 17:28:16]

#

Ota nuo continuet pois. Niin se ei toimi että se palaisi takaisin looppiin jossa se jo on.

Deewiant [12.01.2006 17:33:18]

#

main-funktion sisältö pitää olla aaltosulkujen välissä, siksi tuo ei käänny.

Kyllä nuo continuet sinne minusta kuuluvat.

Baglair [12.01.2006 17:54:57]

#

Ei niiden continuejen tartte mielestäni tuolla turhaa roikkua. Kyseessähän on vain ehtolause. Mutta niistä loopeista.

For ja while silmukka kääntyy kääntäjällä ihan samaksi binaariksi, jos on rakentanut ne samanlailla toimiviksi.

While silmukka eli 'sen aikan kun' on ehkä helpompi käsittää. Ainakin omalla kohdallani oli näin kun aloittelin koodausta C:llä.

Tässä esimerkki while silmukasta:

#include <stdio.h>

int main(void)   {
   int x = 1;

//Tämä toistorakenne toistaa itseään kymmenen kertaa eli
//sillä aikaa kun x on pienempi kuin 10 toista.
   while(x <= 10) {
      printf("x = %d", x);
//x = x + 1
      ++x;
   }
}

For looppi sensijaan on ainakin tällähetkellä mielestäni hiukan nopeampi kirjoittaa

Deewiant [12.01.2006 18:01:57]

#

Baglair kirjoitti:

Ei niiden continuejen tartte mielestäni tuolla turhaa roikkua. Kyseessähän on vain ehtolause.

Käsitin niin, että tarkoitus on kysyä kunnes vastaus on oikea. Tietenkin loopin voi myös muuttaa muotoon while (luku != 3) ja säätää muun ohjelman tuohon sopivaksi.

Baglair [12.01.2006 18:04:26]

#

Oho mun moka. Sen siitä saa ku ei kato tarpeeks tarkasti.
Edit: Mutta nyt kun vielä tarkemmin katoin niin eihän niiden continujen tarttis ollakkaan siellä. Eihän ohjelma keskeydy vasta kun tullaan breakiin.

Metabolix [12.01.2006 18:10:45]

#

Mitähän uuta se luku voi muka olla kuin suurempi, pienempi tai sama? Eli viimeinen else-blokki on turha.

Deewiant: käsittääkseni while(1)-silmukka looppaa, kunnes tulee break (tai goto), ihan continue-lauseesta riippumatta =)

Mutta ihan alkuperäiseen kysymykseen vastauksena ovat tosiaan ne main-funktion aaltosulut. Muuten tuo on täysin toimiva ohjelma. (Vaikka mitä järkeä on aina arvata kolmosta, se on sitten eri asia :)

Azure [12.01.2006 18:45:51]

#

Kiitos neuvoista, nyt se toimii. Ohjelmani oli vain tarkoitus kuvata itselleni silmukoiden tekoa.

Tässä paranneltu koodi:

#include <iostream>
using namespace::std;

int main(void) {
int luku = 0;

 while (1) {
 cout << endl << "Arvaa luku!" << endl;
 cin >> luku;

 if (luku == 3)
 {
 cout << "OIKEIN, se luku on kolme";
 break;
 }
  else if (luku > 3)
  {
  cout << endl << "VAARIN";
  continue;
  }
   else if ( luku < 3)
   {
   cout << endl << "VAARIN";
   continue;
   }
    else
    {
    cout << endl << "VAARIN";
    continue;
    }
  }
}

Deewiant [12.01.2006 18:52:32]

#

Metabolix kirjoitti:

Mitähän uuta se luku voi muka olla kuin suurempi, pienempi tai sama? Eli viimeinen else-blokki on turha.

Miten olisi ensimmäiset kaksi else-blokkia. =)

Metabolix myös kirjoitti:

Deewiant: käsittääkseni while(1)-silmukka looppaa, kunnes tulee break (tai goto), ihan continue-lauseesta riippumatta =)

Hyvä pointti, enpä älynnyt.

Baglair [12.01.2006 18:57:57]

#

Yksikin else riittäisi eli tee näin se ehtorakenne

if(luku == 3)   {
   cout << "OIKEIN, se luku on kolme";
   break;
}
else   {
   cout << endl << "VAARIN";
}

Metabolix [12.01.2006 19:04:55]

#

No tällä hetkellä yksi else riittää, mutta jos sinne vaikka laittaa vihjeeksi "liian pieni" ja "liian suuri", kuten usein on, niin silloin kaksi. Paitsi että breakin jälkeen ei tarvita elseä, jos nyt aletaan pikkuseikoista viilata.

Deewiant [12.01.2006 19:19:09]

#

Metabolix kirjoitti:

No tällä hetkellä yksi else riittää, mutta jos sinne vaikka laittaa vihjeeksi "liian pieni" ja "liian suuri", kuten usein on, niin silloin kaksi.

Ja jos laittaa if-lauseen jälkeen jotain koodia, tarvitaan continuet else-blokkeihin. ;)

Metabolix [12.01.2006 19:30:27]

#

... jos haluaa, ettei sitä koodia suoriteta, jos on menty else-blokkiin.

#include <iostream>
using namespace::std;

int main(void)
{
  int luku = 0;

  while (1)
  {
    cout << endl << "Arvaa luku!" << endl;
    cin >> luku;

    if (luku == 3)
    {
      cout << "Oikein, kolmehan se oli.\n";
      break;
    }

    if (luku > 3)
    {
      cout << endl << "Liian suuri.\n";
      continue;
    }

    if (luku < 3)
    {
      cout << endl << "Liian pieni.\n";
      continue;
    }

    cout << "Ei pienempi, ei suurempi, mutta ei samakaan. Jaahas.\n";
  }
}

Azure [12.01.2006 20:14:01]

#

Mitä järkeä on sitten koko else:stä jos if:llä voi tehdä saman noin? =D

Metabolix [12.01.2006 20:17:52]

#

Mitä järkeä on elää, kun voi kuollakin?

Voi tuon tehdä näinkin jokseenkin yhtä pieneen tilaan:

#include <iostream>
using namespace std; // Eikä tungeta tänne kaksoispisteitä!

int main(void)
{
  int luku = 0;

  while (luku != 3)
  {
    cout << endl << "Arvaa luku!" << endl;
    cin >> luku;

    if (luku == 3) {
      cout << "Oikein, kolmehan se oli.\n";
    }
    else if (luku > 3) {
      cout << endl << "Liian suuri.\n";
    }
    else if (luku < 3) {
      cout << endl << "Liian pieni.\n";
    }
    else {
      cout << "Ei pienempi, ei suurempi, mutta ei samakaan. Jaahas.\n";
    }
  }
}

Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta