Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: VIOPEn harjoitustehtävät

Sivun loppuun

Kimmo [21.11.2006 22:11:41]

#

ei oikeen mun kekseliäisyys riitä tollaisen systeemin tekemiseen, eli pitäis tehdä ohjelma joka kysyy arvosanoja ja laskee ja tulostaa niiden keskiarvon sekä sen, että miten monta niitä arvosanoja annettiin. ja siinä pitääis käyttää while tai do-while juttua. se mitä mä oon saanut aikaiseksi on tällainen, mutta tosta ite laskemisesta ja muusta ton whilen kanssa en osaa/ymmärrä... jotain apua olis kiva saada. =)

#include <stdio.h>

int main()
{
int arvosana;

printf("Ohjelma laskee syötettyjen arvosanojen keskiarvon.\n Lopetus negatiivisella kokonaisluvulla.\n");

printf("Anna arvosana (4-10):");
scanf("%i", &arvosana);

printf("Ohjelmaan syötetty %i arvosanaa.\n", arvosana);
printf("Arvosanojen keskiarvo: ");

return(0);

}

Mod. edit: kooditagit

Blaze [21.11.2006 22:42:29]

#

Koulutehtävä, joten valmista ratkaisua ei heru.

Mietihän näitä:
-Ohjelmassa ei ole järkeä, ellei käyttäjää vaadita syöttämään ainakin yhtä lukua. Tämän perusteella voit valita oikean silmukkatyypin.
-Koeta keksiä ehto, jolla silmukassa pyöriminen lopetetaan. Tee aluksi vaikka ohjelma, joka kysyy aina 10 lukua, ja laskee niistä vaaditut asiat, sitten muuta ohjelmaa niin, että joka luvun jälkeen kysytään käyttäjältä, haluaako tämä jatkaa.

Kimmo [21.11.2006 22:47:59]

#

emmä mitään valmista ratkaisua haluakaan. mut miten tollainen kymmentä lukua kysyvä ohjelma sitten tehdään tolla while-jutulla?

Blaze [21.11.2006 22:59:24]

#

Määritellään laskurimuuttuja. Silmukan sisällä kasvatetaan aina sen arvoa yhellä. Silmukassa pyöritään niin kauan kuin laskurin arvo on pienempi kuin 10.

Kimmo [21.11.2006 23:08:57]

#

tai tosta toisesta jutusta, niin miten sen saa niin, että se kone laskee että kuinka monta niitä arvosanoja on syötetty siihen? vai onko se just toi laskurimuuttuja?

Blaze [21.11.2006 23:41:30]

#

Jos joka silmukan kierroksella kysytään yksi luku ja kasvatetaan muuttujan arvoa yhdellä, niin eikös sen muuttujan arvosta silloin näe, kuinka monta lukua on kysytty.

Kimmo [22.11.2006 20:20:07]

#

no enpä tosta oikeen tajua... mut mulla on muitakin pieniä ongelmia eri hommien kanssa, voin laittaa tähän samaan, eli esim tällainen, että on kertoma-juttu ja sen pitäis tulostaa näytölle vaan esim viitosen kertoma "120", mutta mulla toi tulostaa siihen siitä väliltäkin, eli "2, 6, 24, 120". mikä tossa on vikana, että se tulostaa noi ylimääräiset luvut?

#include <stdio.h>

int main(void)

{
int i, luku, kertoma = 1;

printf("Anna kokonaisluku:");
scanf("%d", &luku);


for(i = 2; i <= luku; i++)

{

kertoma = kertoma * i;

printf("Luvun %d kertoma on %d\n", luku, kertoma);

}
return;

}

(Mod. edit: Kooditagit yhä edelleenkin.)

Metabolix [22.11.2006 20:21:20]

#

Esimerkiksi se, että tulostat silmukassa etkä vasta sen päätyttyä. (Muuten, returnin pitäisi perässä olla nolla ja koodia olisi kiva sisentää järkevästi.)

Kimmo [22.11.2006 21:51:22]

#

en huomannut tota koogitagi-juttua, joten anteeks siitä... sain nyt toimimaan ton kertoma-jutun, että kiitti siitä. mut haluisko joku neuvoa tossa ekassa tehtävässä vielä? noi Blazen vinkit ei oikeen aukea mulle, joku esimerkki tai joku ihan suomenkielinen vinkki auttais mua enemmän...

lisään tähän vielä ton mitä oon saanut nyt aikaan, kun koitin etsiä netistä joitain vinkkejä tohon... vieläkään en tajua, että miten tohon loppuun saa näkyviin sen, että miten monta niitä arvosanoja on syötetty...

#include <stdio.h>

