📄 sale.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>#define MAXSEAT 60#define ROWS 14#define ROW 4#define SHOWROW 24#define INROW 21#define MSGROW 22#define NITEM 8#define MAXBUS 20#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 */ int 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; struct ticketlib{ int bus; int state; int time; int nseat; int lseat; int gate; int model; int laststa; char tab[MAXSEAT];}*tl;int *order;int ntl;struct statobus{ int sta; int bus; unsigned price; unsigned bprice;}*sb,*cursb;int nsb,ncursb;struct station{ int no; char code[5]; char name[10]; unsigned int howfar;}*sta;int nsta;struct model{ int no; char name[50];}*mod;int nmod;struct buses{ int psb; int ptl;}*bus;int nbus;char *tab[]={ "*** 售 票 系 统 ***", "----------------------------------------" "---------------------------------------", "Q-退出 S-售票 空格--到站 '-'-前一天 '+'-后一天 N-票号"};char *title[]={"班次","时间","票价","终点","座数","余座","检票口","车型"};int col[NITEM]={4,12,20,30,40,48,56,64};int uno;struct passwd *upwd;int date,psta,number=-1;char ucode[5],uname[10],csta[10];int showcol[4]={15,35,55,70};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 prebus[MAXBUS];int pretime;main(int argc,char *argv[]){ char c,envvars[20],*envs; int sbus,pbus,quit; long tn; struct time t; int n; char msg[80]; RP=getenv("ROOTPATH"); if(RP==NULL) return -1; envs=getenv("PRETIME"); if(envs==NULL) pretime=0; else pretime=atoi(envs); for(n=0;n<MAXBUS;n++) { prebus[n]=-1; sprintf(envvars,"PREBUS%d",n); envs=getenv(envvars); if(envs==NULL) continue; prebus[n]=atoi(envs); } uno=getuid(); upwd=getpwuid(uno); if(upwd==NULL) { printf("\nTHE USER %d DOS NOT EXIST!\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; psta=311; nsta=readsta(); nmod=readmod(); nsb=readsb(date); ntl=readtl(date); if(nsta==-1||nmod==-1||nsb==-1||ntl==-1) quit=1; else { showitem(); nbus=takebus(); quit=0; sbus=0; pbus=0; } show(1,sbus,pbus); 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 */ tn=time(0); gettime(tn,&t); if(t.hour==0&&t.minute==0&&t.second==0) { n=t.year*10000+t.month*100+t.mday; if(n>date) date=n; } if(t.second%10==0) { showitem(); nsb=readsb(date); ntl=readtl(date); n=takebus(); if(n!=nbus) { sbus=0; pbus=0; nbus=n; } show(1,sbus,pbus); } break; case Down: if(pbus<nbus-1) pbus++; if(pbus-sbus>=ROWS) { sbus++; show(1,sbus,pbus); } else show(0,sbus,pbus); break; case Up: if(pbus>0) pbus--; if(pbus<sbus&&sbus>0) { sbus--; show(1,sbus,pbus); } else show(0,sbus,pbus); break; case PgUp: if(pbus>ROWS) pbus-=ROWS; else pbus=0; if(sbus>ROWS) { sbus-=ROWS; show(1,sbus,pbus); } else if(sbus>0) { sbus=0; show(1,sbus,pbus); } else show(0,sbus,pbus); break; case PgDn: if(pbus<nbus-ROWS) pbus+=ROWS; else pbus=nbus-1; if(sbus<nbus-ROWS) { sbus+=ROWS; show(1,sbus,pbus); } else show(0,sbus,pbus); break; case Home: pbus=0; if(sbus>0) { sbus=0; show(1,sbus,pbus); } else show(0,sbus,pbus); break; case End: pbus=nbus-1; if(pbus-sbus>=ROWS) { sbus=nbus-ROWS; show(1,sbus,pbus); } else show(0,sbus,pbus); break; case ' ': n=insta(); showitem(); if(n!=-1) { nbus=takebus(); sbus=0; pbus=0; show(1,sbus,pbus); } break; case '0': case 's': if((n=sale(pbus))!=-1) { sprintf(msg,"此次售票成功! (%d.%02d元)", n/100,n%100); showmsg(msg); showitem(); show(1,sbus,pbus); } break; case '+': tn=time(0); do{ tn+=86400; /* 24h. * 3600Sec. */ gettime(tn,&t); n=t.year*10000+t.month*100+t.mday; }while(n<=date); date=n; showitem(); nsb=readsb(date); ntl=readtl(date); nbus=takebus(); sbus=0; pbus=0; show(1,sbus,pbus); break; case '-': n=date; tn=time(0); while(1) { gettime(tn,&t); if(t.year*10000+t.month*100+t.mday<date) { n=t.year*10000+t.month*100 +t.mday; tn+=86400; } else break; } if(n<date) { date=n; showitem(); nsb=readsb(date); ntl=readtl(date); nbus=takebus(); sbus=0; pbus=0; show(1,sbus,pbus); } break; case 'n': number=inticnum(); break; case 'q': quit=1; break; default: printf("\07"); break; } } getch(); sigignore(SIGALRM); erase(); refresh(); endwin();}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]); mvaddstr(ROW+ROWS+2,0,tab[1]); refresh();}int readmod(){ char fn[80]; char errs[128]; int fd; long size; sprintf(fn,"%s/bas/model.dat",RP); fd=open(fn,O_RDONLY); if(fd==-1) { sprintf(errs,"文件%s打开失败!",fn); showmsg(errs); return fd; } size=lseek(fd,0L,2); mod=(struct model *)malloc(size); if(mod==NULL) { showmsg("为车型数据分配内存出错!"); return -1; } else { lseek(fd,0L,0); read(fd,(char *)mod,size); close(fd); return size/sizeof(struct model); }}int readsta(){ char fn[80]; char errs[128]; int fd; long size; int i,nsta; 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); nsta=size/sizeof(struct station); for(i=0;i<nsta&&psta!=sta[i].no;i++) ; if(i<nsta) strcpy(csta,sta[i].name); else csta[0]='\0'; return nsta; }}int readsb(int date){ char fn[80]; char errs[128]; int i,fd; long size; if(sb!=NULL) free(sb); sprintf(fn,"%s/data/idex/%d",RP,date); fd=open(fn,O_RDONLY); if(fd==-1) { sprintf(errs,"文件%s打开失败!",fn); showmsg(errs); return fd; } size=lseek(fd,0L,2); sb=(struct statobus *)malloc(size); if(sb==NULL) { showmsg("为站点-班车数据分配内存出错!"); return -1; } lseek(fd,0L,0); read(fd,(char *)sb,size); close(fd); return size/sizeof(struct statobus);}int readtl(int date){ char fn[80]; char errs[128]; int fd; long size; int i; if(tl!=NULL) free(tl); if(order!=NULL) free(order); sprintf(fn,"%s/data/ticlib/%d",RP,date); fd=open(fn,O_RDONLY); if(fd==-1) { sprintf(errs,"文件%s打开失败!",fn); showmsg(errs); return fd; } size=lseek(fd,0L,2); ntl=size/sizeof(struct ticketlib); tl=(struct ticketlib *)malloc(size); order=(int *)malloc(ntl*sizeof(int)); if(tl==NULL||order==NULL) { showmsg("为排序数据分配内存出错!"); return -1; } lseek(fd,0L,0); read(fd,(char *)tl,size); close(fd); for(i=0;i<ntl;i++) order[i]=i; sorttl(ntl); return ntl;}sorttl(int ntl){ int i,j,k,n; k=ntl/2; while(k>0) { for(j=k;j<ntl;j++) { n=order[j]; i=j-k; while(i>=0&&tl[order[i]].time>tl[n].time) { order[i+k]=order[i]; i-=k; } order[i+k]=n; } k/=2; }}int takebus(){ int i,j,k; struct time t; long tn; int tm; int *ptl,*psb; int nptl,npsb; if(nsb<=0||ntl<=0) return 0; tn=time(0); gettime(tn,&t); if(getdays(t.year*10000+t.month*100+t.mday,date)==0) tm=t.hour*100+t.minute; else tm=0; ptl=(int *)malloc(ntl*sizeof(int)); if(ptl==NULL) { showmsg("为票库数据分配内存出错!"); return 0; } for(i=0,nptl=0;i<ntl;i++) if((tl[order[i]].time>tm &&tl[order[i]].state==0 &&tl[order[i]].lseat>0) /* || */ /* (checkbus(tl[order[i]].bus)==1&&tm<pretime) */) ptl[nptl++]=order[i]; psb=(int *)malloc(nsb*sizeof(int)); if(psb==NULL) { showmsg("为站点-班车指针数据分配内存出错!"); free(ptl); return 0; } for(i=0,npsb=0;i<nsb;i++) if(sb[i].sta==psta) psb[npsb++]=i; if(bus!=NULL) free(bus); bus=(struct buses *)malloc(nptl*sizeof(struct buses)); if(bus==NULL) { showmsg("为班车指针数据分配内存出错!"); free(psb); free(ptl); return 0; } for(i=0,nbus=0;i<nptl;i++) { for(j=0;j<npsb&&sb[psb[j]].bus!=tl[ptl[i]].bus;j++) ; if(j<npsb) { bus[nbus].ptl=ptl[i]; bus[nbus].psb=psb[j]; nbus++; } } free(psb); free(ptl); return nbus;}sort_time(int nbus){ int i,j,k,n; k=nbus/2; while(k>0) { for(j=k;j<nbus;j++) { n=order[j]; i=j-k; while(i>=0&&tl[bus[order[i]].ptl].time>tl[bus[n].ptl].time) { order[i+k]=order[i]; i-=k; } order[i+k]=n; } k/=2; }}int insta(){ int i; static char code[5]="cdc"; while(1) { if(get_s(SHOWROW,showcol[2],"",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 0; } else showmsg("输入的站点不存在!"); }}int inticnum(){ int n; n=number; if(get_n(SHOWROW,showcol[3],"",&n,10)==-1) return -1; else return n;}showitem(){ int i; char ns[]="售票员:",ds[]="日期:",ss[]="到站:", nums[]="票号:"; move(SHOWROW,0), clrtoeol(); mvaddstr(SHOWROW-1,0,tab[1]); mvprintw(SHOWROW,showcol[0]-strlen(ns),"%s%s",ns,uname); mvprintw(SHOWROW,showcol[1]-strlen(ds),"%s%d.%d.%d ",ds, date/10000,date%10000/100,date%100); mvprintw(SHOWROW,showcol[2]-strlen(ss),"%s%s ",ss,csta); mvprintw(SHOWROW,showcol[3]-strlen(nums),"%s%d",nums,number); refresh();}show(int flag,int sbus,int pbus){ static int s=-1,p=-1; int i; void showtime(); move(2,70); clrtoeol(); if(nbus<=0) { mvaddstr(2,70,"0/0"); clrscr(); refresh(); return; } else mvprintw(2,70,"%d/%d",pbus+1,nbus); if(nbus<=0) { clrscr(); return; } if(flag==0) mvaddch(p-s+ROW,col[0]-1,' '); else { for(i=0;i<ROWS&&(sbus+i)<nbus;i++) { sigignore(SIGALRM); showone(ROW+i,sbus+i); sigset(SIGALRM,showtime); } for(;i<ROWS;i++) move(ROW+i,0), clrtoeol(); } mvaddch(pbus-sbus+ROW,col[0]-1,'>'); p=pbus;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -