2x2 Matrix einlesen und in einer Funktion größtes Element bestimmen



  • Hallo,

    ich bin neu im Forum und in der Welt von C. Wir haben im Betreff stehendes als HA auf und unten stehenden Code habe ich mit devc++ geschrieben. Probleme bereitet mir die maxwert Funktion, die mir von der eingelesenen 2x2 Matrix im main Teil das größte Element ausspucken soll. Vor allem weiß ich überhaupt nicht welchen Datentyp ich verwenden muss. Das gilt für Datentyp von a[2][2] in int main? für Datentyp von Funktion maxwert und für Datentyp von Übergabe Parametern in der Funktion?

    Wenn ich den Code so laufen lassen, dann liest er die 4 Elemente problemlos ein, stürzt aber dann beim Aufruf der Fkt ab. Die Matrix an sich ist richtig geschrieben. Das hab ich mit einer entsprechenden Ausgabe schon getestet. Sorry wenn beim Code nichts eingerückt ist. Beim Schreiben war es das noch?! Ich bitte um Hilfe! 😕 🙂

    long maxwert(long a[2][2]) {

    long max = a[1][1];
    int i,j;

    for (i=1; i<=2; i++) {
    for (j=1; j<=2; j++) {
    if (a[i][j]>max) {
    max = a[i][j];
    }
    }
    }
    return max;
    }

    int main(int argc, char *argv[])
    {
    long a[2][2];
    int i, j;

    for (i=1; i<=2; i++) {
    for (j=1; j<=2; j++) {
    printf("a[%d][%d]: ", i, j);
    scanf("%ld", &a[i][j]);
    }
    printf("\n");
    }
    printf("Das groesste Element: %lf\n", maxwert(a[2][2]));

    system("PAUSE");
    return 0;
    }



  • Dann lies dein Script nochmal durch.
    Arrays fangen in C immer beim index 0 an.

    Und nutze für Code die cpp-Tags. Text markieren und den C/C++ Button unter den 🙂 😉 anklicken.



  • a[2][2] ist übrigens kein Array sondern ein einzelnes Element.
    Bei deiner Definition von a ( long a[2][2]; ) existiert es allerdings noch nicht einmal.
    Warum? Siehe vorheriges Post.

    Beachte unbedingt die Compilerwarnungen und beseitige die Ursache dafür.



  • Ich habe das Programm mal neuformatiert, dann kann ich anhand der Zeilennummern die Fehler beschreiben:

    #include <stdlib.h>
    #include <stdio.h>
    
    long maxwert(long a[2][2])
    {
    	long max = a[1][1];
    	int i,j;
    
    	for (i=1; i<=2; i++)
    	{
    		for (j=1; j<=2; j++)
    		{
    			if (a[i][j]>max)
    			{
    				max = a[i][j];
    			}
    		}
    	}
    	return max;
    }
    
    int main(int argc, char *argv[])
    {
    	long a[2][2];
    	int i, j;
    
    	for (i=1; i<=2; i++)
    	{
    		for (j=1; j<=2; j++)
    		{
    			printf("a[%d][%d]: ", i, j);
    			scanf("%ld", &a[i][j]);
    		}
    		printf("\n");
    	}
    	printf("Das groesste Element: %lf\n", maxwert(a[2][2]));
    
    	system("PAUSE");
    	return 0;
    }
    

    Zeilen 1+2: fehlen bei Dir. Mache es Dir zur Angewohnheit, Programme so zu schreiben, dass beim Kompilieren keine Warnung ausgespuckt wird. Wurde bei Dir keine Warnung gegeben, dann stelle das Warnlevel höher ein. "stdlib.h" brauchst Du für die "system"-Anweisung, "stdio.h" brauchst Du für "printf" und "scanf".

    Zeile 6: kann man so machen, halte ich aber für etwas verwirrend. Fang mit "max=0" an. Die Variable max ist ein Long und wird von der Funktion zurückgegeben. Das heißt, die Funktion gibt ein Long zurück und damit hast Du auch den Datentyp der Funktion.

    Zeile 22: Da Du argc und argv nicht brauchst und eine nervige Warnung bekommst, kannst Du auch schreiben: "int main (void)".

    Zeile 24: Bei der Deklaration eines Arrays wird die Anzahl der Elemente angegeben. Da ein Array in C immer beim Index 0 beginnt, ist der letzte Index um 1 weniger als die Anzahl bei der Deklaration. Ein "long max = a[1][1];" beinhaltet also nur ein Element: a[0][0]. Später zählst Du aber von a[1][1] bis a[2][2] hoch. Sofern Du die Zählerei beibehältst, musst Du die Deklaration wie folgt verändern: "long max = a[3][3];". Und entsprechend wird es auch der Kopf der Funktion "maxwert" verändert: "long maxwert(long a[3][3])".

    Zeile 36: 1) Tippfehler: Statt "%lf" muss es "%ld" heißen.
    2) Die Funktion maxwert bekommt das ganze Array übergeben und nicht nur das Element a[2][2]. Der Aufruf heißt also "maxwert(a)".

    viele grüße
    ralph



  • rkhb schrieb:

    Zeile 6: kann man so machen, halte ich aber für etwas verwirrend. Fang mit "max=0" an.

    Das ist kein guter Tipp. Da ist die Version vom TO wesentlich besser.
    Das Array kann ja auch nur negative Werte enthalten. Dann wäre bei dir der Maximalwert 0. Das ist dann falsch.

    Wenn dann solltest du LONG_MIN nehmen. Aber wenn du das erste Arrayelement nimmst liegst du immer richtig, egal welcher Datentyp.



  • Okay schon mal vielen Dank für eure Hilfe. Das Hauptproblem konnte ich lösen. Er berechnet jetzt den größten Wert. Allerdings habe ich noch zwei kleine Probleme, die sich einfach nicht lösen lassen. a[0][1] wird stets als der Wert von a[1][0] ausgegeben. Ich sehe den Fehler nicht. Außerdem scheint das mit dem Systempause nicht richtig zu funktionieren. Wenn ich zum Schluss eine beliebige Taste drücke, stürzt das Programm ab.

    #include <stdio.h>
    #include <stdlib.h>
    
    long maxwert(long a[1][1]) {  
    
    long max = a[0][0];           
    int i,j;
    
      for (i=0; i<=1; i++) {            
          for (j=0; j<=1; j++) {        
              if (a[i][j]>max) {
                       max = a[i][j];  
              }     
          }
      }
      return max;                      
    }
    
    int main(void)
    {
        long a[1][1];
        int i, j;
    
        for (i=0; i<=1; i++) {
            for (j=0; j<=1; j++) {
                printf("a[%d][%d]: ", i, j);
                scanf("%ld", &a[i][j]);
            }
        printf("\n");
        }
    
        printf("Das groesste Element: %ld\n", maxwert(a));
    
      system("PAUSE");	
      return 0;
    }
    


  • 1. Array-indizes fangen immer bei 0 an, aber beim anlegen von Arrays musst du als Größe die tatsächliche Länge nehmen, also wieder:

    long a[2][2];
    

    Die Arrayelemente sind dann von 0 bis 1 durchnummeriert. SOmit stimmen die for-Schleifen, wie sie jetzt sind.

    Stürtzt das Problem tatsächlich ab (woher weißt du das?), oder beendet es sich nur einfach? Denn Beenden wäre erklärbar.



  • Danke!! Jetzt hab ich a[2][2] in der main und bei den Übergabeparametern richtig deklariert. Jetzt funzt alles!!
    Das Problem mit dem Abstürzen hat sich auch damit erledigt. Danke 👍 :p 😃



  • Bei der Definition von einem Array wird die Anzahl der Elemente Angegeben.

    In C ist es üblich bei der for-Schleife auf < zu testen.
    Wenn die Schleife bei 0 anfängt, hat das den Vorteil, dass du die Anzahl der Durchläufe hinschreiben kannst.
    Bzw. kannst du den Wert benutzen, der auch bei der Definition des Arrays angegeben wird.

    for (i=0; i<2; i++) { // 2 Durchläufe. 
            for (j=0; j<2; j++) {
                printf("a[%d][%d]: ", i, j);
                scanf("%ld", &a[i][j]);
            }
            printf("\n");  // hier war die Einrückung nicht ganz richtig.
        }
    

Anmelden zum Antworten