Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Matriisifunktiot

Sivun loppuun

kermiitti [10.04.2009 10:03:43]

#

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

os [10.04.2009 10:16:44]

#

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.

kermiitti [10.04.2009 10:26:25]

#

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

}
}

os [10.04.2009 10:41:02]

#

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

kermiitti [10.04.2009 10:55:57]

#

Voiko näin tulostaa taulukosta?

{
cout << tulosta_matriisi[i][x];
}

os [10.04.2009 11:15:47]

#

Ei tietenkään, koska taulukkosi nimi on matriisi eikä tulosta_matriisi.

kermiitti [10.04.2009 12:00:29]

#

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;

}
}
}

Teuro [10.04.2009 12:13:12]

#

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

eq [10.04.2009 13:23:31]

#

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.

kermiitti [10.04.2009 15:09:38]

#

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;

}

Jalmari91 [10.04.2009 16:59:20]

#

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.

User137 [10.04.2009 23:46:40]

#

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

Teuro [11.04.2009 09:12:18]

#

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.

Metabolix [11.04.2009 09:59:43]

#

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

Sivun alkuun

Vastaus

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

Tietoa sivustosta