kuddlmuddl
Commander
- Registriert
- Mai 2010
- Beiträge
- 2.715
Für seinen falschen Code oben wäre das tatsächlich einfacher. Aber er hat die pq-Formel falsch abgeschriebenWarum schreibst du eigentlich nicht
x2 = -x1;
?
Folge dem Video um zu sehen, wie unsere Website als Web-App auf dem Startbildschirm installiert werden kann.
Anmerkung: Diese Funktion ist in einigen Browsern möglicherweise nicht verfügbar.
Für seinen falschen Code oben wäre das tatsächlich einfacher. Aber er hat die pq-Formel falsch abgeschriebenWarum schreibst du eigentlich nicht
x2 = -x1;
?
Warum schreibst du eigentlich nicht
x2 = -x1;
?
Mal abgesehen davon dass du da ziemlich viel mathematischen Blödsinn gemacht hast...
Wieso "4*0.1"?
Wieso (p*p-4*0.1)-p)?
double zahl_unter_der_wurzel = p*p-4*0.1;
if (zahl_unter_der_wurzel < 0)
{
printf("Die Parabel mit den Werten p=%d, q=%d hat keine Nullstellen!\n", p, q);
}
else
....
Mit dieser Gleichung habe ich dank meines nicht vorhandenen "Programmier-skills" so gekämpft, dass ich die Gleichung erstmal nach x umgestellt habe - daraus resultieren die vorhandenen Gleichungen!
Doch das ist die pq formel und du hast beim Umstellen einen Fehler gemacht ODER beim abschreiben. Was du im Programm stehen hast ist nicht die Lösung von sasdensas wie sie auch auf Wikipedia steht.Vielleicht ist das auch gar nicht die pq-Formel!? Wie gesagt vorgegeben ist x^2+p*x+q=0 und das habe ich nach x umgestellt - mehr nicht.
Etwas genauer: Es gibt 0, 1 oder 2 reele Lösungen und immer genau 2 komplexe die im Falle deren Existenz mit den reelen identisch sind.Es ist eine PQ-Formel und es gibt aufgrund des Quadrates 2 mögliche X-Werte.
Doch das ist die pq formel und du hast beim Umstellen einen Fehler gemacht ODER beim abschreiben. Was du im Programm stehen hast ist nicht die Lösung von sasdensas wie sie auch auf Wikipedia steht.
Außerdem solltest du NIE NIE NIE irgendwo im Programm 0.1 schreiben nur weil das der Wert von q ist.
#include <stdafx.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main( void ) {
double x1;
double x2;
float p;
float q = 0.1;
double Ergebnis_x1;
double Ergebnis_x2;
for (p = 0 ; p <= 2.1 ; p += 0.1) {
x1 = ((sqrt(p*p-4*q)-p)/2);
x2 = -((sqrt(p*p-4*q)+p)/2);
Ergebnis_x1 = x1*x1 + p*x1 + q;
Ergebnis_x2 = x2*x2 + p*x2 + q;
if (p < 0.7) { printf ("Fuer den Wert p=%f entsteht eine komplexe Zahl\n", p); }
else { printf ("\np= %.2f\t x1= %g\t x2= %g\n", p, x1, x2); }
if (p < 0.7) { printf ("Kontrolle der Ergebnisse fuer x1= Komplexes Ergebnis\n");
printf ("Kontrolle der Ergebnisse fuer x2= Komplexes Ergebnis\n"); }
else { printf ("Kontrolle der Ergebnisse fuer x1= %g\n", Ergebnis_x1);
printf ("Kontrolle der Ergebnisse fuer x2= %g\n", Ergebnis_x2); }
}
system ("PAUSE");
return 0;
}
#include <stdafx.h>
double x1;
double x2;
double x1, x2;
x1 = ( ( sqrt( p*p - 4*q ) - p ) / 2 );
x2 = -( ( sqrt( p*p - 4*q ) + p ) / 2 );
system ("PAUSE");
printf( "Press enter to exit . . . " );
getchar();
Die Formel braucht man deshalb, weil man x nicht freistellen kann, wenn man x² und x in der selben Gleichung hat.
...#include <stdafx.h>... Eigentlich brauchst du den nicht und kannst ihn weglassen...
error C1010: Unerwartetes Dateiende während der Suche nach dem vorkompilierten Header. Haben Sie möglicherweise vergessen, im Quellcode "#include "StdAfx.h"" einzufügen?
Hier könnte man den Beistrichoperator verwenden.
Die Formel stimmt nicht und du hast nicht ganz verstanden wie ich das mit meinem Division durch Null Beispiel gemeint habe. Du solltest auf keinen Fall in deinem Programm mathematisch undurchführbare Rechnungen haben. Eine Division durch Null kann unter umständen dein Programm zum Absturz bringen und muss deshalb vermieden werden.
Die Zeile mit dem Ergebnis passt, aber danach kommt zwei mal die Überprüfung ob p kleiner als 0.7 ist. Wieso machst du das zwei mal?
Diese Zeile ist auch nicht sauber! Du solltest die system() Funktion vermeiden, weil sie nur auf Windows funktioniert und keine Standardfunktion ist.
Den Code an sich werde ich dir nicht schreiben, du sollst ja schließlich etwas lernen, aber wenn du auf alles hörst was ich dir gesagt habe, solltest du am Ende ein sauberes und funktionierendes Programm haben.
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main( void ) {
float p, q = 0.1;
double x1, x2, Unter_Wurzel = (p/2)*(p/2) - q, Ergebnis_x1, Ergebnis_x2;
for (p = 0 ; p <= 2.1 ; p += 0.1) {
x1 = -p/2 + sqrt(Unter_Wurzel);
x2 = -p/2 - sqrt(Unter_Wurzel);
Ergebnis_x1 = x1*x1 + p*x1 + q;
Ergebnis_x2 = x2*x2 + p*x2 + q;
printf ("\np= %.2f\t x1= %g\t x2= %g\n", p, x1, x2);
if (p < 0.7) { printf ("Kontrolle der Ergebnisse fuer x1= Komplexes Ergebnis\n");
printf ("Kontrolle der Ergebnisse fuer x2= Komplexes Ergebnis\n"); }
else { printf ("Kontrolle der Ergebnisse fuer x1= %g\n", Ergebnis_x1);
printf ("Kontrolle der Ergebnisse fuer x2= %g\n", Ergebnis_x2); }
}
printf("\n\nBitte Enter druecken um das Programm zu verlassen");
getchar();
return 0;
}
Kein Problem, solange du Eigeninitiative an den Tag legst und nicht erwartest, dass andere deine Arbeit machen wird dir gerne geholfen, dazu sind Foren da.Zunächstmal danke, dass du dir die Zeit nimmst so eine Ausführliche Antwort zu tippen!
In deinen Projekteinstellungen sind vorkompilierte Header eingestellt und stdafx.h wird deshalb benötigt, weil dort eben die Header stehen sollten. Du hast deine Header aber in der *.c Datei stehen, weshalb stdafx.h für dich sinnlos ist. Wenn du es aber weglässt ohne die Einstellung zu ändern, dann gibt das natürlich einen Fehler. Wenn du ein neues Projekt erstellst, dann wirst du immer gefragt ob es vorkompilierte Header haben soll. Am besten ist, wenn du dort auf leeres Projekt klickst und keine vorkompilierten Header auswählst, dann kannst ( bzw. musst ) du das stdafx.h weglassen. Aber wenn du es verwendest, dann #include "stdafx.h" schreiben, aber das hast du ja schon.Jetzt sind wenigstens die < > durch " " ersetzt und es funktioniert wieder. Kann man scheinbar doch nicht ganz weglassen!?
In diesem Fall ist Lesbarkeit wichtiger! Zeilen sparen musst du nicht und macht auch keinen Sinn, am Ende kommt der gleiche Code raus. Für den Compiler macht es keinen Unterschied ob du das alles in einer Zeile schreibst oder nicht. Mach es so, wie man es am einfachsten lesen kann. Zum Beispiel:Ist geändert und spart einige Zeilen ein. Werde ich mir in Zukunft angewöhnen. Wobei mir die andere Schreibweise besser gefällt weil es übersichtlicher ist aber die eingesparten Zeilen sind bestimmt wichtiger!?
float p, q = 0.1;
double x1, x2;
double Unter_Wurzel = (p/2)*(p/2) - q;
double Ergebnis_x1, Ergebnis_x2;
Wieso nicht?Die Abfrage so einzufügen wie du es sagst (und wie es auch 100%ig ist) bekomme ich nicht hin
if( Unter_Wurzel < 0 )
{
printf( "Fehler\n" );
}
else
{
// Hier der Rest des Codes
x1 = ...
}
if (p < 0.7)
Die hast du definiert inkl. Berechnung, aber die hat da nichts zu Suchen. Oben soll sie nur definiert und ggfs. initialisiert werden. Die Variablen ändern sich aber in der For-Schleife.
Du denkst vermutlich Funktional, aber das wäre nicht der richtige Weg.
In diesem Fall ist Lesbarkeit wichtiger! Zeilen sparen musst du nicht und macht auch keinen Sinn, am Ende kommt der gleiche Code raus. Für den Compiler macht es keinen Unterschied ob du das alles in einer Zeile schreibst oder nicht. Mach es so, wie man es am einfachsten lesen kann.
Die Abfrage so einzufügen wie du es sagst (und wie es auch 100%ig ist) bekomme ich nicht hin
Wieso nicht?
Dann wird es Zeit dich mit deinem neuen besten Freund vertraut zu machen: dem Debugger! Ein Debugger erlaubt es dir dein Programm schrittweise durchzuführen. Du kannst einen sogenannten Breakpoint setzen und dieser tut genau das, was sein Name andeutet, er stoppt das Programm an dieser Stelle. Um im Visual Studio einen Breakpoint zu setzen klickst du einfach ganz links auf den Rand der Zeile, dann kommt ein roter Punkt, der dein Breakpoint ist. Wenn du jetzt das Programm im Debug Mode startest, dann läuft das Programm bis zu diesem Punkt und stoppt dann. Wenn das Programm gestoppt ist, dann kannst du mit der Maus über eine Variable fahren und es wird dir angezeigt welchen Wert sie hat. Es gibt dann noch die Möglichkeit, dass du das Programm einfach weiterlaufen lässt ( F5 ) oder, dass du den nächsten Befehl ausführst, also einfach eine Zeile weiter gehst ( F10 ), das nennt sich "stepping", weil du schrittweise durch den Code gehst. Wenn da eine Funktion ist, dann kannst du auch mit ( F11 ) in diese Funktion springen, dann siehst du den Code dieser Funktion ( bei printf oder so etwas siehst du maximal den Assemblercode, weil der Code von printf nicht dem Compiler beiliegt ), also F11 bringt dir nur etwas, wenn du in deine eigenen Funktionen springen willst. Das nennt sich nebenbei Step-Over ( F10 ), also über die Funktion gehen oder Step-Into ( F11 ), also in die Funktion gehen. Wenn du einen Breakpoint auf die erste Zeile deines Programms setzt, dann kannst du mit F10 ganz einfach durchgehen und verfolgen was bei jedem Schritt passiert und welchen Wert die entsprechenden Variablen haben. Der Debugger ist wirklich der beste Freund des Programmierers.Habe bisher ziemliche Schwierigkeiten in diese "Programmier-Denkweise" reinzukommen - ist halt völliges Neuland für mich und daher sehr ungewohnt. Vor allem fällt es mir schwer nachzuvollziehen wie die Schleifen "ineinandergreifen" und wie an sich die Abläufe funktionieren.
Es ist wichtig schönen, sauberen und effizienten Code zu schreiben, aber es gibt Dinge, die der Compiler immer gleich umsetzt, egal wie du es schreibst. Es ist vollkommen egal, ob du die Variablen in eine Zeile schreibst oder in mehrere, am Ende macht der Compiler den gleichen Code daraus. Es ist jedoch nicht egal, ob du zwei mal eine "if( p < 0.7 )" hast, denn das fasst der Compiler nicht zusammen.dachte es wäre gut Zeilen zu sparen wegen der Geschwindigkeit des Programmes
Doch doch, das funktioniert schon.Das funktioniert nicht so wie du es geschrieben hast
Warum schon wieder ohne CODE-Tags? Verwende bitte CODE-Tags, auch wenn die Einrückung etwas übertrieben ist.Das hier ist der aktuelle Stand
double Unter_Wurzel, Ergebnis_x1, Ergebnis_x2;
if (Unter_Wurzel <= 0) printf ("Fatal error!!!!111elf");
Unter_Wurzel = (p/2)*(p/2) - q;
x1 = -p/2 + sqrt(Unter_Wurzel);
x2 = -p/2 - sqrt(Unter_Wurzel);
if( Bedingung )
{
// Wenn Bedingung wahr ist ( also größer gleich 1 ist ), dann springen wir in diesen Codeblock ( Ein Codeblock ist alles zwischen {}
}
else
{
// Wenn Bedingung falsch ist ( also gleich 0 ist ), dann springen wir in diesen Codeblock
}
aber den wichtigeren Teil weggelassen:Das funktioniert nicht so wie du es geschrieben hast
(oder ich bin wieder zu unfähig es richtig umzusetzen)
Merk dir das bitte: Auf keinen Fall mit einer Variable arbeiten, die noch keinen Wert hat!
Warum schon wieder ohne CODE-Tags? Verwende bitte CODE-Tags, auch wenn die Einrückung etwas übertrieben ist.
Ich glaube du hast noch nicht ganz verstanden wie if Funktioniert,...
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main( void ) {
float p, q = 0.1;
double x1, x2;
double Unter_Wurzel, Ergebnis_x1, Ergebnis_x2;
for (p = 0 ; p <= 2.1 ; p += 0.1) {
Unter_Wurzel = (p/2)*(p/2) - q;
if (Unter_Wurzel < 0) { printf ("Wert unter Wurzel kleiner 0 - Fehler!\n\n"); }
else {
x1 = -p/2 + sqrt(Unter_Wurzel);
x2 = -p/2 - sqrt(Unter_Wurzel);
Ergebnis_x1 = x1*x1 + p*x1 + q;
Ergebnis_x2 = x2*x2 + p*x2 + q;
printf ("\n\nWert fuer p= %.2f\tErgebnis x1= %g\tErgebnis x2= %g\n", p, x1, x2);
if (Ergebnis_x1 == 0 && Ergebnis_x2 == 0) { printf ("Probe fuer x1= %g\tProbe fuer x2= %g\n", Ergebnis_x1, Ergebnis_x2); }
if (Ergebnis_x1 == 0 && Ergebnis_x2 != 0) { printf ("Probe fuer x1= %g\tBedingung fuer x2 nicht erfuellt\n", Ergebnis_x1); }
if (Ergebnis_x1 != 0 && Ergebnis_x2 == 0) { printf ("Bedingung fuer x1 nicht erfuellt, da x1= %g\tProbe fuer x2= %g\n",Ergebnis_x1, Ergebnis_x2); }
if (Ergebnis_x1 != 0 && Ergebnis_x2 != 0) { printf ("Gleichungsbedingungen nicht erfuellt\n", Ergebnis_x2); }
}}
printf("\n\nBitte Enter druecken um das Programm zu verlassen");
getchar();
return 0;
}