Supportnet Computer
Planet of Tech

Supportnet / Forum / Anwendungen(Java,C++...)

C-Rechner - case switch problem





Frage

Hallo Leute! habe ein problem bei einem case switch. ich habe ein menu und die auswahl geschieht hier über ein case switch. wenn ich die 1 auswähle wird eine addition ausgeführt (keine probleme). wenn ich aber dann subtraktion auswähle wird das programm beendet und es wird keine berechnung durchgeführt. was stimmt denn bloss nicht? darf ich keine variablen deklarieren in einem case? hier der code: [code] switch (auswahl) { case 1: printf("Addition (gebrochene Zahlen erlaubt)\n"); float summand1=0, summand2=0, summe=0; printf("\terste Zahl eingeben: "); scanf("%f", &summand1); printf("\tzweite Zahl eingeben: "); scanf("%f", &summand2); summe=summand1+summand2; printf("\tSumme: %.3f\n\n", summe); break; case 2: printf("Subtraktion (gebrochene Zahlen erlaubt)\n"); float minuend=0, subtrahend=0, differenz=0; printf("\terste Zahl eingeben: "); scanf("%f", &minuend); printf("\tzweite Zahl eingeben: "); scanf("%f", &subtrahend); differenz=minuend-subtrahend; printf("\tDifferenz: %.3f\n\n", differenz); } [\code] gruss brshna ;)

Antwort 1 von son_quatsch

Glaub ich nicht. Poste doch mal das gesamte Programm (Text in die Antwort einfügen, danach STRG+A, dann "Code"-Button anklicken).

Antwort 2 von Ambulanz!

Das habe ich gerade mal kompiliert:

#include<stdio.h>

int main()
{

int auswahl;

scanf("%d",&auswahl);

switch (auswahl)
   {
   case 1: printf("Addition (gebrochene Zahlen erlaubt)\n");

         float summand1=0, summand2=0, summe=0;

         printf("\terste Zahl eingeben: ");
         scanf("%f", &summand1);
         printf("\tzweite Zahl eingeben: ");
         scanf("%f", &summand2);

         summe=summand1+summand2;

         printf("\tSumme: %.3f\n\n", summe);
      break;

   case 2: printf("Subtraktion (gebrochene Zahlen erlaubt)\n");

         float minuend=0, subtrahend=0, differenz=0;

         printf("\terste Zahl eingeben: ");
         scanf("%f", &minuend);
         printf("\tzweite Zahl eingeben: ");
         scanf("%f", &subtrahend);

         differenz=minuend-subtrahend;

         printf("\tDifferenz: %.3f\n\n", differenz);

   }

   return 0;
}



Im Wesentlichen ist das also dein Programmcode und, was soll ich sagen, zumindest auf meinem Rechner wird auch die Subtraktion einwanfrei durchgeführt (Compiler ist GCC).

Antwort 3 von brshna

hm... komisch...
ich benutze MICROSOFT VISUAL STUDIO 2005

aber vnn der syntax her stimmt das oder? man darf variablen in einem case deklarieren?

was ist gcc? kann ich den kompiler ändern bei VISUAL STUDIO?



gruss brshna

Antwort 4 von brshna

hier noch mal der code (gesamt)

// taschenrechner.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//

#include <stdio.h>
#include <math.h>



