Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Silmukkarakenteet

Sivun loppuun

Aloittelija2 [16.09.2004 11:27:03]

#

Olisi tarkoitus thedä ohjelma joka kysyy käyttäjältä kokonaisluvun n (n>0) ja tulostaa luvun kertoma näytölle. Esimerkiksi n:n kertomaa merkitään merkillä n!, joka tarkoittaa lukua, joka saadaan seuraavasti 1*2*3...*n

Olen saanut seuraavan koodin aikaiseksi ja ihmettelen suuresti mikä saatana siinä on vikana? Kohta menee hermot jos kukaan ei osaa auttaa...

#include <stdio.h>

int main(void){

int x, i, tulo;

			printf("\n Anna kokonaisluku:");
			scanf("%d", &tulo, &x, &i);

			for (i=1 ;i <= x; i++);

			tulo = 1 * i;

			printf("Luvun %d kertoma on %.0f", tulo);

return 0;
}

rndprogy [16.09.2004 12:10:48]

#

vaihda nuo %d %i:ksi. Tälläinen toimii.

#include <stdio.h>

int main(void){

int x, i, tulo;

printf("\n Anna kokonaisluku:");
scanf("%i", &tulo, &x, &i);


for (i=1 ;i <= x; i++);

tulo = 1 * i;

printf("Luvun %i kertoma on", tulo);

getchar();
return 0;
}

Meca [16.09.2004 13:09:45]

#

%d ja %i on sama asia.
Miksi käyttäjältä kysytään kolme lukua vaikka tarvitaan vain yksi? Lisäksi jos halutaan lukea useampaan muuttujaan, pitää scanf:ssä olla jokaista muuttujaa varten %d, tuossa luetaan arvo vain muuttujaan 'tulo'. Muuttujaan 'x' ei lueta mitään arvoa, joten silmukka pyörii satunnaisen määrän kiertoja. Lisäksi silmukka ei tee muuta kuin pyörii määränsä ympäri, koska sen lopussa on puolipiste. Kun silmukan suoritus on loppunut, kerrotaan silmukan pyörimä määrä yhdellä ja sen jälkeen näytetään tuloksena saatu kokonaisluku liukulukuna nollan desimaalin tarkkuudella. Ei muuta kuin kurssin oppikirja esille ja alkeita kertaamaan, kyllä se sieltä valkenee.

tejeez [16.09.2004 13:32:54]

#

Meca kirjoitti:

%d ja %i on sama asia.
Miksi käyttäjältä kysytään kolme lukua vaikka tarvitaan vain yksi?

Eikös tuossa niin että käyttäjältä kysytään yksi luku vaikka tarvitaan kolme? :)

Heikki [16.09.2004 14:27:30]

#

Onpas tuo rndprogyn koodi outoa... Eihän tuo voi toimia.

Tässä toimiva versio:

#include <stdio.h>

int main() {
	int n=0; //tämä luetaan käyttäjältä
	int tulos=1; //tähän lasketaan tulos

	printf("\nAnna luku josta lasketaan kertoma: ");
	scanf("%i", &n);

	int i;
	for (i=1; i<=n; i++) { //for-silmukan perään EI puolipistettä!
		tulos=tulos*i; //kerrotaan tulos laskurimuuttujalla
	}

	printf("\n\nLuvun kertoma on %i", tulos);

	return 0;
}

Ps. Aloittelija2: Laita koodisi [ koodic] ja [ /koodic] -tagien väliin keskustelualueella.

Meca [16.09.2004 14:32:55]

#

tejeez kirjoitti:

Eikös tuossa niin että käyttäjältä kysytään yksi luku vaikka tarvitaan kolme? :)

Ei tarvita kuin yksi luku mutta yritetään lukea tietoa kolmeen muuttujaan.

Antti Laaksonen [16.09.2004 17:24:35]

#

Vielä yksi esimerkkitoteutus mahtuu mukaan...

#include <stdio.h>

int main(void) {
    int luku, tulos, i;

    printf("Kirjoita luku: ");
    scanf("%i", &luku);

    tulos = luku;
    for (i = 2; i < luku; i++) {
        tulos *= i;
    }

    printf("%i! = %i", luku, tulos);

    return 0;
}

Heikin esimerkki on myös ihan hyvä, mutta C:ssä muuttujia ei saa määritellä kesken kaiken, vaan ne täytyy määritellä heti funktion alussa.

Deewiant [16.09.2004 20:42:33]

#

Antti Laaksonen kirjoitti:

C:ssä muuttujia ei saa määritellä kesken kaiken, vaan ne täytyy määritellä heti funktion alussa.

Kyllä niitä saa, se ei vain ole suositeltavaa koodin selkeyden takia.

thefox [17.09.2004 09:37:28]

#

Deewiant: ANSI-C:ssä EI saa, uudemmassa C99-standardissa kyllä. Ihan normaali ANSI-C on kuitenkin enemmän käytössä ja jos puhutaan vain "C:stä", niin yleensä tarkoitetaan ANSI-C:tä.

edit: ja en ole todellakaan samaa mieltä siitä, että tuollainen kaikissa tapauksissa selventäisi yhtään mitään :)

Heikki [17.09.2004 16:15:28]

#

Antti Laaksonen kirjoitti:

Heikin esimerkki on myös ihan hyvä, mutta C:ssä muuttujia ei saa määritellä kesken kaiken, vaan ne täytyy määritellä heti funktion alussa.

