Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Taulukon alkioiden summa

Sivun loppuun

Aloittelija2 [21.12.2004 10:11:08]

#

Sanokaas viisaammat mikä tässä on vikana kun sen pitäisi toimia seuraavasti: sen pitäisi tulostaa taulukko näytölle, sekä laskea taulukon alkioiden summan ja jokaisen rivin perään tulostetaan rivinvaihtomerkki.

#include

main()
{
int eka_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 summa_matriisi[5][5];
int y, x;

for(y = 0; y < 5; y++)
{
for(x = 0; x < 5; x++)
{
summa_matriisi[y][x] = eka_matriisi[y][x];

if(x == 4) {
printf("Taulukon: %d\n", summa_matriisi[y][x]);
}
else {
printf("alkioiden summa on %d\t", summa_matriisi[y][x]);
}
}
}
}

FooBat [21.12.2004 10:29:46]

#

Jospa vaikka vähän yrittäisit ensin itse miettiä mitä tuo sinun koodisi tekee ja mitä sen pitäisi tehdä.

1. Mitä ihmettä teet summamatriisilla. Summahan on yleensä vain yksi luku.

2. Jos haluat laskea summaa, kannattaa jonnekin varmaan laittaa '+'-merkki.

3. Jos haluat tulostaa eka_matriisin, kannattaa varmaan tulostaa sen alkioita eikän jonkun muun.

4. Miksi tulostelet jotain hassuja tekstejä jokaisen taulukon alkion kohdalla. Noi for-silmukan sisällä olevat koodit ajetaan niin monta kertaa kuin for:in ehto on tosi (tässä tapauksessa 25 kertaa). Et varmaan halua tulostaa summaa 25 kertaa.

Eli alapas nyt ihan rauhassa miettimään mitä sinun pitää tehdä ja miten. Tämä EI ole vaikea tehtävä ja sen tarkoitushan on opettaa sinua ohjelmoimaan ja miettimään loogisesti. (Tämähän oli taas niitä koulutehtäviä.)

Kai sulla on edes oma C-kääntäjä jolla oikeasti testaat koodiasi? Jos ei, niin hankipa äkkiä sellainen.

firebug [21.12.2004 10:58:04]

#

Foobat: Matriisien summa lasketaan laskemalla yhteen samoilla paikoilla matriiseissa olevat luvut ja laittamalla tulos summamatriisiin samaan kohtaan.(hieman hankala selittää)

Nämä "Aloittelija2" ja "Ahvenisto" jotka kyselevät apuja tällaisiin helppoihin tehtäviin tuntuvat olevan sama henkilö(ainakin sähköpostiosoitteen perusteella). Myös mureakuhassa samanlaisilla tunnuksilla on tällaisia tehtäväratkaisuja kyselty.

Metabolix [21.12.2004 11:02:29]

#

Lue se C-opas, opettele ohjelmoimaan (ajattelemaan) itse, ja kaikkein eniten: tee itse koulutehtäväsi!

Vihjeenä: Laske ensin summa ja mieti sen jälkeen tulostusta.

Jaska [21.12.2004 15:18:19]

#

lainaus:

(hieman hankala selittää)

Eikä ole. A_{i}{j}=B_{i}{j}+C_{i}{j}. Tässä käytetty LaTeX-tyyppistä merkintätapaa.

firebug [21.12.2004 16:31:19]

#

Jaska kirjoitti:

Eikä ole. A_{i}{j}=B_{i}{j}+C_{i}{j}. Tässä käytetty LaTeX-tyyppistä merkintätapaa.

Tuollaisia merkintätapoja kun moni vaan ei ymmärrä(kuten minä :)

Metabolix [21.12.2004 16:36:06]

#

No laitetaan sama sitten C-funktiona:

void LaskeYhteen(int **Matriisi_A, int **Matriisi_B, int **Summa, int Koko)
{
  int x, y;
  for (x = 0; x < Koko; x++)
    for (y = 0; y < Koko; y++)
      Summa[x][y] = Matriisi_A[x][y] + Matriisi_B[x][y];
}