void main(void)
{
	
int auswahl=0;

printf("\n\tHallo und viel spass mit dem Calculator von Mike Barmettler\n\t------------------------------------------------------------\n\n\n");	


//Menu
printf("Menu\n----\n\n");
printf("<1> Addition \n");
printf("<2> Subtraktion \n");
printf("<3> Multiplikation \n");
printf("<4> Division \n");
printf("<5> Wurzel (2te)\n");
printf("<6> Kreisflaeche / Kreisumfang / Kreisvolumen \n");
printf("<7> Zahl im Quadrat \n");
printf("<8> Celsius -> Fahrenheit \n");
printf("<9> Sinus \n");
printf("<10> Cosinus \n");
printf("<11> Tangens \n\n");
printf("<12> cm2 -> m2 \n");
printf("<13> m -> feet \n");
printf("<14> feet -> m \n");
printf("<15> m/s -> km/h \n");
printf("<16> km/h -> m/s \n");
printf("<99> Programm Ende\n");
printf("-------------------------------\n\n");


//Abfrage
printf("Was moechten Sie tun?\t");
scanf("%i", &auswahl);
printf("-------------------------------\n\n");

switch (auswahl)
	{
	case 1: printf("Addition (gebrochene Zahlen erlaubt)\n");

			float summand1=0, summand2=0, summe=0;

			printf("\terste Zahl eingeben:      ");
			scanf("%f", &summand1);
			printf("\tzweite Zahl eingeben:     ");
			scanf("%f", &summand2);

			summe=summand1+summand2;

			printf("\tSumme: %.3f\n\n", summe);
		break;

	case 2: printf("Subtraktion (gebrochene Zahlen erlaubt)\n");
			
			float  minuend=0, subtrahend=0, differenz=0;

			printf("\terste Zahl eingeben:      ");
			scanf("%f", &minuend);
			printf("\tzweite Zahl eingeben:     ");
			scanf("%f", &subtrahend);

			differenz=minuend-subtrahend;

			printf("\tDifferenz: %.3f\n\n", differenz);
	
	}

}


Antwort 5 von Ambulanz!

Zitat:
]
D:\DevXP\HB>gcc support2.c -osupport2.exe
support2.c: In function `main':
support2.c:7: warning: return type of 'main' is not `int'
support2.c:72:2: warning: no newline at end of file

D:\DevXP\HB>support2

Hallo und viel spass mit dem Calculator von Mike Barmettler
------------------------------------------------------------


Menu
----

<1> Addition
<2> Subtraktion
<3> Multiplikation
<4> Division
<5> Wurzel (2te)
<6> Kreisflaeche / Kreisumfang / Kreisvolumen
<7> Zahl im Quadrat
<8> Celsius -> Fahrenheit
<9> Sinus
<10> Cosinus
<11> Tangens

<12> cm2 -> m2
<13> m -> feet
<14> feet -> m
<15> m/s -> km/h
<16> km/h -> m/s
<99> Programm Ende
-------------------------------

Was moechten Sie tun? 2
-------------------------------

Subtraktion (gebrochene Zahlen erlaubt)
erste Zahl eingeben: 6
zweite Zahl eingeben: 3
Differenz: 3.000


D:\DevXP\HB>


So, das ist jetzt die komplette Ausgabe in der Windows XP-"Konsole" inklusive Compilerkommandozeile (in Angedenken an das Supportnet habe ich mir erlaubt, entsprechende Dateinamen zu wählen) und einiger Compilerwarnungen.

Die Deklaration ist grundsätzlich zulässig innerhalb eines Switch-Statements, so wie in jeder anderen Programmkontrollstruktur auch (z.B. in Schleifen etc...).

GCC ist ein Compiler (bzw. für Windows benutze ich die MinGW-Portierung desselben, da er ursprünglich wohl aus der UNIX-Welt stammt). Mit Visual Studio wird der ohne größte Änderungen nicht funktionieren.

GCC\MinGW ist kostenlos zu haben unter "Current" -> "MinGW" ->"MinGW-5.1.3.exe"

Eine etwas ältere Version mit IDE gibt es Dev-C++ 5.

Und du könntest eventuell wegen eines IDE mal bei eclipse.org vorbeischauen.

Antwort 6 von brshna

ok habs getestet... es klappt mit dem gcc kompiler

aber woran liegt das, dass ich das nicht kompilieren kann mit dem visual studio?

greez brsh

Antwort 7 von Ambulanz!

Keine Ahnung,

nachher werde ich mal VS 2003 (ein neueres besitz ich nicht) installieren und dann "schau'n mer mal".

