Brauche (Nach?)Hilfe wegen einem C++ Projekt.
-
Ich muss in C++ ein Projekt erstellen. Habe auch schon Gedanken dazu gemacht was ich machen möchte. Was ganz einfaches^^ Quasi ein kleiner Kalorienrechner^^.
Man gibt Alter, Geschlecht, Gewicht, Größe usw ein. Der gibt dann je nach dem den BMI, optimal Gewicht und bla aus. Alles ganz einfache Vorgänge.Das Programm an sich ist nicht das Problem, nur dass ich eben C++ nicht ganz verstehe. In C würde ich das ohne Probleme machen können, aber bei C++ verstehe ich's nicht^^. Die ganzen Header. usw -.-, privat, protected,public usw -.- und bräuchte jemanden der sich mit mir mal an einem Tag zusammensetzt und mir zeigt wie ich das mache.
Wenn jemand Zeit und Lust hat, und aus Berlin kommt, dann würde ich mich freuen, wenn man sich bei mir meldet^^
Würde natürlich auch was zahlen.
Würde das auch hier versuchen mit euch zu machen, aber kA ob ich das dann wirklich checke^^
-
Ganz klassisch mit einem Buch (C++ Primer oder so) zu lernen steht nicht zur Debatte?
-
BunterVogel schrieb:
Die ganzen Header. usw -.-
Die "ganzen" header hast du in C auch. Du brauchst für so einen Kalorienrechner nicht wahnsinnig viele header.
#include <iostream> //für cin, cout,... #include <vector> // eventuell zum speichern von den BMI,s #include <string> // wenn du irgendwelche Zeichenketten wie einen Namen brauchst #include <fstream> //nur, wenn du es in .txt dateien speichern oder lesen willstmehr fallen mir nicht ein.
Eine Klasse benötigst du doch auch nicht unbedingt (also private, public, protected).
Ich würde dir ein Buch vorschlagen, kostet dich einmal und das hast du dafür für immer und es steht mehr drin als nur ein Tutorial für einen BMI-Rechner.
gruß
syntax
-
Ich frage mal folgendes dann-
Ich habe folgende Dateien:Unisex.cpp
#include <iostream> using namespace std; #include "Unisex.h" // Berechnung der BMI. unisex float CUnisex::bmiBerechnung() { return 10000*(gewicht / (groesse * groesse)); }Unisex.h
#include <string> using namespace std; class CUnisex { protected: string name; float alter; float gewicht; float groesse; float aktivfaktor; public: float bmiBerechnung(); };gui.cpp
#include <iostream> #include <string> #include "Unisex.h" #include "gui.h" using namespace std; void main () { CUnisex n; n.bmiBerechnung(); system("Pause"); }gui.h
class CGui { public: void application(); };Wie mache ich da jetzt eine Eingabe für Gewicht und Größe? Und wo genau findet der CIN und COUT statt?
-
BunterVogel schrieb:
In C würde ich das ohne Probleme machen können, aber bei C++ verstehe ich's nicht^^. Die ganzen Header. usw -.-, privat, protected,public usw -.-
Jedenfalls nicht krampfhaft alles Mögliche in Klassen verpacken.
Wenn du C-Umsteiger bist, dann lösche erst mal malloc/free aus deinem Gedächtnis. Nein, new/new[]/delete/delete[] sollst du auch nicht benutzen, wenn es nicht unbedingt nötig ist.
Ich denke, die wichtigste Lektion ist erst mal, RAII zu verstehen bzw das, was wir darunter verstehen. Der Trick in der C++ Resourcenverwaltung, sei es dynamisch reservierter Speicher, eine geöffnete Datei, ein gelockter Mutex (etc), ist es, die Verantwortung für das "Aufräumen" an Objekte abzugeben, die das dann ganz automatisch machen. Ganz einfaches Beispiel:
Hui:
#include <vector> int main() { // der Vektor kümmert sich schon um den dynamisch // reservierten Speicher std::vector<int> dings (2); dings[0] = 23; dings[1] = 42; ... return 0; }Pfui:
int main(void) { int* ptr = (int*) malloc(sizeof(int)*2); ptr[0] = 23; ptr[1] = 42; ... free(ptr); return 0; }Der Zeiger ptr fühlt sich nicht verantwortlich für das, worauf er zeigt. Wenn sich kein Objekt in der Hinsicht verantwortlich fühlt, muss der Anwender sich selbst drum kümmern, hier per free(ptr). In C++ kommt erschwerend hinzu, dass ein Funktionsaufruf mit einer Ausnahme abgebrochen werden kann. Da kann man sich einen solchen Stil also noch weniger erlauben; denn eine Operation, die bei "..." eine Ausnahme wirft, führt dazu, dass free nicht mehr aufgerufen wird.
Bei einem halbwegs vernünftigen Design wird jede Resource (dynamisch allozierter Speicher, geöffnete Datein, etc) von einem Objekt verwaltet, was diese Resource wieder freigibt, sofern das Objekt "zerstört" wird. Solche Objekte können wieder von anderen Objekten verwaltet werden, falls sie im dynamischen Speicher leben. Objekte im automatischen Speicher werden -- welch Überraschung -- automatisch zerstört.
Objekte im statischen Speicher werden auch nach Programmende zerstört. Hier ist also keine extra "Verwaltung" nötig. Verwaltet Objekt X eine Resource Y, sagen wir dazu meistens "X besitzt Y". Und diese Besitzverhältnisse ergeben bei einem stimmigen Design einen gerichteten azyklischen Graphen.Im Wesentlichen bietet dir der C++ Sprachkern die Möglichkeit, leicht benutzbare Abstraktionen selbst zu bauen. Diverse solcher Abstraktionen sind bereits in der Standardbibliothek verfügbar. Die kannst und solltest du nutzen.
Am Anfang wirst du wahrscheinlich erst mal von C++ überwältigt sein. Aber das legt sich mit der Zeit. Kommt auch drauf an, wie du C++ lernst. Versuchst du es anhand von Feature-Auflistungen, wirst du dich wahrscheinlich länger fragen, was du wie wo machen solltest. Ein gutes Buch kann da echt viel Zeit sparen.
-
hmm^^ okay^^
So richtig komme ich dadurch nicht weiter xD
Aber dennoch Danke

