Addition / Subtraktion zweier Matrizen
-
Hallo!
Im Rahmen meines Studiums muss ich bis nächste Woche einen Programmentwurf anfertigen. Die Aufgabe lautet folgendermaßen:
"Schreiben sie ein nutzerfreundliches Programm als dialogbasierte Applikation mit C++ und unter Verwendung der MFC zur Berechnung von Summe und Differenz zweier Matrizen. Dabei soll der Nutzer zwischen Matrizen mit zwei bis fünf Zeilen und zwei bis fünf Spalten wählen können. Die Auswahl soll dann jeweils für beide Matrizen gleich gelten. Je nach Auswahl sollen die benötigten Eingabefelder angezeigt bzw. überflüssige Eingabefelder ausgeblendet werden.
Nach Eingabe der benötigten Werte und der Auswahl der Rechenoperation soll das Ergebnis berechnet und ausgegeben werden."Generell habe ich wenig Ahnung von C++, wir hatten ein paar Vorlesungen dazu aber ich glaube alleine werde ich das nicht schaffen.
Habt ihr ein paar Ideen wie ich das umsetze?
Oder hat hier vielleicht jemand ein ähnliches Programm bereits geschrieben?Hoffe ihr könnt mir etwas helfen
-
MFC auf der Uni? Na toll
Da gibts besseres.
Du musst halt schauen, dass du (mit dem graphischen Editor von Visual Studio) 5x5=25 Eingabefelder in den Dialog gibst.
Später kannst du dann diese ein und ausblenden, je nach Matrixgröße.
MFC ist leider alles andere als ein intuitives GUI Framework, schau dir folgende Slides an, dort wird sehr kompakt alles wesentliche präsentiert:
http://courses.cs.vt.edu/~cs2704/spring02/mcquain/Notes/IntroMFC.1.pdf
-
Deine Aufgabe ist supi einfach. Schnell den Breymann durcharbeiten, dann das Scribble-Tutorial. Und alles wird gut. Im nächsten Semester.
-
fdfsdfsdf schrieb:
MFC auf der Uni? Na toll
Da gibts besseres.
Es gibt nunmal auch Profs, die kurz vor der Rente stehen.
Aber MFC als Framework für Einsteiger in C++, die nebenbei auch Windows-GUI programmieren lernen sollen, ist prinzipiell gar nicht mal so dumm.
Und schließlich kann man von einem MINT-Studenten erwarten, dass er das einmal Erlernte auch in einem anderen Kontext anwenden kann.
-
Hi,
es gibt viele Klassen mit Operatoren für Matritzen, dies kann sehr schnell sehr komplex werden, bezüglich Rotationen und irregulären Matrizen aber, dein dozent
wird sich über kurze einfache Lösungen freuen.float gMatA3x3[3][3] = {{1,2,3},{1,2,3},{1,2,3}}; float gMatB3x3[3][3] = {{5,5,5},{6,7,3},{5,1,0}}; float gMatC3x3[3][3] = {0};//Zero like void SubAB(void) { for(int x(0); x<3;x++) for(int y(0); y<3;y++) gMatC3x3[x,y] = gMatA3x3[x,y]-gMatB3x3[x,y]; }
Das mit MFC geht über den Dialog Editor, einfach eine UI zusammen frimeln.
PS MFC ist nur eine Arbeitserleichterung für die WinApi, und der beste Weg.
(Da gibt es nix besseres!)usw..
Grüße K.
-
Ja unser Prof ist kurz vor der Rente
. Ich studiere Konstruktion, da ist Informatik auch eigentlich nur Beiwerk, aber dieses Semester steht halt ein Programmentwurf an, der dann auch bewertet wird.
So den Dialog habe ich jetzt so realisiert: http://up.picr.de/26047814mj.jpg
Habt ihr dafür vielleicht Verbesserungsvorschläge?
Ich habe mir es so vorgestellt, dass alles erst Schritt für Schritt sichtbar wird. Also erst nur die Eingabe von Zeilen und Spalten. Nach der Auswahl werden dann die jeweiligen Eingabefelder der Matrix, die Auswahl der Operation und der Button zur Berechnung sichtbar. Und nach dem Drücken des Buttons dann letztendlich die Ergebnismatrix.Die schwierige Arbeit kommt jetzt natürlich erst. Habt ihr vielleicht schon ein paar Hinweise für die benötigten Variablen und Funktionen?
-
Ja Wunderbar, bissel Fett ist aber auch halt ne Demo, hier ist drauf zu achten das mit geringstem Aufwand das Ziel erreicht wird.
Um all deine kleinen Eingabe -Felder auslesen zu können, nutzt du bei OnButton
(Handler einbauen)die Funktion : GetDlgCtrl(NUMMER DES CONTROLS) siehe resource, und bekommst dann einen Handle auf das Fenster des Eingabefeldes.
Dann erhälst du den text der box mit CWnd *pWnd(GetDlgCtrl(IDC_EDIT1));
und kannst dann den Text mit CString str(pWnd->GetWindowText()); erlangen.
dann konvertierst du den text to float das geht so:float val = atof(str);
dann trägst du die eingaben in die jeweiligen Felder deiner mat. ein und verwendest dann wie oben Sub,add,mul ,div über eine Rotation würde sich der prof freuen dann bekommst Du noch einen drauf mit Mappe:
Kann so aussehen hier als Beispiel wie man ein Bild rotiert ist 1:1 auf mat auch passend:
soff und doff sind die Adressen von ziel und quelle muss man aufpassen..
void CDraw::RotBox8(DWORD soff,DWORD doff,WORD width,WORD height,float angel) { angel *= PI180; register float cosv = cosf(angel); register float sinv = sinf(angel); register short hw = width>>1,cs,gx; register short hh = height>>1,bs,gy; for(register short yy = 0; yy < height; yy++) for(register short xx = 0; xx < width; xx++) { bs = (xx - hw),cs = (yy - hh); gx = ((short)(bs * sinv) + (short)(cs * cosv) + hw); gy = ((short)(bs * cosv) - (short)(cs * sinv) + hh); SetPix8(doff,width-xx+1,yy,width,GetPix8(soff,gx,gy,width) ); } }
-
Ich hätte jetzt einfach alle Felder mit einer Double Variable belegt und halt nach der Position durchnummeriert. Also quasi dA11,dA12 ... dB11 etc. aber das wären ja 75 Stück ... Wenn ich das mit dem Float machen will, muss ich da die Eingabefelder der jeweiligen Matrizen zu einer Gruppe zusammenfassen?
-
Wenn du in der resource.h schaust, sind die Bezeichner IDC_EDIT1 - xx folge Zahlen, ich würde diese in einer schleife durchlaufen.
Mit steigendem index GetDlgCtrl(n+offset) laufen lassen, dann kannst
du das mit 4 Zeilen lösen, geht auch über zig Membervariablen das sieht nicht gut aus.Grüse
k.
-
Also die Auswahl der Operation und die Berechnung funktioniert. Ich habe aber doch einfach alle Edits mit einer Variable belegt. Sieht halt blöd aus im Quellcode, aber funktionert.
Für die anfängliche Auswahl der Zeilen und Spalten (min. 2 max. 5) habe ich jetzt zwei Spinboxen und zwei Edits verwendet, die funktionieren auch schon soweit. Jetzt ist die Frage wie ich die jeweiligen Edit Felder der Matrizen ein-, bzw. ausblende, passend zur Auswahl über die Spinboxen?
-
Du kannst die Editfelder disablen:
m_Edit1.EnableWindow(FALSE);
m_Edit1.EnableWindow(TRUE);Verschwinden lassen geht mit:
m_Edit1.ShowWindow(SW_HIDE);
m_Edit1.ShowWindow(SW_SHOW);anschließend:
Invalidate(); UpdateWindow();
auslösen.
-
Ich brauch dann aber für die Edits eine Control Variable oder?
-
Du hast gesagt alle Controls hast Du als Variablen angelegt,
dann schon, du kannst aber auch über die Fensterklasse einen
Zeiger auf ein Control erlangen wenn Du dessen ID kennst aus der
resource.h was ich vorschlug um die Felder dynamisch zu lesen.Dann gilt wie schon beschrieben:
CWnd *pWnd(GetDlgCtrl(IDC_EDIT1)); //Control besorgen (Auch ein Fenster ist) if(pWnd && pWnd->m_hWnd) //abfrage ob Zeiger & Window gültig wenn man möchte. { pWnd->EnableWindow(false); oder pWnd->ShowWindow(SW_HIDE);//SW_SHOW //optional: Invalidate(); //erneuert die Darstellung via msg UpdateWindow(); //erneuert internas }