Tarvitsen jälleen pikkuisen vinkkejä jotta saan tämän koodin toimimaan. Ohjelman pitäisi laskea yhteen haluamasi ajanjakson aikanatehdyt työtunnit sekä keskimääräisen työpäivän pituuden. Missä on vika kun tämä ei toimi?
#include <iostream>
int main()
{
int paivat;
printf("Ohjelma laskee yhteen haluamasi ajanjakson aikana tehdyt\n");
printf("tyotunnit seka keskimaaraisen tyopaivan pituuden.\n");
printf("Kuinka monta paivaa:");
scanf("%d", &paivat);
int paivat2 = 1;
double tunnit1 = 0;
double kaikki = 0;
double taulukko[31];
for(paivat2=1; paivat2<=paivat; paivat2++) {
printf("Anna paivat2", paivan tyotunnit:);
scanf("%d", &tunnit1);
kaikki += tunnit1;
taulukko[paivat2-1]=tunnit1;
}
printf("Tehdyt tunnit yhteensa:",kaikki\n);
double keskimaara;
keskimaara = kaikki / paivat;
printf("Keskimaarainen tyopaivan pituus: ", keskimaara\n);
for(double taulukko=0; taulukko<paivat; taulukko++)
{
printf("Syotetyt tunnit: taulukko[paivat2-1]"\n);
}
}
return 0;Päätä ensin, ohjelmoitko C:tä vai C++:aa. Jos ohjelmoit C:tä, liitä mukaan stdio.h ja alusta kaikki muuttujat main-funktion alussa.
Varsinainen ongelma on nyt printf-funktion käytössä. Lukaise C-oppaasta, kuinka sitä kuuluu käyttää. Lainausmerkkien sisälle pannaan tulostettava teksti, muuttujien paikat ja rivinvaihdot. Sen jälkeen tulevat muuttujat pilkuilla erotettuina.
Kiinnitä myös huomiota for-silmukoihin. Ne kannattaa muodostaa tähän tapaan:
for (i = 0; i < paivat; i++) {Nyt i-muuttuja on vuorollaan jokainen taulukon indekseistä.
Lisäksi ainakin return-komento on eksynyt väärään paikkaan. Sisentäminen auttaisi tämmöisten huomaamisessa.
printf("Anna paivat2", paivan tyotunnit:);
scanf("%d", &tunnit1);Mitä kummaa? Yrititkö mahdollisesti tätä:
printf("Anna %d. paivan tyotunnit: ", paivat2);
// Tulostaa esim: Anna 2. paivan tyotunnit:
scanf("%lf", &tunnit1);
// Ja arvohan pitää lukea double-muuttujaan doublena.Ja sitten toinen:
for(double taulukko=0; taulukko<paivat; taulukko++)
{
printf("Syotetyt tunnit: taulukko[paivat2-1]"\n);
}Vielä isompi mitä kummaa? Yrititkö mahdollisesti tätä:
printf("Syotetyt tunnit:\n");
for(paivat2 = 0; paivat2 < paivat; paivat2++)
{
printf("%d. paiva: %lf \n", paivat2, taulukko[paivat2-1]);
}Lisäksi return on väärässä paikassa, sen pitäisi olla main-funktion sisällä.
Oletko tosiaan itse yhtään miettinyt näitä? Et varmaankaan. Harvoin näkee noin idioottimaisia virheitä. Ja kääntäjän virheilmoitukset kannattaa aina laittaa esille näissä ongelmatapauksissa. Lisäksi nuo kyseiset virheilmoitukset kannattaa myös itse lukea. Tälläkin kertaa sieltä olisi varmasti saanut selville joka ainoan virheen. Olisiko ehkä syytä ajatella sekä koodia kirjoittaessaan että siinä vaiheessa, kun se ei heti toimi, mitä koodillaan oikein yrittää tehdä? Jonkin perusoppaan, kuten tämän Putkan C-oppaan lukeminen voisi olla paikallaan.
Jotta ei haukuttaisi turhan takia niin tämä oli alunperin c++ kieltä ja se pitää muuttaa c kieliseksi versioksi taas. Tällä koodinpätkällä virheet vähenivät reippaasti. Mutta jotain siinä on vielä vikana, mutta mitä? Visual c++ ohjelma ilmoittaa, että " i : undeclared identifier" Mitä tämä tarkoittaa?
#include <stdio.h>
int main(void)
{
int paivat;
int paivat2 = 1;
int tunnit;
printf("Ohjelma laskee yhteen haluamasi ajanjakson aikana tehdyt\n");
printf("tyotunnit seka keskimaaraisen tyopaivan pituuden.\n");
printf("Kuinka monta paivaa:");
scanf("%d", &paivat);
double tunnit1 = 0;
double kaikki = 0;
double taulukko[31];
for (i = 0; i < paivat; i++) {
printf("Anna %d. paivan tyotunnit: ", paivat2);
scanf("%lf", &tunnit1);
kaikki += tunnit1;
taulukko[paivat2-1]=tunnit1;
}
printf("Tehdyt tunnit yhteensa:\n",kaikki);
double keskimaara;
keskimaara = kaikki / paivat;
printf("Keskimaarainen tyopaivan pituus: \n", keskimaara);
printf("Syotetyt tunnit:\n");
for(paivat2 = 0; paivat2 < paivat; paivat2++)
{
printf("%d. paiva: %lf \n", paivat2, taulukko[paivat2-1]);
}
return 0;
}Mod. laittoi kooditagit
Kooditagit.
Nuo
double tunnit1 = 0; double kaikki = 0; double taulukko[31]; double keskimaara; int i; // Vielä lisäksi.
... pitäisi siirtää samaan paikkaan kuin
int paivat; int paivat2 = 1; int tunnit;
koska C-kielessä muuttujamäärittelyjen pitää olla funktion alussa.
Ne koodi-tagit... Mutta, määrittele jossain kohdasse se i, eli pistä main-funktion alkuun int i;
Nyt toimii muuten mutta se ei tulosta oikein. Mitä tämä tarkoittaa? "Virhe muotoilumerkkijonon käyttämisessä.
Tarkista, että muotoilumerkkijonoja (esim. %d, %c, %s) vastaa yhtä monta argumenttia.
Tarkista, että olet kirjoittanut muotoilumerkkijonot oikein. "
#include <stdio.h>
int main(void)
{
int paivat;
int paivat2 = 1;
int tunnit;
int i;
double tunnit1 = 0;
double kaikki = 0;
double taulukko[31];
double keskimaara;
printf("Ohjelma laskee yhteen haluamasi ajanjakson aikana tehdyt\n");
printf("tyotunnit seka keskimaaraisen tyopaivan pituuden.\n");
printf("Kuinka monta paivaa:");
scanf("%d", &paivat);
for (i = 0; i < paivat; i++) {
printf("Anna %d. paivan tyotunnit: ", paivat2);
scanf("%lf", &tunnit1);
kaikki += tunnit1;
taulukko[paivat2-1]=tunnit1;
}
printf("Tehdyt tunnit yhteensa:\n",kaikki);
keskimaara = kaikki / paivat;
printf("Keskimaarainen tyopaivan pituus: \n", keskimaara);
printf("Syotetyt tunnit:\n");
for(paivat2 = 0; paivat2 < paivat; paivat2++)
{
printf("%d. paiva: %lf \n", paivat2, taulukko[paivat2-1]);
}
return 0;
}Se tarkoittaa sitä, että sinulla on printf-funktiossa eri määrä argumentteja kuin tekstissä olevia kohtia, joihin ne tulostetaan. Tuossa tapauksessa siis se tarkoittaa sitä, että näistä puuttuu %lf
printf("Tehdyt tunnit yhteensa:\n",kaikki);
=>
printf("Tehdyt tunnit yhteensa: %lf\n", kaikki);
printf("Keskimaarainen tyopaivan pituus: \n", keskimaara);
=>
printf("Keskimaarainen tyopaivan pituus: %lf\n", keskimaara);
Ja tosiaan, tuon jälkimmäisen for-silmukan pitäisi muuttuja jotenkin. Joko aloitat sen 1:stä (paivat2 = 1) tai jätät -1:sen pois ja lisäät +1:sen siihen, mistä paivat2 kirjoitetaan ruudulle:
for (paivat2 = 1; paivat2 <= paivat; paivat2++)
{
printf("%d. paiva: %lf \n", paivat2, taulukko[paivat2 - 1]);
}
// TAI
for (paivat2 = 0; paivat2 < paivat; paivat2++)
{
printf("%d. paiva: %lf \n", paivat2 + 1, taulukko[paivat2]);
}Poista vielä taulukoiden indeksoinnista -1, koska muuten ohjelma kirjoittaa varatun muistin ulkopuolelle. Ja muista, että olet käyttänyt i-muuttujaa ensimmäisessä silmukassa.
Nyt on seuraava ongelma: pitäisi tulostaa, että Kuinka monta työpäivää. Annetaan arvoksi vaikka 4. Sitten kysyy Anna 1 päivän työtunnit
Anna 1 päivän työtunnit
Anna 1 päivän työtunnit
Anna 1 päivän työtunnit
Miten tuon saa muutettua niin, että se toimisi oikein?
#include <stdio.h>
int main(void)
{
int paivat;
int paivat2 = 1;
int tunnit;
int i;
double tunnit1 = 0;
double kaikki = 0;
double taulukko[31];
double keskimaara;
printf("Ohjelma laskee yhteen haluamasi ajanjakson aikana tehdyt\n");
printf("työtunnit sekä keskimääräisen työpäivän pituuden.\n");
printf("Kuinka monta päivää:");
scanf("%d", &paivat);
for (i = 0; i < paivat; i++) {
printf("Anna %d. päivän työtunnit: ", paivat2);
scanf("%lf", &tunnit1);
kaikki += tunnit1;
taulukko[paivat2-1]=tunnit1;
}
printf("Tehdyt tunnit yhteensa:%.1lf\n",kaikki);
keskimaara = kaikki / paivat;
printf("Keskimaarainen tyopaivan pituus: %.1lf\n", keskimaara);
printf("Syotetyt tunnit:\n");
for(paivat2 = 0; paivat2 < paivat; paivat2++)
{
printf("%d. paiva: %.1lf \n", paivat2, taulukko[paivat2-1]);
}
return 0;
}Voisi auttaa, jos muuttaisit tuosta for-loopin sisältäkin sen paivat2:n i:ksi, kun se on jo itse silmukasta muutettu:
for (i = 0; i < paivat; i++) {
printf("Anna %d. päivän työtunnit: ", i + 1);
scanf("%lf", &tunnit1);
kaikki += tunnit1;
taulukko[i] = tunnit1;
}Tuo viimeinen for-silmukka muuten kaipaa edelleen aiemmin mainittua korjausta.
No mainitsin siitä jo äskeisessä viestissä. :) Koska olet käyttänyt silmukassa i-muuttujaa, käytä sitä myös silmukan sisällä paivat2:n asemesta. Ja poista -1:t taulukon indeksistä (myös toisessa silmukassa). Kun teet nuo muutokset, ohjelmasi toimii vihdoin moitteettomasti.
Heh, valaiskaas nyt tyhmää vielä? Eli ei toimi vieläkään. Pitäisi siis tulostaa seuraavasti:
"Kuinka monta päivää:4
Anna 1. päivän työtunnit:5.4
Anna 2. päivän työtunnit:6.5
Anna 3. päivän työtunnit:8.9
Anna 4. päivän työtunnit:7.8
Tehdyt työtunnit yhteensä: 28.6
Keskimääräinen työpäivän pituus: 7.1
Syötetyt tunnit: 5.4 6.5 8.9 7.8"
#include <stdio.h>
int main(void)
{
int paivat;
int paivat2 = 1;
int tunnit;
int i;
double tunnit1 = 0;
double kaikki = 0;
double taulukko[31];
double keskimaara;
printf("Ohjelma laskee yhteen haluamasi ajanjakson aikana tehdyt\n");
printf("työtunnit sekä keskimääräisen työpäivän pituuden.\n");
printf("Kuinka monta päivää:");
scanf("%d", &paivat);
for (i = 0; i < paivat; i++) {
printf("Anna %d. päivän työtunnit: ", paivat2=1);
scanf("%lf", &tunnit1);
kaikki += tunnit1;
taulukko[paivat2]=tunnit1;
}
printf("Tehdyt työtunnit yhteensa:%.1lf\n",kaikki);
keskimaara = kaikki / paivat;
printf("Keskimääräinen työpäivän pituus: %.1lf\n", keskimaara);
printf("Syötetyt tunnit:");
for (i = 1; paivat2 <= paivat; paivat2++)
{
printf("%i. %lf", paivat2, taulukko[paivat2]);
}
return 0;
}Metabolix kirjoitti aiemmin seuraavaa:
lainaus:
Voisi auttaa, jos muuttaisit tuosta for-loopin sisältäkin sen
paivat2:ni:ksi, kun se on jo itse silmukasta muutettu:for (i = 0; i < paivat; i++) { printf("Anna %d. päivän työtunnit: ", i + 1); scanf("%lf", &tunnit1); kaikki += tunnit1; taulukko[i] = tunnit1; }
Lisäksi Metabolix on ehtinyt kirjoittaa jo näinkin:
lainaus:
Ja tosiaan, tuon jälkimmäisen for-silmukan pitäisi muuttuja jotenkin. Joko aloitat sen 1:stä (paivat2 = 1) tai jätät -1:sen pois ja lisäät +1:sen siihen, mistä paivat2 kirjoitetaan ruudulle:
for (paivat2 = 1; paivat2 <= paivat; paivat2++) { printf("%d. paiva: %lf \n", paivat2, taulukko[paivat2 - 1]); } // TAI for (paivat2 = 0; paivat2 < paivat; paivat2++) { printf("%d. paiva: %lf \n", paivat2 + 1, taulukko[paivat2]); }
// Ensimmäinen koskee siis tätä:
for (i = 0; i < paivat; i++) {
printf("Anna %d. päivän työtunnit: ", paivat2=1);
scanf("%lf", &tunnit1);
kaikki += tunnit1;
taulukko[paivat2]=tunnit1;
}
// Ja jälkimmäinen tätä:
for (i = 1; paivat2 <= paivat; paivat2++)
{
printf("%i. %lf", paivat2, taulukko[paivat2]);
}Kaikki toimii, kun vain muutat niitä neuvojen mukaisesti.
Vielä on ongelma. Se tulostaa esim seuraavasti:
"Ohjelma laskee yhteen haluamasi ajanjakson aikana tehdyt työtunnit sekä keskimääräisen työpäivän pituuden.
Kuinka monta päivää:4
Anna 1. päivän työtunnit: 5.4
Anna 2. päivän työtunnit: 6.5
Anna 3. päivän työtunnit: 8.9
Anna 4. päivän työtunnit: 7.8
Tehdyt työtunnit yhteensä:28.6
Keskimääräinen työpäivän pituus: 7.2
Syötetyt tunnit:1. 6.52. 8.93. 7.84. 0.0"
Pitäisi tulostaa seuraavasti:
"Tehdyt työtunnit yhteensä: 28.6
Keskimääräinen työpäivän pituus: 7.1
Syötetyt tunnit: 5.4 6.5 8.9 7.8 "
Lopussa on vielä ongelma. Eli mistä tuo johtuu, että tehdyt tunnit ovat 7.2 kun pitäisi olla 7.1? Syötetyt tunnit kusee kanssa?
#include <stdio.h>
int main(void)
{
int paivat;
int paivat2 = 1;
int tunnit;
int i;
double tunnit1 = 0;
double kaikki = 0;
double taulukko[31];
double keskimaara;
printf("Ohjelma laskee yhteen haluamasi ajanjakson aikana tehdyt\n");
printf("työtunnit sekä keskimääräisen työpäivän pituuden.\n");
printf("Kuinka monta päivää:");
scanf("%d", &paivat);
for (i = 0; i < paivat; i++) {
printf("Anna %d. päivän työtunnit: ", i + 1);
scanf("%lf", &tunnit1);
kaikki += tunnit1;
taulukko[i] = tunnit1;
}
printf("Tehdyt työtunnit yhteensä:%.1lf\n",kaikki);
keskimaara = kaikki / paivat;
printf("Keskimääräinen työpäivän pituus: %.1lf\n", keskimaara);
printf("Syötetyt tunnit:");
for (i = 1; paivat2 <= paivat; paivat2++)
{
printf("%i. %.1lf", paivat2, taulukko[paivat2]);
}
return 0;
}Itse asiassa se toimii ihan oikein.
28,6 / 4 = 7,15
pyöristettynä 7,2.
Siinä on vaan se, että viope ei hyväksy tuota... Saako sen millään niin, että se olisi 7.1? Ja entä tuo loppu sitten? Se menee väärin pahasti...
Kerro se kymmenellä, niin saat 71,5. Muuta se kokonaisluvuksi, niin saat 71. Jaa se kymmenellä niin saat 7,1. Koodina:
LUKU = ((int)(LUKU * 10)) / 10.0;
Jos tarkoitat lopun väärin menemisellä sitä, että siihen tulostuu aina päivän numero ennen sen tuntimäärää, niin kyllä kai osaat itsekin tuosta viimeisestä printf-lauseesta poistaa paivat2:n tulostuksen ja laittaa välin oikeaan kohti.
Lue se C-opassarja, niin voit joskus vaikka oppia tekemään jotakin itsekin.
Viimeisessä silmukassa taulukkoa luetaan yhden indeksin verran liian korkealta. Taulukon indeksointi alkaa nollasta!
Ja mihin tuo pitäisi laittaa?
LUKU = ((int)(LUKU * 10)) / 10.0;
No voi härregyyd. Katsos tuollaista kutsutaan kaavaksi. Laitat tuon siihen kohti, missä haluat sen kyseisen muunnoksen (7.15 => 7.1) tehdä, ja vaihdat sanan LUKU tilalle sen muuttujan nimen, jolle haluat muutoksen tehdä. 8(
Olisiko sen C-oppaan lukeminen lopultakin paikallaan?
Nyt on kaava säädetty sopivaksi. Mä olen tässä nyt miettinyt/testaillut jo tunnin miksi tuo tulostaa seuraavasti:
"Syötetyt tunnit:1. 6.52. 8.93. 7.84. 0.0"
Pitäisi olla "Syötetyt tunnit: 5.4 6.5 8.9 7.8"
Sieltä jää niinkuin yks arvo alusta pois. Miksi? Se on niinkuin lopussa. Ja mistä tuo 1. tulee tuohon?
#include <stdio.h>
int main(void)
{
int paivat;
int paivat2 = 1;
int tunnit;
int i;
double tunnit1 = 0;
double kaikki = 0;
double taulukko[31];
double keskimaara;
printf("Ohjelma laskee yhteen haluamasi ajanjakson aikana tehdyt\n");
printf("työtunnit sekä keskimääräisen työpäivän pituuden.\n");
printf("Kuinka monta päivää:");
scanf("%d", &paivat);
for (i = 0; i < paivat; i++) {
printf("Anna %d. päivän työtunnit: ", i + 1);
scanf("%lf", &tunnit1);
kaikki += tunnit1;
taulukko[i] = tunnit1;
}
printf("Tehdyt työtunnit yhteensä:%.1lf\n",kaikki);
keskimaara = ((int)(paivat * 17.9)) / 10.0;
printf("Keskimääräinen työpäivän pituus: %.1lf\n", keskimaara);
printf("Syötetyt tunnit:");
for (i = 1; paivat2 <= paivat; paivat2++)
{
printf("%i. %.1lf", paivat2, taulukko[paivat2]);
}
return 0;
}for (i = 1; paivat2 <= paivat; paivat2++)
Tuon vuoksi. Tutkit taulukkoa indeksistä 1...paivat, kun taulukko on varattu alueelle 0...paivat-1.
Aloittelija2 kirjoitti:
Nyt on kaava säädetty sopivaksi. Mä olen tässä nyt miettinyt/testaillut jo tunnin - -
Tämä osoittaa, että sinulla ei ole hajuakaan mitä olet tekemässä. Tämä ei ole vaikea ongelma jos tajuat *yhtään* printf-funktion toimintaa.
Mistä ihmeestä tuo 17.9 ilmestyi tuonne keskiarvon laskemiseen ja mikä tarkoitus sillä on? :) Melkein suosittelisin muita olemaan antamatta valmista koodia Aloittelija2:lle tästä eteenpäin, näyttää että siitä ei seuraa mitään hyvää :)
Rautalanka:
-tarkista sqwiikin esittelemä kohta; miten for-looppi toimii?
-mikä merkitys on printf:n ensimmäisellä parametrilla (muotoilumerkkijono, itselläsi "%i. %.1lf")?
Kuten sanottu, myöskään tuo keskiarvon laskeminen ei ole nyt oikein. Käytä Metabolix:n antamaa tapaa. Outoa sinänsä, että tuo VIOPE (virtuaaliope? :) haluaa väärän tuloksen.
Aloittelija2:lla taitaa olla vielä paljon opettelemista niin ohjelmoinnista kuin myös neuvojen kuuntelemisesta. Tuosta silmukasta on jo moneen kertaan täällä huomautettu, milloin mistäkin asiasta, ja tämä on jo koolmas kerta kun annan siitä toimivan version. Mutta ei mene perille, ei sitten millään, kun pitää aina muokata sitä jotenkin muuten ja tulla taas valittamaan kun ei vieläkään toimi.
for (i = 0; i < paivat; i++)
{
printf(" %lf", taulukko[i]);
}Ja mikä ihme tämä on:
keskimaara = ((int)(paivat * 17.9)) / 10.0;
Ei kaavan oikea käyttäminen voi niin vaikeaa olla. Tuo ei todellakaan anna sinulle oikeaa vastausta millään muulla arvolla kuin tuolla tietyllä. Tuolla muunnellulla kaavallasi tulos ei riipu mitenkään tuntimäärästä, vaan se on suoraan verrannollinen päiviin.
1 pv => keskiarvo = 1.7
2 pv => keskiarvo = 3.5
3 pv => keskiarvo = 5.3
4 pv => keskiarvo = 7.1
5 pv => keskiarvo = 8.9
Näin sitä käytetään:
LUKU = ((int)(LUKU * 10)) / 10.0;
=>
keskimaara = ((int)(keskimaara * 10)) / 10.0;
Jos sanot, että tuolla ei ole mitään väliä, koska tuo kaava toimii testitapauksessa (muttei muissa), niin mikset sitten kirjoita lopputulostettakin valmiiksi, mitä sitä turhaan taulukosta lukemaan, jos se on aina sama:
printf("Syötetyt tunnit: 5.4 6.5 8.9 7.8");
Omatoiminen ajattelu sallittu. Oletko käynyt kertaakaan tuota koodia ajatuksella läpi? Jos olet, niin (a) olet huomannut tuon virheen tai (b) sinusta ei ole ohjelmoijaksi vielä pitkään aikaan. Lue ensin se C-opassarja ajatuksella läpi. Kyllä tyhmemmänkin pitäisi huomata, että silmukassa alustetaan eri muuttuja kuin mitä käytetään.
Kumma juttu kun teidän neuvoilla ei tätä saada toimimaan?
Voit sinä vaikka neuvoa sikaa kymmenen vuotta, mutta epäilen, että saat sitä opetettua kirjottamaan.
Se menee tällä
keskimaara = ((int) (kaikki / paivat));
muuten oikein mutta pyöristää väärin. Missä vika? Saako vastauksen jotenkin katkaistua (7.15 --> 7.1)?
Aloittelija2 kirjoitti:
Se menee tällä
keskimaara = ((int) (kaikki / paivat));
muuten oikein mutta pyöristää väärin. Missä vika? Saako vastauksen jotenkin katkaistua (7.15 --> 7.1)?
LUKU = ((int)(LUKU * 10)) / 10.0;
Tossahan sulla se kaava on?
Ei se toimi tuolla kaavalla! Mitä järkeä kertoa kymmenellä ja jakaa kymmenellä?
Ootko nyt ees lukenu ajatuksella mitään viestiä? Metabolixhan jo kertoi ton.
Metabolix kirjoitti:
Kerro se kymmenellä, niin saat 71,5. Muuta se kokonaisluvuksi, niin saat 71. Jaa se kymmenellä niin saat 7,1. Koodina:
LUKU = ((int)(LUKU * 10)) / 10.0;
Mikä toi kokonaisluku juttu on? Se tässä yli hilseen menee?
Lukaisepa tuolla aiemmin annetut viestit. Tuosta omasta lausekkeestasi et voi saada 7.15! Tuon kyseisen pyöristyksen olen jo kahteen kertaan selittänyt. Kokonaisluku on semmoinen, jossa on vain kokonaisia, ei desimaaleja. Lue se C-opas, niin voit oppia, mikä on kokonaisluku!
Kirjoitanpa nyt omasta päästäni tuollaisen ohjelman. Voit ladata sen tästä ja todeta, että se tosiaan toimii, eikä siinä tosiaan ole mitään sen kummempaa kuin noita palasia, joita olet itsekin käyttänyt (paitsi tietenkin dynaaminen muistinvaraus, niin että se toimii yli 31 päivän ajoillakin). Koska tuo on koulutehtävä, en kuitenkaan laita lähdekoodia esille. Ohjelma on siis kirjoitettu kokonaan tämän aiheen pohjalta, minun ja Antin neuvoja noudattaen. Ainut pieni virhe siinä on sellainen, että muuttujia ei alusteta, joten 0 päivää antaa virheellisen keskiarvon... Mutta en enää ala muokata.
Typecastaus (muunto tietotyyppiin), (int)luku ottaa luku-muuttujasta pelkän kokonaislukuosan:
luku (int)luku 3.12 3 5.6 5 12.5 12 19.9999 19 -12.8 -12
Eli nappaa desimaalit pois.
Tässä vastaukseksi tulee 28.6 keskimääräiseksi työpäivän pituudeksi. Ei siis 2.8.....
#include <stdio.h>
int main(void)
{
int paivat;
int paivat2 = 1;
int tunnit;
int i;
double tunnit1 = 0;
double kaikki = 0;
double taulukko[31];
double keskimaara;
printf("Ohjelma laskee yhteen haluamasi ajanjakson aikana tehdyt\n");
printf("työtunnit sekä keskimääräisen työpäivän pituuden.\n");
printf("Kuinka monta päivää:");
scanf("%d", &paivat);
for (i = 0; i < paivat; i++) {
printf("Anna %d. päivän työtunnit: ", i + 1);
scanf("%lf", &tunnit1);
kaikki += tunnit1;
taulukko[i] = tunnit1;
}
printf("Tehdyt työtunnit yhteensä:%.1lf\n",kaikki);
keskimaara = ((int)(kaikki * 10)) / 10.0;
printf("Keskimääräinen työpäivän pituus: %.1lf\n", keskimaara);
printf("Syötetyt tunnit:");
for (i = 0; i < paivat; i++)
{
printf(" %.1lf", taulukko[i]);
}
return 0;
}*kick*
Tuota pyöristystä piti käyttää vasta siihen valmiiseen keskiarvoon, ei laskea sillä keskiarvoa.
Minkähän takia kaavani on:
LUKU = ((int)(LUKU * 10)) / 10.0;
eikä
KESKIARVO = ((int)(KAIKKI * 10)) / 10.0;
Vataus: Siksi, että siinä pitää olla sama luku molemmissa kohdissa.
KESKIARVO = ((int)(KESKIARVO * 10)) / 10.0;
Sinun pitää siis ensin laskea keskiarvo ja vasta sitten katkaista se:
keskimaara = kaikki / paivat;
keskimaara = ((int)(keskimaara * 10)) / 10.0;
Tai yhtenä lausekkeena:
keskimaara = ((int)((kaikki / paivat) * 10)) / 10.0;
Nyt toimii, se oli jostain pienestä kiinni - lähes samaa kaavaa tuli käytettyä, mutta silti jokin meni pieleen.
Kiitos! :)
#include <stdio.h>
int main(void)
{
int paivat;
int paivat2 = 1;
int tunnit;
int i;
double tunnit1 = 0;
double kaikki = 0;
double taulukko[31];
double keskimaara;
printf("Ohjelma laskee yhteen haluamasi ajanjakson aikana tehdyt\n");
printf("työtunnit sekä keskimääräisen työpäivän pituuden.\n");
printf("Kuinka monta päivää:");
scanf("%d", &paivat);
for (i = 0; i < paivat; i++) {
printf("Anna %d. päivän työtunnit: ", i + 1);
scanf("%lf", &tunnit1);
kaikki += tunnit1;
taulukko[i] = tunnit1;
}
printf("Tehdyt työtunnit yhteensä:%.1lf\n",kaikki);
keskimaara = ((int)((kaikki / paivat) * 10)) / 10.0;
printf("Keskimääräinen työpäivän pituus: %.1lf\n", keskimaara);
printf("Syötetyt tunnit:");
for (i = 0; i < paivat; i++)
{
printf(" %.1lf", taulukko[i]);
}
return 0;
}Aihe on jo aika vanha, joten et voi enää vastata siihen.