Pitäisi tehdä pari funktiota jotka tekevät sen mitä funktion nimi kertookin
Kysymyksen on, että eikö kaksiulotteisen funktion sisältöä voi tulostaa kuten olen alla yrittänyt eli eikö yhdellä for-silmukan kierroksella voi tulostaa molempien alkioiden sisältöä. Koska koodi ei näytä toimivan tällätavalla niin olisiko oikea suunta koittaa rakentaa for-silmukan sisään toinen for silmukka?
void tulosta_matriisi(int matriisi[5][5]) { int i; { for(i=0; i < 5; i++) // muokattu { cout << tulosta_matriisi[i][i]; } } } int laske_summa(int matriisi[5][5]) { int i; int summa; { for(i=0; i < 5; i++) { summa = summa + matriisi[i][i]; } return summa; } }
Oikea "suunta" on joo. Ulomman silmukan muuttuja kuvaamaan rivin numeroa ja sisempi sarakkeen numeroa. Olisithan sitä voinut itsekin kokeilla.
Miksi silmukassasi muuten lukee... EDIT: no ei lue enään.
Olisiko tämä oikein? En oikein voi kokeilla funktiota ennen, kuin koko koodi on valmis niin kysyn näin jos joku kokeneempi osaa sanoa kokeilematta onko funktio oikein.
void tulosta_matriisi(int matriisi[5][5]) { int i; int x; { for(i=0; i < 4; i++){ for(x=0; x < 4; x++){ { cout << tulosta_matriisi[i][x]; } } }
Kyllä voit aivan hyvin testata, esimerkiksi näin:
#include <iostream> using std::cout; // Tähän väliin testattavat funktiot // ... // ... int main() { int matriisi[5][5] = { { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 10 }, { 11, 12, 13, 14, 15 }, { 16, 17, 18, 19, 20 }, { 21, 22, 23, 24, 25 } }; tulosta_matriisi(matriisi); return 0; }
Kannattaa kuitenkin aluksi vähän katsoa noita tekemiäsi funktiota oikeasti ajatuksen kanssa. Jälkimmäisessä postauksessasi edes sulkujen määrä ei täsmää.
Voiko näin tulostaa taulukosta?
{ cout << tulosta_matriisi[i][x]; }
Ei tietenkään, koska taulukkosi nimi on matriisi
eikä tulosta_matriisi
.
Nyt funktiot jo tulosteleekin, mutta nyt ei kyllä tiedä miten saisin niin, että rivit ja sarakkeet tulostuisivat oikein. Lisäksi summa on väärä. En keksi miten funktio laskee summan tällähetkellä, kun ei se sitä ainakaan niin laske miten olin ajatellut.
void tulosta_matriisi(int matriisi[5][5]) { int i; int x; { for(i=0; i <= 4; i++){ for(x=0; x <= 4; x++){ { cout << matriisi[i][x] << endl; } } } } } int laske_summa(int matriisi[5][5]) { int i; int x; int summa; { for(i=0; i < 4; i++){ for(x=0; x < 4; x++){ { summa = summa + matriisi[i][x]; } } return summa; } } }
Tässä hieman siistitty koodi. Poistettu muun muassa iso kasa turhia aaltosulkuja, sekä sisennetty järkevästi. laske_summa(int matriisi[5][5]) funktiossa on selkeä virhe, josta johtuu tuo epämääräinen tulos.
#include <iostream> void tulosta_matriisi(int matriisi[5][5]){ int i; int x; for(i=0; i <= 4; i++){ for(x=0; x <= 4; x++){ std::cout << matriisi[i][x] << std::endl; } } } int laske_summa(int matriisi[5][5]){ int i; int x; int summa; for(i=0; i < 4; i++){ for(x=0; x < 4; x++){ summa = summa + matriisi[i][x]; } } return summa; } int main(){ int matriisi[5][5] = { { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 10 }, { 11, 12, 13, 14, 15 }, { 16, 17, 18, 19, 20 }, { 21, 22, 23, 24, 25 } }; tulosta_matriisi(matriisi); std::cout << laske_summa(matriisi) << std::endl; return EXIT_SUCCESS; }
kermiitti kirjoitti:
Nyt funktiot jo tulosteleekin, mutta nyt ei kyllä tiedä miten saisin niin, että rivit ja sarakkeet tulostuisivat oikein. Lisäksi summa on väärä. En keksi miten funktio laskee summan tällähetkellä, kun ei se sitä ainakaan niin laske miten olin ajatellut.
Millä sinä tätä koodia teet? Kyllähän se muistiollakin on joo mahdollista, mutta lopputuloskin on sen näköinen. [/rant]
Ongelmasi on hyvin yksinkertainen: mieti mitä tulostusfunktion silmukassa todella tulostetaan, ja miten tulostus- ja summafunktioiden silmukat eroavat toisistaan. Indeksejä loopatessa operaattoria <=
on syytä välttää (ilman erityistä syytä se ei aiheuta kuin sekaannusta.)
Myös sitä kannattaa pohtia, miten mielekästä on taulukon indeksien arvoja lisäillä tuntemattomaan (alustamattomaan) muuttujaan.
No nyt se toimii mallikkaasti.
void tulosta_matriisi(int matriisi[5][5]) { int i; int x; for(i=0; i < 5; i++){ for(x=0; x < 5; x++){ cout << matriisi[i][x] << " " ; } if(i < 4){cout << endl;} } } int laske_summa(int matriisi[5][5]) { int i; int x; int summa = 0; for(i=0; i < 5; i++){ for(x=0; x < 5; x++){ summa = summa + matriisi[i][x]; } } cout << endl; return summa; }
Nuo i:n ja x:n voi luoda for lauseessakin ja nykyään se yleensä luodaankin for lauseessa. Ja kannattaa opetella sisennys, koska noi sun koodipätkät on tosi rumia.
kermiitti kirjoitti:
.. for(i=0; i < 5; i++){ for(x=0; x < 5; x++){ cout << matriisi[i][x] << " " ; } if(i < 4){cout << endl;} }
Jos tuon oikeanpaan suuntaan sisentää niin se näyttää tältä, meneekö ohjelman logiikka vielä niin kuin tarkotit?
.. for(i=0; i < 5; i++) { for(x=0; x < 5; x++) { cout << matriisi[i][x] << " "; } if(i < 4){cout << endl;} }
User137 kirjoitti:
Jos tuon oikeanpaan suuntaan sisentää niin se näyttää tältä, meneekö ohjelman logiikka vielä niin kuin tarkotit?
.. for(i=0; i < 5; i++) { for(x=0; x < 5; x++) { cout << matriisi[i][x] << " "; } if(i < 4){cout << endl;} }
Menee kyllä, koska tuon voi esittää myös näin.
for(i=0; i < 5; i++) { for(x=0; x < 5; x++) { cout << matriisi[i][x] << " "; } cout << endl; }
Tekee siis aivan saman asian, koska i on aina pienempi kuin 4 paitsi viimeisellä kierroksella, jolloin rivin vaihdolle ei ole tarvetta.
Teuro kirjoitti:
Tekee siis aivan saman asian, koska i on aina pienempi kuin 4 paitsi viimeisellä kierroksella, jolloin rivin vaihdolle ei ole tarvetta.
Rivinvaihdolle on aina tarvetta. Tuossa ohjelmassa rivinvaihdon puute taulukon lopusta on korjattu virheellisesti sillä, että on lisätty rivinvaihto laske_summa-funktioon, jonka ei tietenkään pitäisi tulostaa rivinvaihtoa, kun ei kerran tulosta muutakaan.
Oikea ratkaisu olisi siis ottaa laske_summa-funktiosta rivinvaihdon tulostus pois ja sen vastaavasti poistaa tuo ehto taulukon tulostamisesta, jolloin rivinvaihto tulostuisi siellä, missä sen loogisesti kuuluu.
Myös sisennykset ovat yleisesti olleet pielessä, kuten moneen kertaan on jo mainittu. Lisäksi i ja x on nimetty hassusti, loogiset vaihtoehdot olisivat i ja j tai x ja y.
Tulostusfunktio olisi siisteintä toteuttaa näin:
void tulosta(int t[5][5]) { // Joka riville... for (int i = 0; i < 5; ++i) { // Tulostetaan neljä lukua ja kunkin perään väli. for (int j = 0; j < 4; ++j) { std::cout << t[i][j] << " "; } // Tulostetaan viimeinen erikseen ja sen perään rivinvaihto. std::cout << t[i][4] << std::endl; } }
Aihe on jo aika vanha, joten et voi enää vastata siihen.