Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Numeeriset taulukot c-kielessä

Sivun loppuun

Aloittelija2 [18.12.2004 12:36:48]

#

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;

Antti Laaksonen [18.12.2004 12:45:16]

#

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.

Metabolix [18.12.2004 12:48:02]

#

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.

Aloittelija2 [18.12.2004 12:51:34]

#

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

Metabolix [18.12.2004 13:01:39]

#

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.

arcatan [18.12.2004 13:03:25]

#

Ne koodi-tagit... Mutta, määrittele jossain kohdasse se i, eli pistä main-funktion alkuun int i;

Aloittelija2 [18.12.2004 13:24:34]

#

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;
}

Metabolix [18.12.2004 13:28:17]

#

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]);
}

Antti Laaksonen [18.12.2004 13:30:27]

#

Poista vielä taulukoiden indeksoinnista -1, koska muuten ohjelma kirjoittaa varatun muistin ulkopuolelle. Ja muista, että olet käyttänyt i-muuttujaa ensimmäisessä silmukassa.

Aloittelija2 [18.12.2004 13:40:16]

#

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;
}

Metabolix [18.12.2004 13:51:15]

#

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.

Antti Laaksonen [18.12.2004 13:52:12]

#

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.

Aloittelija2 [18.12.2004 14:08:30]

#

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 [18.12.2004 14:15:50]

#

Metabolix kirjoitti aiemmin seuraavaa:

lainaus:

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;
}

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.

Aloittelija2 [18.12.2004 14:42:57]

#

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;
}

Metabolix [18.12.2004 14:48:32]

#

Itse asiassa se toimii ihan oikein.
28,6 / 4 = 7,15
pyöristettynä 7,2.

Aloittelija2 [18.12.2004 14:54:40]

#

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...

Metabolix [18.12.2004 15:41:21]

#

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.

Antti Laaksonen [18.12.2004 17:01:42]

#

Viimeisessä silmukassa taulukkoa luetaan yhden indeksin verran liian korkealta. Taulukon indeksointi alkaa nollasta!

Aloittelija2 [18.12.2004 21:20:38]

#

Ja mihin tuo pitäisi laittaa?


LUKU = ((int)(LUKU * 10)) / 10.0;

Metabolix [18.12.2004 21:24:53]

#

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?

Aloittelija2 [19.12.2004 11:43:46]

#

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;
}

sqwiik [19.12.2004 11:48:42]

#

for (i = 1; paivat2 <= paivat; paivat2++)

Tuon vuoksi. Tutkit taulukkoa indeksistä 1...paivat, kun taulukko on varattu alueelle 0...paivat-1.

thefox [19.12.2004 12:11:04]

#

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.

Metabolix [19.12.2004 12:28:31]

#

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.

Aloittelija2 [19.12.2004 17:01:13]

#

Kumma juttu kun teidän neuvoilla ei tätä saada toimimaan?

Blaze [19.12.2004 17:15:28]

#

Voit sinä vaikka neuvoa sikaa kymmenen vuotta, mutta epäilen, että saat sitä opetettua kirjottamaan.

Aloittelija2 [19.12.2004 17:21:19]

#

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)?

vipemype [19.12.2004 17:47:22]

#

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?

Aloittelija2 [19.12.2004 17:50:14]

#

Ei se toimi tuolla kaavalla! Mitä järkeä kertoa kymmenellä ja jakaa kymmenellä?

vipemype [19.12.2004 17:54:19]

#

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;

Aloittelija2 [19.12.2004 18:00:11]

#

Mikä toi kokonaisluku juttu on? Se tässä yli hilseen menee?

Metabolix [19.12.2004 18:03:20]

#

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.

sqwiik [19.12.2004 18:04:36]

#

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.

Aloittelija2 [19.12.2004 18:13:21]

#

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;
}

sqwiik [19.12.2004 18:15:40]

#

*kick*
Tuota pyöristystä piti käyttää vasta siihen valmiiseen keskiarvoon, ei laskea sillä keskiarvoa.

Metabolix [19.12.2004 18:17:29]

#

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;

Aloittelija2 [19.12.2004 18:24:33]

#

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;
}

Sivun alkuun

Vastaus

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

Tietoa sivustosta