Antwort 8 von brshna

oh! das wäre wirklich echt super. ich komm nicht so ganz klar mit dem dev c++. er beendet die konsole immer gleich nach dem er am ende des codes ist... was ich nicht so toll finde...

vielen dank für die hilfe - hoffentlich wird das problem danach auch gefunden =)

greez brshna

Antwort 9 von son_quatsch

MSVC++ 6:
--------------------Konfiguration: supportnet - Win32 Debug--------------------
Kompilierung läuft...
sup2.cpp
c:\sup2.cpp(60) : error C2360: Initialisierung von 'summe' durch 'case'-Marke übersprungen
        c:\sup2.cpp(48) : Siehe Deklaration von 'summe'
c:\sup2.cpp(60) : error C2360: Initialisierung von 'summand2' durch 'case'-Marke übersprungen
        c:\sup2.cpp(48) : Siehe Deklaration von 'summand2'
c:\sup2.cpp(60) : error C2360: Initialisierung von 'summand1' durch 'case'-Marke übersprungen
        c:\sup2.cpp(48) : Siehe Deklaration von 'summand1'
Fehler beim Ausführen von cl.exe.

supportnet.exe - 3 Fehler, 0 Warnung(en)

Erst als ich die erste "float"-Zeile vor das Case gelegt hab, hat es funktioniert. Und zwar prächtig.

Zitat:
er beendet die konsole immer gleich nach dem er am ende des codes ist...

Dann mach doch mal auf die letzte schließende geschweifte Klammer einen Rechtsklick und wähle "Haltepunkt einfügen"

Antwort 10 von brshna

hm.. also muss ich die variablen doch vor den switch stellen - und zwar alle?

also kann ich die variablen doch nicht in einem case deklarieren.... oder?



greez brsh

Antwort 11 von son_quatsch

Das ist eine Art Glaubensfrage. Ich würde schon sagen, dass Deklarationen innerhalb von CASE-Labels daneben sind. Stell Dir mal vor, Du verwendest keinen BREAK-Sprungbefehl, dann rattert Dein Code auch in die nächsten Codezeilen hinein. Was wäre, wenn dort nochmal dieselbe Variable deklariert wird?

Aber was ich mir nicht erklären kann ist, warum VC nur die ersten Deklarationen anmeckert, aber die zweiten (bei CASE 2:) nicht. Wie gesagt - ich wär das nie so angegangen. Da Du eh immer drei Variablen hast, könntest Du sie auch genausogut einmalig Wert1, Wert2 und Erg nennen, statt sie für jeden Zweck anders zu deklarieren.

Antwort 12 von brshna

hab ich jetzt auch so gemacht... aber er meckert jetzt wieder irgendwas von: "syntax error before '=' token"

bei diesem abschnitt:

case 6: printf("Kreisflaeche / Kreisumfang / Kreisvolumen\n");

float r=0, flae=0, umf=0, vol=0;

printf("\tRadius eingeben: ");
scanf("%f", &r);

--> flae=(PI/4) * (r+r)^2;
umf=2 * r * PI;
vol=4/3 * PI * r^3;

printf("\tFlaeche: %.4f\n\n", flae);
printf("\tUmfang: %.4f\n\n", umf);
printf("\tVolumen: %.4f\n\n", vol);
break;

der gleiche fehler bei all den anderen formeln bzw. berechnungen... darf man das nicht in einem case? schon oder?

Antwort 13 von Ambulanz!

Was hältst du davon, den Code der Kreisberechnungen so

flae = pow(r,2)*PI;
   umf = 2 * r * PI;
   vol = pow(4/3 * PI * r,3);
// wahrscheinlich Kugelvolumen

zu formulieren und die gesamten Berechnungen (auch der anderen Calculator-Funktionen) in eigene Funktionen zu packen?

Etwa so in der Art (und nur als Beispiel gedacht):


#include<stdio.h>

#define PI 3.1415

