[c]Taschenrechner Programmierung


Bismark

Erfahrenes Mitglied
Hi Leute,
ich sollte in der Uni ein Taschenrechnerprogramm nach einem Nessi schneidermann-Diagramm unter OpenSuse 10.3 mit dem gcc -Compiler Programmieren.
C:
#include <stdio.h>

void loeschen();	//Funktions Deklaration

char Dummy;

int main()
{
double Op1= 0.0, Op2= 0.0, Erg;
int Menuewahl, GueltigeEingabe = 1, op2u = 0;
int ScanErg;

do
{
//Ausgabe des Menue
printf("\n\n\nEinfacher Taschenrechner\n");
printf("========================\n\n");
printf("< 1.> Addition\n");
printf("< 2.> Subtraktion\n");
printf("< 3.> Multiplikation\n");
printf("< 4.> Division\n\n");
printf("< 9.> Programmende\n\n");
printf("Ihre Wahl:");
ScanErg = scanf("%d",&Menuewahl);

//löschen des Tastataturpuffers
loeschen();

//Ausgabe der Bezeichnung der jeweiligen Aktion
if(ScanErg==1)
{
GueltigeEingabe = 1;

switch(Menuewahl)
{
   case 1:	printf("Addition\n");       
	        printf("--------\n");       break;
   case 2:	printf("Subtraktion\n");    
		printf("-----------\n");    break;
   case 3:	printf("Multiplikation\n");
		printf("--------------\n"); break;
   case 4:      printf("Division\n");	    
	        printf("--------\n");	    break;
   default:     GueltigeEingabe = 0;	    break;
}

}else
{
   printf("\nFalsche Eingabe! Bitte wiederholen Sie!\n");
}

if(GueltigeEingabe == 1)
{
   //Eingabe des 1. Zahls
   do
   {
   printf("\n\nBitte geben Sie den 1. Operanten ein: ");
   loeschen();
   if(scanf("%lf",&Op1) == 1)
   {
	   printf("Falsche Eingabe! Bitte geben Sie den ersten Operanten noch einmal ein!");
   }
   }while(scanf("%lf",&Op1) != 1);
   
   //Eingabe des 2. Zahls
   do
   {
   printf("Bitte geben Sie den 2. Operanten ein: ");
   scanf("%lf",&Op2);
   
   // Für die Eingabeüberprüfung des 2. Operanten
   op2u = scanf("%lf",&Op2);

   loeschen();

   if(scanf("%lf",&Op2) != 1)
   {
	   printf("Falsche Eingabe! Bitte geben Sie den zweiten Operanten noch einmal ein!");
   } else
   {
		if(Menuewahl == 4 && op2u == 0)
		{
			printf("Division durch Null! Bitte geben Sie eine Zahl für den zweiten Operanten ein!");
			op2u = 0;
		}
		else
		{
		}
   }
   }while(op2u == 0);
}

// Ausgabe des Ergebnisses
switch(Menuewahl)
{
   case 1:	Erg = Op1 + Op2;       
		printf("%d +  %d =  %d", &Op1 %Op2 &Erg);break;
   case 2:	Erg = Op1 - Op2;       
		printf("%d -  %d =  %d", &Op1 %Op2 &Erg);break;
   case 3:	Erg = Op1 * Op2;       
	        printf("%d *  %d =  %d", &Op1 %Op2 &Erg);break;
   case 9:	Erg = Op1 * Op2;       
	        printf("%lf /  %lf =  %lf", &Op1 %Op2 &Erg);break;
   default: printf("Falsche Eingabe! Bitte versuchen Sie es noch einmal!");break;
}

loeschen();
} while(Menuewahl != 9);

printf("Programm wird beendet");
return 0;
}





void loeschen()		//Funktions Deffinfition
{

do
{
   Dummy = getc(stdin);
} while(Dummy != '\n');

}

Das problem ist beim Ausgeben der Ergebnissen. Die variablen Op1, Op2 und Erg sind double Variablen und als Fehler gibt der Compiler die %lf als fehler aus obwohl ich diese schon davor gemacht habe, welche nicht als fehler ausgegeben werden. Das programm wird ansonsten ausgeführt.
Das zweite Problem ist bei der Eingabe. Man kann die erste Zahl eingeben, die zweite jedoch nicht.:(:-:)confused::suspekt:

ich würde mich freen, wenn ihr mir helfen könntet.:)

Lg Bismark
 
C:
		printf("%d +  %d =  %d", &Op1 %Op2 &Erg);break
printf erwartet im Gegensatz zu scanf keine Adresse, sondern direkt den auszugebenden Wert. Außerdem muss man auch bei printf (wie bei jedem anderen Funktionsaufruf) die Parameter durch Kommas trennen. Schlussendlich ist der Formatspezifizierer %d nicht für Fließkommazahlen geeignet. Verwende stattdessen %lf. \edit: %lf ist auch falsch, siehe Beitrag von deepthroat weiter unten.

Grüße,
Matthias
 
Zuletzt bearbeitet:

Bismark

Erfahrenes Mitglied
Hi,
muss es so sein:
C:
printf("%lf +  %lf =  %lf", &Op1, %Op2, &Erg);

Halt auch zwischen den Einzelnen variablen?
Lg Bismark
 

Bismark

Erfahrenes Mitglied
Hi,
ich habs so umgestellt, es klapp.
Bei:
C:
 case 9:  Erg = Op1 * Op2;       
            printf("%lf /  %lf =  %lf", &Op1 %Op2 &Erg);break;
kam es auch zur fehlermeldung, wahrscheinlich wegen "versteckter" bezeichner oder so. Mit %f und %lf klappt es halt.


vielendank für die hilfe :) ;) :)
Lg Bismark
 

Neue Beiträge