int main()
{
int arvosana, keskiarvo;

printf("Ohjelma laskee syötettyjen arvosanojen keskiarvon.\n Lopetus negatiivisella kokonaisluvulla.\n");

do
{

	printf("Anna arvosana (4-10):");
	scanf("%d", &arvosana);

		keskiarvo = arvosana + arvosana % 2;

		if(arvosana<4 || arvosana>10);
	{

}

}while(arvosana<4 || arvosana>10);

	printf("Ohjelmaan syötetty %d arvosanaa.\n", arvosana);
	printf("Arvosanojen keskiarvo: %d", keskiarvo);


return(0);

}

miiro [23.11.2006 16:23:24]

#

while-silmukka toimii siis näin

while(/*ehto minkä täytyy toteutua että silmukka loppuu*/) {
/*mitä loopataan*/
}
/*jos whilessä on vaikka joku $i++, niin tähän voi pistää $i:n tulostuksen!*/

Kimmo [23.11.2006 18:31:59]

#

enkö mä noin ole vähän kuin tehnytkin, vai? jos joku haluaa, niin saa antaa jonkun vihjeen millä ton mun arvosana-ohjelman saa toimimaan... tai että mitä tosta mun koodista puuttuu tai mikä siinä on väärin tai jotain?
ja miten ton saa laskemaan sen keskiarvon niistä annetuista luvuista, kun ite koitin tollai vaan kahdella luvulla, mut ei edes sekään näyttänyt oikeen onnistuvan ja sit kun niitä lukuja tulis vielä enemmän.
kuitenkin osaatte hyvin auttaa, joten älkää pihistelkö tietojenne kanssa...

Metabolix [23.11.2006 18:46:12]

#

Väärin on esimerkiksi se, että silmukkaa kierretään niin kauan, kuin arvosana on oikean alueen ulkopuolella, ja se, että keskiarvoksi laitetaan joka kierroksella viimeisin syötetty arvo pyötistettynä ylempään parilliseen. Lisäksi koodi on rumasti kirjoitettu. Jos panostaisit vähän sen ulkoasuun, ymmärtäisit ehkä itsekin sitä paremmin.

Teepä tästedes ohjelmasi niin, että ensin suunnittelet toiminnan yksityiskohtaisesti läpi asti ja sitten kirjoitat ohjelman suunnitelmasi mukaisesti. Voin vaikka tähän tehtävään avustukseksi kirjoittaa suunnitelman, sinun ei tarvitse kuin täyttää jokaisen kommenttirivin perään vastaava koodirivi.

// Pääfunktion määrittely
    // Määritellään: numero, summa, lukumaara, keskiarvo
    // Alustetaan summaksi ja lukumääräksi nolla
    // Silmukan aloitusrivi
        // Tulostetaan pyyntöteksti
        // Luetaan luku muuttujaan "numero"
        // Jos numero on kolmea suurempi ja yhtätöista pienempi
            // Laitetaan summaksi summa + numero
            // Korotetaan lukumäärää yhdellä
        // Muuten
            // Valitetaan käyttäjälle virheellisestä luvusta
    // Silmukan lopetusrivi ja -ehto, eli tarkistetaan, onko numero pienempi kuin nolla
    // Jos lukumäärä on nolla
        // Tulostetaan virheteksti, ei ollut yhtään lukua laskettavaksi!
    // Muuten
        // Keskiarvo on summa jaettuna lukumäärällä
        // Tulostetaan keskiarvo
    // Lopussa pääohjelmasta on tapana palauttaa nolla
// Ja siihen se viimeinen aaltosulku vielä.

Huomaa siisti sisennys. Kirjoita samaan kohti sisennettynä koodisi vastaavat rivit (tällä kertaa yksi rivi jokaista kommenttia kohden ja mahdollisesti ylimääräisenä lopettavia sulkumerkkejä, '}'). Yleensä sisennyksen suuruus on yksi sarkain, tabulaattori. Tällöin sen voi usein editorin asetuksista säätää ulkonäöltään haluamansa kokoiseksi.

Voi olla hyvä muuttaa keskiarvo joksikin muuksi kuin kokonaisluvuksi, koska nythän se pyöristyy varsin railakkaasti.

Miiro (ja kysyjäkin): "while" => "niin kauan kuin". Ehto on siis se ehto, jonka pitää toteutua.

while (kissan_jalkojen_maara == 4) {
    printf("Kissalla on jalat tallella!\n");
    // Ja täällä sitten jotakin mahdollisesti jalkoja muuttavaa...
}

Tulipa samalla esimerkki siististä sisennyksestä. :)

Blaze [23.11.2006 19:12:55]

#

Metabolix kirjoitti:

// Ja täällä sitten jotakin mahdollisesti jalkoja muuttavaa...

VERRRRIINEN KIRRRRVES!!

Kimmo [23.11.2006 23:59:24]

#

no mä jatkan taas tätä kyselyä... eli nyt tein ton Metabolixin jutun mukaan tota ohjelmaa... Ja aika hyvin näytti onnistuvan, mut jotain vikaa siinä yhä vaan on...

voitte tosta vaikka katsoa, että mikä siinä on vikana vielä...

(Mod. edit. tiivistetäänpä täältä epäolennaisia, järjettömiä ja viallisia koodeja pois...)

ja tossa on vikana vielä ainakin se, että se tulostaa vaan ekalla kertaa ton "anna arvosana (4-10)" -jutun, vaikka se kai pitäis tulostua siihen joka kerta tai sillee. mutta kertokaas taas sitten, että mitä oon tehnyt nyt tällä kertaa väärin...

Jaska [24.11.2006 02:35:23]

#

Sinun pitää laittaa arvosanan kysely while -luupin sisään. Tässä ei pidä käyttää do-while -luuppia, sillä jos käyttäjä syöttää negatiivisen luvun, silmukka suoritetaan ja vasta sitten tarkistetaan onko luku kelvollinen.

    if(numero<4 || numero>10); {

}

while (numero < 0) {

     }
     while(numero > 3);

}

while(numero > 4);

En tajua mitä koitat tehdä. Suoritat tyhjia lohkoja ja lauseita. Kokeile koodata Metabolixin pseudokoodiesimerkin mukaan niin vältyt ongelmilta. Sinun pitäisi ensiksi koittaa hahmottaa ohjelman rakenne kunnolla ja opetella miten if- ja while-silmukat toimivat.

LaNu [24.11.2006 16:08:35]

#

Kimmo kirjoitti:

tossa on vikana vielä ainakin se, että se tulostaa vaan ekalla kertaa ton "anna arvosana (4-10)" -jutun, vaikka se kai pitäis tulostua siihen joka kerta tai sillee.

Se tulostus ei ole minkään silmukan sisällä, joten ei se silloin tulostu kuin kerran.

Tuo koodin sisentäminen on kyllä kaameaa... esim. sinulla if-lauseen }-merkki on samalla sisennyksellä kuin main-funktion koodilohkon aloittava. Ei sillä ohjelman toiminnan kannalta ole merkitystä, mutta hankaloittaahan tuo lukemista.

if(numero<4 || numero>10); {

}

Näköjään ei voi koodilainausta aloittaa tabeillla, joten en tuota samaan asuun saanut. Mitäs tuon if-ehdon jälkeen pitäisi tapahtua, kun ei mitään sisältöä ole? Kummalliselta minun silmääni näyttää myös puolipiste ehdon perässä. (Onko se syntaksivirhe, vai jotain jota en tiedä?) Do-silmukan päätteeksi whilen ehdon perään tulee puolipiste, mutta ei tähän(?).

Edit: If-lauseen ehdon toteutuessa on varmaankin tarkoitus poistua silmukasta? Eli se ilmoitus väärästä syötteestä ja silmukasta poistuminen. Tekstiä osaat tulostaa, ja tuon poistumisen varmasti löydät kirjasta/netistä. On se sen tärkeä perusjuttu.

Metabolix [24.11.2006 17:28:11]

#

Et nyt tehnyt ohjeideni mukaan. Anna niiden kommenttien olla koodin seassa, se on kommenttien tarkoitus. Mieti uudestaan. Olet sotkenut koko rakenteen, siirrellyt rivejä minne sattuu. Tee nyt juuri niin kuin sanoin, niin ei tule ongelmia. Muista, yksi rivi jokaisen kommentin perään + tarvittavat sulkumerkit.

Kimmo [24.11.2006 19:36:59]

#

niin, tein metabolix sun ohjeiden mukaan niin paljon kuin osasin/tajusin, mut osa noista sun jutuista meni liian vaikeeks ja koitin päätellä mitä tarkoitit, mutta se sit tais sekottaa tota mun koodia vielä vaan enemmän.

tossa on taas toi mun tän hetkinen koodi ja ehkä noi sisennykset on huonoja, mut ei kai se nyt niin väliä ole loppujen lopuks... ei siinä niin paljoa eroa ole tohon edelliseen, mutta poistin tosta ainakin ne pari turhaa juttua...

(Mod. edit. tiivistetäänpä täältä epäolennaisia, järjettömiä ja viallisia koodeja pois...)

voitte kertoa vaan ihan suoraan, että miten saan ton toimimaan oikein, sillä mulla on aika iso määrä noita tehtäviä vielä jäljellä, tyyliin yks tehtävä päivää kohti, joten en jaksais taistella enää kauaa ton saman kanssa...

nyt toi ohjelma toimii niin, että se katkeaa heti sen ekan annetun numeron jälkeen ja tulostaa vaan sit siihen loppuun sen lukumäärän ja keskiarvon, mut muuta ei sit se teekään.

Andu [24.11.2006 20:22:06]

#

En nyt laita koko koodia, sillä muuten et opi, mutta tästä on vähän enemmän apua, kuin noista edellisistä.

#include <stdio.h>