void add();
void sub();
void kreis();

int main()
{

int auswahl;

do
{
printf("Bitte Auswahl treffen: (1) (2) (6) oder (99)");
scanf("%d",&auswahl);

switch (auswahl)
{
case 1:
add();
break;

case 2:
sub();
break;

case 6:
kreis();
break;

default:
break;

}
}while(auswahl!=99);

return 0;
}

void add()
{
printf("Addition (gebrochene Zahlen erlaubt)\n");

float summand1=0, summand2=0, summe=0;

printf("\terste Zahl eingeben: ");
scanf("%f", &summand1);
printf("\tzweite Zahl eingeben: ");
scanf("%f", &summand2);

summe=summand1+summand2;

printf("\tSumme: %.3f\n\n", summe);
}

void sub()
{
printf("Subtraktion (gebrochene Zahlen erlaubt)\n");

float minuend=0, subtrahend=0, differenz=0;

printf("\terste Zahl eingeben: ");
scanf("%f", &minuend);
printf("\tzweite Zahl eingeben: ");
scanf("%f", &subtrahend);

differenz=minuend-subtrahend;

printf("\tDifferenz: %.3f\n\n", differenz);
}

void kreis()
{
printf("Kreisflaeche / Kreisumfang / Kreisvolumen\n");

float r=0, flae=0, umf=0, vol=0;

printf("\tRadius eingeben: ");
scanf("%f", &r);

flae = flae = pow(r,2)*PI;
umf = 2 * r * PI;
vol = pow(4/3 * PI * r,3); // wahrscheinlich Kugelvolumen

printf("\tFlaeche: %.4f\n\n", flae);
printf("\tUmfang: %.4f\n\n", umf);
printf("\tVolumen: %.4f\n\n", vol);
}

Der Code compiliert mit GCC wunderbar (und gibt als Bonus auch die erwarteten Egebnisse aus).

VS habe ich noch nicht installiert und komme dazu heute wohl nicht mehr.

PS: So weit ich mich erinnern kann, gilt für Kreise:

Flächeninhalt = pi * Radius²
Umfang = 2 * pi * Radius
Durchmesser = 2 * Radius

Kreisvolumen kann ich nicht so richtig zuordnen. Was ist damit gemeint? Die Formel jedenfalls deutet auf die Berechnung eines Kugelvolumens hin.

Antwort 14 von Ambulanz!

Kleine Fehlerkorrektur in der Funktion kreis():

Es muss
 flae = pow(r,2)*PI;
heissen und nicht flae = flae = pow(r,2)*PI; (beim copy'n'paste sollte ich besser schon mal genauer hingucken).

Antwort 15 von brshna

Zitat:
Kreisvolumen kann ich nicht so richtig zuordnen. Was ist damit gemeint? Die Formel jedenfalls deutet auf die Berechnung eines Kugelvolumens hin.


autsch =) ja hast recht =)

Zitat:
Flächeninhalt = pi * Radius²


unser mathelehrer meint zu dieser formel: "das ist kindergarten" =o (dipl. Ingenieur)

naja es funzt aber auch so =)


vielen dank - ich werde das mit den funktionen beachten, bzw. einbauen.

greez brshna

Antwort 16 von brshna

vielen dank!

mein rechner funzt!!!!! echt geil!!!

gruss brshna

hier der code falls den jemand möchte:

Zitat:

// taschenrechner.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//

#include <stdio.h>
#include <math.h>
#define PI 3.14159265