Ich gehöre zu denen, die mehr durch "machen" und "versuchen" den Ablauf verstehen, als mir jetzt ein Buch durchzulesen. Die Zeit habe ich leider auch nicht mehr, ich muss das Projekt schnell fertig bekommen. Mir gehts nur noch drum, dass ich mich gerade Frage, wie ich da im obigen Code eine Eingabe von der groesse und gewicht machen kann. Die Eingabe soll in der gui stattfinden. Und dann das nächst Problem, wie kann ich bei der Eingabe sagen, dass er das bei bmiBerechnung einfügen soll, dieser befindet sich auch in einer anderen Datei...^^
-
BunterVogel schrieb:
hmm^^ okay^^
Die Eingabe soll in der gui stattfinden. Und dann das nächst Problem, wie kann ich bei der Eingabe sagen, dass er das bei bmiBerechnung einfügen soll, dieser befindet sich auch in einer anderen Datei...^^du musst der klasse gui irgendwie eine referenz/ einen zeiger geben, damit diese dann die eingelesenen werte speichern bzw. weiterverarbeiten kann.
eine möglichkeit:... int main() { CUnisex n; CGui gui(n); gui.eingabe(); }die klassen könnten dann so aussehen:
class CGui { private: Cunisex& n_; //refernz auf unisex-objekt public: CGui(CUnisex& n) : n_(n) {} void eingabe() { std::string name; std::cout << "Name: "; std::cin >> name; n.set_name(name); // funktion hinzufügen, mit der man die variablen setzten kann } void ausgabe() { .... }wieso nimmst du eigentlich eine eigene klasse für die ein/ausgabe (gui). dafür reichen auch funktionen aus oder du schreibst es direkt in die main funktion ?
-
Danke fuer die antwort, wenn ich zu hause bin schau ich mir das an.
Ja wir sollen das mit ein und ausgabe in der gui machen meinte mein dozent^^
-
hmmm hab das mal mit deinem Code versucht, jedoch klappt das nicht :S
Mein Dozent meinte mir iwie, ich könne das entweder mit Setter/Getter machen, aber mit nem Konstruktor solle das leichter sein.
-
Sowie du das Programm beschreibst muss man nur ein paar Eingaben machen und die dann Berechnen für micht hört sich das wie ein Programm welches nicht mal 100 Zeilen braucht.
Falls es so ist dann würde ich auf die Klassen ganz verzichten und nur Funktionen verwenden, pack einfach alles in die main.cpp und gut is.^^

-
BunterVogel schrieb:
Mein Dozent meinte mir iwie, ich könne das entweder mit Setter/Getter machen, aber mit nem Konstruktor solle das leichter sein.
Frage Deinen Dozenten doch mal, wozu man Klassen braucht
schrieb:Sowie du das Programm beschreibst muss man nur ein paar Eingaben machen und die dann Berechnen für micht hört sich das wie ein Programm welches nicht mal 100 Zeilen braucht.
genau 10 Zeilen; Leerzeilen und Zeilen, die nur die geschweiften Klammern enthalten, mit gerechnet
#include <iostream> int main() { using namespace std; cout.precision(3); for( float gewicht, groesse; cout << "\nGeben Sie Ihr Gewicht in kg und Ihre Groesse in cm ein: ", cin >> gewicht >> groesse; ) cout << "Ihr BMI ist: " << (10000.*gewicht/(groesse*groesse)) << " kg/m^2" << endl; return 0; }
-
Das ist jetzt aber nichtmal ein Bogey.

-
BunterVogel schrieb:
Ich gehöre zu denen, die mehr durch "machen" und "versuchen" den Ablauf verstehen, als mir jetzt ein Buch durchzulesen.
Wenn du ernsthaft programmieren willst, wirst du damit nicht weit kommen.
BunterVogel schrieb:
...Die Zeit habe ich leider auch nicht mehr, ich muss das Projekt schnell fertig bekommen.
Wenn man zu spät versucht sich um eine Lösung zu bemühen, hat man zu lange geschlafen.
BunterVogel schrieb:
Mir gehts nur noch drum, dass ich mich gerade Frage, wie ich da im obigen Code eine Eingabe von der groesse und gewicht machen kann.
Ich weiß nicht was dein Lehrer sehen will, aber...
1. C++ ist eine Multiparadigmensprache, Objektorientierung wird unterstützt, ist aber nicht immer die optimale Lösung.Du kannst es natürlich mit der Klasse machen, aber ob es in so einem "Minimalfall" sinnvoll ist, steht auf einen anderen Blatt.
2. Ein- und Ausgabe sollte möglichst getrennt werden, um unabhängiger von einer bestimmten Oberfläche (Console, GUI...) zu sein.
Dein Dozent wird hier vermutlich eher zu der praxisfernen Variante mit zwei Methoden zum Ein- bzw. Auslesen tendieren, es sei den er hat tatsächlich schon ernsthaft Softwareentwicklung betrieben.
Wenn man es wirklich so extrem betreibt:
Die unsaubere Variante:
#include "Unisex.h" int main() // void main ist falsch!!! { CUnisex n; // Sowohl die Klassen- als auch Variablenbenennung finde ich schlecht n.einlesen(); n.bmiBerechnung(); n.ausgeben(); system("Pause"); }"Etwas" sauberer
#include "Unisex.h" #include "Gui.h" int main() { CUnisex n; CGui gui(n); // Oder: CGui gui; [Vorteil: eine UI für viele Unisex-Objekte] gui.eingabe(); // gui.eingabe(n); n.bmiBerechnung(); // n.bmiBerechnung(); gui.ausgeben() // gui.ausgabe(n); }
-
Danke für die Antworten erst einmal.
Natürlich besteht das ganze Projekt nicht aus einer Rechnung. Mir geht es wie gesagt nur darum, bei dem gegebenen Code, irgendwie eine Eingabe stattfinden zu lassen und eine Ausgabe. Wenn ich das einmal geschafft und gerafft habe, will ich noch andere Optionen einbauen, wie Unterschiede zwischen Mann und Frau, Alter, Sportleistung, und blablabla.