int main()
{
    int maara, keskiarvo, luku, summa = 0, maaranyt = 0;

    printf("Ohjelma laskee niin monen luvun keskiarvon kuin haluat.\nNumeron tulee olla 4-10.\n\nMonen luvun keskiarvon haluat laskea? ");
    scanf("%d", &maara);

    while(maara > maaranyt)
    {
        //Kysy lukua
        //Jos luku on pienempi kuin 4 tai suurempi kuin 10
        //mene suoraan loopin alkuun.
        //EDIT: Tämä tapahtuu continue-lauseen avulla
        summa += luku;

        maaranyt++;
    }

    //Laske keskiarvo summan ja maaran avulla

    return 0;
}

Koodia ei ole testattu.

Metabolix [24.11.2006 21:28:25]

#

No tehdäänpä sitten se ohjelma tähän... Täsmälleen noiden ohjeideni mukaan. (Mitäpä se minua haittaa, jos kysyjä ei itse vaivaudu opettelemaan vaan lähettää tämän sellaisenaan, ja eihän tämä opettelua estä.) Anteeksi, ei ole tarkoitus mitenkään tylyltä vaikuttaa, mutta... :o

#include <stdio.h>

// Pääfunktion määrittely
int main(void)
{
    // Määritellään: numero, summa, lukumaara, keskiarvo
    int numero, summa, lukumaara, keskiarvo;
    // Alustetaan summaksi ja lukumääräksi nolla
    summa = lukumaara = 0;
    // Silmukan aloitusrivi
    do {
        // Tulostetaan pyyntöteksti
        printf("Anna seuraava arvosana (4-10): ");
        // Luetaan luku muuttujaan "numero"
        scanf("%d", &numero);
        // Jos numero on kolmea suurempi ja yhtätöista pienempi
        if (numero > 3 && numero < 11) {
            // Laitetaan summaksi summa + numero
            summa = summa + numero;
            // Korotetaan lukumäärää yhdellä
            lukumaara = lukumaara + 1;
        // Muuten
        } else {
            // Valitetaan käyttäjälle virheellisestä luvusta
            printf("No jopas kumman arvosanan annoit!\n");
        }
    // Silmukan lopetusrivi ja -ehto, eli tarkistetaan, onko numero pienempi kuin nolla
    } while (!(numero < 0));

    // Jos lukumäärä on nolla
    if (lukumaara == 0) {
        // Tulostetaan virheteksti, ei ollut yhtään lukua laskettavaksi!
        printf("Et antanut yhtäkään arvosanaa!\n");
    // Muuten
    } else {
        // Keskiarvo on summa jaettuna lukumäärällä
        keskiarvo = summa / lukumaara;
        // Tulostetaan keskiarvo
        printf("Keskiarvo: %d\n", keskiarvo);
    }
    // Lopussa pääohjelmasta on tapana palauttaa nolla
    return 0;
// Ja siihen se viimeinen aaltosulku vielä.
}

Hieman hassulta tuolla tietyt kommenttisisennykset näyttävät, mutta noista kommenteista kaikki ovat oikeassa ohjelmoinnissa kuitenkin turhia ja jätetään kirjoittamatta.

Vihjeenä vielä, että keskiarvon saa tarkemmin, kun muuttaa keskiarvomuuttujan float-tyyppiseksi ja laskeekin näin:

float keskiarvo; // Alussa siis näin
keskiarvo = summa / (float)lukumaara; // Muutetaan jakajakin liukuluvuksi
printf("Keskiarvo: %.2f\n", keskiarvo);

miiro [24.11.2006 22:19:01]

#

Metabolix kirjoitti:

Miiro (ja kysyjäkin): "while" => "niin kauan kuin". Ehto on siis se ehto, jonka pitää toteutua.

No sitä kyllä olin tarkoittavinakin...

Kimmo [25.11.2006 02:04:45]

#

Kiitti paljon Metabolixille tosta kokonaisesta hommasta, oli vähän vielä ongelmia kun piti saada se kahdella desimaalilla lopussa, mutta sainpa nyt lopulta toimimaan...

Saatte ehkä auttaa huomenna tai joskus taas uusissa tehtävissä, jos en ite osaa...

Metabolix [25.11.2006 17:44:42]

#

Kaikin mokomin, mutta muista silti, että vaikka se, että me osaamme tehdä tehtäväsi, voi antaa sinulle hyvän kurssiarvosanan, niin ohjelmointitaitoja se ei sinulle anna. Eli vaikka nyt olet saanut tehtävän palautettua toimivana, niin kannattaa silti opetella hyvin tarkoin, mitä koodissa nyt tapahtuukaan, jotta opit myös itse.

Kimmo [25.11.2006 19:57:50]

#

Emmä tällä avun kysymisellä hyvää kurssiarvosanaa metsästä, vaan noissa tehtävissä on ideana, että ne kaikki pitää olla tehtynä että saa osallistua kokeeseen...

No, mutta pieni apu vois olla taas tarpeen, tohon valmiiseen koodiin pitää lisätä funktiot, jotta ton saa toimimaan siten, että valinta 1 tulostaa tekstin "miau", 2 tulostaa tekstin "hauhau" ja 3 tekstin "ammuu". mitä tossa siis on tarkoitus lisätä? oon koittanut vähän kaikkea mitä oon eri nettisivujen ohjeista löytänyt, mut ei toi näytä hyväksyvän mitään mun vaihtoehtojani.

