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.
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?
Käytät myös scanfia väärin. Parametreiksi annetaan formaatin jälkeen osoitteet mihin arvot tallennetaan (&pituus antaa pituus-muuttujan osoitteen)
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
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.
scanf():ää käytettäessä käyttäjä itse syöttää rivinvaihdon jolloin seuraava printf() alkaa eri riviltä.
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
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.
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.
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.
Ihan totta siis tuonne se rivinvaihto tulee ja siitä oli puhe.
[Offtopic]Tästä ketjusta hävisi monta viestiä taivaan tuuliin.[/offtopic]
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ä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.