Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Multitaulukko... taulukko[10][10]

Sivun loppuun

Shooter99 [27.10.2012 08:42:00]

#

Moi,

kun en mistään löydä vastausta tähän kysymykseeni niin kysyn täältä...

Eli ongelmaa ei sinällänsä ole mutta on kuitenkin...

int taulukko[3][3]{1, 1, 1,
                   2, 2, 2,
                   3, 3, 3}

eli minulla on multidim taulukko ja yritän saada taulukon tulosta laskettua yhteen.

Saan tuloksen kyllä näin

tulos = taulukko[0][0] + taulukko[0][1] + taulukko[0][2] + taulukko[0][3]...

Mutta kuten olen monesta paikasta lukenut niin lyhyempi koodi on parempi kuin pirun pitkä, ja pitkässä on tietenkin mahdollisuus helpommin virheille...

Okei sitten yritin seuraavaa...

int taulukko[3][3]{1, 1, 1,
                   2, 2, 2,
                   3, 3, 3}
int y, x, tulos;

int main (){

        for(y = 0; y < 3; y++){


        for(x = 0; x < 3; x++){


                        if(x == 2) {
                                printf("%d\n", matriisi[y][x]);
                           } else {
                                printf("%d\t", matriisi[y][x]);
                                 }

                }

        }
     tulos += taulukko[y][x];
//     tulos = taulukko[y][x]++);
     printf("tulos on %d", tulos);
}

Sekä yritin for lausekkeen jälkeen sijoittaa

scanf

funktiota tallentamaan tuloksia mutta eihän siitä mitän apua ole käytännössä kun luvut on jo alustettu matriisiin...

Eli olisiko jossain opas tai hyvä vinkki näihin monitasoisiin taulukoihin kun kaikki opukset alkaa hienosti kertoon niistä mut sit hypätäänkin yhtä äkkiä siihen miten kirjaimet tallentuun taulukkoon jne jne...

The Alchemist [27.10.2012 10:14:58]

#

Minkä ihmeen takia te ihmiset copy-pasteatte aina jotain rikkinäistä paskaa tänne foorumeille? Tuokaan koodi ei ole lähimainkaan toimiva. Mitään suoraa kysymystäkään et ole antanut, joten tuon perusteella ongelmasi havaitseminen on melko mahdotonta.

1. Kerro selkeästi, mitä haluat saada aikaan ja mihin olet jäänyt aiemmin jumiin.
2. Älä käytä esimerkkinä sekavaa koodia, joka ei edes mene kääntäjästä läpi.

Jaska [27.10.2012 10:35:39]

#

Tulos-muuttujaa pitää kasvattaa for-luuppien sisällä. Et ole nimennyt muuttujaa matriisi koodissasi.

Shooter99 kirjoitti:

Eli olisiko jossain opas tai hyvä vinkki näihin monitasoisiin taulukoihin

Ei monitasoiset taulukot ole muuta kuin yksitasoisia taulukoita, jonka alkiot ovat taulukoita.

Macro [27.10.2012 10:37:58]

#

Pitäiskö tulos += taulukko[x][y]:n olla jälkimmäisen for-loopin sisällä ja sieltä löytyvän matriisi-taulukon nimenä taulukko? Entä pitäisikö (?) tulos-muuttuja alustaa, ennen kuin koitat lisätä siihen mitään +=-operaattorilla?

Shooter99 [27.10.2012 13:26:18]

#

Esimerkkitulostus

Taulukon:
4 6 25 88 5
34 5 300 4 65
78 43 11 90 125
98 585 12 63 21
45 35 9 5 1

alkioiden summa on 1757

Tämä on se mitä olisi tarkoitus tehdä...
Eli taulukko[5][5] on todellinen mutta koitan saada eka toimiin [3][3]:lla...
jotta tuloksen oikein lasku on helpompaa...

jalski [27.10.2012 13:55:19]

#

Kuten Jaska aiemmin sanoi, kaksiulotteisen taulukon hahmotat ajattelemalla sen olevan taulukko mikä koostuu taulukoista. C käyttää Row-major järjestystä, eli taulukon rivit on tallennettu muistissa peräkkäin. Lisäksi C:n kanssa touhutessa kannattaa sisäistää taulukoiden ja osoittimien yhteys.

Harjoittele alusta pitäen sisentämään koodisi jotenkin järkevästi. Myöskään muuttujia, joita ei tarvita kuin yhdessä paikassa on turha määritellä globaaleiksi.

Kokeilepa:

#include <stdio.h>

int main(void)
{
  int taulukko[3][3] = { 1, 1, 1,
                         2, 2, 2,
                         3, 3, 3  };

  int col, row, summa = 0;

  for (row = 0; row < 3; row++)
    for (col = 0; col < 3; col++)
      summa += taulukko[row][col];

  printf("Kaksi ulotteisen taulukon summa on: %d\n", summa);

  return 0;
}

