Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: Rivinvaihto matriisiin

Sivun loppuun

Plasmidi [30.09.2007 13:38:22]

#

Tehtävä:

Tiedostoissa "mata.txt" ja "matb.txt" on 10 x 10 suuruiset kokonaislukumatriisit. Tee ohjelma, joka laskee matriisien summan uuteen matriisiin. Tuloksena saatu summamatriisi tallennetaan tiedostoon "summa.usr".

#include<stdio.h>

int main()
{
    int a[10][10];
    int b[10][10];
    int i,j;

    FILE *mata,*matb,*summa ;

    if( (mata = fopen("mata.txt", "r"))==NULL)
    {
        printf("\nerror opening the file mata");
        exit(1);
    }
    if( (matb = fopen("matb.txt", "r"))==NULL)
    {
        printf("\nerror opening the file matb");
        exit(1);
    }
    if( (summa = fopen("summa.usr", "w"))==NULL)
    {
        printf("\nerror opening the file summa");
        exit(1);
    }
    for ( i=0;i<10;i++)
        for( j=0;j<10;j++)
            fscanf(mata,"%d",&a[i][j]);
    for ( i=0;i<10;i++)
    {
        for( j=0;j<10;j++)
            fscanf(matb,"%d",&b[i][j]);
    }

fprintf(summa, "%d", a[0][0] + b[0][0]);
for ( i=0;i<10;i++) {
    for( j=0;j<10;j++) {
        if(!(i == 0 && j == 0)) {
            fprintf(summa," %d",a[i][j]+b[i][j]);
        }
    }
}

printf("Matriisien summa on laskettu tiedostoon summa.usr.\n");

    return 0;
}

Olen tehnyt tuommoisen koodinpätkän, mutta ongelmana on, että se tulostaa matriisin ilman rivinvaihtoja. Miten saisin sen tulostamaan rivinvaihdot joka kymmenennen luvun välein? Eli näin:

5 45 46 58 650 12 14 13 13 3
11 9 49 73 11 61 15 14 13 10
11 48 41 48 49 13 7 81 8 48
11 35 49 14 13 12 6 8 8 15
11 10 12 14 6 11 14 14 4 7
11 10 12 14 6 14 14 14 8 7
11 6 9 14 10 12 6 8 8 15
11 9 38 8 10 13 4 81 8 8
11 6 49 11 5 9 13 13 13 10
1 45 46 8 70 12 11 11 13 3

Grez [30.09.2007 13:39:38]

#

Laitat sinne fprintf("\n"); tulostuksen rivilooppiin.

Plasmidi [30.09.2007 14:56:37]

#

#include<stdio.h>

int main()
{
    int a[10][10];
    int b[10][10];
    int i,j;

    FILE *mata,*matb,*summa ;

    if( (mata = fopen("mata.txt", "r"))==NULL)
    {
        printf("\nerror opening the file mata");
        exit(1);
    }
    if( (matb = fopen("matb.txt", "r"))==NULL)
    {
        printf("\nerror opening the file matb");
        exit(1);
    }
    if( (summa = fopen("summa.usr", "w"))==NULL)
    {
        printf("\nerror opening the file summa");
        exit(1);
    }
    for ( i=0;i<10;i++)
        for( j=0;j<10;j++)
            fscanf(mata,"%d",&a[i][j]);
    for ( i=0;i<10;i++)
    {
        for( j=0;j<10;j++)
            fscanf(matb,"%d",&b[i][j]);
    }

fprintf(summa,"%d ", a[0][0] + b[0][0]);
for ( i=0;i<10;i++) {
    for( j=0;j<10;j++) {
        if(!(i == 0 && j == 0)) {
            fprintf(summa,"%d ",a[i][j]+b[i][j]);
        }
    }
 fprintf(summa,"\n");
}

printf("Matriisien summa on laskettu tiedostoon summa.usr.\n");

    return 0;
}

Koodi on nyt tommonen ja toimii hienosti, mutta kun se laittaa ton rivinvaihdon merkin välilyönnin päähän aina rivin päässä, mutta pitäs saada se heti rivin viimisen numeron jälkee.

Ohjelmani laittaa siis näin:

5 45 46 58 650 12 14 13 13 3 ! (! on rivinvaihtomerkki)

Pitäisi mennä näin: 5 45 46 58 650 12 14 13 13 3! (! on rivinvaihtomerkki)

Miten saisin tuon korjattua?

TsaTsaTsaa [30.09.2007 15:39:00]

#

/* Pelkkä rivinvaihto */
fprintf(summa,"\n");

/* Backspace ja rivinvaihto (eli kumittaa viimeisen välilyönnin pois) */
fprintf(summa,"\b\n");

Plasmidi [30.09.2007 16:06:11]

#

Ei toimi tuo backspace homma tulostaa samalla lailla kuin ennenkin.

Grez [30.09.2007 16:14:32]

#

No jos korvaat tämän rivin

fprintf(summa,"%d ",a[i][j]+b[i][j]);

tällä

fprintf(summa,((j==9)?"%d":"%d "),a[i][j]+b[i][j]);

tai jopa

fprintf(summa,((j==9)?"%d\n":"%d "),a[i][j]+b[i][j]);

jolloin erillistä \n tulostusta ei tarvita.

Itse silti laittaisin ehkä sen näin ja tulostaisin \n erikseen.

fprintf(summa,(j?" %d":"%d"),a[i][j]+b[i][j]);

Tuon viimeisen selitys: Minusta on elegantinpaa jättää erotinmerkki tulostamatta ensimmäisellä ja tulostaa myöhemmillä ennen varsinaista tekstiä. Tästä on etuna se, että systeemi ei mene rikki vaikka määrä myöhemmin vaihtuisikin. Lisäksi tietysti tuosta on se näennäinen kikkaetu että nolla on suoraan false, niin ei tarvitse tehdä erikseen vertailua (paitsi jos kieli vaatii booleanin)

Antti Laaksonen [30.09.2007 16:15:57]

#

Älä tulosta välilyöntiä, jos vuorossa on rivin viimeinen luku (j on 9).

Muoks. Grez oli nopeampi

Plasmidi [30.09.2007 16:22:12]

#

Kiitti avusta Grez ja muut, nyt toimii.

Legu [30.09.2007 16:23:38]

#

if (viiminen numero rivillä) {
    tulosta pelkkä numero
} else {
    tulosta numero ja välilyönti
}

Sivun alkuun

Vastaus

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

Tietoa sivustosta