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
Laitat sinne fprintf("\n"); tulostuksen rivilooppiin.
#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?
/* Pelkkä rivinvaihto */ fprintf(summa,"\n"); /* Backspace ja rivinvaihto (eli kumittaa viimeisen välilyönnin pois) */ fprintf(summa,"\b\n");
Ei toimi tuo backspace homma tulostaa samalla lailla kuin ennenkin.
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)
Älä tulosta välilyöntiä, jos vuorossa on rivin viimeinen luku (j on 9).
Muoks. Grez oli nopeampi
Kiitti avusta Grez ja muut, nyt toimii.
if (viiminen numero rivillä) { tulosta pelkkä numero } else { tulosta numero ja välilyönti }
Aihe on jo aika vanha, joten et voi enää vastata siihen.