📄 dayrep.c
字号:
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<fcntl.h>#include<signal.h>#include<curses.h>#include<malloc.h>#include<time.h>#include<errno.h>#include<unistd.h>#include<pwd.h>#include<memory.h>#define MAXSEAT 60#define ROWS 15#define ROW 5#define SHOWROW 21#define INROW 22#define MSGROW 23#define NITEM 0#define BEGINYEAR 1970#define DSEC 86400#define HSEC 3600#define MSEC 60struct time{ int second; /* 0--59 */ int minute; /* 0--59 */ int hour; /* 0--23 */ int mday; /* 1--31 */ int month; /* 1--12 */ int year; /* 1970-- */ int wday; /* 0--6(0=Sunday)*/ int yday; /* 1--365(366) */ long tseconds; /* seconds from 1970.1.1,0:0:0 */};struct ticket{ int bus; int sta; unsigned user; /* sale user */ char flag; /* 0-all 1-half */ int date; /* date saled */ int time; /* time saled */ char checkflag; /* checked or not */ unsigned number; /* number of ticket */ int seat; /* seat of ticket in bus */ unsigned price; /* all price or half price */ int ruser; /* return user(normal -1) */ int rdate; /* date returned */ int rtime; /* time returned */ unsigned rprice; /* price returned */};char *tab[]={ "*** 班 次 售 票 查 询 ***", "----------------------------------------" "---------------------------------------", "Q-退出 D-日期"};/*char *title[]={};*//*int col[NITEM]={};*/int uno;struct passwd *upwd;char ucode[5],uname[10];enum Key{ NONE,Up,Down,Right,Left,Center,End,PgDn,Home, PgUp,Ins,F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,F11,F12};char *RP;int ntic,nctic,nrtic;unsigned long money,cmoney,rmoney,rprice;main(int argc,char *argv[]){ char c; long tn; struct time t; int n,quit,date; RP=getenv("ROOTPATH"); if(RP==NULL) return -1; uno=getuid(); upwd=getpwuid(uno); if(upwd==NULL) { printf("\n用户%d不存在!\n",uno); return -1; } else { strcpy(ucode,upwd->pw_name); strcpy(uname,upwd->pw_comment); } init(); tn=time(0); gettime(tn,&t); date=t.year*10000+t.month*100+t.mday; quit=0; while(quit==0) { move(ROW+ROWS+1,41+strlen(tab[2])/2); refresh(); alarm(1); c=getkey(); refresh(); if(c!=-1) { clrin(); clrmsg(); } if(c>='A'&&c<='Z') c=c-'A'+'a'; switch(c) { case -1: /* return of alarm */ break; case 'd': n=indate(date); if(n!=-1&&checkdate(n)==0) if(readtic(n)!=-1) { date=n; show(); } break; case 'q': quit=1; break; default: printf("\07"); break; } } sigignore(SIGALRM); erase(); refresh(); endwin();}int indate(int date){ int d=date; if(get_n(INROW,30,"请输入日期: ",&d,10)==-1) return -1; else return d;}int checkdate(int date){ int year,month,day; int mdays[2][12]={31,28,31,30,31,30,31,31,30,31,30,31, 31,29,31,30,31,30,31,31,30,31,30,31}; long tn; struct time t; year=date/10000; month=date%10000/100; day=date%100; tn=time(0); gettime(tn,&t); /*if(year<t.year||year>t.year+1) return -1; */if(month<1||month>12) return -1; if(year%4==0) { if(day<1||day>mdays[1][month-1]) return -1; } else if(day<1||day>mdays[0][month-1]) return -1; return 0;}init(){ int i; void showtime(); signal(SIGINT,SIG_IGN); sigset(SIGALRM,showtime); initscr(); raw(); nonl(); noecho(); erase(); mvaddstr(ROW-4,40-strlen(tab[0])/2,tab[0]);/* for(i=0;i<NITEM;i++) mvaddstr(ROW-2,col[i],title[i]);*/ mvaddstr(ROW-1,0,tab[1]); mvaddstr(ROW+ROWS,0,tab[1]); mvaddstr(ROW+ROWS+1,40-strlen(tab[2])/2,tab[2]); refresh();}int readtic(int date){ char fn[80]; int fd; long s,size; struct ticket tic; sprintf(fn,"%s/data/ticket/%d",RP,date); fd=open(fn,O_RDONLY); if(fd==-1) { showmsg("票库数据有错误, 请处理以后重新检票!"); return -1; } size=sizeof(struct ticket); ntic=0; money=0L; nctic=0; cmoney=0L; nrtic=0; rprice=0L; rmoney=0L; for(ntic=0;;) { s=read(fd,(char *)&tic,size); if(s!=size) break; ntic++; money+=tic.price; if(tic.checkflag!=0) { nctic++; cmoney+=tic.price; } if(tic.ruser!=-1) { nrtic++; rprice+=tic.price; rmoney+=tic.rprice; } } close(fd); return 0;}show(){ mvprintw(ROW+2,25,"总票数: %d",ntic); mvprintw(ROW+3,25,"总金额: %ld.%02ld",money/100,money%100); mvprintw(ROW+4,25,"退票数: %d",nrtic); mvprintw(ROW+5,25,"退票金额: %d.%02d",rprice/100,rprice%100); mvprintw(ROW+6,25,"退票手续费: %d.%02d",(rprice-rmoney)/100, (rprice-rmoney)%100); mvprintw(ROW+7,25,"结算票数: %d",nctic); mvprintw(ROW+8,25,"结算金额: %ld.%02ld",cmoney/100,cmoney%100); mvprintw(ROW+9,25,"实际售票: %d",ntic-nrtic); mvprintw(ROW+10,25,"实际金额: %ld.%02ld",(money-rmoney)/100, (money-rmoney)%100); refresh();}void showtime(){ long tn; struct time t; char s[80]; tn=time(0); gettime(tn,&t); sprintf(s,"%4d.%02d.%02d/%02d:%02d:%02d",t.year, t.month,t.mday,t.hour,t.minute,t.second); mvaddstr(0,0,s); refresh();}int gettime(long tn,struct time *t){ int days,ydays; int TZ; char *tzs; int mdays[2][12]={31,28,31,30,31,30,31,31,30,31,30,31, 31,29,31,30,31,30,31,31,30,31,30,31}; int i; tzs=(char *)getenv("TZ"); if(tzs==NULL) TZ=0; else { for(;*tzs!='\0'&&*tzs!='+'&&*tzs!='-'&&(*tzs<'0'||*tzs>'9');tzs++) ; TZ=atoi(tzs); TZ=-TZ; } tn+=TZ*HSEC; days=tn/DSEC; t->tseconds=tn; t->wday=(days+4)%7; ydays=365; for(t->year=BEGINYEAR;days>=ydays;t->year++) { if(t->year%400==0||(t->year%4==0&&t->year%100!=0)) ydays=366; else ydays=365; days-=ydays; } t->yday=days; t->month=1; if(t->year%400==0||(t->year%4==0&&t->year%100!=0)) for(i=0;days>=mdays[1][i];i++) { days-=mdays[1][i]; t->month++; } else for(i=0;days>=mdays[0][i];i++) { days-=mdays[0][i]; t->month++; } t->mday=days+1; t->hour=tn%DSEC/HSEC; t->minute=tn%HSEC/MSEC; t->second=tn%MSEC; return 0;}showmsg(char s[]){ move(MSGROW,0); clrtoeol(); mvaddstr(MSGROW,40-strlen(s)/2,s); refresh(); printf("\7\7");}clrmsg(){ move(MSGROW,0); clrtoeol(); refresh();}clrin(){ move(INROW,0); clrtoeol(); refresh();}clrscr(){ int i; for(i=0;i<ROWS;i++) { move(ROW+i,0); clrtoeol(); } refresh();}int get_n(int y,int x,char *prompt,int *n,int b){ char c,s[80],ss[80]; int i; sprintf(s,"%d",*n); for(i=0;i<b-1;i++) ss[i]=' '; ss[b-1]='\0'; mvaddstr(y,x,prompt); x+=strlen(prompt); mvaddstr(y,x,ss); mvaddstr(y,x,s); refresh(); i=0; while(1) { move(y,x+i); refresh(); if(i>=b-1) c=0x0d; else c=getkey(); switch(c) { case -1: continue; case 0x1b: /* <ESC> pressed */ return -1; case 0x0d: /* <ENTER> pressed */ if(i) { ss[i]='\0'; *n=atoi(ss); } return 0; case 0x08: /* <BS> pressed */ if(i<=0) continue; else { ss[--i]=' '; ss[i]='\0'; } break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': ss[i++]=c; break; default: printf("\7\7"); break; } mvaddstr(y,x,ss); refresh(); }}getkey(){ char c,key; char keys[]={Up,Down,Right,Left,NONE,End,PgDn,Home, PgUp,NONE,NONE,Ins}; key=getch(); refresh(); if(key==0x1b) { alarm(1); if(getch()!=-1) { c=getch(); refresh(); key=keys[c-'A']; } } return key;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -