📄 routetic.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 9999#define ROWS 15#define ROW 5#define SHOWROW 21#define INROW 22#define MSGROW 23#define NITEM 9#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 ticketlib{ int bus; int state; int time; int nseat; int lseat; int gate; int model; int laststa; char tab[MAXSEAT];}*bus;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 */}tic[MAXSEAT];int ntic=0;struct busstate{ int bus; int time; char regi; int reguser; int regtime; char check; int gate; int checkuser; int checkbegintime; int checkendtime; char print; int printuser; int printtime; char settle; int owner; int rate; int settleuser; int settletime;}bs;struct station{ int no; char code[5]; char name[10]; unsigned int howfar;}*sta;int nsta;char *tab[]={ "*** 站 点 售 票 查 询 ***", "----------------------------------------" "---------------------------------------", "Q-退出 B-站点 D-日期 P-打印日报"};char *title[]={"班次","座位","票号","性质","票价","日期","时间", "售票人","检否"};int col[NITEM]={2,8,18,28,34,42,50,58,68};int uno;struct passwd *upwd;char route[5];char ucode[5],uname[10];int date,psta,tflag,number=-1;char ucode[5],uname[10],csta[10];int showcol[5]={8,24,43,57,70};char *RP;int total=0;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};main(int argc,char *argv[]){ char c; int stic,ptic,quit; long tn; struct time t; int m,mm,n; 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; nsta=readsta(); if(nsta==-1) quit=1; else { quit=0; stic=0; ptic=0; } while(quit==0) { show(stic,ptic); 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 */ tn=time(0); gettime(tn,&t); if(t.second%10==0&&sta->no!=-1) { /* m=readtic(date,sta->no);*/ if(m!=-1) { if(m<ntic) { if(stic>=m) stic=ntic-1; if(ptic>=m) ptic=ntic-1; } ntic=m; } } break; case Down: if(ptic<ntic-1) ptic++; if(ptic-stic>=ROWS) stic++; break; case Up: if(ptic>0) ptic--; if(ptic<stic&&stic>0) stic--; break; case PgUp: if(ptic>=ROWS) ptic-=ROWS; else ptic=0; if(stic>=ROWS) stic-=ROWS; else stic=0; break; case PgDn: if(ptic<ntic-ROWS) ptic+=ROWS; else ptic=ntic-1; if(stic<ntic-ROWS) stic+=ROWS; break; case Home: ptic=0; if(stic>0) stic=0; break; case End: ptic=ntic-1; if(ptic-stic>=ROWS) stic=ntic-ROWS; break; case 'd': n=indate(date); if(n==-1||checkdate(n)==0) { date=n; if(ntic==-1) ntic=0; show(1,stic,ptic); } break; case 'b': mm=insta(); if(mm!=-1) { m=readtic(date,mm); if(m!=-1) { ntic=m; stic=0; ptic=0; strcpy(route,sta->code); } } break; case 'p': print(); break; case 'q': quit=1; break; default: printf("\07"); break; } } sigignore(SIGALRM); erase(); refresh(); endwin();}int indate(int date){ int d=date; total=0; 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 readsta(){ char fn[80]; char errs[128]; int fd; long size; sprintf(fn,"%s/bas/stas.dat",RP); fd=open(fn,O_RDONLY); if(fd==-1) { sprintf(errs,"文件%s打开失败!",fn); showmsg(errs); return fd; } size=lseek(fd,0L,2); sta=(struct station *)malloc(size); if(sta==NULL) { showmsg("为站点数据分配内存出错!"); return -1; } else { lseek(fd,0L,0); read(fd,(char *)sta,size); close(fd); return size/sizeof(struct station); }}int readtic(int date,int no){ char fn[80]; int fd; long s,size; int i,j; sprintf(fn,"%s/data/ticket/%d",RP,date); fd=open(fn,O_RDONLY); if(fd==-1) { showmsg("票库数据有错误!"); return -1; } size=sizeof(struct ticket); for(i=0;i<MAXSEAT;) { s=read(fd,(char *)(tic+i),size); if(s!=size) break; if(tic[i].sta==no) { total+=tic[i].price; i++; } } close(fd); return i;}int insta(){ int i; char code[5]="cdc"; total=0; while(1) { if(get_s(SHOWROW+1,30,"站点代码:",code,5)==-1) return -1; for(i=0;i<nsta&&strcmp(code,sta[i].code)!=0;i++) ; if(i<nsta) { psta=sta[i].no; strcpy(csta,sta[i].name); clrin(); return psta; } else showmsg("输入的站点不存在!"); }}int inticnum(){ int n=0; if(get_n(INROW,30,"请输入票号: ",&n,10)==-1) return -1; return n;}show(int stic,int ptic){ static int n=-1; static int s=-1; static int p=-1; static char b[5]; int i; void showtime(); move(2,70); clrtoeol(); if(sta->no!=-1) mvprintw(2,0,"站点: %s",/*sta->name*/csta); if(ntic>0) { mvprintw(2,15,"金额:%d.%d",total/100,total%100); mvprintw(2,70,"%d/%d",ptic+1,ntic); } else { mvaddstr(2,70,"0/0"); clrscr(); refresh(); return; } mvaddch(p-s+ROW,col[0]-1,' '); if(p!=ptic) p=ptic; for(i=0;i<ROWS&&s+i<ntic;i++) ; if(n!=ntic||s!=stic||(i<ROWS&&s+i<ntic)||b!=route) { n=ntic; s=stic; strcpy(b,route); for(i=0;i<ROWS&&(s+i)<ntic;i++) { sigignore(SIGALRM); showone(ROW+i,s+i); sigset(SIGALRM,showtime); } for(;i<ROWS;i++) move(ROW+i,0), clrtoeol(); } move(p-s+ROW,0), clrtoeol(); showone(p-s+ROW,p); mvaddch(p-s+ROW,col[0]-1,'>'); refresh();}showone(int row,int n){ int i,j,k,l; char sname[20]; move(row,0), clrtoeol(); mvprintw(row,col[0],"%d",tic[n].bus); mvprintw(row,col[1],"%d",tic[n].seat); mvprintw(row,col[2],"%d",tic[n].number); if(tic[n].flag) mvaddstr(row,col[3],"半票"); else mvaddstr(row,col[3],"全票"); mvprintw(row,col[4],"%4d.%02d",tic[n].price/100,tic[n].price%100); mvprintw(row,col[5],"%2d.%d",tic[n].date%10000/100,tic[n].date%100); mvprintw(row,col[6],"%2d:%02d",tic[n].time/100,tic[n].time%100); if(getuser(tic[n].user,sname)==0) mvaddstr(row,col[7],sname); else mvaddstr(row,col[7],"(无)"); if(tic[n].checkflag) mvaddstr(row,col[8],"已检"); else mvaddstr(row,col[8],"未检"); refresh();}int getuser(int uno,char uname[]){ struct passwd *psw; if(uno==-1) return -1; else { psw=getpwuid(uno); if(psw!=NULL) { strcpy(uname,psw->pw_comment); return 0; } else return -1; }}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;}print(){ printf("%c{",0x1b);printf(" 站点售票情况日报\n\n");printf(" 日期:%d.%d.%d\n",date/10000,date%10000/100,date%100);printf(" 站点:%s 金额: %d.%02d 票数:%d张\n\n\n",csta,total/100,total%100,ntic); printf("%c}",0x1b);return;}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(); }}int get_s(int y,int x,char prompt[],char s[],int n) /* x,y location of cursor; s the string */ /* n length of s; */{ char c,ss[128]; int i; for(i=0;i<n-1;i++) ss[i]=' '; ss[n-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>=n-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'; strcpy(s,ss); } return 0; case 0x08: /* <BS> pressed */ if(i<=0) continue; else ss[--i]=' '; break; default: ss[i++]=c; 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 + -