Zahlenwerte in einen Vektor bzw Matrix schreiben
-
Hallo,
habe ein Problem und bin etwas verwirrt.
Ich möchte einen 5-Zeiligen Vektor haben in denen ich nacheinander Zahlen reinschreibe, die ich nach einer bestimmten Formel ausrechne.
Formel wäre z.B. b[k] = ((k+1) * (k+2)) /2
Sowas möchte ich für eine i,k-Matrix haben. Die Werte sollen dann nacheinander dort reingeschrieben werden. i und k sollen außerdem noch veränderbar sein, je nachdem ob i größer,kleiner oder gleich k.
War die letzten Vorlesungen nich da und hab da jetzt ne ziemliche Lücke in meinem Wissensstand.
Wie ich Felder und Matrizen generell erstelle und per Hand mit Werten belege weiss ich, nicht aber wie ich das ganze nacheinander per Gleichungen machen soll.Wäre nett wenn mir jemand das ganze erklären könnte.
-
Hi,
für eine m,n Matrix mit k-Dimensionalen Vektorelementen brauchst du zwei äußere m,n Schleifen und eine innere k Schleife.
-
also ich habs tatsächlich geschafft schonmal ne matrix zu schreiben und diese auszugeben
#include <stdio.h> int main() #define zeile 5 #define spalte 5 { int i,k; int matrix[spalte][zeile]; for(i=0; i<spalte; i++) { for(k=0; k<spalte; k++) { if (i>k) { matrix[i][k] = ((i+1)*(k+1))/2; printf(" %d", matrix[i][k]); } if (i==k) { matrix[i][k] = 1; printf(" %d", matrix[i][k]); } if (i<k) { matrix[i][k] = 0; printf(" %d", matrix[i][k]); } } printf ("\n"); } }
wenn ich aber jetzt statt int zb double nehme funktioniert das ganze nicht mehr, wieso nicht?
-
Edit:
Hier rechnet der Compiler nur mit integer-Werten:
((i+1)*(k+1))/2;Schreib doch matrix[i][k] = ( double ) .. usw ..
0der benutze in der Formel wenigstens einmal einen double Wert.
Der Compiler rechnet dann intern mit double weiter:
((i+1)*(k+1))/ 2.0;
-
ok danke
hier steht "Das Programm soll die Matrix mat mittels einer Funktion fill_matrix mit den obigen Werten belegen, wobei die Matrix mat als globale Variable definiert wird."
also wie man funktionen macht und werte übergibt weiss ich. wie das ganze für eine matrix gehen soll weiss ich aber nicht.
bisher kenne ich nur, dass eine funktion mit return den wert zurückgibt und diesen auf eine variable schreibt.wie schreibt man das ganze, wenn man jeden wert einzeln in eine matrix eingeben will?
Damn Informatik is ne komplizierte Sache...
-
Du hast nun schon ne Funktion geschrieben, die main() heisst, die brauchst du nur umzubenennen und in einem neuen main() aufzurufen.
Najanun und wo muss man dann wohl mat hinpacken, damit mat global wird ?
-
sorry, versteh nich was du meinst.
also damit mat global wird, muss es in main.
ich krieg aber das übergeben der werte aus der matrix-funktion in die main-funktion nich hin.
-
jebus schrieb:
...
hier steht "Das Programm soll die Matrix mat mittels einer Funktion fill_matrix mit den obigen Werten belegen, wobei die Matrix mat als globale Variable definiert wird.
...Ich lese da nichts von einer Übergabe.
Die Matrix soll doch nur global definiert werden weiter nüschts.
Kannst also deine Variable über deine Funktion drüber schreiben und fertig.
-
sorry verstehs noch immer nich, könntest mir das bitte genauer erklären?
-
Ja, kann ich.
Das Gerüst sieht so aus, wenn ich die Aufgabe richtig interpretiere:
// Matrix global definieren. double mat[5][5]; void fill_matrix() { // Matrix füllen. } int main() { fill_matrix(); // Funktion aufrufen. return 0; } // Feddisch.
Tschtümmts ?
-
ja stimmt
also hab hier mal das jetzt geschrieben mittlerweile
#include <stdio.h> #define zeile 5 #define spalte 5 int i,j,k; double matrix[spalte][zeile]; int main(void) { double b[k]; double x[k]; fill_matrix (); for(i=0; i<spalte; i++) { for(j=0; j<spalte; j++) { printf(" %lf", matrix[i][j]); } printf ("\n"); } for (k=0;k<=4;k++) { printf ("\n"); b[k] = ((k+1)*(k+2))/2; printf(" %lf", b[k]); } for (k=0;k<=4;k++) { x[k] = matrix[k][k-1] * x[k-1]; printf ("%lf %lf %lf", matrix[i][j], b[k], x[k]); } } void fill_matrix (void) { for(i=0.0; i<spalte; i++) { for(j=0.0; j<spalte; j++) { if (i>j) { matrix[i][j] = ((i+1)*(j+1))/10.0; } if (i==j) { matrix[i][j] = 1; } if (i<j) { matrix[i][j] = 0; } } } }
also aufgabe is jetzt:
1.3 im Hauptprogramm alle x[k] für k = 0 ... 4 nach Gl. (2) berechnen
Gl. 2:
x[k] = b[k] – mat[k][0] * x[0] – . . . – mat[k][k-1] * x[k-1])Hab das versucht oben umzusetzen aber es klappt nich.
In der Schleife in der ich die Formel anwende bekomme ich eine "abnormal program termination"... ??
-
Muttu den Fehler suchen. Lass dir die Werte der Variablen als Zwischenergebnisse anzeigen, mach dich mit einem Debugger vertraut, usw.
-
hallo,
also ich hab jetzt mal n total einfaches programm geschrieben
#include <stdio.h> #define zeile 5 #define spalte 5 int k=0; double b[zeile]; double x[zeile]; int main() { double b[k]; double x[k]; for(k=0.0; k<spalte; k++) { b[k] = 0; x[k] = 0; printf("\n %lf %lf\n",b[k],x[k]); } }
das ganze soll 0'en in die felder schreiben.
wenn ich das ganze im debugger laufen lasse, dann funktioniert das für die ersten 3 k's aber dann kommt bei dem x[4] diese fehler meldung?
bis dahin steht für x[k] noch kein bad adress drinnen, ab k =4 dan schon und das programm stürzt abWedit output window auto: Fri Jun 15 16:19:52 2007
k = 3
b[k] = 0.0000000000000000e+00
x[k] = <bad address 0x00000018>
spalte = 5kann mir das jemand erklären bitte?
-
Nebenbei:
Globale Variablen sind schlechter Programmierstil und weiterhin solltest du deine Variablen gleich initialisieren
-
Wieso hast du die Arrays doppelt im Programm ?
-
ja ok stimmt, muss ich verändern.
was sagt ihr zu meinem eigentlichen problem?
-
Wenn du das richtige Paar entfernst, gibts kein eigentliches mehr
Was sagst du denn hierzu:
int k = 0; double b[k]; double x[k];
Wie groß sind die Arrays und wie viele Zahlen passen rein ?
-
hab das ganze mal so geschrieben, is das so richtig?
#include <stdio.h> int main() { int k=0; double b[k]; double x[k]; for(k=0; k<5; k++) { b[k] = 0; x[k] = 0; printf("\n %lf %lf\n",b[k],x[k]); } }
bekomme immernoch die gleiche fehlermeldung.
die arrays sollen 5 zahlen fassen.
-
#include <stdio.h> #define IDX 5 int main() { int k; double b[IDX]; double x[IDX]; for(k=0; k<5; k++) { b[k] = 0; x[k] = 0; printf("\n %lf %lf\n",b[k],x[k]); } }
-
so läuft das also ....
vielen dank