#include <stdio.h>

void kissa(void);
void koira(void);
void lehma(void);

int main()
{
  int valinta;
  do{

    printf("1:kissa\n2:koira\n3:lehmä\n");
    printf("Lopetus negatiivisella luvulla.\n");
    printf("Valitse eläin:");
    scanf("%d", &valinta);
    if(valinta < 0) {
      printf("Ohjelma lopetetaan...");
    }
    else if(valinta == 1) {
      kissa();
    }
    else if(valinta == 2) {
      koira();
    }
    else if(valinta == 3) {
      lehma();
    }
    else {
      printf("Antamasi luku ei kelpaa.\n\n");
    }
  }while(valinta>0);
  return 0;
}

Ja ite oon siis kokeillut esim näin:

if( valinta == 1)
   {
      printf("miau!")
   }

mut ei toi näytä toimivan...

Blaze [25.11.2006 20:35:02]

#

Kimmo kirjoitti:

No, mutta pieni apu vois olla taas tarpeen, tohon valmiiseen koodiin pitää lisätä funktiot, jotta ton saa toimimaan siten, että valinta 1 tulostaa tekstin "miau", 2 tulostaa tekstin "hauhau" ja 3 tekstin "ammuu". mitä tossa siis on tarkoitus lisätä?

Funktiot nimeltä kissa, koira ja lehma, jotka tulostaa sopivan tekstin.

Kimmo kirjoitti:

if( valinta == 1)
   {
      printf("miau!")
   }

mut ei toi näytä toimivan...

Sulta puuttuu puolipiste tuon printf:n lopusta.
En tiedä, kuinka tarkka opettajasi on, tämä metodihan tuottaa kyllä saman lopputuloksen, mutta se ei oo se ratkasu, jota kysytään.

Kimmo [25.11.2006 20:44:17]

#

ei toimi ton puolipisteen jälkeenkään. ja toi on siis yks nettisivu jolla ne tehtävät tehdään ja se nettisivu myös tarkastaa ne ja kertoo jos on virheitä, eli ei opettaja noita kato tai tarkista tai mitään...

mitä tällainen tarkoittaa:

"Tarkista oletko määritellyt kaksi samantyyppistä muuttujaa tai funktiota (main)."

mitä te lisäisitte tohon valmiiseen koodiin, jotta saisitte siitä toimivan?

Metabolix [25.11.2006 21:06:32]

#

No ne funktiot kissa, koira ja lehma, kuten pyydetään.
VIOPEssa (joo, tiedän, mitä käytät) selvästi neuvotaan, että palauta vain puuttuvat funktiot, älä main-funktiota. Tästä samasta tehtävästä on muuten juteltu ennenkin.

Tuollahan on siis annettu funktioiden esittelyt:

void kissa(void);
void koira(void);
void lehma(void);

Kirjoita siis vastaavat funktiot ja palauta ne. Tähän tapaan:

void kissa(void)
{
    // ... koodia ohjeen mukaan
}

Lukisit sieltä VIOPEsta teoriaosuudetkin, niin ehkä ymmärtäisit. Ja minun nähdäkseni kurssista läpi pääseminen tarkoittaa jokseenkin samaa kuin hyvä arvosana. Kurssista läpi pääseminenkään ei tarkoita, että osaisit ohjelmoida, ja jos teet tällaisia päästäksesi kurssista läpi, olet väärällä kurssilla. Ohjelmointia pitää opetella oppiakseen ohjelmoimaan, ei päästäkseen ohjelmointikurssista läpi.

Metabolix [25.11.2006 21:32:03]

#

Kyllä se lähtee, kun vain teet ohjeiden mukaan. Sinun siis kuuluu palauttaa vain nuo kolme funktiota oikeilla tekstintulostuksilla, ei muuta. Ei main-funktiota.

Metabolix [25.11.2006 21:36:58]

#

No mutta kun se on lehma eikä lehmä. Noin periaatteessa, juu (vai pitäisiköhän niissä olla vielä rivinvaihdotkin), kunhan vielä puolipisteet lisäät.

Kimmo [25.11.2006 21:42:59]

#

no nyt se toimi kun laitoin rivinvaihdot ja puolipisteet...

Kimmo [25.11.2006 21:55:23]

#

Niin, eli toi eläin-juttu siis toimi jo. Mut tosta laskimesta ei taas nyt tuu yhtään mitään...

Metabolix [25.11.2006 21:59:15]

#

Mistä laskimesta?

Ja ei, minulla ei ole enää pääsyä VIOPEn tehtäviin, testitunnukseni olivat ja menivät joskus melkoisen kauan sitten.

Kimmo [25.11.2006 22:14:24]

#

