Zeiger für ein mehrdemensionales Array setzen



  • Hallo.

    Habe folgendes kleines Berechnungsprogramm:

    /*************************************************************************/
    /*                        Klassenarbeiten                                */
    /*************************************************************************/
    
    #include <stdio.h>
    
    void main (void)
    {
      float matrix_a [4][5]   = {{3, 15, 10, 30, 14},  
    			     {16, 12, 12, 24, 8},
    			     {8, 5, 15, 20, 20},
    			     {10, 8, 14, 10, 25}},
    
       matrix_b [1][5]         = {{3, 2, 1, 2, 3}},    
    
       ges_pkte [1][4]         = {{0, 0, 0, 0}};
    
       int a,
           k;                                 
    
    /*************************************************************************/
    /* Berechnen der Ergebnisse und Speichern im Array ges_pkte[][]          */
    /*************************************************************************/
    
    for ( k=0; k<4; k=k+1) 
    { 
            for ( a=0; a<5; a=a+1) 
            { 
                    ges_pkte[0][k] += matrix_a[k][a] * matrix_b[0][a]; 
            } 
    }
    
    /*************************************************************************/
    /* Ausgabe der Werte der Arrays                                          */
    /*************************************************************************/  
    
      printf("\n\tDie Punkteverteilung fuer alle 4 Klassen:");
      printf("\n");  
      printf("\n\t  Nr der Aufg.   1       2       3       4       5    Gesamt Pkt.  ");
      printf("\n");  
      printf("\n\t  Klasse 8a:    %2.0f   |  %2.0f  |   %2.0f  |   %2.0f   |  %2.0f  |  %2.0f",
           	 matrix_a[0][0],matrix_a[0][1],matrix_a[0][2],matrix_a[0][3],matrix_a[0][4],ges_pkte[0][0]);
      printf("\n");  
      printf("\n\t  Klasse 8b:    %2.0f   |  %2.0f  |   %2.0f  |   %2.0f   |  %2.0f  |  %2.0f ",
             matrix_a[1][0],matrix_a[1][1],matrix_a[1][2],matrix_a[1][3],matrix_a[1][4],ges_pkte[0][1]);
      printf("\n");  
      printf("\n\t  Klasse 8c:    %2.0f   |  %2.0f  |   %2.0f  |   %2.0f   |  %2.0f  |  %2.0f ",
             matrix_a[2][0],matrix_a[2][1],matrix_a[2][2],matrix_a[2][3],matrix_a[2][4],ges_pkte[0][2]);
      printf("\n");  
      printf("\n\t  Klasse 8d:    %2.0f   |  %2.0f  |   %2.0f  |   %2.0f   |  %2.0f  |  %2.0f ",
             matrix_a[3][0],matrix_a[3][1],matrix_a[3][2],matrix_a[3][3],matrix_a[3][4],ges_pkte[0][3]);
      printf("\n");  
      printf("\n\t  Pkt/Aufg.:    %2.0f   |  %2.0f  |   %2.0f  |   %2.0f   |  %2.0f ",
    	 matrix_b[0][0],matrix_b[0][1],matrix_b[0][2],matrix_b[0][3],matrix_b[0][4]);
      printf("\n\n");
    
    }
    /*************************************************************************/
    

    Ausführung des Programms:

    Die Punkteverteilung fuer alle 4 Klassen:

    Nr der Aufg. 1 2 3 4 5 Gesamt Pkt.

    Klasse 8a: 3 | 15 | 10 | 30 | 14 | 151

    Klasse 8b: 16 | 12 | 12 | 24 | 8 | 156

    Klasse 8c: 8 | 5 | 15 | 20 | 20 | 149

    Klasse 8d: 10 | 8 | 14 | 10 | 25 | 155

    Pkt/Aufg.: 3 | 2 | 1 | 2 | 3

    Im Array matrix_a stehen von links nach rechts die Gesamtpunkte pro Aufgabe für die Aufgaben 1 bis 5 einer Klassenarbeit und von oben nach unten vier verschiedene Schulklassen.
    Im Array matrix_b stehen von links nach rechts die Punkte für die Aufgaben 1 bis 5 (Punktewertung/Aufgabe).

    Das Programm funktioniert. Nun möchte ich die Matrix aber über Zeiger ansprechen. Habe folgendes versucht:

    float *z_matrix_a = &matrix_a[0][0],
             *z_matrix_b = &matrix_b[0][0],
             *z_ges_pkte = &ges_pkte[0][0];
    
      printf("\n\tDie Punkteverteilung fuer alle 4 Klassen:");
      printf("\n");  
      printf("\n\t  Nr der Aufg.   1       2       3       4       5    Gesamt Pkt.  ");
      printf("\n");  
      printf("\n\t  Klasse 8a:    %2.0f   |  %2.0f  |   %2.0f  |   %2.0f   |  %2.0f  |  %2.0f",
           	 z_matrix_a,z_matrix_a++,z_matrix_a++,z_matrix_a++,z_matrix_a++,z_ges_pkte++);
      printf("\n");  
      printf("\n\t  Klasse 8b:    %2.0f   |  %2.0f  |   %2.0f  |   %2.0f   |  %2.0f  |  %2.0f ",
             z_matrix_a,z_matrix_a++,z_matrix_a++,z_matrix_a++,z_matrix_a++,z_ges_pkte++);
      printf("\n");  
      printf("\n\t  Klasse 8c:    %2.0f   |  %2.0f  |   %2.0f  |   %2.0f   |  %2.0f  |  %2.0f ",
             z_matrix_a,z_matrix_a++,z_matrix_a++,z_matrix_a++,z_matrix_a++,z_ges_pkte++);
      printf("\n");  
      printf("\n\t  Klasse 8d:    %2.0f   |  %2.0f  |   %2.0f  |   %2.0f   |  %2.0f  |  %2.0f ",
             z_matrix_a,z_matrix_a++,z_matrix_a++,z_matrix_a++,z_matrix_a++,z_ges_pkte++);
      printf("\n");  
      printf("\n\t  Pkt/Aufg.:    %2.0f   |  %2.0f  |   %2.0f  |   %2.0f   |  %2.0f ",
    	 z_matrix_b,z_matrix_b++,z_matrix_b++,z_matrix_b++,z_matrix_b++);
      printf("\n\n");
    

    Aber das ist wohl nicht ganz richtig ...

    Meine Fragen:
    Wie kann ich im Array matrix_a die einzelnen Punktezahlen in allen Zeilen und Spalten [4][5] ansprechen?
    Wie komme ich auf das Ausgabeergebnis, wie es mein Programm oben liefert?
    Wie schreibe ich die Anweisungen für die Zeiger richtig?
    Muss ich mehr Schleifen einsetzen?

    😕 😕 😕

    Gruß, Patrick



  • Sieht nach einem... falschen Forum aus.

    Edit: wie wär's mit der Ausgabe mithilfe einer Schleife? Das würde das ganze um 200% lesbarer/attraktiver fürs Auge machen.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x, bzw. C++11) in das Forum C (C89 und C99) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Prinzipiell schon mal richtig, wenn auch falsch umgesetzt.
    Die Auswertungsreihenfolge von Parametern einer Funktion ist undefiniert,
    dein "++" kann also "richtige" Ergebnisse liefern oder falsche.
    Auch musst du den Zeiger noch dereferenzieren mittels "*" oder [].

    void main (void)
    {
      float matrix_a [4][5]   = {{3, 15, 10, 30, 14},  
                     {16, 12, 12, 24, 8},
                     {8, 5, 15, 20, 20},
                     {10, 8, 14, 10, 25}},
    
       matrix_b [1][5]         = {{3, 2, 1, 2, 3}},    
    
       ges_pkte [1][4]         = {{0, 0, 0, 0}}, *p=matrix_a, *g=ges_pkte;
    
       int a,
           k;                                
    
    /*************************************************************************/
    /* Berechnen der Ergebnisse und Speichern im Array ges_pkte[][]          */
    /*************************************************************************/
    
    for ( k=0; k<4; k=k+1)
    {
            for ( a=0; a<5; a=a+1)
            {
                    ges_pkte[0][k] += matrix_a[k][a] * matrix_b[0][a];
            }
    }
    
    /*************************************************************************/
    /* Ausgabe der Werte der Arrays                                          */
    /*************************************************************************/  
    
      printf("\n\tDie Punkteverteilung fuer alle 4 Klassen:");
      printf("\n");  
      printf("\n\t  Nr der Aufg.   1       2       3       4       5    Gesamt Pkt.  ");
      printf("\n");  
      printf("\n\t  Klasse 8a:    %2.0f   |  %2.0f  |   %2.0f  |   %2.0f   |  %2.0f  |  %2.0f",
                p[0],p[1],p[2],p[3],p[4],*g++); p+=5;
      printf("\n");  
      printf("\n\t  Klasse 8b:    %2.0f   |  %2.0f  |   %2.0f  |   %2.0f   |  %2.0f  |  %2.0f ",
                p[0],p[1],p[2],p[3],p[4],*g++); p+=5;
      printf("\n");  
      printf("\n\t  Klasse 8c:    %2.0f   |  %2.0f  |   %2.0f  |   %2.0f   |  %2.0f  |  %2.0f ",
                p[0],p[1],p[2],p[3],p[4],*g++); p+=5;
      printf("\n");  
      printf("\n\t  Klasse 8d:    %2.0f   |  %2.0f  |   %2.0f  |   %2.0f   |  %2.0f  |  %2.0f ",
                p[0],p[1],p[2],p[3],p[4],*g++); p+=5;
      printf("\n");  
      printf("\n\t  Pkt/Aufg.:    %2.0f   |  %2.0f  |   %2.0f  |   %2.0f   |  %2.0f ",
         matrix_b[0][0],matrix_b[0][1],matrix_b[0][2],matrix_b[0][3],matrix_b[0][4]);
      printf("\n\n");
    
    }
    


  • Mein Hauptfehler war wohl hauptsächlich der Zeigerzusatz [*].
    Vielen Dank.


Anmelden zum Antworten