Programmieraufgabe
-
also zu den globalen variablen, kann ich jetzt nichts sagen! das werde ich ändern!
jetzt zu den anderen Punkten:
variabeldeklerationen sind nur am anfang einer funktion erlaubt, also machst du mal bitte dein int asdf an den anfang der main funktion.
Meine Konsole geht immer nach jedem Porgramm zu, deshalb habe ich schnell noch eine Eingabeaufforderung geschrieben! Das ist mir eigentlich klar, dass die Definitionen an Anfang kommen.
void main ist auch falsch, schreibe int main und dann ein return 0 am ende der main.
void main(void) geht!!!
die mainfunktion muss keinen wert mehr zurück geben in den neueren compilern!die <stdio.h> solltest du auchmal includieren, sonst funktioniert scanf/printf nicht.
ich programmiere mit MS Visual C++ Express Edition 2005! Wenn ich die stdio.h includiere, bringt er einen Fehler. Anscheinend ist die stdafx.h für Ein- und Ausgaben zuständig.
Und ich muss in der FH mit dem Borland programmieren und deshalb habe ich die stdio.h noch nicht includiert. Sie kommt erst rein, wenn ich das Programm auf den Borland umschreiben muss.und wenn wie in der ersten zeile angegeben der dateiname ueb5.cpp ist, ist das auch falsch, für C ist das mit der endung .c
Hier gilt das Gleiche wie für den eben beschrieben Punkt.
Die Endung wird später, wenn ich das Programm für den Borland umschreiben muss, geändert.Ich werde dann mal die globalen Variablen ändern und mich dann nochmal melden.
Trotzdem schon mal vielen Dank.
Gruß Sheddy
-
// ueb5.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung. // #include "stdafx.h" #include <math.h> /*#include <stdio.h>*/ #define EPSI 0.1 float fkt(float); float mittel(float, float); float nullst(float, float); void main(void) { int asdf; float lsg; float a; float b; /* EINGABE DER INTVERALLGRENZEN*/ printf("Geben Sie die untere Intervallgrenze ein:"); scanf("%f",&a); printf("Geben Sie die obere Intervallgrenze ein:"); scanf("%f",&b); nullst(a,b); printf("Die Nullstelle ist bei %.4f\n",lsg); scanf("%d",&asdf); } /* NULLSTELLEN */ float nullst(float x, float y) { float a; float b; float mi; float lsg; mi = mittel(x,y); lsg = fkt(mi); do { if(lsg > 0) { b=mi; mittel(a,b); fkt(mi); printf("a = %.2f | b = %.2f\n",a,lsg); } else { a=mi; mittel(a,b); fkt(mi); printf("a = %.2f | b = %.2f\n",lsg,b); } }while(lsg >= EPSI); return(lsg); } /* MIITELWERT */ float mittel(float x, float y) { return((x+y)/2.0); } /* FUNKTION */ float fkt(float x) { return(pow(x,2)-5); }
So sieht mein Quellcode jetzt aus!
Beim Compilieren bringt er keinen Fehler. Aber, wenn ich das Programm aufrufe sagt er folgendes:
Run-Time Check Failure #3 - The variable 'b' is being used without being defined.
Was habe ich jetzt falsch gemacht, bei der Änderung von globalen zu lokalen Variablen?
-
Die Aufgabe kam mir doch gleich so bekannt vor (: Freue mich jederzeit ueber eine Paypal-Ueberweisung - Nein Scherz, aber hoffentlich lernst du was draus.
#include <stdio.h> #include <math.h> #define INTERVALL_EPSILON 0.01 float intervall(float low, float high, float seek, float (*func)(float)) { float erg, mid; do { mid = (high + low) / 2; erg = func(mid); #ifdef INTERVALL_DEBUG printf("low %f ; high %f ; mid %f ; erg %f\n", low, high, mid, erg); #endif if(erg > seek) high = mid; else low = mid; } while(fabs(seek - erg) > INTERVALL_EPSILON); return mid; } float intervall_rec(float low, float high, float seek, float (*func)(float)) { float mid = (high + low) / 2; float erg = func(mid); #ifdef INTERVALL_DEBUG printf("low %f ; high %f ; mid %f ; erg %f\n", low, high, mid, erg); #endif if(fabs(seek - erg) <= INTERVALL_EPSILON) { return mid; } else if(erg < seek) { return intervall_rec(mid, high, seek, func); } else { return intervall_rec(low, mid, seek, func); } } float func(float x) { return pow(x, 5) - 5; } int main(void) { float a, b, nullstelle; printf("Untere Intervallgrenze = "); scanf("%f", &a); printf("Obere Intervallgrenze = "); scanf("%f", &b); nullstelle = intervall(a, b, 0.f, &func); printf("Ergebniss (iterativ): %f\n", nullstelle); nullstelle = intervall_rec(a, b, 0.f, &func); printf("Ergebniss (rekursiv): %f\n", nullstelle); }
-
ach du scheisse... das sieht ja ganz anders als meins!
hmm...ich warte mal lieber bis zur nächsten übung !
-
Da ist noch mehr Schnickschnack drin. Nur dass du mal siehst wie man sowas aufbauen kann. Klar hat man da Probleme am Anfang. Ich wuerde dir empfehlen dich mal mit Funktionen auseinander zu setzen, anscheinend hast du keine Ahnung wie die Werte in die Funktion und wieder zurueck kommen.
-
sheddy schrieb:
void main(void) geht!!!
die mainfunktion muss keinen wert mehr zurück geben in den neueren compilern!Klar "geht" das. Das ist K&R - C. Also vor ANSI C Standard. Wenn jemand Dein
Programm nach ANSI-Standard kompiliert wirds wohl nicht immer und unbedingt
funktionieren.int main(void) int main(int argc, char *argv[])
Diese zwei Möglichkeiten sind mit den C-Standards von 1989 und 1999 konform.
In jedem Fall gibt die main-Funktion den Beendigungszustand an das
Betriebssystem zurück. Dabei steht der Return-Wert 0 oder EXIT_SUCCESS für
"erfolgreich". Ein Wert ungleich 0 oder EXIT_FAILURE, zeigt an, dass bei der
Ausführung des Programms Fehler auftraten.
-
// ueb5.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung. // #include "stdafx.h" #include <math.h> #include <stdio.h> #define EPSI 0.1 float fkt(float); float mittel(float, float); float nullst(float, float); int main(void) { int asdf; float a, b; /* EINGABE DER INTVERALLGRENZEN*/ printf("Geben Sie die untere Intervallgrenze ein:"); scanf("%f",&a); printf("Geben Sie die obere Intervallgrenze ein:"); scanf("%f",&b); printf("Die Nullstelle ist bei %.4f\n",nullst(a,b)); scanf("%d",&asdf); return 0; } /* NULLSTELLEN */ float nullst(float x, float y) { float mi, lsg; mi = mittel(x,y); lsg = fkt(mi); do { if(lsg > 0) { y=mi; mi = mittel(x,y); lsg = fkt(mi); printf("a = %.2f | b = %.2f\n",x,lsg); } else { x=mi; mi = mittel(x,y); lsg = fkt(mi); printf("a = %.2f | b = %.2f\n",lsg,y); } }while(lsg >= EPSI); return(lsg); } /* MIITELWERT */ float mittel(float x, float y) { return((x+y)/2.0); } /* FUNKTION */ float fkt(float x) { return(pow(x,2)-5); }
So sieht mein Programm jetzt aus.
Ich habe die globalen Variablen weggeschafft. Mir die Funktion Definitionen nochmal angeguckt und nun sie es so aus.Sieht es schon besser aus oder schlimmer?
-
Das sieht auf jeden Fall schon besser aus. Ein paar Dinge kann man da alelrdings noch machen:
- Den Variablen in der Funktion nullst (nullstelle waer besser) mal richtige Namen geben, dass man leicher sehen kann was da passiert.
- Hier steht noch sehr viel doppelt:
if(lsg > 0) { y=mi; // mi = mittel(x,y); doppelt // lsg = fkt(mi); doppelt // printf("a = %.2f | b = %.2f\n",x,lsg); warum hier lsg? macht doch kein sinn } else { x=mi; // mi = mittel(x,y); doppelt // lsg = fkt(mi); doppelt // printf("a = %.2f | b = %.2f\n",lsg,y); } // neu nur einmal: mi = mittel(x, y); lsg = fkt(mi); printf("a = %.2f | b = %.2f\n",x,y);
- Deine Abbruchbedingung ist falsch. Es koennte ja auch ein negativer Wert rauskommen, darum fabs():
}while(fabs(lsg) >= EPSI);
- Die Klammern bei return weg, das sieht imo grottig aus:
return((x+y)/2.0); // --> return (x+y)/2.0;
-
// ueb5.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung. // #include "stdafx.h" #include <math.h> #include <stdio.h> #define EPSI 0.1 float funktion(float); float mittel(float, float); float nullstellen(float, float); int main(void) { int asdf; float a, b; /* EINGABE DER INTVERALLGRENZEN*/ printf("Geben Sie die untere Intervallgrenze ein:"); scanf("%f",&a); printf("Geben Sie die obere Intervallgrenze ein:"); scanf("%f",&b); printf("Die Nullstelle ist bei %.4f\n",nullstellen(a,b)); scanf("%d",&asdf); return 0; } /* NULLSTELLEN */ float nullstellen(float x, float y) { float mi, lsg; mi = mittel(x,y); lsg = funktion(mi); do { if(lsg > 0) { y=mi; } else { x=mi; } mi = mittel(x,y); lsg = funktion(mi); }while(lsg >= EPSI); //<------------- das muss ich ja noch ändern return lsg; } /* MIITELWERT */ float mittel(float x, float y) { return (x+y)/2.0; } /* FUNKTION */ float funktion(float x) { return pow(x,2)-5; }
Ich habe jetzt do-while-Schleife verkürzt.
Was macht denn die Funktion fabs() genau? Ich kenne das noch nicht.
Ich habe mir auch schon gedacht, dass die Abbruchbedingung falsch ist.Die Abbruchbedingung bezieht sich auf den 3. Schritt des Algorithmus. da wusste ich nicht genau, wie ich das umzusetzen habe.
Und ich glaube, ich habe noch etwas bei der Eingabe der Intervallgrenzen falsch gemacht.
Deenn anscheinend dürfen für a nur Werte zwischen -2 und 2 genommen werde, da f(a) sonst nicht kleiner Null wird.
-
fabs(1) gibt dir den Betrag einer Zahl, d.h. aus -0.15 wird 0.15, mehr nicht. Das brauchst du falls du mal f(mi) < 0
Hm grade nochmal die Aufgabe gelesen, du hast eigentlich richtig nach der Aufgabe geloest, ist aber definitiv nicht das was das Programm erfuellen soll.Falls man einen Bereich eingibt, in dem es keine Nullstelle gibt wuerde das Programm nun aber noch in einer Endlosschleife feststecken, das kannst du so abbrechen:
if(x - y < EPSI) return sqrtf(-1.f); // gibt NAN (Not a Number) zurueck
Dann bricht er die Schleife ab, sobald der Intervall zu klein wird.
Ansonsten sieht es ganz gut aus nun!
-
ja, das mit der Endlosschleife habe ich auch schon rausgefunden
Ich dachte immer schon, ich habe einen Fehler gemacht...aber du bestätigst mich damit, dass ich es doch richtig gemacht habe..
ich werde mir das mit fabs() mal angucken....
aber schon mal "Danke"