"Tee laskinohjelma, joka laskee kahden kokonaisluvun summan, erotuksen tai tulon. Ohjelma kysyy ensin, mikä laskutoimitus suoritetaan (1 = summa, 2 = erotus, 3 = tulo). Laskutoimituksen jälkeen vastaus tulostetaan monitorille ja ohjelmaa palaa kysymään seuraavaa laskutoimitusta.

Laadi jokaista laskutoimitusta varten oma funktio, joka kysyy luvut, suorittaa halutun laskutoimituksen ja tulostaa vastauksen monitorille. Ohjelma lopetetaan syöttämällä negatiivinen luku, kuten edellisessä harjoituksessa."

Siinä voi käyttää tota eläin-tehtävän koodia pohjana, joten siitä oon sitä koittanut muokata ja jotain tollaista koitin, mut se kai pitää tehdä jotenkin paljon monimutkaisemmin...

#include <stdio.h>

void summa(void);
void erotus(void);
void tulo(void);

int main()
{
  int valinta, eka, toka;

printf("1:summa\n2:erotus\n3:tulo\n");
    printf("Lopetus negatiivisella luvulla.\n");
    printf("Valitse laskutoimitus:");
    scanf("%d", &valinta);

  do{

    printf("Syötä ensimmäinen luku:");
    scanf("%d", &eka);

    printf("Syötä toinen luku:");
    scanf("%d", &toka);

    if(valinta < 0) {
      printf("Ohjelma lopetetaan...");

    }
    else if(valinta == 1) {
    printf("%d + %d", eka, toka);

    }
    else if(valinta == 2) {
   printf("%d - %d", eka, toka);

    }
    else if(valinta == 3) {
  printf("%d * %d", eka, toka);

    }
    else {
      printf("Antamasi luku ei kelpaa.\n\n");
    }
  }while(valinta>0);
  return 0;
}

Metabolix [25.11.2006 22:20:21]

#

Tekisit niin, kuin käsketään, ja kirjoittaisit ne erilliset funktiot summalle, erotukselle ja tulolle. Eli vaihda siihen edelliseen ohjelmaan kaikkien kissojen tilalle summa, koirien tilalle erotus ja lehmien tilalle tulo ja muokkaa sitten vain niitä kolmea irrallista funktiota.

Kimmo [25.11.2006 22:29:35]

#

enkö mä niin ole tehnyt tuossa? toimiiko ne laskut niin, että laittaa noihin printf-juttuihin vaan tollai "%d + %d", eka toka", vai pitääkö ne laskut laskettaa jotenkin eri tavalla? kyllä mä oon yksinkertaisempia laskimia osannutkin tehdä, mut en noilla while ja else-jutuilla...

Metabolix [25.11.2006 22:32:38]

#

No et, eihän sinulla ole siellä mitään summa-nimistä funktiota. Katso siitä edellisestä mallia, niin ehkä tajuat sen funktiojutun - ja jos et, niin saat luvan itse opetella. Kyllä ne siellä VIOPEssakin selitetään.

Ja laskut pitäisi ihan itse laskea.
printf("%d + %d = %d\n", a, b, a+b);

Suosittelisin sellaista ratkaisua, että hankkisit oman kääntäjän (ts. IDEn). Koska luultavasti olet Windows-käyttäjä, voin vaikkapa suositella Dev-C++:aa. Google tietää. Versio 4.9.9.2 taitaa olla tällä hetkellä menossa, ja ohjelman kotisivulta löytyvistä se suurin ohjelmapaketti on oikea. Helpottaa huomattavasti asioita, kun voi ihan itse tehdä ohjelmia sellaisina, kuin haluaa. Voi vaikka vahingossa oppia jotain.

Kimmo [25.11.2006 23:16:03]

#

mulla on itseasiassa yks toinen tollainen kääntäjä-ohjelma koneella, kun lainasin yhden kirjan mistä asensin sen, mut emmä oikeen tykännyt käyttää sitä.

mut tosta koodista, niin miten saa niin että se lopettaa sen ohjelman kun tulee negatiivinen luku? eli ei kai pelkkä tää riitä:

if(valinta < 0) {
      printf("Ohjelma lopetetaan...");

Metabolix [25.11.2006 23:20:50]

#

No jos tuo on pääfunktiossa, niin return 0;, muussa tapauksessa exit(0);, jolloin tarvitset stdlib.h-otsikon ohjelmaan, mikä ei varmaankaan VIOPElla onnistu.

Mazzimo [25.11.2006 23:31:41]

#

Pahoittelen negatiivisuuttani, mutta sinun täytyy opetella jotain itse! Jos tuolla tavoin pääset kokeeseen asti, on lähes varmaa että sieltä hörähtää hylätty tai korkeintaan ala-arvoinen arvosana (mikäli kokeessa on yhtään tasoa).

Ajattale koodia loogisesti. Koodia käydään läpi rivi riviltä: selaa itseksesi koodia läpi ja tutki mitä jokaisella rivillä tapahtuu. Mieti erilaisia vaihtoehtoja (esim. mitä tapahtuu jos valinta == 1 tai 2 tai 3...) ja miten koodi käyttäytyy.

Opettele ainakin perusteet: muuttujat, ehtolauseet, taulukot, toistorakenteet (ainakin while) sekä funktiot (+ peruskomennot tulostukseen (printf)). Oman kääntäjän asentaminen olisi suositeltavaa. Dev-C++ passaa aloittelijalle mainiosti.

Tsemppiä! Kyllä onnistut, jos vaan jaksat asiaan paneutua! ;)

