📄 report.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<unistd.h>#define BEGINYEAR 1970#define DSEC 86400#define HSEC 3600#define MSEC 60#define ROWS 15#define ROW 5#define INROW 22#define MSGROW 23#define NITEM 4#define MAXBUS 100#define NTIME 30struct 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 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 setleuser; int setletime;}bus[MAXBUS];int nbus;int laststa[MAXBUS];int order[MAXBUS];int col[NITEM]={20,30,40,50};struct station{ int no; char code[5]; char name[10]; unsigned int howfar;}*sta;int nsta;char *tab[]={ "***** 班 次 广 播 信 息 *****", "----------------------------------------" "---------------------------------------", "Q-退出 T-设置间隔时间"};char *title[]={"时间","终点站","班次","检票口"};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;char refreshflag=0;int ntime;main(int argc,char *argv[]){ char c; int flag=0; int quit=0; int sbus,pbus; int n,date,dd; long tn; struct time t; RP=getenv("ROOTPATH"); if(RP==NULL) return -1; ntime=atoi(getenv("NTIME")); if(ntime<=0) ntime=NTIME; init(); tn=time(0); gettime(tn,&t); date=t.year*10000+t.month*100+t.mday; if((nsta=readsta())==-1) nsta=0; if((nbus=readbus(date))==-1) nbus=0; sort(); sbus=0; pbus=0; while(quit==0) { show(sbus,pbus); move(ROW+ROWS+1,41+strlen(tab[2])/2); refresh(); alarm(1); c=getkey(); clrin(); clrmsg(); if(c>='A'&&c<='Z') c=c-'A'+'a'; switch(c) { case -1: tn=time(0); gettime(tn,&t); if(t.second%10==0) { n=readbus(date); if(n!=nbus) { if(n==-1) nbus=0; else nbus=n; sbus=0; pbus=0; } sort(); refreshflag=1; } break; case Down: if(pbus<nbus-1) pbus++; if(pbus-sbus>=ROWS) sbus++; break; case Up: if(pbus>0) pbus--; if(pbus<sbus&&sbus>0) sbus--; break; case PgUp: if(sbus>=ROWS) sbus-=ROWS; else sbus=0; if(pbus>=ROWS) pbus-=ROWS; else pbus=0; break; case PgDn: if(sbus<nbus-ROWS) sbus+=ROWS; if(pbus<nbus-ROWS) pbus+=ROWS; else pbus=nbus-1; break; case Home: sbus=0; pbus=0; break; case End: sbus=nbus-1; pbus=nbus-1; break; case 't': n=getntime(ntime); if(n>0) { ntime=n; n=readbus(date); if(n!=nbus) { if(n==-1) nbus=0; else nbus=n; sbus=0; pbus=0; } sort(); refreshflag=1; } break; case 'q': quit=1; break; default: printf("\07"); break; } } 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]); 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 readbus(int date){ char fn[80]; char errs[128]; int fd; long size,ss; long tn; struct time t,t1; int i; tn=time(0); gettime(tn,&t); gettime(tn+ntime*60,&t1); sprintf(fn,"%s/data/state/%d",RP,date); fd=open(fn,O_RDONLY); if(fd==-1) { sprintf(errs,"文件%s打开失败!",fn); showmsg(errs); return fd; } size=sizeof(struct busstate); for(i=0;i<MAXBUS;) { ss=read(fd,(char *)(bus+i),size); if(ss!=size) break; if(bus[i].time>t.hour*100+t.minute&& bus[i].time<=t1.hour*100+t1.minute) order[i]=i++; } close(fd); readlaststa(date,i); return i;}readlaststa(int date,int n){ struct plans{ int bus; int state; int time; int nseat; int lseat; int gate; int model; int laststa; char tab[60]; }b; char fn[80]; int fd; long size,ss; int i; for(i=0;i<n;i++) laststa[i]=-1; sprintf(fn,"%s/data/ticlib/%d",RP,date); fd=open(fn,O_RDONLY); if(fd==-1) { showmsg("无法打开票库文件, 请排出故障!"); return -1; } size=sizeof(struct plans); while(1) { ss=read(fd,(char *)&b,size); if(ss!=size) break; for(i=0;i<n&&b.bus!=bus[i].bus;i++) ; if(i<n) laststa[i]=b.laststa; } close(fd);}sort(){ 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&&bus[order[i]].gate>bus[n].gate) { order[i+k]=order[i]; i-=k; } order[i+k]=n; } k/=2; } for(i=0;i<nbus-1;i++) { for(j=i+1;j<nbus;j++) if(bus[order[i]].gate==bus[order[j]].gate&& bus[order[i]].time>bus[order[j]].time) { n=order[i]; order[i]=order[j]; order[j]=n; } }}int getntime(int tm){ int n; n=tm; if(get_n(INROW,30,"请输入时间间隔: ",&n,10)==-1) return -1; if(n<=0) { showmsg("错误的时间!"); return -1; } else return n;}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}; void showtime(); key=getch(); refresh(); if(key==0x1b) { sigset(SIGALRM,showtime); alarm(1); if(getch()!=-1) { c=getch(); refresh(); key=keys[c-'A']; } sigignore(SIGALRM); } return key;}void showtime(){ long tn; struct time t; tn=time(0); gettime(tn,&t); mvprintw(0,0,"%4d年%2d月%2d日%2d时%2d分%2d秒",t.year,t.month, t.mday,t.hour,t.minute,t.second); refresh();}show(int sbus,int pbus){ static int n=-1; static int s=-1; static int p=-1; static int o[ROWS]; int i; void showtime(); sigignore(SIGALRM); move(2,70); clrtoeol(); if(nbus>0) mvprintw(2,70,"%d/%d",pbus+1,nbus); else { mvaddstr(2,70,"0/0"); clrscr(); refresh(); return; } mvaddch(p-s+ROW,col[0]-2,' '); if(p!=pbus) p=pbus; for(i=0;i<ROWS&&s+i<nbus&&o[i]==order[s+i];i++) ; if((n!=nbus&&(p-s)>=ROWS)||s!=sbus||(i<ROWS&&s+i<nbus)) { n=nbus; s=sbus; for(i=0;i<ROWS&&(s+i)<nbus;i++) { o[i]=order[s+i]; showone(ROW+i,o[i]); } for(;i<ROWS;i++) move(ROW+i,0), clrtoeol(); } mvaddch(p-s+ROW,col[0]-2,'>'); for(i=0;i<ROWS&&(s+i)<nbus;i++) if(bus[order[s+i]].regi) mvaddch(i+ROW,col[0]-1,'*'); refresh(); sigset(SIGALRM,showtime);}showone(int row,int n){ int i,j,k,l; move(row,0), clrtoeol(); mvprintw(row,col[2],"%d",bus[n].bus); mvprintw(row,col[0],"%2d:%02d",bus[n].time/100,bus[n].time%100); mvprintw(row,col[3],"%d",bus[n].gate); j=0; k=nsta-1; while(j<=k) { l=(j+k)/2; if(laststa[n]<sta[l].no) k=l-1; else if(laststa[n]>sta[l].no) j=l+1; else break; } if(j>k) mvaddstr(row,col[1],""); else mvaddstr(row,col[1],sta[l].name); refresh();}clrscr(){ int i; for(i=0;i<ROWS;i++) { move(ROW+i,0); clrtoeol(); } refresh();}showmsg(char s[]){ move(MSGROW,0); clrtoeol(); mvaddstr(MSGROW,(80-strlen(s))/2,s); refresh(); printf("\7\7");}clrmsg(){ move(MSGROW,0); clrtoeol(); refresh();}clrin(){ move(INROW,0); clrtoeol(); 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%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;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -