[Hilfe]Array mit scanf festlegen



  • Wollte mich gerade wieder etwas in C einüben und ein kleines Programm schreiben in dem ein Array ein und ausgegeben wird aber...

    #include <stdio.h>
    
    void main()
    {
    //_______Deklaration________
    
    double Matrix[3][3] =
    {
    	{0,1,2},
    	{3,4,5},
    	{6,7,8}
    };
    
    int m_zeile = 0;
    
    int aus_zeile = 0;
    
    //________Eingabe___________
    printf("---------Matrixberechnungen----------\n\n");
    printf("Bitte 9 Elemente einer 3-Reihigen Matrix eingeben: \n");
    
    //while(m_zeile <= 2)
    
    scanf("%.2f",&Matrix[1][1]);
    
    //________Berechnung_________
    
    //_________Ausgabe___________
    
    printf("\nMatrix: \n");
    while(aus_zeile <= 2)
    {
    printf("|%.2f %.2f %.2f|\n", Matrix[aus_zeile][0],Matrix[aus_zeile][1],Matrix[aus_zeile][2]);
    aus_zeile++;
    };
    
    }
    

    Das Element vom Array behält den initialisierten Wert, der eingelesene wird nicht übernommen.... warum 😕
    (eine direkte zuweisung ála Matrix[1][1]=345634 ist allerdings möglich... ich verstehs nicht....)



  • Dieser Thread wurde von Moderator/in CMatt aus dem Forum C# und .NET in das Forum ANSI C verschoben.

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

    Dieses Posting wurde automatisch erzeugt.



  • einruecken und diese blindmachenden underscores entfernen. dann benutze bitte [cpp] tags, damit syntax highlighting benutzt wird. danke

    am code seh ich nix auffaelliges. sollte laufen. compiler und version bitte.



  • Der scanf-String will einen Zeiger auf float.



  • wenn das so ist, willst du %lf



  • Danke für die schnelle Hilfe, mit scanf("%lf",...) funktioniert es... wofür steht denn "lf"?

    @c.rackwitz
    Werd ich versuchen zu beachten, aber was meinst du mit "underscores"?



  • "long float" = double 😉 lies dir doch mal man: scanf durch, da findest du auch alle Formatkennungen und -Modifikatoren.



  • Underscores sind die überall in den Kommentaren auftretenden _____
    Sowas trägt nicht gerade zur Lesbarkeit bei und Sinn hat es auch nicht.



  • CStoll schrieb:

    "long float" = double

    omg hätt ich mir ja denken können 😃

    @underscore
    Wollte es in mehrere Funktionen aufteilen und hab des nur mal vorab damit abgetrennt



  • Ok ich habe das Programm jetzt mal weiterentwickelt und bin nun auf ein Problem mit der Berechnung von n-reihigen Determinanten gestoßen.
    Ich poste mal das ganze Programm falls es sich jemand in die Entwicklungsumgebung kopieren möchte, der problematische Teil ist aber nur die "Det()" Funktion.

    #include <stdio.h>
    
    double Det();
    double Input();
    void Output();
    
    int row_count = 2; 
    double Matrix[5][5]; // Array maximaler notwendiger Größe
    
    void main()
    {
      char wiederholung = 'n';
    
      printf("---------Matrixberechnungen----------\n");
    
      do  // Wiederholung
      {
         Input(); // Eingabefunktion
         Output(); // Ausgabe/Determinante
    
    	 printf("\nWeitere Matrix berechnen? (j/n)\n");
    	 do
    	 {
    	    wiederholung = getch();
    	 }
    	 while(wiederholung != 'j' && wiederholung != 'n');
      }
      while(wiederholung == 'j');
    };
    
    double Input()
    {
      int m_zeile;
      int m_spalte;
      int zw_count;
      printf("\nBitte die Anzahl der Reihen der gewuenschten Matrix angeben: ");
    
    // Bestimmung der Reihen
      do
      {
         scanf("%d", &zw_count);
    	 if(zw_count < 2 || zw_count >5)
    	 {
    		 printf("\nFalsche Anzahl der Reihen! => Anderen Wert waehlen\n");
    	 };
      }
      while(zw_count < 2 || zw_count >5);
    
      row_count = zw_count - 1; 
    
    // Eingabe der Elemente
      printf("\n\nBitte %d Elemente der %d-Reihigen Matrix eingeben: \n", (row_count+1)*(row_count+1), (row_count+1));
    
      for(m_zeile = 0; m_zeile <= row_count; m_zeile++)
      {
        for(m_spalte = 0; m_spalte <= row_count; m_spalte++)
          {
            scanf("%lf",&Matrix[m_zeile][m_spalte]);
          };
      };
    
      return 0;
    };
    
    double Det()
    {
      int calc_part = 0;
      int row_inc = 0;
    
      double D = 0; 
      double d1 = 0;
      double d2 = 0;
      double atm_row = 1;
    
      int m_zeile = 0;
      int m_spalte = 0;
    
    // Determinante einer Matrix 
    // 2-reihige allgemein: a11*a22 - a12*a21
    // 3-reihige allgemein: a11*a22*a33 + a12*a23*a31 + a13*a21*a32 - a13*a22*a31 - a11*a23*a32 - a12*a21*a33
    // n-reihige allgemein: ?
    
      // >>>> Teil 1 <<<<
      // (+ a00*a11*a22 + a01*a12*a20 + a02*a10*a21) /C-Indizes
    
      printf("\n>>Berechnung der Determinante<<\n");
    
      while(calc_part <= row_count)
        {
           for(m_zeile = 0; m_zeile <= row_count; m_zeile++)
             {
             // aktuelles Element 
    
    	         printf("\nElement bisher = %.2f", atm_row); //Ausgabe Debugging 
    
    	         atm_row = atm_row * Matrix[m_zeile][m_spalte];
    
    			 printf(" * Matrix (zeile: %d spalte: %d Wert: %.2lf) = %.2lf\n", m_zeile+1, m_spalte+1, Matrix[m_zeile][m_spalte], atm_row); //Ausgabe Debugging 
    
    	         if(m_spalte >= row_count) {m_spalte = m_spalte - row_count;}
    	         else {m_spalte++;}
             };
           // Additionsteil
           d1 = d1 + atm_row; 
           m_spalte++;
    
           printf("\n Abschnitt = %d; Additionsteil bisher = %.2f\n", calc_part+1, d1); //Ausgabe Debugging 
    
           atm_row = 1;
           m_zeile = 0;
           calc_part++;
        };
    
      printf("\nErgebnis Additionsteil: %.2f\n_________________________________________________\n\n", d1); //Ausgabe Debugging 
    
      calc_part = 0;
      m_spalte = row_count;
    
      // >>>> Teil 2 <<<<
      // (- a02*a11*a20 - a00*a12*a21 - a01*a10*a22) /C-Indizes
    
      while(calc_part <= row_count)
        {
           for(m_zeile = 0; m_zeile <= row_count; m_zeile++)
             {
             // aktuelles Element 
    	         printf("\nElement bisher = %.2f", atm_row); //Ausgabe Debugging 
    
    	         atm_row = atm_row * Matrix[m_zeile][m_spalte];
    
    	         printf(" * Matrix (zeile: %d spalte: %d Wert: %.2lf) = %.2lf\n", m_zeile+1, m_spalte+1, Matrix[m_zeile][m_spalte], atm_row); //Ausgabe Debugging 
    
    			 if(m_zeile == row_count){}
    			 else if(m_spalte <= 0){m_spalte = m_spalte + row_count;}
    			 else {m_spalte--;};
    		 };
    
           // Subtraktion
           d2 = d2 - atm_row; 
    
           printf("\n Abschnitt = %d; Subtraktionsteil bisher = %.2f\n", calc_part+1, d2); //Ausgabe Debugging 
    
           atm_row = 1;
           m_zeile = 0;
           calc_part++;
        };
    
      printf("\nErgebnis Subtraktionsteil: %.2f\n_________________________________________________\n", d2); //Ausgabe Debugging 
    
      // Bestimmung der endgültigen Determinante
      D = d1 + d2;
    
      return D;
    };
    
    void Output()
    {
      int m_zeile;
      int m_spalte = 0;
      // Übergabe der Determinante / Aufruf der Det() Funktion
      double D = Det();
    
      printf("\n\nDie eingegebene Matrix: \n");
    
      // Ausgabe der eingegebenen Matrix
      for(m_zeile = 0; m_zeile <= row_count; m_zeile++)
       {
    	   printf("|");
    	   for(m_spalte = 0; m_spalte <= row_count; m_spalte++)
    	   {
               printf(" %.2f ", Matrix[m_zeile][m_spalte]);
    	   };
    	   printf("|\n");
       };
    
      printf("\n______________________\n");
      printf("\nDie transponierte Matrix: \n");
    
      // Ausgabe der transponierten Matrix
      for(m_zeile = 0; m_zeile <= row_count; m_zeile++)
       {
    	   printf("|");
    	   for(m_spalte = 0; m_spalte <= row_count; m_spalte++)
    	   {
               printf(" %.2f ", Matrix[m_spalte][m_zeile]);
    	   };
    	   printf("|\n");
       };
    
      // Ausgabe der Determinante
      printf("\nDeterminante der Matrix: %.2f\n\n", D);
    };
    

    Die Berechnung der Determinante funktioniert für 3-Reihige Matrizen (row_count = 2), aber für 2 reihige sowie wohl auch 4/5 reihige entsteht Schwachsinn 😃

    Irgendjemand kann mir doch sicher einen Tipp geben wie ich das ganze am effizientesten für n-reihige abändern könnte?

    Achso, noch eine Frage am Rande:
    Gibt es eine Möglichkeit den Rückgabewert einer Funktion auszulesen (abc = Det(); ) ohne das die Funktion etwas Ausgibt (also ohne das die Printf Befehle ausgeführt werden)?



  • warum machst du hinter jeden geschwungenen klammer ein anweisungsende(;) das ist hier volkommen unnoetig?

    tja ich haett da schon einen tipp und zwar leg dir n dynamischen 2dim array an(mit malloc):

    ...
    int zeile;
    int spalte;
    int **matrix;
    
    printf("Zeilen> ");
    scanf("%d", &zeile);
    printf("Spalten> ");
    scanf("%d", &spalte);
    
    /*speicher fuer zeile anlegen*/
    matrix = (int **)malloc(zeile * sizeof(int *));
    /*eventl auf NULL pruefen da speicher gar sein kann!!*/
    
    /*speicher fuer spalten anlegen*/
    for(int i = 0; i < zeile; i++)
          matrix[i] = (int *)malloc(spalte * sizeof(int));/*eventl auf NULL pruefen*/
    ...
    

    tja dann musste den code mit -std=c99 compilieren wergen for!!



  • Thx, aber ich hab keinen plan von malloc 😉

    dafür bin ich vorhin auf ne idee gekommen wie ich das ganze für n-reihige matrizen gangbar gekomme. Ich nenne jetzt mal einfach die jeweils zu multiplizierende werte zusammen "Element". Jedenfalls benötigt die Berechnung einer 2 Reihigen Determinante 2 dieser Elemente, eine 3 Reihige 6 und wie ich einer Formelsammlung entnehmen konnte eine 5-reihige 120. Also offensichtlich jeweils die Fakultät der Reihen 🙂
    Also sollte das ganze schon funktionieren wenn ich für beide calc_parts Fakultät der Anzahl der Reihen durch 2 setzte... mal ausprobieren



  • ^^Hab für das ganze dann doch den Gauss-Algorithmus verwendet...

    Naja ich bin jetzt dabei das selbe Programm noch mal Dialogfeldbasierend zu erstellen.
    Dabei müssen die Matrizen in der Form "[a11,a12,...,a1m;a21,a22,....,a2m;...;an1,an2...anm]" eingegeben werden.
    Ich bin dabei schon recht weit gekommen, das eigentliche Programm arbeitet schon ordungsgemäs, trotzdem hab ich da noch Fragen:

    1: Da ich keinen Befehl kannte mit dem man einen Teil eines CStrings zwischen 2 Indexwerten in double konvertieren kann, hab ich dafür selber eine Funktion geschrieben(Über die Einzelnen Chars nach int und dann damit über den Stellenwert nach double). Gibts dafür trotzdem schon eine Funktion mit der man sich die Arbeit sparen kann? (strtol funktionierte nicht so recht)

    2: Die Berechnung und Ausgabe sollte eigentlich stattfinden sobald der Benutzer Return drückt während das Eingabefeld ausgewählt ist. Die Nachricht KeyDown wird aber nicht gesendet wenn das Eingabefeld den Focus hat. Wie kann ich den sonst Feststellen ob die Eingabetaste betätigt ist? (genau erklären bitte)

    drittes Problem hat sich schon erledigt

    schon mal danke im voraus 🙂


Anmelden zum Antworten