Shooter99 [28.10.2012 15:45:33]

#

Moi jalski!

Kiitos paljon !

Juuri tälläistä halusin mistä pystyn hyvin selkeästi näkemään mitä mikäkin rivi tekee...

Koitin tuossa eilen kanssa tuota toista for laukseketta.

for(i = 0; i < 5; i++) {
    for (i=0; i<5; i++){
        sum=sum+matriisi[i][j];

mutta ilmeisesti tuo alempi olisi pitänyt olla j:llä eikä i:llä...

Täng juu...

Lisäys:

Tuossa koitin tuota koodia minkä olit jarski tehnyt niin se antaa tulokseksi 36...
käsittääkseni siitä jää pois yksi kierros...

yleisesti ottaen miten tuo taulukko laskee summan ?
meneekö se vaaka rivit eka läpi vai pystyrivit?

noh rupean tutkimaan tuon toimintaa ja jalostamaan sitä...

jalski [28.10.2012 16:25:46]

#

Shooter99 kirjoitti:

Tuossa koitin tuota koodia minkä olit jarski tehnyt niin se antaa tulokseksi 36...
käsittääkseni siitä jää pois yksi kierros...

Kyllä tuosta esimerkistäni 18 pitäisi tulla summaksi.

lainaus:

yleisesti ottaen miten tuo taulukko laskee summan ?
meneekö se vaaka rivit eka läpi vai pystyrivit?

Katso looppien järjestystä ja päättele. Mainitsinhan aiemmin, että C käyttää Row-major järjestystä. Toisin sanoen taulukko käydään läpi rivi kerrallaan.

Kiinnostaa, mitä C-kääntäjää käytät? Kannattaa aloitellessa valita sellainen, mikä tarjoaa ajonaikaisen tarkistuksen käännösaikaisen lisäksi. Siten saisit kääntäjästä läpi mennyttä virheellistä ohjelmaa ajaessa kivan virheilmoituksen ja rivin tietoosi, miltä etsiä virhettä.

Shooter99 [28.10.2012 22:05:39]

#

Käytän tällä hetkellä CodeBlocksia...

Shooter99 [29.10.2012 10:56:30]

#

Moi...
Okei, sain ohjelman toimimaan niin kuin sitä pyydettiin...

#include <stdio.h>

int main (){

        int matriisi[5][5] = {4, 6, 25, 88, 5,
                              34, 5, 300, 4, 65,
                              78, 43, 11, 90, 125,
                              98, 585, 12, 63, 21,
                              45, 35, 9, 5, 1};

  int c, r, summa = 0;
      printf("Taulukon:\n");

      for (r=0; r<5; r++)
        for (c=0; c<5; c++)


                        if(c == 4) {
                            printf("%d\n", matriisi[row][col]);
                        }
                        else {
                            printf("%d ", matriisi[row][col]);
                        }

      for (r=0; r<5; r++)
        for (c=0; c<5; c++)
          summa = summa + matriisi[r][c];

        printf("alkioiden summa on %d\n", summa);

        return 0;
    }

nyt sitten tiedustelin seuraavaa asiaa että onko toi FOR looppi tehtävä oikeasti 2 kertaa jotta saa tulostettua sekä matriisin ruudulle ja laskettua tuloksen ?

Tuntuu jotenki typerältä mutta kaikilla muilla tavoilla tulokseksi tuli aina 0...

Varmaan sais ihan erillisellä aliohjelmalla helposti mutta ku ei osaa vie käyttää niitä niin jätetään se toistaiseksi väliin...

mitä muuten printf lauseessa tekee \t ?

google anto jotain ihan ihme taulukkoja missä käsiteltiin jotain ihan muuta...

-tossu- [29.10.2012 12:31:47]

#

Toki voit laittaa sekä tulostuksen että laskun samaan for-looppiin. Laita lasku sisempään looppiin heti else-lohkon jälkeen.

Nykyisellään koodisi ei tosin edes käänny; siellä on esittelemättömät muuttujat row ja col. Vaikka for-loopeissa ei nykyisessä koodissasi aaltosulkuja tarvitsekaan olla, kannattaa niitä käyttää, sillä niiden jättäminen pois väärässä paikassa voi aiheuttaa erikoisia ongelmia.

Merkintä \t merkkijonon sisällä tarkoittaa tabulaattoria.

Shooter99 [29.10.2012 14:31:30]

#

Moi!

Huomasin kans että oli jäänyt col ja row tonne pariin kohtaan...

Kiitoksia vastauksista...

Seuraava aihe seuraavassa ketjussa...


Sivun alkuun

Vastaus

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

Tietoa sivustosta