Niinhän se olikin... en ole itse C:tä opiskellut, vaan mennyt suoraan C++:aan, jossa tätä sääntöähän ei ole.

Ja ainakin minusta on selkeämpi määritellä joku laskuri tms. muuttuja vasta kun sitä tarvitaan...

kaviaari [17.09.2004 16:35:00]

#

Henk. koht. koodailen itekkin c++:lla ja mun mielestä mikään ei oo selkeempää kun jaoteltu koodi joten määrittelen kaikki muuttujat samassa kohdassa, noh jokainen tallaa(luetaan koodaa) tyylillään.

Aloittelija2 [19.09.2004 11:43:02]

#

Juu kyllä näillä ohjeilla sain tuon toimimaan. Löytyiskö mistään c ohjelmaa jolla pystyis laskemaan koearvosanojen keskiarvon että ei itse tarvisi sitä suunnitella? Nimenomaan siis c kielellä...

firebug [19.09.2004 11:49:29]

#

Suosittelisin ottamaan pikemmiten jonkun C-kirjan käteen ja lukemaan siitä kaikki perusasiat. Tuo koearvosanojen keskiarvon laskeminen on todella helppo tehdä, kun vain vähän sitä paperilla tai päässään suunnittelee.

(Haiskahtaa kumpikin näistä tehtävistä muuten aika pahasti koulutehtäviltä :)

Heikki [19.09.2004 11:52:19]

#

Keskiarvon laskijahan on erittäin yksinkertianen tehdä. Kannattaisi yrittää itse...

Tässä kuitenkin oma, kovalevyn syövereistä löytämäni keskiarvonlaskija (C++:aa, mutta eroa C:hen ainoastaan cin ja cout):

#include <iostream>

using namespace std;


int main(int argc, char *argv[])
{
  int monta, summa, temp;
  float tulos;

  cout << "Keskiarvolaskija\n\n";
  cout << "Monesta luvusta lasketaan keskiarvo?\n";
  cin >> monta;



  for (int i=0; i<monta; ++i) {
    cout << "\nAnna luku " << i+1 << "\n";
    cin >> temp;
    summa+=temp;
  }

  //lasketaan lopullinen tulos
  tulos=summa/monta;

  cout << "\nLukujen keskiarvo on: " << tulos << "\n";
  return 0;
}

Metabolix [19.09.2004 12:22:37]

#

Onhan tuossa muutakin eroa: muuttuja i määritellään keskellä koodia. Se pitäisi siis siirtää alkuun.

vipemype [19.09.2004 13:48:25]

#

Tuo Heikin koodi olisi parempi ilman tuota 'monta lukua' kysymystä. Eli käyttäjältä kysyttäisiin lukuja ja kun lukujen syöttäminen on lopetettu, ohjelma laskee niistä keskiarvon.

Metabolix [19.09.2004 19:53:32]

#

Mutta mistä tiedämme, milloin niitä ei enää syötetä? "cin >> temp" varmaankin odottaa, kunnes käyttäjä antaa luvun; ei Enter sitä masenna.

Aloittelija2 [21.09.2004 13:52:51]

#

Sanokaas viisaammat miten saan tuon kysymään monta keskiarvo numeroa? Ja sen pitäisi tulostaa myös, esim. että "Ohjelmaan syötetty 5 arvosanaa."

#include <stdio.h>
   main()
   {
     int syotetty_luku, keskiarvo;
     do
     {
       printf("Ohjelma laskee syötettyjen arvosanojen keskiarvon.\nLopetus negatiivisella kokonaisluvulla.Anna arvosana (4-10):\n");


	   scanf("%d", &syotetty_luku);



       keskiarvo = syotetty_luku / syotetty_luku;

       if(syotetty_luku > 0) {
           printf("Arvosanojen keskiarvo: %d\n", keskiarvo);
         }
         else if(syotetty_luku < 0) {
           printf("Ohjelma lopetetaan...\n");

         }
     }
     while(syotetty_luku > 0);

     return 0;
   }

dungeon86 [21.09.2004 14:58:49]

#

tsekkaa ekaa ohjelmaani: www.freewebs.com/dungeon86/ka10.zip

firebug [21.09.2004 15:53:17]

#

Aloittelija2: Edelleen suosittelisin jotain hyvän oppaan lukemista ennenkuin edes yrität tehdä tuohon lisää. Tällä hetkellä tuo ohjelmasi ei tee mitään järkevää. Yksinkertainen toimintasuunnitelma:

1. Kysy käyttäjältä lukujen määrä
2. Talleta määrä johonkin muuttujaan
3. Kysy lukuja niin pitkään kunnes niitä on annettu maara-kappaletta; negatiivisen luvun tapauksessa lopeta ohjelma, positiiviset luvut lisätään muuttujaan summa
4. Laske keskiarvo = summa / maara
5. Tulosta keskiarvo käyttäjälle

Tästä vain lähdet vaihe vaiheelta koodaamaan ja mietit järkevästi jokaisessa kohdassa mitä ohjelman tulee tehdä. Jos tekeminen ei vieläkään onnistu täältä ja mureakuhasta saamillasi ohjeilla, niin suosittelisin jättämään koodaamisen sikseen.


Sivun alkuun

Vastaus

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

Tietoa sivustosta