Anfänger braucht Hilfe ! Erste Grafische Oberfläche !?
-
Hi !
Habe seit mehr als einem Jahr eher schlechten Unterricht in C++. Bin auf einem Berufskolleg für den IT-Bereich.
Wir sollen für ein Projekt ein Programm schreiben. Wir haben uns für einen Taschenrechner (Körper und Grundrechenarten) entschieden. Nun frage ich mich, wie man dem Ganzen jetzt eine Oberfläche spendieren kann.
Bin ein richtiger "Noob" in Sachen prorammieren, wir haben alle (?) Schleifen, Funktionen und die ganzen Grundelemente bis jetzt beigebracht bekommen.
Wir arbeiten mit dem kostenlosen Compiler Dev C++.Ist es mögliche damit nachträglich eine GUI zu erstellen oder muss man das Ganze in Visual Studio einfügen und bearbeiten ?
Das Programm hat noch ein paar Macken und die Grundrechenarten sind noch nicht eingefügt. Wie gesagt, will erstmal wissen, wie man jetzt anfängt mit dem Erstellen einer Oberfläche.Hier der Code :
#include <cstdlib> #include <iostream> #include <math.h> using namespace std; int main(int argc, char *argv[]) { //||||||||||||||||\\ // \\ //Körperberechnung\\ // \\ //||||||||||||||||\\ int ok=0; char menu; char menu2=0; int replay=0; int ok2=0; do // ANFANG DER SCHLEIFE FÜR DIE KÖRPERFUNKTION!!!!! { // ANFANG DER SCHLEIFE FÜR DIE KÖRPERFUNKTION!!!!! menu2=0; cout << "Welcher Körper soll berechnet werden?" << endl; cout << " 1.Wuerfel" << endl; cout << " 2.Quader" << endl; cout << " 3.Quadratische Pyramide" << endl; cout << " 4.Kugel" << endl; cout << " 5.Oktaeder" << endl; cout << " 6.Kegel" << endl; cout << " 7.Zylinder" << endl; cin >> menu; cout << endl; //:::::::::::::Würfel::::::::::::: if(menu=='1') { float a; float ergO; float ergV; cout << "Der Wuerfel" << endl; cout << "Geben sie die Seitenlaenge in cm an!" << endl; cin >> a; cout << endl; ergO=a*a*6; ergV=a*a*a; cout << "Die Oberflaeche betraegt: " << ergO <<" Quadratzentimeter." << endl; cout << "Das Volumen betraegt: " << ergV << " Kubikzentimeter." << endl; replay=1; } //:::::::::::::Quader::::::::::::: if(menu=='2') { float a; float b; float c; float ergO; float ergV; float A; float B; float C; cout << "Der Quader" << endl; cout << "Geben die die Laenge des Quaders ein." << endl; cin >> a; cout << endl << "Geben sie nun die Breite ein." << endl; cin >> b; cout << endl << "Nun noch die Hoehe." << endl; cin >> c; cout << endl; A=a*b; B=b*c; C=c*a; ergO=2*A+2*B+2*C; ergV=a*b*c; cout << "Die Oberflaeche betraegt: " << ergO <<" Quadratzentimeter." << endl; cout << "Das Volumen betraegt: " << ergV << " Kubikzentimeter." << endl; replay=1; } //:::::::::::::Quadratische Pyramide::::::::::::: if(menu=='3') { float a; float h; float ergO; float ergV; float b=1; float c=3; float ergM; float ergG; float ergD; cout << "Die Quadratische Pyramide" << endl; cout << "Geben Sie die Seitenlaenge in cm an." << endl; cin >> a; cout << endl; cout << "Geben Sie nun die Hoehe in cm an." << endl; cin >> h; cout << endl; ergM=a*sqrt(4*(h*h)+(a*a)); ergG=a*a; ergO=ergM+ergG; ergD=b/c; ergV=ergD*ergO*h; cout << "Die Oberflaeche betraegt: " << ergO <<" Quadratzentimeter." << endl; cout << "Das Volumen betraegt: " << ergV << " Kubikzentimeter." << endl; replay=1; } //:::::::::::::Kugel::::::::::::: if(menu=='4') { float r; float ergO; float ergV; float pi = 3.141592654; float a=4; float b=3; float ergk; cout << "Die Kugel" << endl; cout << "Geben sie den Radius in cm an." << endl; cin >> r; cout << endl; ergk=a/b; ergO=(4*pi)*(r*r); ergV=ergk*pi*(r*r*r); cout << "Die Oberflaeche betraegt: " << ergO <<" Quadratzentimeter." << endl; cout << "Das Volumen betraegt: " << ergV << " Kubikzentimeter." << endl; replay=1; } //:::::::::::::Oktaeder::::::::::::: if(menu=='5') { float a; float ergO; float ergV; float b=2; float c=3; float ergk; cout << "Der Oktaeder" << endl; cout << "Geben sie die Seitenlaenge in cm an." << endl; cin >> a; cout << endl; b=sqrt(b); ergk=b/c; ergV=ergk*(a*a*a); b=2; c=sqrt(c); ergk=b*c; ergO=ergk*(a*a); cout << "Die Oberflaeche betraegt: " << ergO <<" Quadratzentimeter." << endl; cout << "Das Volumen betraegt: " << ergV << " Kubikzentimeter." << endl; replay=1; } //:::::::::::::Kegel::::::::::::: if(menu=='6') { float r; float h; float ergO; float ergV; float b=1; float c=3; float pi = 3.141592654; float s; float ergM; float ergG; float ergD; cout << "Der Kegel" << endl; cout << "Geben Sie den Radius in cm an." << endl; cin >> r; cout << endl; cout << "Geben Sie nun die Hoehe in cm an." << endl; cin >> h; cout << endl; s=sqrt((r*r)+(h*h)); ergM=r*s*pi; ergG=pi*(r*r); ergO=ergM+ergG; ergV=(b/c)*ergG*h; cout << "Die Oberflaeche betraegt: " << ergO <<" Quadratzentimeter." << endl; cout << "Das Volumen betraegt: " << ergV << " Kubikzentimeter." << endl; replay=1; } //:::::::::::::Zylinder::::::::::::: if(menu=='7') { float u; float ergO; float ergV; float r; float h; float ergM; float pi = 3.141592654; cout << "Der Zylinder" << endl; cout << "Geben den Radius in cm an." << endl; cin >> r; cout << endl; cout << "Geben sie nun die Hoehe in cm an." << endl; cin >> h; cout << endl; ergV=(r*r)*h; ergM=(2*pi)*r*h; ergO=ergM+(4*(pi*(r*r))); cout << "Die Oberflaeche betraegt: " << ergO <<" Quadratzentimeter." << endl; cout << "Das Volumen betraegt: " << ergV << " Kubikzentimeter." << endl; replay=1; } do { if(replay==1) { cout << "Wollen sie eine neue Berechnung innerhlab dieser Kategorie starten? (j/n)." <<endl; cin >> menu2; cout << endl << endl << endl << endl << endl << endl << endl << endl << endl; } if(menu2=='j') { ok=1; ok2=1; } if(menu2=='n') { ok=0; ok2=1; } } while(ok2!=1); if(replay==0) { cout << "Sie haben keinen gueltigen menuepunkt gewaehlt!" << endl << "Bitte versuchen sie es nocheinmal!" << endl << endl << endl; menu2=1; } } // ENDE DER SCHLEIFE FÜR DIE KÖRPERFUNKTION!!!!! while(ok==1); // ENDE DER SCHLEIFE FÜR DIE KÖRPERFUNKTION!!!!! system("PAUSE"); return EXIT_SUCCESS; }
Haltet euch wenn möglich so einfach wie möglich in den Antworten
Danke schonmal vielmals !!
edit: Wäre vielleicht hilfreich, wenn jemand einfach den Quellcode für "Hello World" mit Oberfläche niederschreiben könnte
-
Wäre vielleicht hilfreich, wenn jemand einfach den Quellcode für "Hello World" mit Oberfläche niederschreiben könnte
für windows?
MessageBox(0, _T("Hello, world!"), _T("Hello, World!"), MB_OK);
HTH.
-
Da fängts schon an , wenn ich den Code in ein "leeres" Programm einfüge (Int main etc.), was ich bestimmt nicht so machen muss, bekomme ich schon Fehlermeldungen das allerlei nicht deklariert wurde
-
Wenn du eine GUI für C++ erstellen willst, also eine Oberfläche ist es viel Arbeit. Wenn ich mich recht entsinne gibt Dev-C++ in dem Ordner Beispiele vor. Schau sie dir an. Werde aber bezweifeln das du sie verstehst, da es wie gesagt ein bisschen mehr Arbeit ist als das Cmd Fenster.
-
du benötigst eine zusätzliche Bibliothek für grafische Oberflächen.
Die Entscheidung welche du nutzen willst wirst du zuerst treffen müssen.
Das Beispiel oben war der direkte Aufruf der WinAPI, davon würde ich abraten.
-
Maddinuser schrieb:
Nun frage ich mich, wie man dem Ganzen jetzt eine Oberfläche spendieren kann.
Vielleicht eines als erstes: Im Gegensatz zu Sprachen wie Java und C# hat C++ keine Standardbibliothek für Grafik. Da gibt es die VCL, MFC, GTK, QT...
Und UI-Programmierung geht über einfache Grundlagen bei weiten hinaus - wenn nicht unbedingt nötig, lasse es lieber bleiben, oder versuch mal die Konsole auszuschöpfen (Da gibt es eine kleine aber feine Bibliothek; Improved Console wäre glaube ich ein gutes Stichwort für die Suche).
Maddinuser schrieb:
Wir arbeiten mit dem kostenlosen Compiler Dev C++.
*Zähneknirchen;Jemandenerwürgenwill*
Maddinuser schrieb:
Ist es mögliche damit nachträglich eine GUI zu erstellen
Ja, die Frage ist nur welche Bibliothek den Dev C++ noch unterstüzt (da nicht mehr der aktuellste).
Maddinuser schrieb:
Wie gesagt, will erstmal wissen, wie man jetzt anfängt mit dem Erstellen einer Oberfläche.
Lass erstmal die Finger weg, und gehe den Code grundlegend anders an.
1. Code in Funktionen aufsplitten (nicht nur eine main-Funktion)
2. Dabei Logik und Ein-/Ausgabe möglichst etwas trennen, da letztere stark von der UI abhängig ist (cout/cin gibt es nicht in der UI).
3. Die Kommentare für Schleifenanfang/Ende kann man sich sparen wenn man richtig einrückt:int main() { // ... do { // ... if(menu=='1') { // ...
Maddinuser schrieb:
edit: Wäre vielleicht hilfreich, wenn jemand einfach den Quellcode für "Hello World" mit Oberfläche niederschreiben könnte
Das würde dir nichts nützen. Es gibt keine einheitliche Oberfläche unter C++. Und vor allem: Es gibt relativ wenige einfache Bibliotheken für eben dies. Zumal viele aktuelle UI-Frameworks Objektorientiert sind, und ich sehe in deinen Code nicht, das du damit schon zurecht kommen würdest.
cu André
-
Schlag deinen Lehrer mal von mir ja danke
-
Ok, ich denke ich lass das einfach bleiben. Ist alles komplizierter als ich dachte bzw. nicht die richtige Programmiersprache.
Warum soll ich den Lehrer schlagen ?^^
-
Sag mal, warum benutzt du nicht einfach cast's zur Abfrage?
-
way schrieb:
Sag mal, warum benutzt du nicht einfach cast's zur Abfrage?
Was meinst du mit "Casts zur Abfrage"?
@ Maddinuser:
Einige Tipps zu deinem Code, den ich aufgrund der Länge nur überflogen habe:- Wozu brauchst du
<cstdlib>
? <math.h>
sollte<cmath>
heissen (ohne Endung, wie alle C++-Standardheader).- Es ist nicht üblich, dass die Programmstruktur sich durch Leerzeilen und Kommentartiteln zwischen den einzelnen Teilen auszeichnet. Benutze wie gesagt Funktionen (die solltet ihr nach einem Jahr schon gehabt haben...) oder sogar Klassen.
- Deklariere Variablen, wenn du sie brauchst. Und du benötigst nicht für jedes kleine Zwischenresultat eine eigene Variable (ist aber deine Entscheidung).
- Anstatt mehrerer
if
-Abfragen nacheinander könntest duswitch
verwenden.
- Wozu brauchst du
-
Ok, Funktionen und Switch sind anscheinend eine bessere Wahl.Werden wir uns morgen dransetzen.
Übrigends, heute die Arbeit in Datenprogrammierung wiederbekommen: 5-
Das sollte alles sagenWas sind Casts ?
-
Maddinuser schrieb:
Was sind Casts ?
Nach einem Jahr fragst du das?
Die Bezeichnung "schlecht" für den Unterricht scheint mir stark untertrieben zu sein...Ich würde dir in diesem Falle unbedingt raten, noch nebenbei zu lernen, gerade wenn du interessiert bist.
Casts sind explizite Umwandlungen zwischen verschiedenen Datentypen. Berühmt (für den Anfang) ist
static_cast
:int a = 19; int b = 4; double c = static_cast<double>(a) / static_cast<double>(b);
Hier wäre mindestens ein Cast nötig, da sonst das 4 als Ergebnis der (Integer-)division rauskommen würde. Mehr zu Casts findest du in Büchern oder Internettutorials (wobei du bei letzteren besonders vorsichtig sein musst, nicht selten werden Dinge schlecht erklärt - gibts aber auch bei Büchern).
-
Nexus schrieb:
Maddinuser schrieb:
Was sind Casts ?
Nach einem Jahr fragst du das?
Die Bezeichnung "schlecht" für den Unterricht scheint mir stark untertrieben zu sein...Kann deine Empörung nicht verstehen. Normalerweise kommt man sehr gut ohne Casting aus. Und dann muß er es noch nicht kennen. Außerdem weißt du ja nicht, wieviel Stunden pro Woche die Schüler C++ haben.
-
Die Qualität des Unterrichts hängt auch immer sehr stark von der Schulform und dem Lehrer ab.
Wir hatten Hardcore Programmier-UNterricht ab der 7. Klasse mit Turbo Pascal
das war 1995Aber wenn wir ehrlich sind sah unser erstes Programm auch nicht besser aus.
Mir fällt zu dem Code auch nicht mehr ein, als hier schon gesagt wurde. Die Oberfläche sollte der Threadersteller vielleicht erstmal auf später verschieben.
-
Bulli schrieb:
Kann deine Empörung nicht verstehen. Normalerweise kommt man sehr gut ohne Casting aus. Und dann muß er es noch nicht kennen. Außerdem weißt du ja nicht, wieviel Stunden pro Woche die Schüler C++ haben.
Es ist mehr Erstaunen als Empörung. Und Typumwandlung gehört meiner Ansicht nach zu den Grundlagen. Auch wenn sie nur eine Stunde C++ pro Woche haben, sollte das irgendwann mal drangekommen sein (das soll nicht als Vorwurf an den Threadersteller verstanden werden).
Abgesehen davon gibt es genügend Fälle, wo man casten kann (nicht nur
static_cast
). Ich würde auch nicht behaupten, man komme gut ohne aus (am Anfang vielleicht schon noch, aber später...). Aber die Diskussion hatten wir sowieso erst gerade.
-
Also kann ich mit Casts einen Integerwert in einen Float umwandeln ?
Hatten heute den Unterricht für das Projekt. Die Lehrer (und die haben definitiv Ahnung davon) meinten, ich könnte den Code in Visual C++ einfügen und damit eine Oberfläche erstellen.Die Buttons etc. müssten dann "nur noch" mit den einzelnen Funktionen verknüpft werden. Hörte sich logisch an.
Was sagt ihr dazu ?
-
1. Brauchst du dazu eine Version von VS, die die MFC beinhaltet, die kostenlose Expressversion tut dies nicht.
2. Ein Designer ist in der Lage, dir automatisch Code zu generieren, aber das ersetzt nicht das Wissen, wie du diesen Code selbst schreibst.Es gibt verschiedene Casts. Für dein Beispiel wäre wohl ein static_cast angemessen (static_cast<float>(Integerwert))
-
Maddinuser schrieb:
Die Lehrer (und die haben definitiv Ahnung davon)...
Meine Erfahrung von Lehrern ist - zumindestens im IT-Bereich - eher eine Andere. Das soll jetzt nicht grundsätzlich IT-Lehrer schlechtreden, aber viele Lehrer kennen nur die akademische Ansicht.
Maddinuser schrieb:
...ich könnte den Code in Visual C++ einfügen und damit eine Oberfläche erstellen.
Sofern du...
a) Entweder eine Version ab Standard erwirbst (wegen MFC)
b) alles mit Händen und Füßen programmierst (Windows API)
c) eine weitere Sprache (C++/CLI in Zusammenhang mit WindowsForms und dem .Net Framework).
d) eine andere Bibliothek suchst die unter VC funktioniert (in der Regel dann aber ohne Designer)
...mag es stimmen. Voraussetzung ist, das du das nötige Grundwissen hast. Ich will nicht böse klingen: aber du solltest dich erst mit den C++ Grundlagen soweit vertraut machen, das du sie auch sicher beherrschst.Maddinuser schrieb:
Die Buttons etc. müssten dann "nur noch" mit den einzelnen Funktionen verknüpft werden. Hörte sich logisch an.
Was sagt ihr dazu ?
Auch das ist schlicht und ergreifend nur die halbe Wahrheit. Zum einen bist du dann auf einen Designer angewiesen, um die Oberfläche einfach mal eben so zu entwerfen. Dann solltest du dich zumindestens mit den Windowsressourcen etc. vertraut machen. Und zu guter letzt gibt es doch noch einige Unterschiede zwischen Consolen und Windowsprogramme, alleine was den Programmfluß betrifft.
Man wird recht schnell Betriebsblind wenn einem Sachen schon alltäglich geworden sind. Auch MFC-Grundkenntnisse erwirbt man nicht eben mal an einen Tag.
cu André