07-25-2022, 10:45 PM
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:
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 Rckzahlungszeitraum 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, "Rckzahlungsbetrag : %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 fr 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 Rckzahlung
restSchuld -= tilgung;
//Eine Jahreszahl fr 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( "Drcken 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;
//Prfen 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("drcken 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 Rckzahlungsbetrag : %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 );
}