Matrix Spiegeln



  • Irgendwie stehe ich gerade total auf dem Schlauch, ich versteh überhaupt nicht, was gerade das Problem ist.

    Ich möchste eigentlich einfach nur eine Matrix der Größe N (#define N 10) an der Hauptdiagonale spiegeln:

    void spiegeln(char matrix[N][N]) {
    	for (int i = 0; i < N; i++) {
    		for (int k = 0; k < N; k++) {
    			char temp = matrix[i][k];
    			matrix[i][k] = matrix[k][i];
    			matrix[k][i] = temp;
    		}
    	}
    
    }
    

    Ich sehe im Debugger, dass sich die Werte wie erwartet ändern, aber wenn ich die Matrix ausgebe, dann ist sie genau wie davor.

    Also wenn ich diese Ausgabe direkt unter die äußer for-schleife IN der Funktion packe:

    for (int i = 0; i < N; i++) {
        for (int k = 0; k < N; k++) {
            printf("%c ", matrix[i][k]);
        }
        printf("\n");
    }
    

    Dann ist die Ausgabe davor und danach identisch.

    Es ist zu spät, ich peil gerade überhaupt nicht mehr, was passiert.



  • Ach ... ich spiegel natürlich im gleichen Zug hin und auch wieder zurück.

    Oh Gott ey.

    Sehe ich das richtig, dass ein

    if (k < i)
       continue;
    

    in der innern for-Schleife das Problem lösen würde? Ich habs gerade ausprobiert aber bin nicht mehr mental auf dem Level zu erkennen, ob das jetzt stimmt.



  • Schlauch schrieb:

    Sehe ich das richtig, dass ein

    if (k < i)
       continue;
    

    in der innern for-Schleife das Problem lösen würde?

    Schon, aber wenn du von 1 bis 10 laut zählen willst, zählst du dann im Kopf von 1 bis 100 und überlegst dir vor jeder Zahlnennung, ob du schon über 10 hinaus bist - oder zählst du einfach nur bis 10? Ich will damit sagen: verkürze doch einfach deine innere Schleife!

    Also entweder so:

    for (int k = i + 1; k < N; k++) {
    

    oder andersrum tauschen:

    for (int k = 0; k < i; k++) {
    

    Der Fall k=i liegt auf der Diagonalen und braucht daher nicht behandelt werden - bei deinem continue könntest du also auf <= testen.


Anmelden zum Antworten