//Funktionen zu den Berechnungen
void add()
{
float summand1=0, summand2=0, summe=0;
printf("Addition (gebrochene Zahlen erlaubt)\n");
printf("\terste Zahl eingeben: ");
scanf("%f", &summand1);
printf("\tzweite Zahl eingeben: ");
scanf("%f", &summand2);

summe=summand1+summand2;

printf("\tSumme: %.4f\n\n", summe);
}
void sub()
{
float minuend=0, subtrahend=0, differenz=0;
printf("Subtraktion (gebrochene Zahlen erlaubt)\n");
printf("\terste Zahl eingeben: ");
scanf("%f", &minuend);
printf("\tzweite Zahl eingeben: ");
scanf("%f", &subtrahend);

differenz=minuend-subtrahend;

printf("\tDifferenz: %.4f\n\n", differenz);
}
void mult()
{
float faktor1=0, faktor2=0, produkt=0;
printf("Multiplikation (gebrochene Zahlen moeglich)\n");

printf("\terste Zahl eingeben: ");
scanf("%f", &faktor1);
printf("\tzweite Zahl eingeben: ");
scanf("%f", &faktor2);

produkt=faktor1*faktor2;

printf("\tProdukt: %.4f\n\n", produkt);
}
void kreis()
{
double r=0, flae=0, umf=0, vol=0;
printf("Kreisflaeche / Kreisumfang / Kreisvolumen\n");

printf("\tRadius eingeben: ");
scanf("%lf", &r);

flae = pow(r,2)*PI;
umf = 2 * r * PI;
vol = pow(4/3 * PI * r,3);

printf("\tFlae84che: %.4lf\n\n", flae);
printf("\tUmfang: %.4lf\n\n", umf);
printf("\tVolumen: %.4lf\n\n", vol);
}

void div()
{
float dividend=0, divisor=0, quotient=0;
printf("Division (gebrochene Zahlen moeglich)\n");

printf("\terste Zahl eingeben: ");
scanf("%f", &dividend);
printf("\tzweite Zahl eingeben: ");
scanf("%f", &divisor);

quotient=dividend / divisor;

printf("\tQuotient: %.4f\n\n", quotient);
}

void wurz2()
{ double zahl_wurzel2=0, resultat=0;
printf("Wurzel (2te) (gebrochene Zahlen moeglich)\n");

printf("\tZahl eingeben: ");
scanf("%lf", &zahl_wurzel2);

resultat=sqrt(zahl_wurzel2);

printf("\tResultat: %.4lf\n\n", resultat);
}
void zahl_quadriert()
{
float zahl=0, resultat=0;
printf("Zahl im Quadrat\n");
printf("\tZahl eingeben: ");
scanf("%f", &zahl);

resultat=pow(zahl,2);

printf("\tResultat: %.4f\n\n", resultat);
}
void sinus()
{
double zahl=0;
printf("Sinus\n");
printf("Zahl eingeben: ");
scanf("%lf", &zahl);
printf("Resultat: %.4lf\n\n", sin(zahl));
}
void cosinus()
{
double zahl=0;
printf("Cosinus\n");
printf("Zahl eingeben: ");
scanf("%lf", &zahl);
printf("Resultat: %.4lf\n\n", cos(zahl));
}
void tangens()
{
double zahl=0;
printf("Tangens\n");
printf("Zahl eingeben: ");
scanf("%f", &zahl);
printf("Resultat: %.4f\n\n", tan(zahl));
}
void cel_fahr()
{
float cel=0, fahr=0;
printf("Celsius -> Fahrenheit \n");
printf("\tCelsius Temperatur eingeben: ");
scanf("%f", &cel);

fahr=(cel * 9/5)+32;

printf("\tFahrenheit: %.4f\n\n", fahr);
}
void fahr_cel()
{
float cel=0, fahr=0;
printf("Fahrenheit -> Celsius \n");
printf("\tFahrenheit Temperatur eingeben: ");
scanf("%f", &fahr);

cel=(fahr-32)*5/9;

printf("\tCelsius: %.4f\n\n", cel);
}
void cm_m()
{
float cm=0, m=0, resultat=0;
printf("cm2 -> m2 \n");
printf("\tZahl eingeben: ");
scanf("%f", &cm);

resultat=cm / 10000;

printf("\tResultat: %.4f\n\n", resultat);
}
void m_feet()
{
double m=0, ft=0;
printf("m -> feet\n");
printf("\tMeter eingeben: ");
scanf("%lf", &m);

ft= m/0.3048;

printf("\tFeet(Fuss): %.4lf\n\n", ft);
}
void feet_m()
{
double m=0, ft=0;
printf("feet -> m\n");
printf("\tFeet(Fuss) eingeben: ");
scanf("%lf", &ft);

m= ft*0.3048;

printf("\tMeter: %.4lf\n\n", m);
}
void ms_kmh()
{
double m=0, km=0;
printf("m/s -> km/h \n");
printf("\tm/s eingeben (nur m): ");
scanf("%lf", &m);

km=m*3.6;

printf("\tkm/h: %.4lf\n\n", km);
}



