Aufgabe mit Pointer auf Funktion
-
Ich würd' eher ein Array aus den Funktionszeigern basteln:
#include <stdio.h> #define _USE_MATH_DEFINES /* ISO/IEC 9899/1999 verlangt M_PI nicht zwingend -> Compilererweiterung */ #include <math.h> void flush_stdin( void ) { int ch; while( ( ( ch = getc( stdin ) ) != EOF ) && ( ch != '\n' ) ); } double get_outline( float radius ) { return 2.0f * radius * M_PI; } double get_area( float radius ) { return radius * radius * M_PI; } struct function_switch_t { const char *name; double ( *function )( float ); } function_switch[ ] = { { "Der Umfang", get_outline }, { "Die Flaeche", get_area } }; int main( void ) { float radius = 0.0f; int choice = 0; do { puts( "Bitte geben Sie einen Radius ein:" ); if( !scanf( "%f", &radius ) ) { puts( "Eingabefehler!\n" ); flush_stdin( ); radius = 0; } } while( !radius ); do { puts( "\nBitte waehlen Sie:" ); puts( " 1 ... Umfang" ); puts( " 2 ... Flaeche" ); if( !scanf( "%d", &choice ) && ( choice != 1 ) && ( choice != 2 ) ) { puts( "Eingabefehler!" ); flush_stdin( ); choice = 0; } } while( !choice ); printf( "\n%s eines Kreises mit Radius %f ist %lf.\n", function_switch[ choice - 1 ].name, radius, function_switch[ choice - 1 ].function( radius ) ); }greetz, Swordfish
-
Gewaltig!!

Danke für deine Hilfe Swordfish!
glg fath
-
Hast Du es auch verstanden?
greetz, Swordfish
-
Nun ja, teilweise.
Ein paar Sachen werde ich umschreiben müssen.
Ich habe noch nicht herausgefunden, warum du den ! Operator benutzt (z.B. vor scanf oder radius)
while( ( ( ch = getc( stdin ) ) != EOF ) && ( ch != '\n' ) ); Die Bedingung in dieser while Schleife ist auch noch nicht ganz klar für mich.
Auch struct habe ich noch nicht kennen gelernt.
Vielleicht hast du ja noch ein paar kurze Erklärungen? Sonst muss ich mich noch durch den Tutorials-Jungle kämpfen.
Danke inzwischen!!
lg fath
-
Die Funktion
flush_stdinist nur dazu da, ungültige Eingaben aus dem Puffer vonstdinzu flushen. Man hätte auch schreiben können:void flush_stdin( void ) { int ch = 0; do { ch = getc( stdin ); } while( ( ch != '\n' ) && ( ch != EOF ) ); // oder: while( !( ( ch == '\n' ) || ( ch == EOF ) ) ); }Es werden also Zeichen aus
stdingelesen (entfernt), solange (a) der stream nicht leer ist (EOF) und das Ende der Zeile ('\n') nicht erreicht ist.Ich habe Funktionen und deren Namen in eine
structzusammengefasst. Du kannst sie natürlich auch getrennt lassen:// anstatt: struct function_switch_t { const char *name; double ( *function )( float ); } function_switch[ ] = { { "Der Umfang", get_outline }, { "Die Flaeche", get_area } }; // definierst du am beginn der main einfach: double ( *function_switch[ ] )( float ) = { get_outline, get_area }; const char *name[ ] = { "Der Umfang", "Die Flaeche" }; // und berechnest so: printf( "\n%s eines Kreises mit Radius %f ist %lf.\n", name[ choice - 1 ], radius, function_switch[ choice - 1 ]( radius ) );fath schrieb:
Ich habe noch nicht herausgefunden, warum du den ! Operator benutzt (z.B. vor scanf oder radius)
C nimmt 0 als
falseund alles andere alstruean. Wenn jetzt inradius0steht (d.h. keine gültige Eingabe erfolgt ist), sag ichwhile( !radius );. Du könntest auchwhile( radius != 0 );schreiben.Ich hoffe, nun sind alle Klarheiten beseitigt

greetz, Swordfish
-
Swordfish schrieb:
Die Funktion
flush_stdinist nur dazu da, ungültige Eingaben aus dem Puffer vonstdinzu flushen.ja fein, aber 'flush' ist hier nur das falsche wort.

-
Warum?
greetz, Swordfish
-
im zusammenhang mit irgendwelchen buffern heisst flush soviel wie: 'alle gepufferten daten jetzt sofort an den empfänger senden'. die daten gehen dabei nicht verloren, sondern werden für die sofortige weiterverarbeitung aus dem buffer rausgeschoben. was du aber machst ist eher 'auslesen und wegwerfen'. hier wäre vielleicht 'clear' oder sowas das passendere wort.

-
to flush = "leeren" Punktum
greetz, Swordfish
-
Swordfish schrieb:
to flush = "leeren"
naja sagen wir's mal so: wenn du das glas bier auf 'ex' austrinkst ist das ein 'flush'. kippst du es in den ausguss, dann nicht.

-
Wenn ich ein Bier wegkippe, so ist das a) Verschwendung und b) nicht ich.
greetz, Swordfish