Zum Inhalt springen

Frage zu meinem Programm mit Funktion,Schleife und SwitchCase


Empfohlene Beiträge

Geschrieben (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 von voldemort
Geschrieben

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

Geschrieben

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.

Geschrieben

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 ;)

Geschrieben
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.

Geschrieben

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

Geschrieben

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

Geschrieben
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]

Geschrieben (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 von Klotzkopp
Auf Wunsch des Autors geändert
Geschrieben

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

Geschrieben

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

Geschrieben
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.
Geschrieben
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 ^^

Geschrieben
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 geben
Das 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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...