2016-04-13 4 views
-2

Ich bin ein neuer CS-Student und habe es schwer, zweidimensionale Arrays zu verstehen. Im Moment versuche ich es nur 1 Reihe hintereinander zu drucken.Ausdruck von 2-dimensionalen Arrays in C

Dies ist mein Code

#include <stdio.h> 

#define N 3 

int main(void) 

{ 
    int array[N][N], i, j, rows[N], cols[N]; 


    for(i=0;i<N;i++) 
    { 
     printf("Enter row %d: ", i+1); 
     for(j=0;j<N;j++) 
     scanf("%d", &array[i][j]); 
    } 
    printf("The 5 rows you entered are: \n"); 
    for(i=0;i<N;i++) 
    { 
     for(j=0;j<N;j++) 
     { 
      printf("%d", array[i][j]); 
      printf("\n"); 
     } 
    } 
    printf("\n"); 
    return 0; 
} 

Ich mag würde das Programm Druck haben aus:

1 2 3 
1 2 3 
1 2 3 

Wenn ich die \n es hinzufügen ausdruckt:

1\n 
2\n 
3\n 
1\n 
2\n 
3\n 
1\n 
2\n 
3\n 

Stellen Sie sich die \ ns als das vor, was der Bildschirm ausdruckt, ich bin tr ying zu repräsentieren, was der Code ausgibt. Ich habe Schwierigkeiten, diese Box zu bekommen, um genau auszudrucken, was ich eintippe. Es lässt mich nicht immer wieder hereintreten, um darzustellen, was tatsächlich auf dem Befehlsbildschirm ist.

ohne /n es ausdruckt

123123123 

ich auch hinzufügen Zeilen und Spalten versuche. Es gelang mir, einen Code zu finden und das meiste zu verstehen, bis auf eine Zeile. Dies ist der Code.

#include <stdio.h> 

int main(void) 
{ 
    int i, j, array[5][5], rows[5],cols[5]; 

    for(i=0;i<5;i++) 
    { 
     printf("Enter row %d: ", i+1); 
     for(j=0;j<5;j++) 
      scanf("%d", &array[i][j]); 
    } 
    **for(i=0;i<5;rows[i]=cols[i]=0,i++);** 
    for(i=0;i<5;i++) 
    { 
     for(j=0;j<5;j++) 
     { 
      rows[i]=rows[i]+array[i][j]; 
      cols[j]=cols[j]+array[i][j]; 
     } 
    } 
    printf("\nRow Totals: "); 
     for(i=0;i<5;i++) 
    printf("%d\t", rows[i]); 
    printf("\nColumn Totals: "); 
    for(i=0;i<5;i++) 
     printf("%d\t", cols[i]); 
    printf("\n"); 

    return 0; 
} 

for(i=0;i<5;rows[i]=cols[i]=0,i++);
ist die Linie, die ich nicht verstehe. Zunächst einmal verstehe ich die rows[i]=cols[i]=0,i++ nicht wirklich. Und zweitens verstehe ich nicht, warum es ein Semikolon gibt. Ich dachte für Anweisungen nicht Semikolons, aber das Programm funktioniert nicht korrekt ohne diese Zeile oder ohne Semikolon. Wenn ich versuche, es ohne diese Codezeile zu verwenden, gibt es mir verrückte Antworten, ich nehme an, weil die Elemente im Array nicht auf 0 gesetzt sind und diese Codezeile die Elemente der Arrays auf 0 setzt. Kann mir jemand geben eine andere Codezeile, die für jemanden, der relativ neu in C ist, verständlicher sein könnte? Und vielleicht erklären Sie mir, warum es ein Semikolon verwendet?

+0

Sie werden trhe Antworten einfachsten durch ein C Buch zu lesen, nicht durch besondere und möglicherweise nicht verwandte Fragen zu stellen. – Olaf

Antwort

4

Ich möchte das Programm Druck haben aus: 1 2 3 \ n 1 2 3 \ n 1 2 3 \ n

Do:

for(i=0;i<N;i++) 
{ 
    for(j=0;j<N;j++) 
    { 
     printf("%d", array[i][j]); 

    } 
    printf("\n"); 
} 


**for(i=0;i<5;rows[i]=cols[i]=0,i++);** 

ist sicher Syntaxfehler. Ich schätze, du hast ** hinzugefügt, um die Aussage zu markieren.

for(i=0;i<5;rows[i]=cols[i]=0,i++); 

ist eine gültige C-Anweisung. A für-Schleife kann

for(initilization;condition;increment) 

Die Semikolon trennt die drei Teile der for-Schleife in die Form aufgespalten werden. In Ihrem Fall der For-Schleife Inkrement Teil ist weiter unterteilt in mehrere Anweisungen mit Kommas wie unten.

for(initialization;condition;do something useful here, update condition variable); 

Der Zweck des Codes ist die Zeilen- und Spaltensummen auf Null , bevor sie tatsächlich zu finden, um die Summe zu initialisieren. Beachten Sie das Komma im Inkrementteil. Sie können mehrere Anweisungen hinzufügen. Ähnlich könnten Sie das Komma verwenden, um mehrere Initialisierungen oder mehrere Bedingungen zu haben.

Die Semikolon nach der For-Schleife ist ein Sequenzpunkt. Beachten Sie, dass Sie für die for-Schleife keine Anweisung/Compound-Anweisung haben. In einer einfachen Sprache sagt das Semikolon der For-Schleife, nichts zu tun. Aber Sie initialisieren die Zeilen- und Spaltensummen indirekt innerhalb der for-Schleife, die selbst intelligent ist.

Es ist klar, dass die Verwendung nicht sehr geradlinig ist. Wenn Sie diese Art von Aussagen nicht verstehen, schlage ich vor, dass Sie ein gutes C-Programmierbuch durchgehen.

2

for Schleifen haben vier Teile. Du bist wahrscheinlich zu Schleifen verwendet wie:

for (int i = 0; i < 10; i++) 
{ 
    printf("Hello!"); 
} 

oder

for (int i = 0; i < 10; i++) 
    printf("Hello!"); 

Der erste Teil (Setup), "int i = 0", zu Beginn der Schleife ausgeführt wird. Der zweite Teil (Testausdruck), "i < 10", ist die Bedingung, wird vor jeder Iteration überprüft und beendet die Schleife, wenn sie als false ausgewertet wird. Der dritte Teil (Inkrement), "i ++", wird am Ende jeder Iteration ausgeführt und nicht ausgewertet. Der vierte Teil (Körper), läuft nach dem zweiten Teil und vor dem dritten Teil.

In den Abschnitten setup und increment der for-Schleife können Sie Kommas verwenden, um mehrere Anweisungen zu trennen. Es wäre nicht sinnvoll, Kommas im Testausdruck zu verwenden, da es entweder wahr oder falsch auswerten muss. Es wäre auch nicht sinnvoll, im Körper Kommas zu verwenden, da Sie dort nur Semikolons verwenden können.

Es gibt keinen Grund, warum Sie die Schleife nicht verwenden können, um Ihre Arbeit für Sie zu erledigen. Im Beispiel Sie zur Verfügung gestellt:

for(i=0;i<5;rows[i]=cols[i]=0,i++); 

Sie schon verstehen, was die Schleife (Einstellung aller Werte in den Zeilen und Spalten-Arrays auf 0) Es tut es nur der Schleife im Zuwachs Teil tut, anstatt im Körper der Schleife. Es nutzt auch die Tatsache aus, dass die Zuweisungsoperation den zugewiesenen Wert auswertet. Also wird "cols [i] = 0" zu "0" ausgewertet, dem dann Zeilen [i] zugewiesen werden.

For-Schleifen behandeln jedoch immer die nächste Anweisung als ihren Körper. Wenn Sie der Schleife mitteilen möchten, dass sie überhaupt nichts tun soll, müssen Sie nach der Schleife eine leere Anweisung (ein Semikolon mit nichts davor) platzieren, damit sie nichts anderes tun kann.

Wenn Sie das Semikolon zu entfernen, dann wird es davon aus, dass die nächste Zeile der Körper der Schleife ist, die dieses Verhalten gibt:

for(i=0;i<5;rows[i]=cols[i]=0,i++) 
{ 
    for(i=0;i<5;i++) 
    { 
     for(j=0;j<5;j++) 
     { 
      rows[i]=rows[i]+array[i][j]; 
      cols[j]=cols[j]+array[i][j]; 
     } 
    } 
} 

Für die eigentliche Lösung für Ihr Problem, Antwort der Verwendung sjsam.

1

Minor Anpassung an die Ausgabelogik

printf("The %d rows you entered are: \n", N); 
for(i=0;i<N;i++) 
{ 
    for(j=0;j<N;j++) 
    { 
     if (j != 0) 
     { 
      putc(' '); /* add space if we are not the first column */ 
     } 
     printf("%d", array[i][j]); 
    } 
    putc ('\n'); /* new line after each row is complete */ 
} 
printf("\n");