PDA

Vollständige Version anzeigen : [c++]Macht nicht das was er soll.


mose
13-09-2005, 20:24
Also. Hab mir was mit case und switch überlegt aber er macht es nicht.Er soll in den zweiten bereich springen wo case 2: ist.Es ist egal das bei den anderen Sachen nichts ist. Das muss ich noch schreiben.. ich weiss nicht wieso =( sitze schon 30min dran und ich weiss nicht weiter. Bitte nur bei dem Problem helfen keine Tipps und so.Danke.


#include <iostream.h>
#include <stdlib.h>

int main()
{
cout<<"******************************************************************************"<<endl;
cout<<"* Papa_Baer (Mathe) *"<<endl;
cout<<"******************************************************************************"<<endl;
int P1;
cout<<"[ 1]Geometrie"<<endl;
cout<<"[ 2]Binomische Formeln"<<endl;
cout<<"[ 3]Zinsrechnung"<<endl;
cout<<"[ 4]Zinseszinsrechnung"<<endl;
cout<<"[ 5]Satz des Pythagoras"<<endl;
cout<<"[ 6]Trigonometrische Beziehungen"<<endl;
cout<<"[ 7]Infos"<<endl;
cin>>P1;
//########################################################################################## ###
//########################################################################################## ###
//########################################################################################## ###
switch(P1)

case 1:






//########################################################################################## ###
//########################################################################################## ###
//########################################################################################## ###
switch(P1)

{
case 2:
int b1;
cout<<"******************************************************************************"<<endl;
cout<<"* Papa_Baer Modul (binomische Formeln) *"<<endl;
cout<<"******************************************************************************"<<endl;
cout<<"[1]Die erste binomische Formel"<<endl;
cout<<"[2]Die zweite binomische Formel"<<endl;
cout<<"[3]Die dritte binomische Formel"<<endl;
cout<<"[4]Infos zu den binomischen Formeln"<<endl;
cin>>b1;
break;
switch(b1)
{
case 1:
float a;
float b;
cout<<"Bitte geben Sie den Faktor a an und dann b."<<endl;
cin>>a;
cin>>b;
cout<<"Das Ergebnis ist:"<<((a+b)*(a+b))<<endl;
cout<<"Formel:("<<a<<"+"<<b<<")*("<<a<<"+"<<b<<")="<<a*a<<"+"<<a*b+a*b<<"+"<<b*b<<"."<<endl;
break;
};
switch(b1)
{
case 2:
float a;
float b;
cout<<"Bitte geben Sie den Faktor a an und dann b."<<endl;
cin>>a;
cin>>b;
cout<<"Das Ergebnis ist:"<<((a+b)*(a+b))<<endl;
cout<<"Formel:("<<a<<"-"<<b<<")*("<<a<<"-"<<b<<")="<<a*a<<"+"<<a*b+a*b<<"-"<<b*b<<"."<<endl;
break;
};
switch(b1)
{
case 3:
float a;
float b;
cout<<"Bitte geben Sie den Faktor a an und dann b."<<endl;
cin>>a;
cin>>b;
cout<<"Das Ergebnis ist:"<<((a+b)*(a-b))<<endl;
cout<<"Formel:("<<a<<"+"<<b<<")*("<<a<<"-"<<b<<")="<<a*a<<"-"<<b*b<<"."<<endl;
break;
};
switch(b1)
case 4:
cout<<"Um was geht es bei den binomischen Formeln überhaupt?"<<endl;
cout<<"Die binomischen Formeln - es gibt drei Stück davon - sind ein Hilfsmittel zum Ausmultiplizieren und Ausklammern. Beim Ausmultiplizieren sparen sie Zeit, beim Ausklammern sind sie oft unersetzlich."<<endl;

cout<<"Schauen wir uns dazu ein Beispiel an: (3a+4b)^2 = (3a+4b)*(3a+4b)"<<endl;
cout<<" = 3a*3a+3a*4b+3a*4b+3a*"<<endl;
cout<<" = 9a^2+12ab+12ab+16b^2"<<endl;
cout<<" = 9a^2+24ab+16b^2"<<endl;
cout<<""<<endl;
cout<<"So konnten wir schon bisher durch Ausmultiplizieren die Klammer auflösen. Es geht uns nun aber darum, zu überlegen, ob wir nicht vielleicht die Zwischenschritte einsparen und in Zukunft direkt das Ergebnis hinschreiben können."<<endl;
break;
};

//########################################################################################## ###
//########################################################################################## ###
//########################################################################################## ###
switch(P1)

case 3:

//########################################################################################## ###
//########################################################################################## ###
//########################################################################################## ###
switch(P1)

case 4:


//########################################################################################## ###
//########################################################################################## ###
//########################################################################################## ###
switch(P1)
{
case 5:

cout<<"Der Satz des Pythagoras ist einer der fundamentalen mathematischen Saetze der euklidischen Geometrie: Fuer die Seiten jedes ebenen rechtwinkligen Dreiecks gilt die Beziehung a2 + b2 = c2, wobei a und b für die Längen der winkelanliegenden Seiten, der Katheten, stehen und c die Laenge der dem rechten Winkel gegenueberliegenden Seite, der Hypotenuse, darstellt. In der modernen Mathematik ist der Satz aufgrund seiner Aussagen zum Konzept des Senkrechtstehens bedeutsam."<<endl;
break;
};
//########################################################################################## ###
//########################################################################################## ###
//########################################################################################## ###
switch(P1)

case 6:


//########################################################################################## ###
//########################################################################################## ###
//########################################################################################## ###
switch(P1)
{
case 7:
cout<<"##Infos##"<<endl;
cout<<"Was ist Papa_Baer?"<<endl;
cout<<" Papa_Baer ist ein Programm das dazu da ist:"<<endl;
cout<<" einem bei den Mathe Hausaufgaben zu helfen."<<endl;
cout<<"Warum wurde diese Programm geschrieben?"<<endl;
cout<<" Ich hab das Programm nur geschrieben um C++ zu lernen."<<endl;
cout<<"Darf ich das Programm verendern?"<<endl;
cout<<" Ja, du darfst das Programm verendern. Aber du musst dann die neue"<<endl;
cout<<" Version mir dann zuschicken."<<endl;
break;
};
//########################################################################################## ###
//########################################################################################## ###
//########################################################################################## ###



system("PAUSE");
return 0;
}

kaki100
13-09-2005, 20:29
ich mag switch und case net, weil ich das meiste mit if und else.

Also jede case(s) müssen mit einem break beendet werden. Was ich glaube ich bei dir nicht gsehen habe.

zb.:

switch

case
case
case

break;

case
case

break;

case
case

break;



default


Aber wie gesagt, ich mach net soviel mit switch und case :D



EDIT: Wenn du einmal eine Switch abfrage für die Variable P1 machst, musst du weiter unten net wieder "switch(P1)" schreiben, da mit break ja unterbrochen wird

mose
13-09-2005, 20:34
JO danke das wars :) hab par mahl das break; vergessen =/ naja dummer Fehler.

EDIT:// Jetzt taucht es in der 2ten Spalte auf -.-°
EDIT// Ich meine den Fehler-.-

kaki100
13-09-2005, 20:36
beherzige trotzdem mein "EDIT" bitte ;)

MyersGer
13-09-2005, 20:44
da isn bisschen mehr falsch... 2 mal switch dannn n case dann wieder n switch keine geschweiften klammern... öhm... räum da erst mal n bisschen auf. dann kann man weiter helfen

mose
13-09-2005, 20:52
Wie oben schon gesagt ist das noch nicht fertig. -.-° die ganzen anderen Sachen ignorieren. Nur das er in die zweite Spalte springen soll und dort dann weiter machen soll. Aber in der zweiten spalte mach der bei der auswahl nicht weiter

kaki100
13-09-2005, 20:59
Da ich mir gerade denke, dass du anfängst zu programmieren gebe ich dir maln tipp. Wenn du ein Programm zum laufen bringst mit switch und case und dann denkst, na, jetzt kann ichs, versuch zuerst mal jede zeile in deinem quellcode zu erklären. Dir selber, am besten, damit überprüfst du dich eigentlich selbst ob du es verstanden hast und beherrscht. Kenn noch viele Leute aus meiner klasse, die mich oft fragten wie das geht... ah ok, ah ok, ja ne is klar... ok, erklär mir wieso? .. ähm, wie war das nochmal :D ...

Ne, soll kein scherz sein, aber wenn du viel verstehst, dann kannste auch umso mehr probieren wenn dir mal nen fehler passiert...

mose
13-09-2005, 21:02
Joc ich verstehe das ja ^^. Habs ja auch geschrieben :P aber mir pasieren oft Tippfehler. =( Aber habs hinbekommen.

Gonzo
13-09-2005, 21:19
JEDES case muss ( naja muss nicht, aber sonst gibt es kaum nen Sinn )
mit einem break;( raus aus dem switch ) oder einem return; ( raus aus der Funktion )
abgeschlossen werden, ansonsten werden alle weiteren case auch ausgeführt
( glaub ich zumindestens :D )

switch(i)
{
case 1:
bla();
break;
case 2:
blub();
return;
default:
error();
break;
}

so in etwa ;)

kaki100
13-09-2005, 21:21
ich glaube, "default" braucht nicht unbedingt ein break, wäre ja irgendwie sinnlos :rolleyes:

Gonzo
13-09-2005, 21:22
wenn default als letztes steht und keine weiteren code-Zeilen innerhalb der
switch-Anweisung sind ;)
nen return macht Sinn, wenn die Funktion nen Rückgabewert hat

EEBKiller
13-09-2005, 21:29
ein return; in main()

(was ja zweifelsohne auch in nem switch so ist) - Was würde das bewirken ? :p

kaki100
13-09-2005, 21:31
ja klar, return liefert auch was zurück... obwohl... return 0; :rolleyes:

Gonzo
13-09-2005, 21:32
ein return; in main()

(was ja zweifelsohne auch in nem switch so ist) - Was würde das bewirken ? :p
dass er sofort aus der Funktion aussteigt, also wahrscheinlich sofort das Programm beendet

ja klar, return liefert auch was zurück... obwohl... return 0; :rolleyes:
return darf/muss nur dann was zurückliefern wenn die Funktion nicht vom
Typ void ist ;)
also bei void main() einfach nur return,
bei int main() dann halt return 1234456;

mose
15-09-2005, 16:57
ALSO. Ich wollte nicht wieder was auf machen. Also, habe eine Formel die ich für C++ umschreiben muss da es keine ^ kann.

Formel: K*(1+p/100)^n
wie müsste das bei c++ ausschauen ?

kaki100
15-09-2005, 17:14
es gibt exponentialfunktionen in c. Das sollte die einzig schwere sachen zu sein. schau mal nach in der hilfe, mir fällt der befehl nämlich gerade nicht ein.

EEBKiller
15-09-2005, 18:37
also in PHP heissts

int pow(BASIS, EXPONENT);

kaki100
15-09-2005, 19:01
jo, danke eeb. Ich bin mir zu 99 prozent sicher das ins c++ die funktion auch pow(int x) glaube ich heißt

MyersGer
15-09-2005, 19:12
nein...

unter c:
pow(double x, double y)

und unter c++ gibts noch ne überladung für float.

Magicq99
15-09-2005, 19:14
in C heißt es
pow(basis, exponent);

und am Anfang des Programms:
#include <math.h>

Du solltest Dir vielleicht auch angewöhnen die Variablen etwas zweckdienlicher zu benennen. Ich habe mal gelernt das ein Variablenname mit einem Kleinbuchstaben beginnen sollte (ein Objekt dagegen mit einem Großbuchstaben) und am besten einen kurzen Satz darstellen sollte, die einzelnen Worte werden dabei durch Großbuchstaben getrennt.

Aus "P1" könntest Du dann z.B. "calculationSelectedByUser" machen, oder irgendwas anderes, aber eben etwas aussagekräftiges. Für Funktionen gilt das gleiche. Aber das sind nur Konventionen, keine Vorschrift.

Mit einem Editor der Syntax-Vervollständigung beherrscht ist das auch kaum Mehrarbeit beim tippen, aber es erleichtert das Verstehen des Codes ungemein, speziell jemandem der ihn nicht selbst geschrieben hat.

Es ist aber sehr hilfreich sich schon früh einen sauberen Stil anzugewöhnen., z.B. auch was das Einrücken von Unterbereichen angeht.

kaki100
15-09-2005, 19:30
nein...

unter c:
pow(double x, double y)

und unter c++ gibts noch ne überladung für float.


du nerviger 1% du :p

mose
17-09-2005, 11:07
Hm müsste das dann so aussehen ?
cout<<"Kapital nach "<<z4<<" Jahren: "<<(z2*(pow(double (((1+z3)/100), double z4));

MyersGer
17-09-2005, 12:14
nein. das double brauchst du da nicht mit zu schreiben, wenn du die variablen voher schon deklariert hast. und ich geh mal davon aus, dass z4 (was auch immer das sein mag :) ) schon deklariert ist. und bei einer berechnung [ (1+z3)/100 ] brauchst du auch den datentyp nicht voran schreiben. es sei denn du willst das ergebnis casten. dann muss der datentyp aber so da stehen (double) (1+z3)/100 .

mose
17-09-2005, 12:22
LoL irgentwie ist das komisch. 0o Des kommen zu große Zahlen raus =( was hab ich falscj gemacht . Ich meine ind er 5ten Spalte.


#include <iostream.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int Z1;
cout<<"#####Zinsrechnung/Prozentrechnung#####"<<endl;
cout<<"[1]Prozentrechnung."<<endl;
cout<<"[2]Prozentrechnung wenn man mehr als 100% hat."<<endl;
cout<<"[3]Zinsen nach x Tagen."<<endl;
cout<<"[4]Zinsen nach x Jahren."<<endl;
cout<<"*****Zinseszinsrechnung*****"<<endl;
cout<<"[5]Zinsen nach x Jahren."<<endl;

cin>>Z1;
//##############################################################################
//##############################################################################
switch(Z1)
{
case 1:
float Pr;
float PR;
cout<<"Bitte geben Sie die 100% an und dann wie viel Prozent es seien sollen:"<<endl;
cin>>Pr;
cin>>PR;
cout<<"Ein Prozent ist: "<<(Pr/100)<<endl;
cout<<PR<<"% von "<<Pr<<" sind: "<<(Pr/100*PR)<<endl;
break;
};
//##############################################################################
//##############################################################################
switch(Z1)
{
case 2:
float P;
float P2;
float P3;
cout<<"Bitte geben Sie die Prozent an,dann die Zahl und dann wie viel Prozent es seien sollen.."<<endl;
cin>>P;
cin>>P2;
cin>>P3;
cout<<"Ein Prozent ist: "<<(P2/P)<<endl;
cout<<P3<<" Prozent von "<<(P2/P*100)<<endl;
cout<<"100% sind: "<< (P2/P*100)<<endl;
break;
};
//##############################################################################
//##############################################################################
switch(Z1)
{
case 3:
float Z2;
float Z3;
float Z4;
cout<<"Bitte geben Sie das Guthaben an,dann wie viel Prozent Zinsen es gibt und am Ende wie viele Tage es laeuft"<<endl;
cin>>Z2;
cin>>Z3;
cin>>Z4;
cout<<"Man bekommt "<<(Z2/100*Z3)<<" im Jahr."<<endl;
cout<<"Man bekommt "<<(Z2/100*Z3/360)<<" am Tag."<<endl;
cout<<"Man bekommt "<<(Z2/100*Z3/360*Z4)<<" in "<<(Z4)<<" Tagen"<<endl;
cout<<"Man hat nach einem Jahr ein Guthaben von "<<(Z2+(Z2/100*Z3))<<"."<<endl;
break;
};
//##############################################################################
//##############################################################################
switch(Z1)
{
case 4:
float zz2;
float zz3;
float zz4;
cout<<"Bitte geben Sie das Guthaben an,dann wie viel Prozent Zinsen es gibt und am Ende wie viele Jahre es laeuft"<<endl;
cin>>zz2;
cin>>zz3;
cin>>zz4;
cout<<"Man bekommt "<<(zz2/100*zz3*zz4)<<" in "<<zz4<<"."<<endl;
cout<<"Man hat nach einem Jahr ein Guthaben von "<<(zz2+(zz2/100*zz3*zz4))<<"."<<endl;
break;
};
//##############################################################################
//##############################################################################
switch(Z1)
{
case 5:
float z2;
float z3;
float z4;
cout<<"Bitte geben Sie das Kapital an,dann wie viel Prozent Zinsen es gibt und am Ende wie viele Jahre es laeuft"<<endl;
cin>>z2;
cin>>z3;
cin>>z4;
cout<<"Kapital nach "<<z4<<" Jahren: "<<(z2*(pow( (1+z3)/100, z4)));

break;
};
//##############################################################################
//##############################################################################
system("PAUSE");
return 0;
};

MyersGer
17-09-2005, 17:07
puh deine variablennamen sind grausam.
ich denk mal du meinst zeile und nicht spalte. da fängt main an. was soll denn daran falsch sein?

Gonzo
17-09-2005, 20:24
Ich denk mal er meint das case 5: ;)
Erst mal ne kleine Anmerkung : Warum machst du soviele switch für die selbe Variable ?
Einmal würde doch reichen :)
Ansonsten ist deine Formel zur Berechnung wohl falsch, es kommt mir zumindestens
merkwürdig vor dass die Laufzeit als Exponent angegeben wird

maxl
17-09-2005, 23:11
Das die Laufzeit der Exponent ist, stimmt schon, denke ich.

Berechnet werden die Zinsen ja so:
Kapital * [(1 + Zinssatz) ^ Laufzeit]
wenn der Zinssatz als Kommazahl angegeben wird (0.04 für 4 Prozent). Wenn du davon ausgehst, dass der Benutzer eher 4 eingibt, dann sollte sie halt
Kapital * [((100 + Zinssatz) / 100) ^ Laufzeit]
lauten.

Zu deiner Verwendung von switch, möchte ich noch sagen, wie es aussehen sollte. ;)

switch (Variablenname)
{
case 1:
Anweisungen
break;
case 2:
Anweisungen
break;
[...]
default:
Anweisungen
break;
}

Du musst also nicht jedes mal ein neues switch schreiben, wie Gonzo schon gesagt hat. Wenn du deinen Quelltext einigermaßen schön gestaltest, kannst du sogar auf diese ekelhaften
// ################################################
verzichten. :D
Und bei den Variablenamen solltest dir auch was einfallen lassen. Für die Zinsrechnung wären z.B. "Kapital", "Zinssatz" und "Laufzeit" ganz brauchbare Namen. ;) Bei komplexeren Programmen kann dir nämlich sonst 1. keiner mehr helfen und 2. verlierst du dann selber den Überblick, wenn du mal ein paar Monate nicht daran arbeitest.

mose
18-09-2005, 08:28
OK. Also muss ich die Fariablen gescheit bennenen. =) werd ich dann auch machen :) Danke. Also muss ich die Formeln noch umstellen?
Also, er spring nur am anfang zu 2 und 1 also zu den binomischen Formeln und zur geometrie.
Aber sonst nirgenswo hin.


//EDIT: problem gelöst. ne {} war falsch gesetzt.
2//EDIT: Wie ziehe ich denn ne Wurzel bei c++?

maxl
18-09-2005, 10:29
Generell könntest du danach auch Googeln oder irgendeine passende Referenz im Internet suchen. ;)

In der math-library gibt's
sqrt(float);
Damit kannst du die Quadratwurzel aus einer Fließkommazahl ziehen.

Wenn du z.B. die 3. Wurzel ziehen willst, dann solltest du vermutlich
pow(float, float);
verwenden. Also für die 3. Wurzel z.B. float(x, 1/3);

mose
18-09-2005, 10:32
OK danke ^^ . Stimmt könnte bei googel suchen. Aber wäre nicht sos chönw ie hier nach zu fragen :) auserdem seit ihr hier sehr kompetent.

Magicq99
18-09-2005, 12:04
Bei Google findest Du aber sehr viel, ich hab spontan z.B. das hier gefunden:
http://www.cppreference.com/stdmath/all.html

Und benenne Deine Variablen sinnvoll, am besten wie ich es Dir oben vorgeschlagen habe. Das macht es auch für Dich leichter den Code nachzuvollziehen, vor allem wenn Dein Programm weiter wächst.

Und um einzelne Bereiche abzutrennen brauchst Du auch nicht so viele # in den Kommentaren. Es reicht ein oder zwei Leerzeilen zu lassen und dann mit einem Kommentar eine kurze Überschrift zu schreiben, die am besten kurz und knapp erklärt was in den nächsten Zeilen gemacht wird. Also z.B.
// Main menu
<code>

Und es dient auch der Übersicht wenn alle Variablendeklarationen in speziellen Bereichen gemacht werden. Und wenn die Bedeutung der Variablen nicht durch deren Namen direkt verständlich ist kannst Du auch mit einem Kommentar direkt dahinter eine kurze Erläuterung schreiben, z.B.
float firstArgument; //argument used in calculation xyz

Gewöhn Dir eine gewisse Syntax Disziplin von Anfang an an, denn wenn Du jetzt anfängst schlampig zu programmieren wirst Du es auch später machen. Und tröste Dich nicht mit Argumenten wie "der Code soll jetzt erstmal funktionieren, aufräumen kann ich ihn auch später noch", das wirst Du nicht machen weil das Programm immer weiter wächst. Später kehrst Du dann an eine Stelle zurück und frägst Dich selbst was Du da eigentlich gemacht hast.

mose
18-09-2005, 12:36
Hört sich logisch an. Naja sitze nun an einem Problem was nichts mi c++ zu tuhen hat sonder mit Mathe. Hab in einem anderen Forum gefragt was sie noch so in einen Rechner haben wollen.
Da haben die mir sowas gegeben Wahrscheinlichkeitsrechnung,Kurvendiskussion,Kreisgleichung.
Naja hm... Hab mich übernommen =(

Magicq99
18-09-2005, 13:47
Du solltest dabei aber eher den Lerneffekt betrachten und nicht primär die Funktionalität Deines Programms. Du solltest Deine ersten Programme also eher programmieren um die Sprache zu lernen, was das Programm eigentlich macht ist dabei eher zweitrangig.

Es ist ja nicht so das die Welt ein weiteres Rechenprogramm benötigen würde, aber es ist eine gute Übung um zu lernen wie es funktioniert.

Du solltest Dir also nicht überlegen was für Funktionen irgendwelche Leute haben möchten, sondern eher welche Programmierelemente Du dabei lernen kannst.

Im Moment lernst Du ja noch eher den grundlegenden Syntax, nächste Schritte wären dann Dinge wie Schleifen, oder Variablen die mehrere Werte speichern können (Arrays), oder Datei Ein- und Ausgabe, usw.

Gonzo
18-09-2005, 16:26
Und um nicht zu vergessen, unsere allseits beliebten pointer :D,
->absolut_wichtige_Sache;

ComSubVie
18-09-2005, 22:12
Für einen Rechner würde ich einfach mal einen Term-Parser empfehlen, der aus dem geparsten String entsprechende Terme als Objektbaum ablegt. Dann kannst du den Baum einfach von oben nach unten berechnen, was das einfachste am ganzen ist. Der Parser muss halt so sachen wie Punkt vor Strich, Klammernregelungen, etc. beherrschen und den Baum entsprechend ablegen.

Damit hast du auch schon eine sehr gute Übung für Zeiger ;)

Andererseits dürfte so ein Parser wohl für den Anfang doch ein bisschen zuviel des Aufwands darstellen...