Calculator
#13
And if anyone thinks I'm just kidding, . . .

It started with three external files as an exercise, and then I went through the whole book: 92 external files for each calculation. Here is one of them:

Code: (Select All)
/* 'krratmon.c' wird von 'KREDITEX.C' aufgerufen.                          */
/* Monatliche Ratentilgung (unterjährliche Tilgung).                       */
/* Bei der Ratentilgung ist die Tilgungsrate fest. Tilgungsrate und Zinsen */
/* ergeben die Annuität. Bei der unterj. Ratentilgung ist es üblich, pro   */
/* Tilgungsperiode einen periodisch anteiligen Zins zu zahlen. Dieser er-  */
/* gibt sich aus der Verzinsung der Restschuld mit dem relativen Zinssatz. */
/*                                                            - 17. 2.1996 */
/* An übrige Programmgestaltung angepaát.                     - 15. 3.1996 */
/*=========================================================================*/

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <graph.h>
#include <math.h>
#include <time.h>
#include <dos.h>
#include <bios.h>

#define LPT1 0              //Reihenfolge der Drucker: 0, 1, 2, ...
#define CURSOR_AUS 0x2000
#define CURSOR_NORMAL 0x0707

int seite;

extern void annuitaeten_menu( void );
extern void monat_tilgung( void );

void titel( void );
void menueLeiste( void );
double rueckBetrag( double kredit, double zins, int monate );
void betragsLeiste( double betrag, double zins, double rueckzahlungsWert );
char tilgungBerechnen( double kredit, double zins, int monate );
void tabellenKopfDrucken( double kredit, double zins, double rueckzahlung, int azeile, int aspalte, int ezeile, int espalte );
void tabelleDrucken( double kredit, double zins, int monate, int azeile, int aspalte, int ezeile, int espalte );
void druckAnzeige( int monate );

void monat_tilgung( void )
{
    int azeile, aspalte, ezeile, espalte;
    int vg_farbe, monate;
    int orginal_seite;
    long int hg_farbe;
    double betrag, zins;
    char antwort, wahl;

    hg_farbe = _getbkcolor();
    vg_farbe = _gettextcolor();
    _gettextwindow( &azeile, &aspalte, &ezeile, &espalte );

    titel();
    _settextwindow( 4, 2, 24, 79 );
    _setbkcolor( 1L );
    _clearscreen( _GWINDOW );

    _settextposition( 2, 4 );
    printf("Geben Sie die H”he des Kreditbetrags ein (in DM)    : ");
    scanf("%lf", &betrag);
    _settextposition( 3, 4 );
    printf("Geben Sie den vereinbarten Zinssatz ein (in %%)      : ");
    scanf("%lf", &zins);
    _settextposition( 4, 4 );
    printf("Geben Sie den Rckzahlungszeitraum ein (in Monaten) : ");
    scanf("%d", &monate);
    _settextcursor( CURSOR_AUS );

    menueLeiste();
    betragsLeiste( betrag, zins, rueckBetrag( betrag, zins, monate ) );
    if ( tilgungBerechnen( betrag, zins, monate ) == 'J' )
    {
        tabellenKopfDrucken( betrag, zins, rueckBetrag( betrag, zins, monate ), azeile, aspalte, ezeile, espalte );
        tabelleDrucken( betrag, zins, monate, azeile, aspalte, ezeile, espalte );
        druckAnzeige( monate );
    }
    //'seite ' muß vor Verlassen der Funktion wieder auf 0 gebracht werden,
    //sonst wird, solange das Gesamtprogramm läuft, einfach weiter gezählt
    //egal aus welchem Programmteil man druckt.
    seite = 0;

    _settextwindow( azeile, aspalte, ezeile, espalte );
    _settextcursor( CURSOR_NORMAL );
    _settextcolor( vg_farbe );
    _setbkcolor( hg_farbe );
    _clearscreen( _GCLEARSCREEN );
    annuitaeten_menu();
}

void titel( void )
{
    int spalte;
    char ch[2];

    _setbkcolor( 15L );
    _clearscreen( _GCLEARSCREEN );
    _settextposition( 2, 18 );
    _settextcolor( 14 );
    _outtext( "Tilgungsplan einer monatlichen Ratentilgung" );
    for ( spalte = 18; spalte < 61; spalte++ )
    {
        _settextposition( 3, spalte );
        _settextcolor( 10 );
        _outtext( "þ" );
    }
}

double rueckBetrag( double kredit, double zins, int monate )
{
    int j;
    double ir, tilgung, restSchuld;
    double monatsZins, annuitaet;
    double rueckzahlung = 0;

    tilgung = kredit / (double) monate;
    restSchuld = kredit;

    //Relativer Zinssatz
    ir = (zins / 100) / monate;

    for ( j = 1; j <= monate; j++ )
    {
        monatsZins = (restSchuld * ir * monate) / 12;
        annuitaet = tilgung + monatsZins;
        restSchuld -= tilgung;
        rueckzahlung += annuitaet;
    }
    return( rueckzahlung );
}

void betragsLeiste( double kredit, double zins, double rueckzahlungsWert )
{
    char puffer[64];

    _settextwindow( 4, 2, 6, 79 );
    _setbkcolor( 11L );
    _clearscreen( _GWINDOW );
    _settextcolor( 15 );
    _settextposition( 1, 40 );
    sprintf(puffer, "Kreditbetrag       : %13.2f DM", kredit);
    _outtext( puffer );
    _settextposition( 2, 40 );
    sprintf(puffer, "Jahreszins         : %13.2f %%", zins);
    _outtext( puffer );
    _settextposition( 3, 40 );
    sprintf(puffer, "Rckzahlungsbetrag : %13.2f DM", rueckzahlungsWert);
    _outtext( puffer );
}

void menueLeiste( void )
{
    _settextwindow( 7, 2, 7, 79 );
    _setbkcolor( 13L );
    _clearscreen( _GWINDOW );

    _settextcolor( 15 );
    _settextposition( 1, 3 );
    _outtext( "Jahr" );
    _settextposition( 1, 7 );
    _outtext( "/Monat" );
    _settextposition( 1, 20 );
    _outtext( "Zinsen" );
    _settextposition( 1, 36 );
    _outtext( "Tilgung" );
    _settextposition( 1, 51 );
    _outtext( "Annuit„t" );
    _settextposition( 1, 67 );
    _outtext( "Restschuld" );
}

char tilgungBerechnen( double kredit, double zins, int monate )
{
    int j, x, zeile, zp;
    unsigned int jahres_zahl;
    char puffer[64], antwort;
    double monatsZins, restSchuld, tilgung;
    double annuitaet, dummy, i;
    struct dosdate_t datum;

    _settextwindow( 8, 2, 24, 79 );
    _setbkcolor( 0L );
    _clearscreen( _GWINDOW );

    //Datum holen
    _dos_getdate( &datum );

    //Jahreszahl der Tilgung holen (Tilgungsbeginn)
    jahres_zahl = datum.year;

    //Restschuld initialisieren
    restSchuld = kredit;
    dummy = kredit;

    tilgung = kredit / (double) monate;

    //Relativer Zinssatz
    i = (zins / 100) / monate;

    zeile = 2;
    zp = 1;                          //Regelt die Jahreszahl
    x = 1;                           //Steht fr die Monatszahl
    for ( j = 1; j <= monate; j++, zp++, x++ )
    {
        //Nur '... /12', da 'zins/100' schon in i enthalten ist
        monatsZins = (restSchuld * i * monate) / 12;

        //Nur Annuit„t und Zins „ndern sich ensprechend der Restschuld
        annuitaet = tilgung + monatsZins;

        //Vermindert sich nach jeder Rckzahlung
        restSchuld -= tilgung;

        //Eine Jahreszahl fr 12 Monate
        if ( zp == 1 )
        {
            _settextcolor( 13 );
            _settextposition( zeile, 3 );
            sprintf(puffer, "%u", jahres_zahl++);
            _outtext( puffer );
        }
        _settextcolor( 15 );
        _settextposition( zeile, 8 );
        sprintf(puffer, "%3d", x);
        _outtext( puffer );
        _settextcolor( 11 );
        _settextposition( zeile, 14 );
        sprintf(puffer, "%12.2f", monatsZins);
        _outtext( puffer );
        _settextcolor( 12 );
        _settextposition( zeile, 31 );
        sprintf(puffer, "%12.2f", tilgung);
        _outtext( puffer );
        _settextcolor( 9 );
        _settextposition( zeile, 47 );
        sprintf(puffer, "%12.2f", annuitaet);
        _outtext( puffer );
        _settextcolor( 14 );
        _settextposition( zeile, 64 );
        sprintf(puffer, "%13.2f", dummy);
        _outtext( puffer );
        zeile++;
        dummy = restSchuld;

        if ( monate <= 12 || monate > 12 )
        {
            _settextposition( 16, 28 );
            _settextcolor( 10 );
            _outtext( "Drcken Sie eine Taste" );
            if ( j % 12 == 0 )
            {
                do
                    getch();
                while ( kbhit() );

                //Hier muá es sein, sprach der HERR !
                zp = 0;
                x = 0;

                //Sofortiges Ende, wenn Monatszahl erreicht
                if ( j == monate )
                    { goto ENDE; }
                    //Sonst n„chste Seite anzeigen
                _clearscreen( _GWINDOW );
                zeile = 2;
            }
        }
    }
    do            //Um die Ausgabe bei 12 <= Monaten festzuhalten
        getch();
    while ( kbhit() );

ENDE:
    _settextcolor( 0 );
    _settextposition( 16, 28 );
    _outtext( "                          " );
    _setbkcolor( 15L );
    _settextcolor( 0 );
    _settextposition( 16, 28 );
    _outtext( "Tilgungsplan ausdrucken? : " );
    antwort = toupper( getche() );

    return( antwort );
}

void tabellenKopfDrucken( double kredit, double zins, double rueckzahlung, int azeile, int aspalte, int ezeile, int espalte )
{
    int spalte, vg_farbe, z = 1;
    unsigned int status, hg_farbe;
    struct dosdate_t datum;
    struct dostime_t zeit;

    //Prfen ob Drucker bereit ist. Nach 2. Versuch Abbruch
    SCHLEIFE:
    status = _bios_printer( _PRINTER_STATUS, LPT1, 0 );
    if ( status & 8 )   //Nicht an
    {
        do
        {
            printf("\n\n\a   Schalten Sie den Drucker ein, und ");
            printf("drcken Sie anschlieáend eine Taste.");
            getch();
            if ( status & 8 && z++ < 2 )
                goto SCHLEIFE;
            else
            {
                _settextwindow( azeile, aspalte, ezeile, espalte );
                _settextcursor( CURSOR_NORMAL );
                _settextcolor( vg_farbe );
                _setbkcolor( hg_farbe );
                _clearscreen( _GCLEARSCREEN );
                annuitaeten_menu();
            }
        } while ( !status & 8 );
    }

    //Datum und Zeit holen
    _dos_getdate( &datum );
    _dos_gettime( &zeit );

    fprintf(stdprn, "\n");
    fprintf(stdprn, "      *** TILGUNGSPLAN EINER MONATLICHEN RATENTILGUNG BEI PERIODISCH ***\n");
    fprintf(stdprn, "                         (MONATLICH) ANTEILIGEM ZINS\n\n");
    fprintf(stdprn, "\t\t\t\t\t  Kreditbetrag       : %13.2f DM", kredit);
    fprintf(stdprn, "\n\t\t\t\t\t  Zinssatz           : %13.2f %%", zins);
    fprintf(stdprn, "\n\t\t\t\t\t  Rckzahlungsbetrag : %13.2f DM", rueckzahlung);

    fprintf(stdprn, "\n\n\t\t\t   Erstellt am: ");
    fprintf(stdprn, "%2d.%2d.%4d  um: %2d:%2d Uhr", datum.day, datum.month,
                                       datum.year, zeit.hour, zeit.minute);
    fprintf(stdprn, "     Seite: %2d\n ", ++seite);
    for ( spalte = 3; spalte <= 80; spalte++ )
        fprintf( stdprn, "%c", 220);

    fprintf(stdprn, "\n\n    %s%s      %s      %s      %s        %s\n\n",
          "Jahr", "/Monat", "  Zinsen", "  Tilgung", "   Annuit„t",
          "Restschuld");
}

void tabelleDrucken( double kredit, double zins, int monate, int azeile, int aspalte, int ezeile, int espalte )
{
    int y, j, x, zp;
    unsigned int jahres_zahl;
    double monatsZins, restSchuld, tilgung;
    double annuitaet, dummy, i;
    struct dosdate_t datum;

    _dos_getdate( &datum );
    jahres_zahl = datum.year;

    restSchuld = kredit;
    dummy = kredit;

    tilgung = kredit / (double) monate;
    i = (zins / 100) / monate;

    zp = 1;
    x = 1;
    for ( j = 1; j <= monate; j++, zp++, x++ )
    {
        monatsZins = (restSchuld * i * monate) / 12;
        annuitaet = tilgung + monatsZins;
        restSchuld -= tilgung;

        if ( zp == 1 )
            fprintf(stdprn, "    %4u", jahres_zahl++);
        else
            fprintf(stdprn, "        ");

        fprintf(stdprn, "  %2d", x);
        fprintf(stdprn, "    %12.2f", monatsZins);
        fprintf(stdprn, "   %12.2f", tilgung);
        fprintf(stdprn, "     %12.2f", annuitaet);
        fprintf(stdprn, "     %13.2f", dummy);
        fprintf(stdprn, "\n");
        dummy = restSchuld;

        if ( j % 12 == 0 )
        {
            fprintf(stdprn, "    ");
            for ( y = 4; y < 80; y++ )
                fprintf(stdprn, "%c", 196);

            fprintf(stdprn, "\n");
            zp = 0;
            x = 0;
        }
        //Nach 48 Zeilen neue Seite, wenn noch mehr kommt
        if ( j % 48 == 0 && j < monate )
        {
            fprintf(stdprn, "\n\t\t\t\t\t*");
            fprintf(stdprn, "\f");
            tabellenKopfDrucken( kredit, zins, rueckBetrag( kredit, zins, monate ), azeile, aspalte, ezeile, espalte );
        }
    }
    fprintf(stdprn, "\n\t       ");
    for ( j = 1; j <= 50; j++ )
        { fprintf(stdprn, "%c", 42); }

    fprintf(stdprn, "\n\t\t     ");
    for ( j = 1; j <= 38; j++ )
        { fprintf(stdprn, "%c", 42); }
    fprintf(stdprn, "\f");
}

void druckAnzeige( int monate )
{
    int vg_farbe;
    long int hg_farbe;
    time_t gegenw_zeit, start_zeit;

    _settextwindow( 13, 22, 15, 58 );
    _setbkcolor( 5L );
    _clearscreen( _GWINDOW );
    time( &start_zeit );
    do
    {
        time( &gegenw_zeit );
        _settextcolor( 15 );
        _settextposition( 2, 4 );
        _outtext( "TILGUNGSPLAN WIRD AUSGEDRUCKT !" );
    } while ( gegenw_zeit - start_zeit < monate / 4 );

    _settextcursor( CURSOR_NORMAL );
    _settextcolor( vg_farbe );
    _setbkcolor( hg_farbe );
    _clearscreen( _GCLEARSCREEN );
}
Reply


Messages In This Thread
Calculator - by SierraKen - 07-24-2022, 10:21 PM
RE: Calculator - by SierraKen - 07-24-2022, 10:40 PM
RE: Calculator - by Coolman - 07-25-2022, 09:34 AM
RE: Calculator - by James D Jarvis - 07-25-2022, 01:05 PM
RE: Calculator - by Coolman - 07-25-2022, 01:43 PM
RE: Calculator - by OldMoses - 07-25-2022, 11:54 AM
RE: Calculator - by bplus - 07-25-2022, 01:28 PM
RE: Calculator - by SierraKen - 07-25-2022, 07:08 PM
RE: Calculator - by Kernelpanic - 07-25-2022, 09:49 PM
RE: Calculator - by SierraKen - 07-25-2022, 09:53 PM
RE: Calculator - by Kernelpanic - 07-25-2022, 10:24 PM
RE: Calculator - by bplus - 07-25-2022, 09:53 PM
RE: Calculator - by OldMoses - 07-28-2022, 12:41 AM
RE: Calculator - by Kernelpanic - 07-25-2022, 10:45 PM
RE: Calculator - by mnrvovrfc - 07-25-2022, 10:50 PM
RE: Calculator - by bplus - 07-25-2022, 11:10 PM
RE: Calculator - by SierraKen - 07-26-2022, 12:22 AM
RE: Calculator - by SierraKen - 07-26-2022, 04:09 PM
RE: Calculator - by bplus - 07-26-2022, 07:15 PM
RE: Calculator - by SierraKen - 07-26-2022, 09:05 PM
RE: Calculator - by SierraKen - 07-26-2022, 09:19 PM
RE: Calculator - by SierraKen - 07-27-2022, 03:11 AM
RE: Calculator - by Pete - 07-27-2022, 04:38 AM
RE: Calculator - by ChiaPet - 07-27-2022, 06:08 AM
RE: Calculator - by bplus - 07-27-2022, 11:51 AM
RE: Calculator - by ChiaPet - 07-28-2022, 03:54 PM
RE: Calculator - by SierraKen - 07-27-2022, 03:31 PM
RE: Calculator - by Kernelpanic - 07-27-2022, 05:34 PM
RE: Calculator - by Pete - 07-27-2022, 06:32 PM
RE: Calculator - by SierraKen - 07-27-2022, 08:02 PM
RE: Calculator - by Kernelpanic - 07-27-2022, 08:12 PM
RE: Calculator - by SierraKen - 07-27-2022, 08:12 PM
RE: Calculator - by Kernelpanic - 07-27-2022, 08:46 PM
RE: Calculator - by SierraKen - 07-27-2022, 09:27 PM
RE: Calculator - by Pete - 07-27-2022, 09:54 PM
RE: Calculator - by Jack - 07-27-2022, 10:26 PM
RE: Calculator - by Pete - 07-27-2022, 10:42 PM
RE: Calculator - by Pete - 07-27-2022, 11:21 PM
RE: Calculator - by SierraKen - 07-27-2022, 11:59 PM
RE: Calculator - by SierraKen - 07-28-2022, 10:11 PM
RE: Calculator - by Pete - 07-29-2022, 01:00 AM
RE: Calculator - by SierraKen - 07-29-2022, 08:30 PM
RE: Calculator - by Kernelpanic - 07-29-2022, 08:42 PM
RE: Calculator - by SierraKen - 07-29-2022, 08:45 PM
RE: Calculator - by SierraKen - 07-29-2022, 08:47 PM



Users browsing this thread: 33 Guest(s)