void kmh_ms()
{
double m=0, km=0;
printf("km/h -> m/s\n");
printf("\tkm/h eingeben (nur km): ");
scanf("%lf", &km);

m=km/3.6;

printf("\tm/s: %.4lf\n\n", m);
}




//Hauptprogramm
void main(void)
{

int auswahl=0;
float zahl=0, resultat=0, cel=0, fahr=0, m=0, km=0, ft=0;

//Begrüssung und Info
printf("\n\tHallo und viel spass mit dem Calculator (v1.0) \n\t------------------------------------------------------------\n\n\n");


//Menu
printf("Menu\n----\n\n");
printf("<1> Addition \n");
printf("<2> Subtraktion \n");
printf("<3> Multiplikation \n");
printf("<4> Division \n");
printf("<5> Wurzel (2te)\n");
printf("<6> Kreisflaeche / Kreisumfang / Kreisvolumen \n");
printf("<7> Zahl im Quadrat \n");
printf("<8> Sinus \n");
printf("<9> Cosinus \n");
printf("<10> Tangens \n\n");
printf("<11> Celsius -> Fahrenheit \n");
printf("<12> Fahrenheit -> Celsius \n");
printf("<13> cm2 -> m2 \n");
printf("<14> m -> feet \n");
printf("<15> feet -> m \n");
printf("<16> m/s -> km/h \n");
printf("<17> km/h -> m/s \n");
printf("<99> Programm Ende\n");
printf("-------------------------------\n\n");


//Abfrage
do{
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("Was moechten Sie tun?\t");
scanf("%i", &auswahl);
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n");


switch (auswahl)
{
/*Addition*/ case 1: add();
break;

/*Subtraktion*/ case 2: sub();
break;

/*Multiplikation*/ case 3: mult();
break;

/*Division*/ case 4: div();
break;

/*zweite Wurzel*/ case 5: wurz2();
break;

case 6: kreis();
break;

case 7: zahl_quadriert();
break;

case 8: sinus();
break;

case 9: cosinus();
break;

case 10: tangens();
break;

case 11: cel_fahr();
break;

case 12: fahr_cel();
break;

case 13: cm_m();
break;

case 14: m_feet();
break;

case 15: feet_m();
break;

case 16: ms_kmh();
break;

case 17: kmh_ms();
break;

case 99: break;

default: printf("ungueltige Eingabe\n");
}
}while (auswahl!=99);
}


Antwort 17 von brshna

oooooh ooooooh

hab da was fest gestellt bei der berechnung vom kugelvolumen...

Zitat:
vol = 4/3 * PI * pow(r,3);


aber wenn ich folgendes im taschenrechner (physikalischer) eingebe: 4/3 * PI * 15^3 erhalte ich 14137.16694

und wenn ich bei dem programm den radius von 15 eingebe ergibt sich 10602.8752

was stimmt da nicht?

Antwort 18 von Ambulanz!

Das Ergebnis der Division 4/3 wird vom Compiler als vom (ganzzahligen) Typ Integer interpretiert (4/3=1).

Wenn du daraus bspw. ein 4/3.0 - demnach float - machst, erhältst du auch das korrekte Kugelvolumen (4/3.0=1.333333).

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: