Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Kahdella jaolliset luvut

Sivun loppuun

Karza [02.12.2005 15:52:46]

#

Taas newbie pulmia. Ohjelma lataa vähän aikaa ja sitten tulee virheraportti... musta taitaa tulla korkeintaan microsoftin työntekijä.

#include <iostream>
using namespace std;
int main()
{
      int i = 1;
      for (i = 2; i <= 10; i++) {
          if (i = i % 0) {
                cout << i;
          }
      }
cin.get();
return 0;
}

sori, itseasiassa tein tuon suunnilleen sekunneissa ja kysäsen vähän hätäsesti, mutta ohjelma siis pitäisi tulostaa lukujen 1 - 10 välistä kaikki kahdella jaolliset luvut... mutta niinkuin sanoin... iskee virheraporttia.. tiiättehän: "...on havainnut virheen" blaa blaa...

Blaze [02.12.2005 16:01:06]

#

if (i = i % 0) {

Ei nollalla voi jakaa. Etkä varmastikaan halua muuttaa tuota indeksimuuttujaa loopin sisällä.

ville-v [02.12.2005 16:08:05]

#

Toisin sanoen muuta kyseinen rivi muotoon

if (i == i % 2) {

Karza [02.12.2005 16:08:52]

#

Aina unohdan tuon == jutun...

Edit: joku mättää silti.

Mitenkä saa sillain, että ohjelma kysyy pelaako uudelleen vai ei. Osaan pistää sen uudelleen alkuun, mutta en lopettaa. Siis jos painaa "E", niin ohjelma loppuu heti.

Baglair [02.12.2005 16:18:12]

#

Voisi helpottaa vastaamista jos kertoisit mitä ohjelman olisi tarkoitus tehdä? Haluatko siis tulostaa Kahdella jaollisia lukuja? Itse kommentoin aina ohjelman alkuun mitä sen kuuluu tehdä.

Karza [02.12.2005 16:21:40]

#

kerroinhan minä... lue alkuviestin loppu.
Pitää luetella kahdella jaolliset luvut.

Baglair [02.12.2005 16:31:10]

#

Katsos niinpäs onkin. Syvimmät pahoitteluni. C:llä homman voisi toteuttaa vaikka näin:

//Tämä ohjelma tulostaa parilliset luvut väliltä 1-10
#include <stdio.h>

#define LUKU_MIN 1
#define LUKU_MAX 10

main()
{
	int i = LUKU_MIN;

	printf("|");
	for(; i <= LUKU_MAX; ++i)	{
		if(i % 2 == 0)	{
			printf("%d|", i);
		}
	}
}

EDIT:
Täsmennetään vähän tuota i % 2 == 0 kohtaa. Eli suomeksi se menee näin: Jos i on jaollinen kahdella (i:n jakojäännös on nolla) tulostetaan i:n digitaali

Blaze [02.12.2005 17:36:55]

#

Karza kirjoitti:

Mitenkä saa sillain, että ohjelma kysyy pelaako uudelleen vai ei. Osaan pistää sen uudelleen alkuun, mutta en lopettaa. Siis jos painaa "E", niin ohjelma loppuu heti.

Tee looppi, jonka ehtona on se, että käyttäjä painoi k. Jos käyttäjä painoi e, looppi – ja ohjelma – loppuu.

Karza [02.12.2005 23:02:10]

#

Kumma juttu. Koitan tehdä sitä, että tulostetaan "Haluatko pelata uudelleen? [k/e]" ja alkumäärittelyissä on "int char uudelleen;" niin virheilmotusta pukkaa, joka on: "invalid conversion from 'const char' to 'char'".. siis mikä mättää?

Blaze [02.12.2005 23:04:57]

#

Mtäh? Ei muuttuja voi olla kahta tyyppiä samaan aikaan. Joko int tai char, ei molempia.

Karza [02.12.2005 23:24:57]

#

No toi nyt oli kirjoitus virhe... ei siinä oikeasti lue inttiä alussa...

/*************ARVAA LUKU**************/

#include <iostream>
using namespace std;

int main()
{
    srand(time(NULL));
    int vastaus = rand() % 100 + 1;                 // arvotaan luku väliltä 1 - 100 muuttujalle vastaus
    int arvaus = 0;
    int varvauskerrat = 0;
    char uudelleen;
    cout << "ARVAA LUKU\n";
    cout << "Ajattelen yht\x84 kokonaislukua 1 - 100 v\x84lilt\x84";
    cout << "\nYrit\x84 arvata, mik\x84 se on: ";
    do
    {
       cin >> arvaus;
       if (arvaus == vastaus) {                     // jos käyttäjän arvaus on sama kun oikea vastaus, niin...
               cout << "\nArvasit OIKEIN!";
               cout << "\nArvasit " << varvauskerrat -- << " kertaa v\x84\x84rin. ";    // tulostetaan varvauskerrat muuttujan arvo, eli väärin vastatut kerrat
               do {
                  cout << "\n\nHaluatko pelata uudelleen? [K/E] ";
                  cin >> uudelleen;
                  cout << "\n________________________________________________\n\n";
                  if (uudelleen = "k") {
                                main();
                  }
                  if (uudelleen = "e") {
                  //////////////////////NYT PITÄISI SAADA OHJELMA SULKEUTUMAAN//////////////
                  }
               }
               while(1);
       }
       if (arvaus != vastaus)                       // jos käyttäjän arvaus on eri kuin oikea vastaus, niin...
       {
               varvauskerrat ++;                    // varvauskerrat muuttujan arvoa kasvatetaan yhdellä, eli yksi enemmän väärin arvattuja kertoja
               if (arvaus >= 101) {                 // jos arvaus on suurempi kuin 100, niin...
                          cout << "\nVastaus on v\x84lilt\x84 1 - 100!";
               }
               if (arvaus <= 0) {                   // jos arvaus on pienempi kuin 1, niin...
                          cout << "\nVastaus on v\x84lilt\x84 1 - 100!";
               }
               cout << "\nArvasit v\x84\x84rin. ";
               if (arvaus <= vastaus) {             // jos käyttäjän arvaus no pienempi kuin oikea vastaus, niin...
                          cout << "Luku on suurempi. ";   // vinkki, että luku on suurempi
               }
               if (arvaus >= vastaus) {             // jos käyttäjän arvaus on suurempi kuin oikea vastaus, niin...
                          cout << "Luku on pienempi. ";   // vinkki, että luku on pienempi
               }
               cout << "\nKoita uudelleen: ";
       }
    }
    while(1);


    cin.get();
    cin.get();
return 0;
}

tuollain...

jgz [03.12.2005 11:49:29]

#

koodissasi lukee:

if (uudelleen = "k") {
   main();
}
if (uudelleen = "e") {
   //////////////////////NYT PITÄISI SAADA OHJELMA SULKEUTUMAAN//////////////
}

Vertailu tapahtuu kahdella = merkillä ja lisäksi "k" ja "e" pitäisi olla muotoa 'k' ja 'e'

hunajavohveli [03.12.2005 12:52:22]

#

Tuli tuossa mieleen, että käynnistääkö main():n kutsuminen muka ohjelman uudestaan, vai avataanko se aliohjelmaksi edellisen main():n sisälle? Eikö pino silloin kasvaisi käytännössä aina uudelleen käynnistettäessä, mikä ei ainakaan minusta vaikuta kovin järkevältä?

Metabolix [03.12.2005 13:01:52]

#

Se avataan aliohjelmaksi. Ei siis ikinä niin (tai siis vain, jos tietää tarkalleen, mitä tekee)! Siitä voi seurata "stack overflow", kun liian monta mainia on päällekkäin. Tuo on yksi niitä tilanteita, joissa voi minusta aivan hyvin käyttää gotoa.

int main(void)
{
  // Tähän muuttujamäärittelyt
  // Tässä on gotoa varten merkitty ohjelman alku
Alku:
  // Tähän kaikki muu koodi (myös muuttujien alkuarvot)
  // Sitten, kun on lopetus kysytty...
  // Huom! Yksittäisten kirjainten ympärille hipsut (') eikä lainausmerkkejä (")
  // Toinen huom! Vertailussa == eikä =
  // Jos tuli k tai K, mennään alkuun
  if ((uudelleen == 'k') || (uudelleen == 'K'))
  {
    goto Alku;
  }
  // Sitten, kun joskus ei mennäkään alkuun tullaan tänne
  return 0;
}

Vaihtoehtoisesti näilä muutoksilla:
Alku: => do {
if (ehdot) => } while (ehdot);
Ja lopun aaltosulut ja goto pois. Huomaa siis do..while-blokin aaltosulut ja lopun puolipiste. Tätä monet pitävät parempana. Aivan kuin sillä olisi mitään merkitystä, kun kääntäjällä lopputulos on kuitenkin sama.

Karza [03.12.2005 13:04:09]

#

Mutta se toimii.... se main(). Ei kai se noin pienessä ohjelmassa haittaa.

Metabolix [03.12.2005 13:07:58]

#

Vastaapa siihen sata tai pari kertaa kyllä, niin huomaat. Eihän se tuossa näköjään haittaa (32548 kertaa meni, ennen kuin minulla kaatui), mutta ei kannata opetella huonoja tapoja.

Karza [03.12.2005 13:21:00]

#

Kiitos.. päätin tehdä lopulle oman goton kun tuolta silmukoiden syövereistä on muuten vaikea päästä pois...

/*************ARVAA LUKU***************/

#include <iostream>
using namespace std;

int main()
{
    Alku:
    srand(time(NULL));
    int vastaus = rand() % 100 + 1;                 // arvotaan luku väliltä 1 - 100 muuttujalle vastaus
    int arvaus = 0;
    int varvauskerrat = 0;
    char uudelleen;
    cout << "ARVAA LUKU\n";
    cout << "Ajattelen yht\x84 kokonaislukua 1 - 100 v\x84lilt\x84";
    cout << "\nYrit\x84 arvata, mik\x84 se on: ";
    do
    {
       cin >> arvaus;
       if (arvaus == vastaus) {                     // jos käyttäjän arvaus on sama kun oikea vastaus, niin...
               cout << "\nArvasit OIKEIN!";
               cout << "\nArvasit " << varvauskerrat -- << " kertaa v\x84\x84rin. ";    // tulostetaan varvauskerrat muuttujan arvo, eli väärin vastatut kerrat
               do {
                  cout << "\n\nHaluatko pelata uudelleen? [k / e] ";
                  cin >> uudelleen;
                  cout << "\n________________________________________________\n\n";
                  if ((uudelleen == 'k') || (uudelleen == 'K')) {
                                goto Alku;
                  }
                  if ((uudelleen == 'e') || (uudelleen == 'E')) {
                                goto Loppu;
                  }
               }
               while(1);
       }
       if (arvaus != vastaus)                       // jos käyttäjän arvaus on eri kuin oikea vastaus, niin...
       {
               varvauskerrat ++;                    // varvauskerrat muuttujan arvoa kasvatetaan yhdellä, eli yksi enemmän väärin arvattuja kertoja
               if (arvaus >= 101) {                 // jos arvaus on suurempi kuin 100, niin...
                          cout << "\nVastaus on v\x84lilt\x84 1 - 100!";
               }
               if (arvaus <= 0) {                   // jos arvaus on pienempi kuin 1, niin...
                          cout << "\nVastaus on v\x84lilt\x84 1 - 100!";
               }
               cout << "\nArvasit v\x84\x84rin. ";
               if (arvaus <= vastaus) {             // jos käyttäjän arvaus no pienempi kuin oikea vastaus, niin...
                          cout << "Luku on suurempi. ";   // ...vinkki, että luku on suurempi
               }
               if (arvaus >= vastaus) {             // jos käyttäjän arvaus on suurempi kuin oikea vastaus, niin...
                          cout << "Luku on pienempi. ";   // ...vinkki, että luku on pienempi
               }
               cout << "\nKoita uudelleen: ";
       }
    }
    while(1);

    cin.get();
    cin.get();
    Loppu:
return 0;
}

Sivun alkuun

Vastaus

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

Tietoa sivustosta