Kimmo [26.11.2006 15:29:56]

#

kun laittaa negatiivisen luvun tohon "valitse laskutoimitus"-kohtaan, niin toi mun ohjelma tulostaa silti sen jälkeen ton "syötä ensimmäinen luku", vaikka se pitäis katketa heti siihen -1:seen... miten ton saa korjattua?

Metabolix [26.11.2006 16:03:13]

#

Laittamalla siihen perään tarkistuksen, että jos luku on pienempi kuin nolla, lopetetaan ohjelma. Lopetusta olet jo kysynyt, ja oikea ehtolausekin näyttäisi tuossa yllä olevan.

Kimmo [26.11.2006 16:29:52]

#

eipä onnistu mitenkään. mihin kohtaan se "jos valinta pienempi ku nolla" -juttu kuuluu sit laittaa?

Metabolix [26.11.2006 16:32:11]

#

No siihen, missä se pitää tarkistaa! Ajattelepa ihan tuon Mazzimon neuvon mukaan rivi kerrallaan. Se kuuluu juuri siihen, missä haluat ohjelman sen tarkistavan.

Kimmo [26.11.2006 16:35:04]

#

se koodi vaan sekoaa, jos sen laittaa siihen mihin se kaiken järjen mukaan oikeesti menis.

hunajavohveli [26.11.2006 16:40:41]

#

Sekoaa miten?

Kimmo [26.11.2006 16:45:37]

#

se tulostaa tällai normaalisti, ja se pitäis siis saada lopetettua heti tohon -1:seen.

1: kahden luvun summa
2: kahden luvun erotus
3: kahden luvun tulo
<0: ohjelman lopetus
Valitse laskutoimitus:2
Syötä ensimmäinen luku:12
Syötä toinen luku:33
12 - 33 = -21

1: kahden luvun summa
2: kahden luvun erotus
3: kahden luvun tulo
<0: ohjelman lopetus
Valitse laskutoimitus:-1
Syötä ensimmäinen luku:


sitten kun laittaa sen "pienempi ku nolla" -jutun, niin tulee tollaista jälkeä:

1: kahden luvun summa
2: kahden luvun erotus
3: kahden luvun tulo
<0: ohjelman lopetus
Valitse laskutoimitus:2
-1208580800 - -1208725696 = 144896

1: kahden luvun summa
2: kahden luvun erotus
3: kahden luvun tulo
<0: ohjelman lopetus
Valitse laskutoimitus:12
Antamasi luku ei kelpaa.

1: kahden luvun summa
2: kahden luvun erotus
3: kahden luvun tulo
<0: ohjelman lopetus
Valitse laskutoimitus:33
Antamasi luku ei kelpaa.

1: kahden luvun summa
2: kahden luvun erotus
3: kahden luvun tulo
<0: ohjelman lopetus
Valitse laskutoimitus:-1
Ohjelma lopetetaan...Syötä ensimmäinen luku:

Metabolix [26.11.2006 16:48:56]

#

No ei se ohjelma siihen lopu, että tulostat tekstin ruudulle. Puuttuu varmaan vieläkin se return taikka exit.

Kun lukisit VIOPEsta tuon kyseisen aihealueen opetustekstit, niin siellä aivan varmasti aivan suoraan kerrotaan, kuinka ohjelma lopetetaan.

Kimmo [26.11.2006 17:05:19]

#

eipä siellä lue sanaakaan ohjelman lopettamisesta. mihin se sit kuuluu laittaa?

Metabolix [26.11.2006 17:15:42]

#

Se varmaan sanotaan jo aiemmin ohjeissa.
Täytyy kyllä sanoa, että sinulla on jotain pahasti pielessä koko ymmärryksessä. Palaapa nyt ihan VIOPEn ensimmäiseen vaiheeseen ja lue ne jutut läpi.

void summa(void);
void erotus(void);
void tulo(void);

int main(void)
{
    int valinta;
    while (1) {
        printf("Negatiivinen lopettaa: ");
        scanf("%d", &valinta);
        if (valinta < 0) {
            break;
        } else if (valinta == 1) {
            summa();
        } else if (valinta == 2) {
            erotus();
        } else if (valinta == 3) {
            tulo();
        } else {
            printf("Et Vain Osaa, n00b!\n");
        }
    }
    return 0;
}

void summa(void)
{
    int a, b;
    printf("Annapa niitä summattavia lukuja: ");
    // ...
}

