Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: ohjelmointitehtäväongelma

Sivun loppuun

maunomato1234 [27.11.2010 18:40:52]

#

Ongelma: Ohjelmassa kysytään henkilöiden pituuksia senttimetreinä kunnes annetaan 0 tai negatiivinen pituus.
Tulostetaan pitkien (>185cm) henkilöiden lukumäärä ja lyhyiden (<160cm) lukumäärä.
Lisäksi tulostetaan kaikkien syötettyjen pituuksien lukumäärä ja keskipituus.
Muuttujille havainnolliset nimet. Kommentoi! Sisennykset!
Selkeä ulkoasu kysymyksille ja tulostuksille.
*/

#include<stdio.h>
#include<conio.h>                                    //kirjastot
#include<stdlib.h>


int main(void)
{
    int keskipituus=0;
    int laskuri=0;
    int pituus=0;
    int pituuspitkat=0;
    int pituuslyhyet=0;
    int lukumaara=0;
    int summa=0;


    printf("Anna henkilon pituus\n");                    //kysymys jota toistetaan
    scanf("%d",pituus);


    while(pituus>0)
    {
     if(pituus>185)
        pituuspitkat=pituuspitkat+1;

     if(pituus<160)
        pituuslyhyet=pituuslyhyet+1;

    laskuri=laskuri+1;
    lukumaara=lukumaara+pituus;
    summa=summa+pituus;

    printf("Anna henkilon pituus\n");
    scanf("%d",pituus);
    }

    if(pituus<=0)
    {

    keskipituus=summa/laskuri;

    printf("Yli 185cm:sten lukumaara",pituuspitkat);
    printf("Alle 160cm:sten lukumaara",pituuslyhyet);
    printf("Keskipituus", keskipituus);
    printf("Pituuksien lukumaara",lukumaara);



    system("pause");


}

-Joku menee tehtävässä väärin... Osaisko kukaan jelppiä?

Mod. lisäsi kooditagit.

Metabolix [27.11.2010 18:48:45]

#

Vastaisen varalle muutama poiminta keskustelun ohjeista:

Itse asiaan: Koodistasi puuttuu jotain, nimittäin aaltosulut eivät täsmää. Tarkista vielä tuo viimeinen if-lause ja mieti myös, onko se edes tarpeellinen.

Käytät printf-funktiota väärin. Eikö kurssilla ole opetettu asiaa? Kurssimateriaalin lisäksi voit luntata oppaasta ohjeita muuttujien tulostamiseen. Edit: Sama koskee myös scanf-funktiota.

Kun saat tuon korjattua, huomaatkin luultavasti heti virheen tulostettavissa arvoissa. Sitä varten vinkki: mitä muuttuja lukumaara koodissasi sisältää, mitä sen kuuluisi sisältää, ja löytyykö sama tieto ehkä jo jostain muusta muuttujasta?

Deffi [28.11.2010 13:37:23]

#

Käytät myös scanfia väärin. Parametreiksi annetaan formaatin jälkeen osoitteet mihin arvot tallennetaan (&pituus antaa pituus-muuttujan osoitteen)

Jokotai [28.11.2010 13:58:09]

#

Vähän muotoilu tarvetta noihin printf-funktioihin. Nyt käyttö näyttäisi tältä:

Anna henkilon pituus
190Anna henkilon pituus
0Yli 185cm:sten lukumaara1Alle 160cm:sten lukumaara0Keskipituus190Pituuksien lukumaara1

Teuro [28.11.2010 15:27:43]

#

Ei suinkaan näytä, koska tuosta printf-funktiosta puuttuu juurikin tuo muuttujan paikka. Muutoin olet kyllä oikeassa. Muutama rivinvaihto olisi kyllä paikallaan. Seuraavaksi aloittaja kaiketi huomaa, että keskiarvoon ei välttämättä sovi int tyyppi.

User137 [28.11.2010 17:37:25]

#

scanf():ää käytettäessä käyttäjä itse syöttää rivinvaihdon jolloin seuraava printf() alkaa eri riviltä.

Teuro [28.11.2010 20:01:11]

#

Hmm testien perusteella mulla tapahtuu jotakin aivan kummallista, koska ilman rivinvaihtomerkkejä kaikki tulostettava tulostuu yhteenpötköön, mutta rivinvaihtojen kanssa tulostus on juuri kuten pitääkin.

Tässä rivivaihtojen kanssa.

printf("Yli 185cm:sten %d lukumaara\r\n", pituuspitkat);
printf("Alle 160cm:sten %d lukumaara \r\n", pituuslyhyet);
printf("Keskipituus %f \r\n", keskipituus);
printf("Pituuksien lukumaara %d \r\n", summa);

Tulokset...

Anna henkilon pituus
145
Anna henkilon pituus
0
Yli 185cm:sten 0 lukumaara
Alle 160cm:sten 1 lukumaara
Keskipituus 145.000000
Pituuksien lukumaara 145

Process returned 0 (0x0)   execution time : 4.317 s

Tässä ilman vaihtoja

printf("Yli 185cm:sten %d lukumaara", pituuspitkat);
printf("Alle 160cm:sten %d lukumaara ", pituuslyhyet);
printf("Keskipituus %f", keskipituus);
printf("Pituuksien lukumaara %d", summa);

Tulokset...

Anna henkilon pituus
145
Anna henkilon pituus
0
Yli 185cm:sten 0 lukumaaraAlle 160cm:sten 1 lukumaara Keskipituus 145.000000Pitu
uksien lukumaara 145
Process returned 0 (0x0)   execution time : 3.796 s

Metabolix [28.11.2010 20:21:18]

#

En näe Teuron testin tuloksessa mitään ihmeteltävää; jos jotain pitää ihmetellä niin kysyjän koodia.

Rivinvaihtona on suositeltavaa käyttää pelkkää \n-merkkiä. Windows tekee omat kikkailunsa käyttäjältä piilossa. %f-formaatti edellyttää keskipituuden muuttamisen float-tyyppiseksi.

Teuro [28.11.2010 20:26:15]

#

Omassa testissäni tein toki muitakin muutoksia, kuin tuon keskipituuden muutoksen oikeaan tietotyyppiin, mutta minusta printf-funktio tarvitsee tuon rivinvaihtomerkin, jotta toiminta olisi haluttu. Viittasin siis vastauksessa User137 viestiin.

Metabolix [28.11.2010 20:30:50]

#

Eihän havaintosi ole mitenkään ristiriidassa User137:n väitteen kanssa: scanf-rivejä (145 ja 0) seuraavat tulosteet ovat uudella rivillä. Vertailun vuoksi voit katsoa Jokotain mielen pimennossa syntynyttä versiota, jossa tuloste jatkuu suoraan käyttäjän syöttämän luvun perään. Tällaisen toteuttaminen vaatisi jo paljon enemmän vaivaa.

Teuro [28.11.2010 20:37:55]

#

Ihan totta siis tuonne se rivinvaihto tulee ja siitä oli puhe.

User137 [29.11.2010 01:44:09]

#

[Offtopic]Tästä ketjusta hävisi monta viestiä taivaan tuuliin.[/offtopic]

Metabolix [29.11.2010 16:17:13]

#

User137 kirjoitti:

Tästä ketjusta hävisi monta viestiä taivaan tuuliin.

Tästä keskustelusta ei tietokannan mukaan ole poistettu yhtäkään viestiä, joten jos viestejä todella puuttuu, on tapahtunut jotain todella mystistä.


Sivun alkuun

Vastaus

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

Tietoa sivustosta