Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Taulukon alkioiden yhteenlasku

Sivun loppuun

kermiitti [28.10.2007 19:46:42]

#

Kuinka lasken taulukon alkioita yhteen keskenaan.
Eli seuraavaksi minun pitaisi laskea taulukkoon luvut[30] syotetyt arvot yheen.

#include <iostream>
using namespace std;

int main()
{

    int kierros;
    int paivia;
    int luvut[30];

    cout << "Ohjelma laskee yhteen haluamasi ajanjakson aikana tehdyttyötunnit sekä keskimääräisen työpäivän pituuden."
    cout << "Kuinka monta päivää:"
    cin >> paivia


    for(kierros=0; kierros < paivia; kierros++)
   {
    cout << "Anna " << kierros << ". päivän työtunnit:";
    cin >> luvut[paivia];
   }

Antti Laaksonen [28.10.2007 20:04:14]

#

Tarvitset vielä yhden muuttujan, johon lasket lukujen summan, sekä toisen for-silmukan, joka laskee summan.

Tosin jos pitää vain laskea lukujen summa, niitä on vähän turha koota aluksi taulukkoon, koska summaa voi laskea myös sitä mukaa, kun lukuja luetaan käyttäjältä.

kermiitti [28.10.2007 20:13:46]

#

Kiitos vinkistä ja nopeasta vastauksesta.

Ohjelman pitää tulostaa tehdyt tunnit yhteensä, keskimääräinen työpäivän pituus ja syötetyt tunnit. Tehtävässä on tarkoitus vähän harjoitella taulukon käyttöä ja siksi käytän taulukkoa. Eikö siis ole keinoa jolla näppärästi voisi laskea taulukosta tietyt alkiot yhteen.

Minä olen muuten jo tutkintoni suorittanut ja pureskelen näitä asioita vähän muista syistä eli en pummi huomen aamuksi vastauksia koulussa palautettavaksi.

Antti Laaksonen [28.10.2007 20:16:14]

#

Ei ole oikein mitään näppärämpää tapaa kuin for-silmukka. Jos tunnit pitää vielä myöhemmin tulostaa, taulukko onkin paikallaan.

kermiitti [28.10.2007 20:29:36]

#

#include <iostream>
using namespace std;

int main()
{

    int kierros;
    int paivia;
    int summa;
    int luvut[30];

    cout << "Ohjelma laskee yhteen haluamasi ajanjakson aikana tehdyttyötunnit sekä keskimääräisen työpäivän pituuden.";
    cout << "Kuinka monta päivää:";
    cin >> paivia;


    for(kierros=0; kierros < paivia; kierros++)
   {
    cout << "Anna " << kierros << ". päivän työtunnit:";
    cin >> luvut[paivia];
    summa = summa + luvut; <---------------- miksei nain voi laskea? ei menen kaantajasta lapi

   }
   cout << "Tehdyt tunnit yhteensä: " << summa;
}

Antti Laaksonen [28.10.2007 20:45:58]

#

Aina kun taulukkoon tallennetaan luku tai sieltä luetaan luku, pitää ilmoittaa käsiteltävä taulukon alkio. Tässä tapauksessa luvut-alkiossa on 30 alkiota, joten taulukon ensimmäinen alkio on luvut[0], toinen alkio on luvut[1], jne., kunnes viimeinen alkio on luvut[29]. Kirjoita for-silmukan sisään siis:

cin >> luvut[kierros];
summa = summa + luvut[kierros];

Muuttuja kierros on laitettu juuri sen vuoksi for-silmukan runkoon, että se saa vuorollaan arvokseen kaikki luvut 0:sta 29:ään eli kaikki taulukon indeksit.

kermiitti [28.10.2007 20:58:43]

#

Mutta nythan jos ensin syötetään esim 5 työpäivää. Niin heti ensimmäisen kierroksen jälkeen for silmukka lopetetaan jos työpäivässä on 8h koska 8 on isompi kuin 5. Kierroksen tarkoitus olisi kasvaa kunnes se on suurempi kuin työpäivien määrä.

Antti Laaksonen [28.10.2007 21:20:21]

#

Tietyn työpäivän tuntimäärä ei vaikuta for-silmukan toimintaan. Ehto on nimittäin "kierros < paivia", ja muuttuja kierros saa järjestyksessä arvot 0, 1, 2, jne., kunnes saavutetaan muuttujan paivia arvo, jonka käyttäjä kirjoitti ensimmäisenä. (Väitin aiemmassa viestissäni hieman väärin: muuttuja kierros ei saa aina arvoja 29:ään asti, vaan siihen lukuun asti, joka on yhtä pienempi kuin muuttujan paivia arvo.)

kermiitti [30.10.2007 16:00:55]

#

#include <iostream>
using namespace std;

int main()
{

    int kierros;
    int paivia;
    int summa = 0;
    int luvut[30];

    cout << "Ohjelma laskee yhteen haluamasi ajanjakson aikana tehdyt\ntyötunnit sekä keskimääräisen työpäivän pituuden.\n";
    cout << "Kuinka monta päivää:";
    cin >> paivia;


    for(kierros=0; kierros < paivia; kierros++)
   {
    cout << "Anna " << kierros+1 << ". päivän työtunnit:";
    cin >> luvut[kierros];
    summa = paivia + luvut[kierros];
    cout << "\n";

   }
   cout << "Tehdyt tunnit yhteensä: " << summa;
}

Sijoitetaanko tässa joka kierroksella työtunnit seuraavaan järjestyksessä olevnan taulukon luvut alkioon. Minkä takia tuolla taulukon hakasten sisällä pitää lukea tuo kierros. Kertooko se että seuraavaan järjestyksessä olevaan alkioon sijoitetaan se arvo joka on sillä hetkellä muuttujassa kierros.

Nyt ohjelma jostain syystä ei anna lisätä uusia tunteja kuin ensimmäiseen päivään ja tulostaa sen jälkeen muut päivät suoraan seuraavasti

Ohjelma laskee yhteen haluamasi ajanjakson aikana tehdyt
työtunnit sekä keskimääräisen työpäivän pituuden.
Kuinka monta päivää:5
Anna 1. päivän työtunnit:5.3

Anna 2. päivän työtunnit:
Anna 3. päivän työtunnit:
Anna 4. päivän työtunnit:
Anna 5. päivän työtunnit:
Tehdyt tunnit yhteensä: -1293801443#

tgunner [30.10.2007 16:15:59]

#

Toi sun kokonaislukutyyppinen luvut kelpaa pitämään liukulukua. Työtuntien antamattomuus voi antaa oudon tuloksen, ellet alusta myös luvut-muuttujaa.

kermiitti [30.10.2007 16:23:52]

#

Ongelma on se että ohjelma tulostaa tuon vastauksen heti kun laittaa 5.3 ja painaa enter.

Kuinka tuon luvut muuttujan voi alustaa, kun se on taulukko?

User137 [30.10.2007 16:42:23]

#

Alustaa voi vaikka näin:

for(kierros=0; kierros < paivia; kierros++)
  luvut[kierros]=0;

Eli siis

cin >> paivia;

pysähtyy enterin jälkeen ja

cin >> luvut[kierros];

pysähtyy myös mutta vain kerran? Ei tunnu loogiselta...

Edit: Aivan siis liukulukuongelma. int tyypille annetaan aina kokonaisluku, 5.3 ei kelpaa.

tgunner [30.10.2007 16:47:28]

#

Nii, se kokonaislukumuoto. Vaihda luvut-muuttujan tyypiksi liukulukuja vetävä (double tai vaik float) ja kokeile sit uusiks. Jos sä annat intille arvon 5.3, nii se vetää ihan mieluusti sun cinit läpi.

jlaire [30.10.2007 16:52:02]

#

User137 kirjoitti:

Alustaa voi vaikka näin:

for(kierros=0; kierros < paivia; kierros++)
  luvut[kierros]=0;

Tai näin:

double luvut[30] = {0.0};

kermiitti [30.10.2007 17:30:49]

#

User137 kirjoitti:

Alustaa voi vaikka näin:

for(kierros=0; kierros < paivia; kierros++)
  luvut[kierros]=0;

Eikö se tässä tapauksessa alusta sen taulukon nollaksi joka kierroksella?

Muutin kaikki muuttujat muotoon double ja nyt ei mene enää kääntäjästä läpi.

"Tarkista ettet yritä viitata johonkin taulukon alkioon lausekkieella, joka ei palauta kokonaislukuarvoa. Et voi esimerkiksi viitata taulukon alkioon muuttujalla, jonka tyyppi on double."

code.cpp: In function `int main()':
code.cpp:21: error: invalid types `double[30][double]' for array subscript
code.cpp:22: error: invalid types `double[30][double]' for array subscript

Blaze [30.10.2007 17:43:48]

#

kermiitti kirjoitti:

Muutin kaikki muuttujat muotoon double

Ei kaikkia, vain se "luvut".

jlaire [30.10.2007 17:45:37]

#

kermiitti kirjoitti:

User137 kirjoitti:

Alustaa voi vaikka näin:

for(kierros=0; kierros < paivia; kierros++)
  luvut[kierros]=0;

Eikö se tässä tapauksessa alusta sen taulukon nollaksi joka kierroksella?

Ei taulukkoa, vaan sen alkiot yksi kerrallaan. Kannattaa kerrata jostain oppaasta taulukoiden käyttö, olet tainnut ymmärtää jotain väärin.

kermiitti [30.10.2007 18:58:20]

#

Blaze kirjoitti:

kermiitti kirjoitti:

Muutin kaikki muuttujat muotoon double

Ei kaikkia, vain se "luvut".

Ei mene kääntäjästä läpi siltinkään. Int ja double tyyppisiä muuttujia ei kai voi summailla keskenään. Ainakin siitä kääntäjä valittaa jos koittaa esitellä alussa double luvut[30] = {0.0};

Blaze [30.10.2007 19:14:20]

#

kermiitti kirjoitti:

Int ja double tyyppisiä muuttujia ei kai voi summailla keskenään.

Voi niitä.

kermiitti kirjoitti:

Ainakin siitä kääntäjä valittaa jos koittaa esitellä alussa double luvut[30] = {0.0};

En tiiä, mikä kääntäjä sulla on, minä saan yhen varotuksen:

blaze@sakura ~ $ g++ --version | head -n 1
g++ (GCC) 4.1.2 (Gentoo 4.1.2 p1.0.2)
blaze@sakura ~ $ g++ testi.cpp
testi.cpp: In function ‘int main()’:
testi.cpp:21: warning: converting to ‘int’ from ‘double’

kermiitti [30.10.2007 23:56:03]

#

Minkä takia tämä koodi laskee ihan miten sattuu. Menee nyt kyllä varoitusten kera kaantajän läpi, mutta vastaukset on ihan mitä sattuu. Ja syötettyjen tuntien tulostuskin on kuin se viittaisi johonkin muistipaikkaan eli sieltä tulee jotain hexa lukua tms. Jos haluan tulostaa taulukon luvut niin onko se sen kummempaa kuin mita olen tuossa koodissa melkein lopussa tehnyt. No tai no ei kai ihan kun sielta tulee jotain hexalukua (;

#include <iostream>
using namespace std;

int main()
{

    int kierros;
    int paivia;
    int summa = 0;
    double luvut[30] = {0.0};
    double keski = 0;
    int loppu;

    cout << "Ohjelma laskee yhteen haluamasi ajanjakson aikana tehdyt\ntyötunnit sekä keskimääräisen työpäivän pituuden.\n";
    cout << "Kuinka monta päivää:";
    cin >> paivia;


    for(kierros=0; kierros < paivia; kierros++)
   {
    cout << "Anna " << kierros+1 << ". päivän työtunnit:";
    cin >> luvut[kierros];
    summa = paivia + luvut[kierros];
    cout << "\n";

   }
   cout << "Tehdyt tunnit yhteensä: " << summa << "\n";
   keski = summa / paivia;
   cout << "Keskimääräinen työpäivän pituus: " << keski << "\n";
   cout << "Syötetyt tunnit: " << luvut[30] << "\n";

   cout << "syota loppu";  // tämä rivi on vain jotta kääntäjä ei sulje ikkunaa samantien.
   cin >> loppu;
}

Metabolix [31.10.2007 10:44:57]

#

No miksi lasket tuolla ihan mitä sattuu? Ensinnäkin myös summan pitäisi olla liukuluku, jos siihen on tarkoitus tallentaa liukulukujen summa, Toiseksi seuraavassa rivissä ei ole mitään järkeä:

summa = paivia + luvut[kierros];

Jos mieluummin lisäisit summaan aina tämän kierroksen arvon:

summa = summa + luvut[kierros];

Syötetyt arvot pitää tulostaa silmukassa samaan tapaan kuin ne on luettukin.


Sivun alkuun

Vastaus

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

Tietoa sivustosta