void erotus(void)
{
    int a, b;
    printf("Annapa niitä erotettavia lukuja: ");
    // ...
}

Muoks. piti vielä vähän lisäillä, kun ei varmaan vähemmällä tule selväksi... Odotan mielenkiinnolla, mahtaako nytkään riittää. Jotain sitä voisi itsekin opetella, eli ihan oikeasti lue ne asiat alusta asti vielä uudemman kerran.

Kimmo [26.11.2006 18:15:26]

#

kiitti vaan tosta, mut ei sitä ohjelmaa voi tolla tavalla tehdä...

Metabolix [26.11.2006 18:28:13]

#

Miksei voi?

Kimmo [26.11.2006 18:29:40]

#

ei se vaan onnistu, kun ei tolla saa sitä tulostamaan niitä oikeita juttuja...

#include <stdio.h>

void summa(void);
void erotus(void);
void tulo(void);

int main()
{
  int valinta, eka, toka;


do{


    printf("1: kahden luvun summa\n2: kahden luvun erotus\n3: kahden luvun tulo\n<0: ohjelman lopetus\n");

    printf("Valitse laskutoimitus:");
    scanf("%d", &valinta);

    printf("Syötä ensimmäinen luku:");
    scanf("%d", &eka);

    printf("Syötä toinen luku:");
    scanf("%d", &toka);

      if(valinta < 0) {
      printf("Ohjelma lopetetaan...");

    }
    else if(valinta == 1) {
    printf("%d + %d = %d\n\n", eka, toka, eka + toka);

    }
    else if(valinta == 2) {
    printf("%d - %d = %d\n\n", eka, toka, eka - toka);

    }
    else if(valinta == 3) {
    printf("%d * %d = %d\n\n", eka, toka, eka * toka);

      }
      else {
      printf("Antamasi luku ei kelpaa.\n\n");
      }


  }while(valinta>0);

  return (0);
}

mihin tossa se pienempi ku nolla -juttu kuuluu vaihtaa, että sen saa toimimaan oikein??

Metabolix [26.11.2006 18:35:04]

#

Miksei sitä saisi tulostamaan oikeita juttuja? Yritä nyt jo ymmärtää, että sinun käsketään tehtävänannossa selvästi tehdä jokaiselle laskutoimitukselle oma funktio, kuten minun keskeneräisessä ohjelmassani olisi. Jokaisessa näistä funktioista sitten pyydät kaksi lukua ja tulostat niistä oikean asian. Tajuatko?

Ja onko niin vaikea keksiä, missä kohti tuossa omassa koodissasi on kohta "valinnan jälkeen ja ennen kahden luvun kysymistä"?

Kimmo [26.11.2006 18:55:57]

#

Metabolix kirjoitti:

Ja onko niin vaikea keksiä, missä kohti tuossa omassa koodissasi on kohta "valinnan jälkeen ja ennen kahden luvun kysymistä"?

niinku jo sanoin, se koodi sekoaa kun laitan sen lopetus-jutun tohon väliin...

mut emmä käsitä, että mikä tossa sun jutussa on ideana, tai että miten ne luvut kuuluu tossa tapauksessa pyytää, että lopputulos on kuitenkin sit sellainen kuin kuuluisikin.

Latska [26.11.2006 19:16:23]

#

Metabolix lähetti terkkuja:

18:52 < Metabolix> Jos kimmo vielä vastaa tuolla, niin haukkukaa sitä minunkin puolestani n00biksi.

Kannattaa muuten tarkistaa, että on iffit ja elset oikein. Ja että lopetusprinttauksen jälkeen tulee return 0;

Mazzimo [26.11.2006 20:51:34]

#

Totta kai se sekoaa, koska sinulla ei ole pienintäkään aikomusta edes tutkia koodia! Lisäät vain Metabolixin antamia esimerkkejä sinne ja heti kun tulostuksesta tuleekin väärä, pistät uutta viestiä tänne. EI NÄIN!! Jos et ryhdistäydy, niin kukaan ei auta sinua (ei edes Metabolix (toivottavasti)).

Cornix [26.11.2006 20:57:36]

#

Ohjelmointiputkan C-oppaassa käsitellään just näitä asioita. Se kannattaa lukea - ajatuksen kanssa.

Tän luulis selventävän funktioita:

#include <stdio.h>

void tama_on_funktio(void);

int main(void) {
   printf("Tämä on ennen funktiota mainissa\n\n");
   tama_on_funktio(); //funktio kysyy käyttäjältä yhden luvun ja tulostaa sen heti sen jälkeen ruudulle.
   printf("Tämä on funktion jälkeen mainissa\n\n");
   return 0;
}

void tama_on_funktio(void) {
   int a;
   printf("Hei! Tervetuloa funktioon tama_on_funktio! Kirjoita luku: ");
   scanf("%d", a);
   printf("\nKirjoitit luvuksi %d!\n\n", a);
}

Sivun alkuun

Vastaus

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

Tietoa sivustosta