Ymmärtäisin kuitenkin tuon Aloittelija2:n kysymyksen niin, että pitäisi laskea yhteen kaikki matriisin alkiot, eli tällä kaavalla (tietenkin for-loopin avulla)

Summa = M[0][0] + M[0][1] + ... + M[4][4];

Koipio-ohjelma [21.12.2004 17:24:37]

#

Matriisin koosta (4x4) päättelisin, että Metabolix käyttää DirectX:ää graafiikan tulostukseen(ja muutenkin käyttää)...
Meni kyllä vähän aiheen vierestä, mutta haittaako...
Paitsi ehkä moderaattoreita...

tejeez [21.12.2004 17:38:38]

#

4x4? o_O
Eikös tuo ole 5x5

Koipio-ohjelma [21.12.2004 17:45:13]

#

Eikun joo, ninhän se on...
Unohdin laskea nollan mukaan... Ei kylläkään kovinkaan harvinainen virhe... Eipä tuo sitten ole DX:n käyttämän matriisin koko, mutta kun selasin keskustelu aluetta, niin käyttäähän Metabolix siltikin DX:ää :D Arvaus meni oikein, ja katsoin... Siis, en tajunnut, matriisin kokoa

Niin, ja pitääkö siinä Aloittelija2:n koodissa olla jotain siinä #includessa :D

Metabolix [21.12.2004 19:42:03]

#

[offtopic]
Kyllä Metabolix käyttää OpenGL:ääkin, mutta siitä ei ole kummempaa puhetta ollut. Matriiseja en ole tarvinnut, kun ei ole 3D:tä tullut vielä tehtyä, ja löytyisikö DX:stä peräti joku luokka matriisille, ettei tarvitse itse osata laskea niitä yhteen.
[/offtopic]

Mutta eiköhän olisi jo aika päästää Aloittelija läksyjään miettimään ja antaa tämän aiheen vaipua... Turha turhaan antaa turhaa toivoa turhilla viesteillä turhaan aiheeseen, ja turha neuvoa turhan helpon tehtävän tekemisessä, kun se on koulutehtävä. 7 turhaa :)

Aloittelija2 [22.12.2004 10:09:39]

#

Metabolixi:lle: Niin mitä varten tämä keskustelupalsta on? No kyllä säkin vielä miehistyt, viimeistään armeijassa! Olet meinaan vielä niin nuori, että taitaa olla vaippa märkänä...

Tarvitsen vihjeitä en sitä, että ratkaisette mulle tehtävän valmiiksi. Olen saanut aina koodin pätkän tehtyä. Se on siis mun tekemä EI kenenkään muun. Olisi eri juttu jos sanoisin tässä tehtävä tehkää koodi mulle.

"Nämä "Aloittelija2" ja "Ahvenisto" jotka kyselevät apuja tällaisiin helppoihin tehtäviin tuntuvat olevan sama henkilö(ainakin sähköpostiosoitteen perusteella). Myös mureakuhassa samanlaisilla tunnuksilla on tällaisia tehtäväratkaisuja kyselty."

Uuuuuh, kyllä nyt pelottaa. Ainakin hirttoköysi pitää ottaa esille. Tuli tehtyä syntiä.
Edelleen ihmettelen mitä tälläkin palstalla tekee jos täältä ei saa apua kysyä?

Antti Laaksonen [22.12.2004 10:32:48]

#

Totta kai apua saa kysyä, myös koulutehtäviin. Kuitenkin kysyjän itsensä pitää olla juonessa mukana. Ei riitä, että liittää viestiin tehtäväksiannon ja jonkun toimimattoman koodinpätkän, jossa ei ole päätä eikä häntää. Kysymyksen pitää olla tarkempi ja siinä pitää ilmetä, mikä osa ohjelmassa ei toimi tai minkä jutun toteuttaminen ei onnistu.

Ohjelmoinnissa täytyy tosiaankin ymmärtää, mitä on tekemässä. Silloin perusvirheet pystyy melkein aina löytämään itsekin. Ja kun keskusteluun tulee vastauksia, ne kannattaa lukea huolellisesti. On aika turhauttavaa toistaa moneen kertaan sama asia. Toisten haukkumiseen ja ivailuun ei sitä vastoin kannata syyllistyä. Semmoisen viestin kirjoittamista katuu aina jälkeenpäin.

Aloittelija2 [22.12.2004 12:18:16]

#

Niin muahan tässä ei tosiaan ole haukuttu yhtään!? Te kun ette tajua, että mä en YMMÄRRÄ näitä asioita. Ja ihan turha sanoa, että lue saatana toi c-opas! Ihan kun mulla ei olis pöytä täynnä oppaita ja silti on vaikea ymmärtää...

FrozenFire [22.12.2004 12:20:50]

#

Täällä tosiaan on alkavan riidan tuntua...

Kysymisessä ei tosiaan ole mitään haittaa.

koulussa opittua:"Tyhmä kysymys on se jota ei kysytä..."

Mutta aivan perusjuttuja ei täällä(kään) tarvitsisi kysyä. Koska ne löytää hyvin jostain ohjelmointi oppaasta (menee vaikka kirjastoon...). Monesti oppii jopa paremmin ku näkee hieman vaivaa ja tutkii asioita.

Kannattaa hommata hyvä kirja ja edetä sitä järjestyksessä, ja opetella mitä sieltä löytyy yhden kirjan jälkeen on jo Paljon viisaampi.

Metabolix [22.12.2004 12:54:43]

#

lainaus:

Ihan kun mulla ei olis pöytä täynnä oppaita - -

No minä veikkaan, että täältä ei löydy ihmeopettajaa, joka osaa selittää asiat paremmin kuin yksikään julkaistu opas. Ne asiat pitää vain yrittää ymmärtää, ei niitä voi kovin monella eri tavalla selittää. Tunnen ihmisiä, joilla olisi motivaatiota, mutta he eivät vain millään ymmärrä.

Varmasti saisit tuonkin koodin korjattua, kun ottaisit oppaan käteen ja lukisit siitä:

"#include-lauseella sisällytetään projektiin muita tiedostoja. Syntaksi on seuraava: - -"
Oho, tuosta puuttuu se sisällytettävä tiedosto!

"Ohjelman pääfunktio on int main(void)"
Oho, tuosta puuttuu int (ja void, jos tämä on C:tä eikä C++:aa).

Ja kuten FooBat tuolla alussa on jo maininnut, se plus-merkki voisi olla aika hyvä lähtökohta yhteenlaskulle.

Suosittelisin vielä koodin sisentämistä, niin se olisi selkeämpää.

FooBat [22.12.2004 13:29:06]

#

En tahtoisi olla tyly, mutta näin helpot tehtävät on henkilön tehtävä itse, että niistä jotain oppii. Näiden kurssien alkupään ohjelmointitehtävien on tarkoitus olla pehmeä lasku ohjelmointiin. Jos et tule ymmärtäneeksi miten nämä alkupään tehtävät tehdään, tulet jatkossa kysymään kaikkia Voipe:n tehtäviä täällä putkassa ja se ei ole kenenkään etu (etenkään sinun itsesi).

Tämän tehtävän tarkoitus on opastaa sinua sinua C:n silmukkarakenteiden toimintaan. Silmukat sinulla olikin oikean, mutta et nähtävästi tiedä mitä ne tekee. Nyt olisi aika avata C-opas tai kirja kohdasta, jossa käsitellään toistorakenteita. Näissä oppaissa on yleensä hyviä selitettyjä esimerkkejä, joiden pitäisi auttaa ymmärtämään asiaa. Jos asiaa ei ymmärrä esimerkistä, pitää koodia alkaa itse muokkaamaan ja katsoa mitä muokkaukset tekee ja yrittää sitä kautta ymmärtää koodia (esim. joku printf("x") johonkin silmukan sisään).

Jos tuntuu siltä että et YMMÄRRÄ näitä asioita, tarkoittaa se vain sitä, että et ole edennyt tarpeeksi hitaasti ja käyttänyt aikaa asioiden kokeilemiseen. Eli menepä C-kirjassa 10 sivua taaksepäin ja aja kaikki koodiesimerkit läpi. Ei riitä, että luet ne vain paperista vaan sinun pitää oikeasti kirjoittaa ne tiedostoon, kääntää kääntäjällä, ajaa ohjelma, katsoa mitä ohjelma tekee, miettiä miksi ohjelma tekee niin, kokeilla yksinkertaisia muutoksia ohjelmaan, arvata mitä tämä muutos saa aikaa ja sitten katsoa tapahtuiko niin kuin kuvittelit. Ohjelmoinnin opettelemin vaatii työtä tai innostusta (mieluusti molempia)!

Hanki C-kääntäjä
Ilman, että itse ajat ohjelmia, et voi oppia asioita. Kääntäjä myös ilmoittaa millä riveillä on kielen kielioppivirhetä tai tuntemattomia muuttujia. Vihje: aloita virheiden korjaus ylimmästä virheestä; usein ensimmäinen virhe saa aikaan sen, että kääntäjä ilmoittelee ylimääriä virheit myöhemmin.
Ohjelmasi käännösvirheet (ainoastaa ensimmäinen on virhe, muut vain varoituksi, mutta nekin on syytä korjata):
$ gcc -Wall test3.c -o a.exe
test3.c:1:9: #include expects "FILENAME" or <FILENAME>
test3.c:4: warning: return type defaults to `int'
test3.c: In function `main':
test3.c:5: warning: missing braces around initializer
test3.c:5: warning: (near initialization for `eka_matriisi[0]')
test3.c:22: warning: implicit declaration of function `printf'
test3.c:29: warning: control reaches end of non-void function
Korjaamalla include:n ohjelma jopa kääntyi, mutta tulosti pitkän listan "alkioiden summa on 4 alkioiden summa on 6 alkioiden summa on 25..." tekstiä. Summalausetta siis tulostetaan liian paljon. Tätä pitää siis korjata jotenkin.

Eli luo oppaasta asiat, joita tulet tarvitsemaan tehtävässä. Kukaan ei keksi asioita vaan päästään, vaan yleensä jonkinlainen opiskelu on paikallaan.

Mieti mitä tehtävässä pitää tehdä. Jos asia tuntuu vaikealta , jaa tehtävä pienempiin ongelmiin, jotka osaat ratkaista. Esimerkiksi miten lasketaan matriisin alkioiden summa? Miten tekisit sen kynällä ja paperilla?

Sisennä koodiasi. Silmukkarakenteet vaikuttavat vain osaan koodia ja on helpompi ymmärtää mihin osaan jos sen suoraan näkee sisennyksestä.

for (rivi = 0; rivi < 5; rivi++) {
  printf("a");
  for (sarake = 0; sarake < 5; sarake++) {
    printf("b");
  }
  printf("c");
}
printf("d");

Kokeiles esimerkiksi tuollaista koodia ja yritä ymmärtää miksi mitäkin kirjainta tulostetaan niin monta kertaa kuin sitä tulostetaan.

En jaksa kirjoittaa näin pitkää viestiä jokaiseen vastaavan kaltaiseen kysymykseen. Sitä varten on C-oppaat, joista nämä samat asiat löytyvät. Tämä on eräs syys minkä takia täällä on aistittavissa pientä vihamielisyyttä.

Mutta älä pelkää kysyä mitään jatkossakaan, yritä vain ensin itse aavistuksen sinnikkäämmin ja sitten kysymystä esittäessä kerro mikä on se ongelma, jota et ymmärrä. Esim. joku outo kääntäjän virheilmoitus, ohjelman outo kaatuminen tai että ohjelma tulostaa jotain mitä se ei kertakaikkiaan sinun järkeilyn mukaan voi tulostaa. Kyllä täällä autetaan, jos tuollaisia kysytään. Sen sijaan jos esittää ohjelman, joka ei käänny eikä sisällä mitään logiikkaa ja sanoo, että korjatkaa tuo toimivaksi, niin ei voi odottaa kovin rakentavaa palautetta.


Sivun alkuun

Vastaus

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

Tietoa sivustosta