voldemort Geschrieben 18. November 2010 Geschrieben 18. November 2010 (bearbeitet) hallo zusammen. wenn ich das programm starte und den umfang berechne soll mir ja das programm mein menü neu aufrufen. deswegen steht es ja in der schleife. nun habe ich aber das problem das es zwei mal aufgerufen wird.genau so läuft es auch mit der flächenberechnung. kann jemand erkennen warum das so ist bzw ob meine lösung die ich nun eingefügt habe optimal ist? die zweite frage. ich würde gerne wenn ich die 3 eingebe das ich den umfang und die fläche berechnen kann. ist das irgendwie möglich ohne die beiden blöcke zu kopieren und umzudeklarieren? #define PI 3.141459265358979 void umfang (float); void flaeche (float); int _tmain(int argc, _TCHAR* argv[]) { char eingabe; do { fflush (stdin); //<----OPTIMALE LÖSUNG? printf("Was moechten Sie berechnen?\n"); printf(" 1 :Umfang\n"); printf(" 2 :Flaeche\n"); printf(" 3 : Umfang und Flaeche\n"); printf(" 0 : Programm beenden\n"); scanf("%c",&eingabe); fflush (stdin); switch (eingabe) { case ('1'): float rU; printf("Bitte Radius fuer Umfang eingeben\n"); scanf("%f",&rU); umfang(rU); break; case ('2'): float rA; printf("Bitte Radius fuer Flaeche eingeben\n"); scanf("%f",&rA); flaeche(rA); break; /*case '3':*/ case ('0'): printf("Das Programm wurde verlassen\n"); return 0; break; } }while (1); return 0; } void umfang (float rU) { printf("Der Umfang betraegt: %f\n",2*PI*rU); } void flaeche (float rA) { printf("Die Flaeche betraegt: %f\n",rA*rA*PI); } grüße voldemort Bearbeitet 18. November 2010 von voldemort Zitieren
Der_Lampe Geschrieben 19. November 2010 Geschrieben 19. November 2010 um punkt 3 umzusetzen kannst du das float rU; printf("Bitte Radius fuer Umfang eingeben\n"); scanf("%f",&rU); umfang(rU); komplett in eine funktion auslagern genauso wie den flaechenteil und dann eben bei 3 beide funktionen aufrufen und in 1 bzw 2 eben nur die benötigte zu deinem andern problem: wo liegt das problem genau? was macht er bzw was macht er nicht? ich raff grad deine problembeschreibung nicht :upps Zitieren
voldemort Geschrieben 19. November 2010 Autor Geschrieben 19. November 2010 also wenn ich das menü so programmiere......... do { printf("Was moechten Sie berechnen?\n"); printf(" 1 : Umfang\n"); printf(" 2 : Flaeche\n"); printf(" 3 : Umfang und Flaeche\n"); printf(" 0 : Programm beenden\n"); scanf("%c",&eingabe); fflush (stdin); .......... ...bekomm ich mit eingabe 1 für umfang berechnen und 5 für den radius zu berechnen folgende ausgabe: Was moechten Sie berechnen? 1 : Umfang 2 : Flaeche 3 : Umfang und Flaeche 0 : Programm beenden 1 Bitte Radius fuer Umfang eingeben 5 Der Umfang betraegt: 31.414593 Was moechten Sie berechnen? 1 : Umfang 2 : Flaeche 3 : Umfang und Flaeche 0 : Programm beenden Was moechten Sie berechnen? 1 : Umfang 2 : Flaeche 3 : Umfang und Flaeche 0 : Programm beenden wenn ich nun aber das menü so programmiere do { fflush (stdin); printf("Was moechten Sie berechnen?\n"); printf(" 1 : Umfang\n"); printf(" 2 : Flaeche\n"); printf(" 3 : Umfang und Flaeche\n"); printf(" 0 : Programm beenden\n"); scanf("%c",&eingabe); fflush (stdin); ....... dann ist die ausgabe korrekt. die frage war nun ob das eine saubere lösung ist oder es ne optimale alternative gibt. Zitieren
Der_Lampe Geschrieben 19. November 2010 Geschrieben 19. November 2010 naja wenn du den bildschirm löschen willst bevor das menü zum zweiten mal angezeigt wird musst du das fflush ja irgendwohin machen... ich würde es allerdings eher an diese stelle setzen: } fflush(stdin); }while (1); weil warum solltest du den bildschirm löschen wenn eh noch nichts darauf steht aber prinzipiell ist das denke ich mal egal irgendwo muss es ja stehen Zitieren
Klotzkopp Geschrieben 19. November 2010 Geschrieben 19. November 2010 aber prinzipiell ist das denke ich mal egal irgendwo muss es ja stehen Eigentlich sollte fflush(stdin) nirgendwo stehen, weil es nicht portabel ist. Sauberer ist es, alles aus dem Eingabepuffer herauszulesen, bis man den Zeilenumbruch findet. Zitieren
Der_Lampe Geschrieben 19. November 2010 Geschrieben 19. November 2010 ok dafür kenn ich mich in C zu wenig aus :floet: sorry :upps Zitieren
_n4p_ Geschrieben 19. November 2010 Geschrieben 19. November 2010 fflush(stdin) löscht auch nicht den bildschirm sondern leert den eingabepuffer. und nach beiden scanf() befindet sich jeweils noch das "Enter" im eingabepuffer, was dann beim nächsten aufruf von scanf() mitgelesen wird. darum statt scanf besser mit fgets arbeiten Zitieren
Klotzkopp Geschrieben 19. November 2010 Geschrieben 19. November 2010 fflush(stdin) löscht auch nicht den bildschirm sondern leert den eingabepuffer.Bei manchen Compilern, ja. Laut Standard erzeugt es undefiniertes Verhalten. Darum ist es nicht portabel. Zitieren
voldemort Geschrieben 20. November 2010 Autor Geschrieben 20. November 2010 halllo zusammen und erstmal danke bis hier. ich habe nun das scanf und das printf mit cout und cin getauscht. so mit kann man ja das fflush(stdin) weglassen und lernen dann langsam die c++ befehle #include "stdafx.h" #include <stdlib.h> #include <iostream> #define PI 3.141459265358979 using namespace std; // 1. Deklaration void umfang (float); void flaeche (float); void punkt_drei (float,float); // 2. Definition void umfang (float rU) { cout<<"\nDer Umfang betraegt:\n"<<PI*2*rU; //U=PI*d } void flaeche (float rA) { cout<<"\nDie Flaeche betraegt:\n"<<rA*rA*PI; //A=PI*d*d*/4 } void punkt_drei (float rU,float rA) { cout<<"\nBitte Radius fuer Umfang eingeben\n"; cin >>rU; umfang(rU); cout<<"\nBitte Radius fuer Flaeche eingeben\n"; cin >>rA; flaeche(rA); } // 3. Aufruf int _tmain(int argc, _TCHAR* argv[]) { char eingabe; do { cout<<"\nWas moechten Sie berechnen?\n"; cout<<" 1 : Umfang\n"; cout<<" 2 : Flaeche\n"; cout<<" 3 : Umfang und Flaeche\n"; cout<<" 0 : Programm beenden\n"; cin >>eingabe; switch (eingabe) { case ('1'): float rU; cout<<"Bitte Radius fuer Umfang eingeben\n"; cin >>rU; umfang(rU); break; case ('2'): float rA; cout<<"Bitte Radius fuer Flaeche eingeben\n"; cin >>rA; flaeche(rA); break; case ('3'): punkt_drei(rU,rA); break; case ('0'): cout<<"Das Programm wurde verlassen\n"; return 0; break; } }while (1); return 0; } nun muss ich das programm so umschreiben das die ergebnisse per rückgabewert an die main übergegeben werden. d.h. heißt doch float umfang (float rU); float umfang(float rU) { float erg=(rU*2*PI); return erg; } main () { float erg; erg =umfang(rU); cout<<"Der Umfang betraegt: "<<erg; } ist das bsp so korrekt? falls ja tritt ja dann hier das problem auf das ich mit switch case arbeite und hier den wert für erg mehrmals benötige;für umfang, fläche und für den punkt 3. muss ich jedesmal ne neue deklaratoin für jeden case punkt finden oder gibt es da ne andere möglichkeit? grüße Zitieren
Klotzkopp Geschrieben 20. November 2010 Geschrieben 20. November 2010 falls ja tritt ja dann hier das problem auf das ich mit switch case arbeite und hier den wert für erg mehrmals benötige;für umfang, fläche und für den punkt 3. muss ich jedesmal ne neue deklaratoin für jeden case punkt finden oder gibt es da ne andere möglichkeit?Du kannst erg auch komplett weglassen: cout<<"Der Umfang betraegt: "<<umfang(rU); Das gleiche hier: float umfang(float rU) { return rU*2*PI; }[/code] Zitieren
lilith2k3 Geschrieben 20. November 2010 Geschrieben 20. November 2010 (bearbeitet) #include <iostream> #include <string> using namespace std; const double PI=3.14159; const char CircumferenceOption = '1'; const char AreaOption = '2'; const char AreaAndCircumferenceOption ='3'; const char ExitOption = 'e'; void PrintMenu(); double AreaCalc(double Radius); double CircumferenceCalc(double Radius); double GetRadiusPrompt(string Prompt); int main(int argc, char** argv) { char answer='x'; double radius=0; while (answer != ExitOption) { PrintMenu(); cin >> answer; switch (answer) { case CircumferenceOption: radius = GetRadiusPrompt("Bitte geben Sie den Radius für die Umfangsberechnung ein"); cout << CircumferenceCalc(radius) << endl; break; case AreaOption: radius = GetRadiusPrompt("Bitte geben Sie den Radius für die Areaberechnung ein"); cout << AreaCalc(radius) << endl; break; case AreaAndCircumferenceOption: radius = GetRadiusPrompt("Bitte geben Sie den Radius für die Unfang- und Areaberechnung ein"); cout << CircumferenceCalc(radius) << endl; cout << AreaCalc(radius) << endl; break; } } return 0; } void PrintMenu() { cout<<"Was moechten Sie berechnen?\n\n"; cout<< CircumferenceOption << " : Umfang\n"; cout<< AreaOption << " : Flaeche\n"; cout<< AreaAndCircumferenceOption << " : Umfang und Flaeche\n"; cout<< ExitOption << ": Programm beenden\n\n"; } double GetRadiusPrompt(string Prompt) { double radius=0; cout << endl <<Prompt << ": "<< endl; if (!(cin>>radius)) { cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); } return radius; } double CircumferenceCalc(double Radius) { return 2*Radius*PI; } double AreaCalc(double Radius) { return Radius*Radius*PI; }[/PHP] Bearbeitet 20. November 2010 von Klotzkopp Auf Wunsch des Autors geändert Zitieren
voldemort Geschrieben 20. November 2010 Autor Geschrieben 20. November 2010 so denne hier mal mein überarbeitetes programm #include "stdafx.h" #include <stdlib.h> #include <iostream> #define PI 3.141459265358979 using namespace std; // 1. Deklaration float umfang (float rU); float flaeche (float rA); // 2. Definition float umfang (float rU) { return PI*2*rU; //U=PI*d } float flaeche (float rA) { return rA*rA*PI; //A=PI*d*d*/4 } // 3. Aufruf int _tmain(int argc, _TCHAR* argv[]) { char eingabe; do { cout<<"\nWas moechten Sie berechnen?\n"; cout<<" 1 : Umfang\n"; cout<<" 2 : Flaeche\n"; cout<<" 3 : Umfang und Flaeche\n"; cout<<" 0 : Programm beenden\n"; cin >>eingabe; switch (eingabe) { case ('1'): float rU; cout<<"Bitte Radius fuer Umfang eingeben\n"; cin >>rU; cout<<"Der Umfang betraegt: "<<umfang(rU); break; case ('2'): float rA; cout<<"Bitte Radius fuer Flaeche eingeben\n"; cin >>rA; cout<<"Die Flaeche betraegt: "<<flaeche(rA); break; case ('3'): cout<<"\nBitte Radius fuer Umfang eingeben\n"; cin >>rU; cout<<"Der Umfang betraegt: "<<umfang(rU); cout<<"\nBitte Radius fuer Flaeche eingeben\n"; cin >>rA; cout<<"Die Flaeche betraegt: "<<flaeche(rA); break; case ('0'): cout<<"Das Programm wurde verlassen\n"; return 0; break; } }while (1); return 0; } gibt es verbesserungsvorschläge? grüße Zitieren
rfc793 Geschrieben 24. November 2010 Geschrieben 24. November 2010 Also wenn du nur den Bildschirm löschen willst, um dein Menü frisch anzuzeigen gibt es eine elegante Methode --> einfach system("cls"); // clearscreen und gut ist und wenn du noch möchtest, das dein Programm an welcher Stelle auch immer kurz eine Pause einlegt welche der Anwender wieder mit der Eingabetaste quittiert, dann einfach --> system("pause"); in den Code einfügen... natürlich nur dort wo es auch sinnvoll ist Zitieren
Klotzkopp Geschrieben 24. November 2010 Geschrieben 24. November 2010 Also wenn du nur den Bildschirm löschen willst, um dein Menü frisch anzuzeigen gibt es eine elegante Methode --> einfach system("cls"); // clearscreen und gut ist Das ist weder elegant noch gut. Erstens ist es nicht portabel und zweitens ein Sicherheitsrisiko. system("pause") ist nicht besser. Zitieren
voldemort Geschrieben 25. November 2010 Autor Geschrieben 25. November 2010 und das war auch nicht mein vorhaben Zitieren
rfc793 Geschrieben 26. November 2010 Geschrieben 26. November 2010 Das ist weder elegant noch gut. Erstens ist es nicht portabel und zweitens ein Sicherheitsrisiko. system("pause") ist nicht besser. Nun ja, stimmt portabel ist es nicht dennoch für *einfache* Anwendungen eine elegante Lösung also warum nicht davon gebrauch machen? Und in kleinen Anwendungen (für den Heimgebrauch und zu Testzwecken) ist es sicher kein Sicherheitsproblem warum auch? Für so Anwendungen welche eine Fläche berechnen sollen oder derartiges kann man das ignorieren, aber das ist auch Geschmackssache und liegt im ermessen des Erstellers. Egal, wollte ja nur einen Tip geben und niemandem Schaden zufügen ^^ Zitieren
Klotzkopp Geschrieben 26. November 2010 Geschrieben 26. November 2010 Nun ja, stimmt portabel ist es nicht dennoch für *einfache* Anwendungen eine elegante Lösung also warum nicht davon gebrauch machen?Wie ich schon sagte, es ist nicht elegant. Es ist eine Krücke, nichts weiter. "Ich muss hier ein anderes Programm starten, weil ich diese Funktionalität selbst nicht hinbekomme". Und in kleinen Anwendungen (für den Heimgebrauch und zu Testzwecken) ist es sicher kein Sicherheitsproblem warum auch?Ob das ein Sicherheitsproblem ist, hängt doch nicht von der Größe des Programms ab. Wenn dir jemand ein Schadprogramm namens cls.exe oder pause.exe unterschiebt, dann ist doch egal, welche Art Programm das ausführt. Egal, wollte ja nur einen Tip gebenDas ist mir bewusst, ich wollte dir keine böse Absicht unterstellen. Das Problem ist, dass sich solche "Tips" schneller verbreiten, als das Wissen, dass das keine gute Lösung ist. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.