[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