⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dosj1.cpp

📁 DOS下一个完整的大型程序源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#if !defined( __STRING_H )
#include <String.h> 
#endif  // __STRING_H

#if !defined( __STDLIB_H )
#include <StdLib.h>
#endif  // __STDLIB_H

#if !defined( __DOS_H )
#include <Dos.h>
#endif  // __DOS_H

#if !defined( __GRAPHICS_H )
#include <Graphics.h>
#endif  // __GRAPHICS_H

#define Uses_DBase
#define Uses_Window
#define Uses_Menu
#define Uses_Field
#define Uses_Button
#include <ly.h>

#include "sj.h"
#include "sjcfg.h"
#include "sjdbf.h"

#if defined( ShiZhu )
  #define XIAN "石柱县"
#elif defined( PengShui )
  #define XIAN "彭水县"
#elif defined( YouYang )
  #define XIAN "酉阳县"
#elif defined( XiuShan )
  #define XIAN "秀山县"
#endif

struct Map
{
   char nField;
   char szName[ 11 ];
   char nRow, nCol;
};

#if defined( BIN )
const maxChg = 7;
const AChgCol = 34;
const chgOff = 20,
      chgLen = 10;
static Map map[] =
{
   fdLCTChg, "市内电话费",  6, 34, // 1 0
   fdLDTChg, "程控长话费",  8, 34, // 2 1
   fdMLTChg, "人工长话费", 10, 34, // 3 2
   fdTGTChg, "电  报  费", 12, 34, // 4 3
   fdSBTChg, "月  租  费", 14, 34, // 5 4
#if defined( ShiZhu )
   fdTOMChg, "包  农  费", 16, 34, // 6 5
#else
   fdTOMChg, "农  话  费", 16, 34, // 6 5
#endif
   fdOTChg,  "其      它", 18, 34, // 7 6
};
static char *szSj[] =
{
     //0         1         2         3         4         5         6         7
     //0123456789012345678901234567890123456789012345678901234567890123456789012345
/*00*/" 缴费时间   月  日 ─   月  日   电话号码            №                     ",
/*01*/"┏━━━━━┯━━━━━━━━━━━━━━━━━━━┯━━━━━┯━━━━┓",
/*02*/"┃ 用户名称 │                                      │缴费合同号│        ┃",
/*03*/"┠─────┼───────────────────┼─────┴────┨",
/*04*/"┃金额(大写)│                                      │(小写)¥            ┃",//$
/*05*/"┠─────┼─────┬─────────────┼────┬─────┨",
/*06*/"┃          │          │                          │月    份│ 欠费金额 ┃",
/*07*/"┃          ├─────┼─────────────┼────┼─────┨",
/*08*/"┃          │          │                          │        │          ┃",
/*09*/"┃          ├─────┼─────────────┼────┼─────┨",
/*10*/"┃    其    │          │                          │        │          ┃",
/*11*/"┃          ├─────┼─────────────┼────┼─────┨",
/*12*/"┃          │          │                          │        │          ┃",
/*13*/"┃          ├─────┼─────────────┼────┼─────┨",
/*14*/"┃          │          │                          │        │          ┃",
/*15*/"┃          ├─────┼─────────────┼────┼─────┨",
/*16*/"┃    中    │          │                          │        │          ┃",
/*17*/"┃          ├─────┼─────────────┼────┼─────┨",
/*18*/"┃          │          │                          │        │          ┃",
/*19*/"┃          ├─────┼─────────────┼────┼─────┨",
/*20*/"┃          │滞  纳  金│                          │共 欠 费│          ┃",
/*21*/"┗━━━━━┷━━━━━┷━━━━━━━━━━━━━┷━━━━┷━━━━━┛",
/*22*/"                                    收款员:              收款时间: 12:12:12",
};
#else
const AChgCol = 44;
const chgOff = 10,
      chgLen = 8;
#if defined( XiuShan )
const maxChg = 15;
static Map map[] =
{
    5, "市话月租",  6, 24, /*1*/ 19, "电报挂号",  6, 44, // 9
    7, "市话计次",  8, 24, /*2*/ 22, "市话租线",  8, 44, //10
    8, "长 话 费", 10, 24, /*3*/ 15, "农话租维", 10, 44, //11
   17, "移动电话", 12, 24, /*4*/ 12, "农话月租", 12, 44, //12
   21, "代 维 费", 14, 24, /*5*/ 13, "农话计次", 14, 44, //13
   11, "长途出租", 16, 24, /*6*/ 14, "农话会议", 16, 44, //14
   16, "无线寻呼", 18, 24, /*7*/  6, "信息费用", 18, 44, //15
   18, "电 报 费", 20, 24, /*8*/
};
#elif defined( PengShui )
const maxChg = 14;
static Map map[] =
{
    5, "市话月租",  6, 24, /*1*/ 17, "线路维护",  6, 44, // 9
    7, "市话计次",  8, 24, /*2*/ 18, "出租电路",  8, 44, //10
    8, "长 话 费", 10, 24, /*3*/ 13, "市话租维", 10, 44, //11
   15, "移动电话", 12, 24, /*4*/ 10, "农话月租", 12, 44, //12
   19, "代 维 费", 14, 24, /*5*/ 11, "农话计次", 14, 44, //13
    9, "租 线 费", 16, 24, /*6*/ 12, "农话会议", 16, 44, //14
   14, "无线寻呼", 18, 24, /*7*/ // 6, "信息费用", 18, 44, //15
   16, "电 报 费", 20, 24, /*8*/
};
#endif
static char *szSj[] =
{
     //0         1         2         3         4         5         6         7
     //0123456789012345678901234567890123456789012345678901234567890123456789012345
/*00*/" 缴费时间   月  日 ─   月  日   电话号码            №                    ",
/*01*/"┏━━━━━┯━━━━━━━━━━━━━━━━━━━┯━━━━━┯━━━━┓",
/*02*/"┃ 用户名称 │                                      │缴费合同号│        ┃",
/*03*/"┠─────┼───────────────────┼─────┴────┨",
/*04*/"┃金额(大写)│                                      │(小写)¥            ┃",//$
/*05*/"┠─────┼────┬────┬────┬────┼────┬─────┨",
/*06*/"┃          │        │        │        │        │月    份│ 欠费金额 ┃",
/*07*/"┃          ├────┼────┼────┼────┼────┼─────┨",
/*08*/"┃          │        │        │        │        │        │          ┃",
/*09*/"┃          ├────┼────┼────┼────┼────┼─────┨",
/*10*/"┃    其    │        │        │        │        │        │          ┃",
/*11*/"┃          ├────┼────┼────┼────┼────┼─────┨",
/*12*/"┃          │        │        │        │        │        │          ┃",
/*13*/"┃          ├────┼────┼────┼────┼────┼─────┨",
/*14*/"┃          │        │        │        │        │        │          ┃",
/*15*/"┃          ├────┼────┼────┼────┼────┼─────┨",
/*16*/"┃    中    │        │        │        │        │        │          ┃",
/*17*/"┃          ├────┼────┼────┼────┼────┼─────┨",
/*18*/"┃          │        │        │        │        │        │          ┃",
/*19*/"┃          ├────┼────┼────┼────┼────┼─────┨",
/*20*/"┃          │        │        │滞 纳 金│        │共 欠 费│          ┃",
/*21*/"┗━━━━━┷━━━━┷━━━━┷━━━━┷━━━━┷━━━━┷━━━━━┛",
#if defined( XiuShan )
/*22*/" 邮局帐号: 县工行 2210033─153      收款员:              收款时间:         ",
#elif defined( PengShui )
/*22*/" 邮局帐号:                          收款员:              收款时间:         ",
#endif
};
#endif

static char szTrue[]  = "已交费",
            szFalse[] = "未交费";

const
   winWidth      = 640 - 8,
   winHeight     = 425,
   winLeft       = 320 - winWidth / 2,
   winRight      = winLeft + winWidth,
   winTop        = 24,
   winBottom     = winTop + winHeight,

   sjWidth       = 76 * 8,
   sjLeft        = 320 - sjWidth / 2,
   sjTop         = winTop + 16,

   ttTelLeft     = sjLeft + 8,  // tt: tytle
   ttTelTop      = winBottom - 15 - 20 - 17,
   fdTelLeft     = ttTelLeft,
   fdTelTop      = ttTelTop + 17,
   fdTelWidth    = 8 * 16 + 2,

   fdOkWidth     = 50,
   fdOkLeft      = fdTelLeft + fdTelWidth,
   fdOkTop       = fdTelTop,

   ttInputLeft   = fdOkLeft + fdOkWidth + 63 - 26,
   ttInputTop    = ttTelTop,
   fdInputLeft   = ttInputLeft,
   fdInputTop    = fdTelTop,
   fdInputWidth  = 86,

   ttOutputLeft  = fdInputLeft + fdInputWidth + 51 - 26,
   ttOutputTop   = ttTelTop,
   fdOutputLeft  = ttOutputLeft,
   fdOutputTop   = fdTelTop,
   fdOutputWidth = fdInputWidth,

   btnOkWidth    = 97,
   btnOkHeight   = 37,
   btnOkLeft     = sjLeft + sjWidth - 8 - btnOkWidth,
   btnOkTop      = ttTelTop;

void ShowBill( BOOL bShowTable )
{
   HideCursor();
   CMHZ::setcolor( 2, 15 );
   if( bShowTable )
   {
      for( int i = 0; i < maxChg; i ++ )
        memcpy( szSj[ map[ i ].nRow ] + map[ i ].nCol - chgOff,
                map[ i ].szName, chgLen );
   }
   int nIteration = 2 - bShowTable,
       nYIteration = 16 * nIteration;
   for( int i = 0, y = sjTop; i < 22; i += nIteration, y += nYIteration )
     CMHZ::showhz( sjLeft, y, szSj[ i ] );
   ShowCursor();
}

void DxMoney( char *szMoney, char *str )
{
   static char szNumber[] = "零壹贰叁肆伍陆柒捌玖";
   static char szUnit[] = "万仟佰拾元角分";

   const cnDxMoneyLen = 32;
   memset( str, ' ', cnDxMoneyLen );

# if( flRChg == 10 )
   szMoney ++;
#endif
   char ch = *szMoney ++;
   if( ch != ' ' )
   {
      if( ch != '1' )
      {
	 memcpy( str, szNumber + ( ch - '0' ) * 2, 2 );
         str += 2;
      }
      memcpy( str, szUnit + 6, 2 );  // 拾
      str += 2;
   }
   BOOL bAfterDot = FALSE;
   for( int nUnit = 0; nUnit < 14; )
   {
      ch = *szMoney ++;
      if( ch >= '0' && ch <= '9')
      {
         memcpy( str, szNumber + ( ch - '0' ) * 2, 2 );
         str += 2;
         if( bAfterDot || ( !bAfterDot && ch != '0' ) )
         {
            memcpy( str, szUnit + nUnit, 2 );
            str += 2;
         }
      }
      if( ch != '.' ) nUnit += 2;
      else bAfterDot = TRUE;
   }
}

void LeftTrim( char *szMoney )
{
   char szTmp[ flRChg ];
   memcpy( szTmp, szMoney, flRChg );
   char *p = szTmp;
   while( *p == ' ' ) p ++;
   memset( szMoney, ' ', flRChg );
   memcpy( szMoney, p, flRChg - ( p - szTmp ) );
}

int ElapsedDay( date& d1, date& d2 )
{
   static char nMonthDay[] =
   {
      31, 30, 31, 30,  // 1   2   3   4
      31, 30, 31, 31,  // 5   6   7   8
      30, 31, 30, 31   // 9  10  11  12
   };
   int nDay;
   if( d1.da_year == d2.da_year && d1.da_mon == d2.da_mon )
      nDay = d2.da_day - d1.da_day + 1;
   else
   {
      nDay = nMonthDay[ d1.da_mon - 1 ] - d1.da_day + 1;
      if( d1.da_year == d2.da_year )
         for( int i = d1.da_mon; i < d2.da_mon - 1; i ++ ) nDay += nMonthDay[ i ];
      else
      {
         for( int i = d1.da_mon; i < 12; i ++ ) nDay += nMonthDay[ i ];
         nDay += ( d2.da_year - d1.da_year - 1 ) * 365;
	 for( i = 0; i < d2.da_mon - 1; i ++ ) nDay += nMonthDay[ i ];
      }
      nDay += d2.da_day;
   }
   return nDay;
}

int SJ::ElapsedDay( char *szDate )
{
   struct date d1, d2;
   getdate( &d2 );

   szDate[ 2 ] = 0;
   szDate[ 5 ] = 0;
   d1.da_year = atoi( szDate );
   if( d1.da_year >= 96 ) d1.da_year += 1900; // Centry
   else d1.da_year += 2000;
   d1.da_mon  = atoi( szDate + 3 ),
   d1.da_day  = config.nDayEnd + 1;
   d1.da_mon ++;
   if( d1.da_mon == 13 )
   {
      d1.da_mon = 1;
      d1.da_year ++;
   }
   int nDay = ::ElapsedDay( d1, d2 );
   for( int i = 0; i < nZnjFree; i ++ )
   {
       int nCmp11, nCmp12, nCmp21, nCmp22;
       nCmp11 = DateCmp( dZnjFree1[ i ], d1 );
       nCmp12 = DateCmp( dZnjFree1[ i ], d2 );
       nCmp21 = DateCmp( dZnjFree2[ i ], d1 );
       nCmp22 = DateCmp( dZnjFree2[ i ], d2 );
       //         |-------------|
       // |---| |-3-|  |-2-|  |-4-| |---|
       //      |---------1---------|
       if( nCmp11 <= 0 && nCmp22 >= 0 ) nDay = 0;  // 1
       else if( nCmp11 > 0 && nCmp22 < 0 )       // 2
         nDay -= ::ElapsedDay( dZnjFree1[ i ], dZnjFree2[ i ] );
       else if( nCmp11 <= 0 && nCmp21 > 0 && nCmp22 < 0 )  // 3
         nDay -= ::ElapsedDay( d1, dZnjFree2[ i ] );
       else if( nCmp22 >= 0 && nCmp12 < 0 && nCmp11 > 0 )  // 4
         nDay -= ::ElapsedDay( dZnjFree1[ i ], d2 );
   }
   return nDay;
}

static double dTheRChg = 0.0;
static double dTotRChg = 0.0;
static double dTotChg = 0.0;
static long *lQfRec = NULL;
static unsigned *uTotQfRec = NULL;
static BOOL bGetPart = FALSE;
static double dInput, dOutput;
static void DelQfPara()
{
   if( lQfRec != NULL )
   {
      delete lQfRec;
      lQfRec = NULL;
   }

   if( uTotQfRec != NULL )
   {
      delete uTotQfRec;
      uTotQfRec = NULL;
   }
}

void PrintBill()
{
   if( !PrnReady() ) return;

   struct date d;
   getdate( &d );
   if( config.nDataMonth == 12 ) d.da_year --;
   fprintf( stdprn, "                        "XIAN"邮电局  用户缴费单据"
                    "     (%02u年%2u月: %1.2lf元)\n\n",
	    d.da_year - 1900, config.nDataMonth, dTheRChg );
   for( int i = 0; i < 23; i ++ )
   {
      fprintf( stdprn, "%s\n", szSj[ i ] );
      if( HardError() ) return;
   }

   int nSpaceLine = 5;
   if( dOutput < 0 )
   {
      nSpaceLine --;
      fprintf( stdprn, " 现收到%1.2lf元,还欠%1.2lf元\n", dInput, -dOutput );
   }
   for( i = 0; i < nSpaceLine; i ++  ) NewLine();
}

void SJ::FillBill( long lSjRec, unsigned uTotSjRec )
{
   if( lSjRec < 0 || lSjRec >= dbfSJ->GetRecordNum() )
     Error( "系统错误:记录号越界" );

   DelQfPara();
   lQfRec = new long[ uTotSjRec ];
   uTotQfRec = new unsigned[ uTotSjRec ];
   char str[ 81 ];

#if !defined( PengShui )
   sprintf( str, "%2u月%2u日 ─ %2u月%2u日",
		 config.nDataMonth, config.nDayStart,
		 config.nDataMonth == 12 ? 1 : config.nDataMonth + 1,
                 config.nDayEnd );
   memcpy( szSj[ 0 ] + 10, str, 20 );  // Month
#endif
   if( uTotSjRec == 1 )
      dbfSJ->GetField( lSjRec, fdTel, szSj[ 0 ] + 42 ); // Tel
   else
   {
      sprintf( str, "共%4u个", uTotSjRec );
      memcpy( szSj[ 0 ] + 42, str, flTel );
   }
   sprintf( str, "%06lu", config.lBillNo );
   memcpy( szSj[ 0 ] + 56, str, 6 );  // Sj Number
   struct date d; getdate( &d );
   sprintf( szSj[ 0 ] + 65, "%04u.%02u.%02u", d.da_year, d.da_mon, d.da_day );

#if defined( BIN )
   dbfSJ->GetField( lSjRec, fdName, str );
   memcpy( szSj[ 2 ] + 14, str, 38 ); // Name
   dbfSJ->GetField( lSjRec, fdCNo, str );
   memcpy( szSj[ 2 ] + 66, str, 8 ); // CNo
#else
   dbfSJ->GetField( lSjRec, fdName, szSj[ 2 ] + 14 );
   dbfSJ->GetField( lSjRec, fdCNo, szSj[ 2 ] + 66 );
#endif

   double dChg[ maxChg ],
          dTotAChg = 0.0,
          dTotQf   = 0.0;
   for( unsigned i = 0; i < maxChg; i ++ ) dChg[ i ] = 0.0;

   dTheRChg = 0.0;
   dTotRChg = 0.0;
   dTotChg = 0.0;
   const maxQfMon = 6;
   char szQfMon[ maxQfMon ][ flQfDate ];
   double dQfMon[ maxQfMon ];
   for( i = 0; i < maxQfMon; i ++ )
   {
      szQfMon[ i ][ 0 ] = 0;
      dQfMon[ i ] = 0.0;
   }

   for( i = 0; i < uTotSjRec; i ++, lSjRec ++ )
   {
      for( int j = 0; j < maxChg; j ++ )
        dChg[ j ] += dbfSJ->GetDouble( lSjRec, map[ j ].nField );

      char szTel[ flTel ];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -