📄 pmaker.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>#define MAXSEAT 60#define PREDAYS 3#define NORMAL 0#define CANCEL 1#define MSGROW 23#define ROUSTA 10#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 buses{ int no; int time; int owner; int rate; int gate; int model; int nseat;}*bus;int nbus;struct twoseat{ int bus; int date; int today; int nextday;}*two;int ntwo;struct rstation{ int bus; int sta; unsigned price; unsigned bprice;}*rsta;int nrsta;struct cancels{ int bus; int date; int days;}*can;int ncan;struct route{ int bus; int nsta; int p[ROUSTA];}*rou;struct ticketlib{ int bus; int state; int time; int nseat; int lseat; int gate; int model; int laststa; char tab[MAXSEAT];}*tl;struct statobus{ int sta; int bus; unsigned price; unsigned bprice;}*sb;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;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;main(int argc,char *argv[]){ long tn; struct time t; int date; char flag; RP=getenv("ROOTPATH"); if(RP==NULL) return -1; init(); if((nbus=readbus())!=-1&&(nrsta=readrsta())!=-1) { if((ntwo=readtwo())==-1) ntwo=0; if((ncan=readcan())==-1) ncan=0; tn=time(0); tn+=PREDAYS*86400; gettime(tn,&t); date=t.year*10000+t.month*100+t.mday; mvaddstr(10,25,"***** 正常计划生成 *****"); refresh(); if(getroute()==0&&indate(&date)==0&&checkdate(date)==0) { if(maketiclib(date)!=-1) flag=0; else flag=1; if(makesb(date)!=-1&&flag==0) flag=0; else flag=1; if(makebs(date)!=-1&&flag==0) flag=0; else flag=1; if(flag==0) mvprintw(20,25,"%d年%d月%d日的计划生成成功!", date/10000,date%10000/100,date%100); else mvprintw(20,25,"%d年%d月%d日的计划生成失败!", date/10000,date%10000/100,date%100); refresh(); getch(); refresh(); } } clear(); erase(); refresh(); endwin();}init(){ int i; signal(SIGINT,SIG_IGN); initscr(); raw(); nonl(); noecho();}int indate(int *date){ int d=*date; int year,month,day; mvprintw(13,30,"%4d年%2d月%2d日",d/10000,d%10000/100,d%100); year=d/10000; if(get_n(13,30,"",&year,5)==-1) return -1; month=d%10000/100; if(get_n(13,36,"",&month,3)==-1) return -1; day=d%100; if(get_n(13,40,"",&day,3)==-1) return -1; *date=year*10000+month*100+day; clear(); refresh(); return 0;}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;}int readbus(){ int fd; char fn[80]; long size; char msg[80]; sprintf(fn,"%s/bas/bus.dat",RP); fd=open(fn,O_RDONLY); if(fd==-1) { sprintf(msg,"文件 %s 打开失败!",fn); showmsg(msg); return fd; } size=lseek(fd,0L,2); bus=(struct buses *)malloc(size); if(bus==NULL) { showmsg("为班次数据分配内存出错!"); close(fd); return -1; } else { lseek(fd,0L,0); read(fd,(char *)bus,size); close(fd); return size/sizeof(struct buses); }}int readtwo(){ int fd; char fn[80]; long size; char msg[80]; sprintf(fn,"%s/bas/twoseat.dat",RP); fd=open(fn,O_RDONLY); if(fd==-1) { sprintf(msg,"文件 %s 打开失败!",fn); showmsg(msg); return fd; } size=lseek(fd,0L,2); two=(struct twoseat *)malloc(size); if(two==NULL) { showmsg("为隔日班数据分配内存出错!"); close(fd); return -1; } else { lseek(fd,0L,0); read(fd,(char *)two,size); close(fd); return size/sizeof(struct twoseat); }}int readcan(){ int fd; char fn[80]; long size; char msg[80]; sprintf(fn,"%s/bas/cancel.dat",RP); fd=open(fn,O_RDONLY); if(fd==-1) { sprintf(msg,"文件 %s 打开失败!",fn); showmsg(msg); return fd; } size=lseek(fd,0L,2); can=(struct cancels *)malloc(size); if(can==NULL) { showmsg("为撤销班次数据分配内存出错!"); close(fd); return -1; } else { lseek(fd,0L,0); read(fd,(char *)can,size); close(fd); return size/sizeof(struct cancels); }}int readrsta(){ int fd; char fn[80]; long size; char msg[80]; sprintf(fn,"%s/bas/route.dat",RP); fd=open(fn,O_RDONLY); if(fd==-1) { sprintf(msg,"文件 %s 打开失败!",fn); showmsg(msg); return fd; } size=lseek(fd,0L,2); rsta=(struct rstation *)malloc(size); if(rsta==NULL) { showmsg("为线路数据分配内存出错!"); close(fd); return -1; } else { lseek(fd,0L,0); read(fd,(char *)rsta,size); close(fd); return size/sizeof(struct rstation); }}int getroute(){ int i,j,k,l; long size; char msg[80]; size=nbus*sizeof(struct route); rou=(struct route *)malloc(size); if(rou==NULL) { showmsg("为线路数据分配内存出错!"); return -1; } for(i=0;i<nbus;i++) { rou[i].bus=bus[i].no; rou[i].nsta=0; } for(i=0;i<nrsta;i++) { j=0; k=nbus-1; while(j<=k) { l=(j+k)/2; if(rsta[i].bus<rou[l].bus) k=l-1; else if(rsta[i].bus>rou[l].bus) j=l+1; else { rou[l].p[rou[l].nsta++]=i; break; } } } for(i=0;i<nbus;i++) if(rou[i].nsta<=0) { sprintf(msg,"%d次班车没有线路!",rou[i].bus); showmsg(msg); return -1; } return 0;}int maketiclib(int date){ int i,j,tcan=0,tnorm; int days; int fd; char fn[80]; long size; struct ticketlib *tl; char msg[80]; size=nbus*sizeof(struct ticketlib); tl=(struct ticketlib *)malloc(size); if(tl==NULL) { showmsg("为票库数据分配内存出错!"); return -1; } for(i=0;i<nbus;i++) { tl[i].bus=bus[i].no; for(j=0;j<ncan&&can[j].bus!=bus[i].no;j++) ; if(j>=ncan) tl[i].state=NORMAL; else if(getdays(can[j].date,date)>=can[j].days) tl[i].state=NORMAL; else if(getdays(can[j].date,date)<0) tl[i].state=NORMAL; else { tl[i].state=CANCEL; tcan++; } tl[i].time=bus[i].time; tl[i].nseat=bus[i].nseat; for(j=0;j<ntwo&&two[j].bus!=bus[i].no;j++) ; if(j>=ntwo) tl[i].lseat=bus[i].nseat; else { days=getdays(two[j].date,date); if(days<0) tl[i].lseat=bus[i].nseat; else if(days%2==0) tl[i].lseat=two[j].today; else tl[i].lseat=two[j].nextday; } tl[i].gate=bus[i].gate; tl[i].model=bus[i].model; tl[i].laststa=rsta[rou[i].p[rou[i].nsta-1]].sta; for(j=0;j<MAXSEAT&&j<tl[i].nseat;j++) tl[i].tab[j]=0; } sprintf(fn,"%s/data/ticlib/%d",RP,date); fd=open(fn,O_WRONLY|O_CREAT|O_TRUNC); if(fd==-1) { sprintf(msg,"文件 %s 打开失败!",fn); showmsg(msg); free(tl); return -1; } write(fd,(char *)tl,size); close(fd); free(tl); chmod(fn,0666); mvprintw(12,30,"总班次数: %d",nbus); mvprintw(13,30,"撤销班次数: %d",tcan); mvprintw(14,30,"隔日班次数: %d",ntwo); mvaddstr(15,25,"--------------------------"); mvprintw(16,30,"正常班次数: %d",nbus-tcan); refresh(); return nbus;}int makesb(int date){ struct statobus *sb; int i; long size; int fd; char fn[80]; char msg[80]; size=nrsta*sizeof(struct statobus); sb=(struct statobus *)malloc(size); if(sb==NULL) { showmsg("为站点--班次数据分配内存出错!"); return -1; } for(i=0;i<nrsta;i++) { sb[i].sta=rsta[i].sta; sb[i].bus=rsta[i].bus; sb[i].price=rsta[i].price; sb[i].bprice=rsta[i].bprice; } sprintf(fn,"%s/data/idex/%d",RP,date); fd=open(fn,O_WRONLY|O_CREAT|O_TRUNC); if(fd==-1) { sprintf(msg,"文件 %s 打开失败!",fn); free(sb); return -1; } write(fd,(char *)sb,size); close(fd); free(sb); chmod(fn,0666); return 0;}int makebs(int date){ struct busstate *bs; int i; long size; int fd; char fn[80]; char msg[80]; size=nbus*sizeof(struct busstate); bs=(struct busstate *)malloc(size); if(bs==NULL) { showmsg("为班次状态数据分配内存出错!"); return -1; } for(i=0;i<nbus;i++) { bs[i].bus=bus[i].no; bs[i].time=bus[i].time; if(bs[i].time<=200) { bs[i].regi=1; bs[i].reguser=getuid(); } else { bs[i].regi=0; bs[i].reguser=-1; } bs[i].regtime=0; bs[i].check=0; bs[i].gate=bus[i].gate; bs[i].checkuser=-1; bs[i].checkbegintime=0; bs[i].checkendtime=0; bs[i].print=0; bs[i].printuser=-1; bs[i].printtime=0; bs[i].settle=0; bs[i].owner=bus[i].owner; bs[i].rate=bus[i].rate; bs[i].settleuser=-1; bs[i].settletime=0; } sprintf(fn,"%s/data/state/%d",RP,date); fd=open(fn,O_WRONLY|O_CREAT|O_TRUNC); if(fd==-1) { sprintf(msg,"文件 %s 打开失败!",fn); showmsg(msg); free(bs); return -1; } write(fd,(char *)bs,size); close(fd); free(bs); chmod(fn,0666); return 0;}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%4==0) ydays=366; else ydays=365; days-=ydays; } t->yday=days; t->month=1; if(t->year%4==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;}int getdays(int date1,int date2){ int days; 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; int dd1,dd2; int y1,y2,m1,m2,d1,d2; if(date1>date2) dd1=date2, dd2=date1; else if(date1<date2) dd1=date1, dd2=date2; else return 0; y1=dd1/10000, y2=dd2/10000; m1=dd1%10000/100, m2=dd2%10000/100; d1=dd1%100, d2=dd2%100; days=0; for(i=y1+1;i<y2;i++) if(i%4==0) days+=366; else days+=365; if(y1==y2) for(i=m1;i<m2;i++) if(y1%4==0) days+=mdays[1][i-1]; else days+=mdays[0][i-1]; else { for(i=m1+1;i<=12;i++) if(y1%4==0) days+=mdays[1][i-1]; else days+=mdays[0][i-1]; for(i=1;i<m2;i++) if(y2%4==0) days+=mdays[1][i-1]; else days+=mdays[0][i-1]; } days-=d1; days+=d2; if(date1>date2) return -days; else return days;}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,NONE,PgDn,Home, PgUp,NONE,End,Ins}; void timeint(); sigset(SIGALRM,timeint); key=getch(); refresh(); if(key==0x1b) { alarm(1); if(getch()!=-1) { c=getch(); refresh(); key=keys[c-'A']; } } sigignore(SIGALRM); return key;}void timeint(){}showmsg(char s[]){ move(MSGROW,0); clrtoeol(); mvaddstr(MSGROW,(80-strlen(s))/2,s); refresh(); printf("\7\7"); getch(); refresh();}clrerr(){ move(MSGROW,0); clrtoeol(); refresh();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -