Summation (was ist falsch?)
-
Hallo allerseits,
zu übungszwecken versuche ich gerade, ein Programm zum Berechnen einer Summe zu schreiben. Blöderweise ist die Ausgabe immer "1", was definitiv falsch ist. Sieht jemand den Fehler und kann mir helfen?#include "stdafx.h" #include <stdio.h> int _tmain(int argc, _TCHAR* argv[]) { double summe=0; //Summationsvariable int lv1, v_input; //Laufvariable #1, Benutzereingabe #1 printf("\n\tS U M M E N B E R E C H N U N G\n"); printf("\t-------------------------------\n"); printf("\tfuer S_n = SUMME_(i=0) ((-1)^i)/(2i+1)\n"); printf("\n Bitte obere Grenze der Summe eingeben\n"); scanf("%i",&v_input); for(lv1=0; lv1<=v_input; lv1=lv1+1){ if((lv1%2==0)||(lv1==0)) summe=summe+(1/(2*lv1+1)); else summe=summe-(1/(2*lv1+1)); } printf("Das Ergebnis ist %lf",summe); fflush(stdin); getchar(); return 0; }
-
1. Die main-Fkt hat die Signaturen
int main(int argc, char *argv[]); // oder int main(int argc, char **argv); // oder int main(void);
alles andere ist falsch.
fflush
arbeitet nur mit Augabestreams,stdin
gehört nicht dazu. Das führt zu undefinierten Verhalten und kann dein Haus zum Explodieren bringen.
3. Ich würde sagen, dass der Compiler
1/(2*lv1+1)
stets als 0 auswertet, weil du nur Integer-Arithmetik hast und 1/x (x != 0) ist stets 0. Du musst dem Compiler sagen, er soll floating-points berechnen, ich würde also so schreiben:
1.0/(2.0*lv1+1.0)
-
Ah danke, mit dem x.0 funktionierts!
Die main-Argumente hat mir Visual Studio automatisch erstellt, ich wusste zwar nicht genau was ich damit anfangen soll, aber weils funktioniert hat, hab ichs drin gelassen.
Das Ding mit fflush und getchar wurde in irgendeinem Forum mal als Möglichkeit angegeben, um das automatische Beenden der Konsole zu verhindern. Gibts da eine bessere Möglichkeit?
-
_TCHAR ist nur ein typedef auf char.
-
FrEEzE2046 schrieb:
_TCHAR ist nur ein typedef auf char.
Warum dann nicht gleich char nehmen? Und was soll _tmain() sein?
-
mngbd schrieb:
Warum dann nicht gleich char nehmen? Und was soll _tmain() sein?
Na ist doch logisch:
//tchar.h #define _tmain wmain
int wmain( int argc, wchar_t *argv[ ], wchar_t *envp[ ] );
-
FrEEzE2046 schrieb:
Na ist doch logisch:
...Hmm, was ist tchar.h? Wo bekommt man das? Und was ist wmain? Ich versteh bald gar nichts mehr.
-
Ja das sind halt die Ideen der redmonder Compilerschmiede -
Infos gibt es allerdings reichlich von denen.Wenn ihr in der IDE ein wenig herum klickt, versteht die auch halbwegs ANSI C.
-
@f.-th.
Wir meinen das nicht ganz ernst
Generell sind die Microsoft spezifischen Header meist ziemlich bescheiden zu lesen. Weil man einfach auf alles irgendein blödsinniges define gemacht hat und gruselige Einrückungen verwendet.Aber was soll's. Jeder kocht halt gern sein eignes Süppchen. So lange der Compiler neben dem ganzen extra Gedöns auch ANSI C Code versteht hab ich damit kein Problem.
Und im Visual Studio lege ich generell nur empty projects an.
-
FrEEzE2046 schrieb:
Wir meinen das nicht ganz ernst
Das hoffe ich doch.
Ich für meinen Teil komme jedenfalls hier vorbei, wenn ich über C reden will. Wenn dann so viele OS-verfärbte Posts hier stehen, vergeht mir schnell die Lust, weil ich den meisten Code gar nicht testen kann. Aus irgendeinem Grund gehts nämlich immer um das OS, das ich gerade nicht zur Hand habe.
Beckett schrieb:
Das Ding mit fflush und getchar wurde in irgendeinem Forum mal als Möglichkeit angegeben, um das automatische Beenden der Konsole zu verhindern.
Na dann halt dich am besten fern von dort. Lies mal hier weiter:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-39349.html
-
Es ist meiner Meinung nach sowieso schwachsinn irgendwelche Microsoft spezifischen Defines zu verwenden. Das sollte man möglichst lassen, weil es a) überhaupt keinen Nutzen hat und b) nur dazu führt, dass andere den Code nicht ausführen können.
Erzeug immer ein leeres Projekt. Die *.c Datei anlegen und int main() {} schreiben schaffste auch alleine.
-
FrEEzE2046 schrieb:
Es ist meiner Meinung nach sowieso schwachsinn irgendwelche Microsoft spezifischen Defines zu verwenden. Das sollte man möglichst lassen, weil es a) überhaupt keinen Nutzen hat
Naja, das kann schon einen Nutzen haben. Die typedef'en das ja je nach Compiler-Einstellung auch auf ihre wide chars. In der MS-Welt ist es schon praktisch, von den String-Typen in den API's zu abstrahieren, weil manche Systeme nicht alle Varianten implementieren.
Aber hier hat das natürlich nichts verloren.
-
FrEEzE2046 schrieb:
Erzeug immer ein leeres Projekt. Die *.c Datei anlegen und int main() {} schreiben schaffste auch alleine.
Werd ich machen. Scheint auch zu funktionieren soweit. Ich war irgendwie davon ausgegangen, dass diese ganzen automatisch erstellten Dateien in den Header- Quell- und Ressourcenordnern notwendig wären.