/* DIVISION.C Version 2 02.02.92 */ #include #include /* Unterprogramm zur Berechnung */ void rechne( long zaehler, long nenner, long stellen ) { /* Ganzahlige Division auf belibig viele Stellen genau */ long quotient; /* ganzzahliger Anteil */ long ziffer; /* aktuelle Dezimalstelle */ long rest; /* aktueller Rest */ long i; /* Laufvariable der Schleife */ /* pruefe ob Zaehler erlaubt */ if ( zaehler < 0 ) { printf( " Fehler: Zaehler ist negativ.\n" ); printf( " Bitte nur mit posiven Zaehlern rechnen.\n" ); return; }; /* pruefe ob Division durch 0 */ if ( nenner == 0 ) { printf( " Fehler: Nenner ist gleich Null.\n" ); printf( " Berechnung ist nicht sinnvoll.\n" ); return; }; /* pruefe ob Stellen erlaubt */ if ( stellen < 0 ) { printf( " Fehler: Anzahl der Stellen zu klein.\n" ); printf( " Bitte nur positive Anzahlen verwenden.\n" ); return; }; /* hier eine ganzahlige Division, Ergebnis: Vorkommastellen */ quotient = zaehler / nenner; /* hier wird der ganzzahlige Rest ermittelt */ /* OPTIMIERT, das Prozentzeichen steht fuer Modulo */ rest = zaehler % nenner; /* Ausgabe des Vorkommaanteils */ printf( " %ld / %ld = %ld,", zaehler, nenner, quotient ); /* Schleife mit i bis Anzahl der Stellen erreicht */ /* OPTIMIERT, i = i + 1 wird zu i ++ */ for ( i = 1; i <= stellen ; i ++ ) { /* Rest mal 10 fuer neue Division, naechste Ziffer */ rest = rest * 10; /* Ziffer ist gesuchte Nachkommastelle */ ziffer = rest / nenner; /* anhaengen der Ziffer an die Ausgabe */ printf( "%ld", ziffer ); /* neuer Rest, (OPTIMIERT) */ rest = rest % nenner; } /* Ende der Schleife */ /* Hier gehts weiter, wenn die Schleife fertig ist */ /* und Zeilenende ausgeben */ printf( "\n" ); /* und Ende! */ return; } #define MAX_ZEICHEN 80 void lese_eine_zahl( const char *text, /* Ausgabetext */ long *zahl /* Adresse der Variablen */ ) { char eingabe[ MAX_ZEICHEN ]; /* Platz fuer Eingabezeile */ char *status; /* Zeiger auf Eingabe */ printf( text ); status = fgets( eingabe, MAX_ZEICHEN - 1, stdin ); if ( status == NULL ) /* Fehler */ exit( 1 ); /* Programm beenden */ sscanf( eingabe, "%ld", zahl ); /* wie atod() */ printf( "\n" ); } int main ( void ) { /* lokale Varibalen, nur hier bekannt */ long ein_zaehler; /* Zaehler des Bruches */ long ein_nenner; /* Nenner des Bruches */ long ein_stellen; /* Anzahl der Nachkommastellen */ /* Voreinstellung der einzugebenden Werte */ ein_zaehler = 1; ein_nenner = 1; ein_stellen = 60; lese_eine_zahl( "\n Bitte den Zaehler eingeben ( 1 ): ", &ein_zaehler ); lese_eine_zahl( "\n Bitte den Nenner eingeben ( 1 ): ", &ein_nenner ); lese_eine_zahl( "\n Bitte die Nachkommastellen eingeben ( 60 ): ", &ein_stellen ); /* Ganzahlige Division auf belibig viele Stellen genau */ rechne( ein_zaehler, ein_nenner, ein_stellen ); /* und Ende! */ return 0; } /* ENDE DER DATEI */