⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pbsshow.c

📁 这是一个使用了 cursor 编程技术实现的车站自动售票系统的源代码
💻 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<pwd.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	9struct	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;}*bs;int	nbs;int	*order;int	col[NITEM]={2,10,18,27,35,44,50,58,67};char	*tab[]={	"班 次 状 态 信 息 查 询",	"----------------------------------------"	"---------------------------------------",	"Q-退出    D-日期    N-指定   B-班次排序   T-时间排序   P-打印"};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	orderflag=0;main(int argc,char *argv[]){	char	c;	int	flag=0;	int	quit=0;	int	sbs=0,pbs=0;	int	n,date;	long	tn,minute;	struct	time	t;	RP=getenv("ROOTPATH");	if(RP==NULL)		return	-1;	init();	tn=time(0);	gettime(tn,&t);	date=t.year*10000+t.month*100+t.mday;	minute=t.minute;	if((nbs=readbs(date))==-1)		nbs=0;	if(orderflag)		sortbybus();	else		sortbytime();	show(1,sbs,pbs);	while(quit==0)	{		move(21,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)				{					nbs=readbs(date);					if(nbs==-1)						nbs=0;					if(orderflag)						sortbybus();					else						sortbytime();					show(1,sbs,pbs);				}				break;			case	Down:				if(pbs<nbs-1)					pbs++;				if(pbs-sbs>=ROWS)				{					sbs++;					show(1,sbs,pbs);				}				else					show(0,sbs,pbs);				break;			case	Up:				if(pbs>0)					pbs--;				if(pbs<sbs&&sbs>0)				{					sbs--;					show(1,sbs,pbs);				}				else					show(0,sbs,pbs);				break;			case	PgUp:				if(pbs>=ROWS)					pbs-=ROWS;				else					pbs=0;				if(sbs>=ROWS)				{					sbs-=ROWS;					show(1,sbs,pbs);				}				else					if(sbs>0)					{						sbs=0;						show(1,sbs,pbs);					}					else						show(0,sbs,pbs);				break;			case	PgDn:				if(pbs<nbs-ROWS)					pbs+=ROWS;				else					pbs=nbs-1;				if(sbs<nbs-ROWS)				{					sbs+=ROWS;					show(1,sbs,pbs);				}				else					show(0,sbs,pbs);				break;			case	Home:				if(sbs>0)				{					sbs=0;					pbs=0;					show(1,sbs,pbs);				}				else				{					pbs=0;					show(0,sbs,pbs);				}				break;			case	End:				pbs=nbs-1;				if(pbs-sbs>=ROWS)				{					sbs=nbs-ROWS;					show(1,sbs,pbs);				}					else					show(0,sbs,pbs);				break;			case	'd':				n=indate(date);				if(n==-1||checkdate(n)==0)				{					date=n;					nbs=readbs(date);					if(nbs==-1)						nbs=0;					if(orderflag)						sortbybus();					else						sortbytime();					show(1,sbs,pbs);				}				else					printf("\7\7");				break;			case	'n':				n=appoint(pbs);				if(n!=-1)					if(n-sbs>=ROWS||n<sbs)					{						sbs=n;						pbs=n;						show(1,sbs,pbs);					}					else					{						pbs=n;						show(0,sbs,pbs);					}				break;			case	'b':				sortbybus();				show(1,sbs,pbs);				break;			case	't':				sortbytime();				show(1,sbs,pbs);				break;			case	'p':				print();				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	readbs(int date){	char	fn[80];	char	errs[128];	int	fd;	long	size;	int	i,n;	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=lseek(fd,0L,2);	if(bs!=NULL)		free(bs);	if(order!=NULL)		free(order);	bs=(struct busstate *)malloc(size);	order=(int *)malloc((size/sizeof(struct busstate))*sizeof(int));	if(bs==NULL||order==NULL)	{			showmsg("为班次状态数据分配内存出错!");		return	-1;	}	else	{		lseek(fd,0L,0);		size=read(fd,(char *)bs,size);		close(fd);		n=size/sizeof(struct busstate);		for(i=0;i<n;i++)			order[i]=i;		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();	sigset(SIGALRM,showtime);	key=getch();	refresh();	if(key==0x1b)	{		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,"%d年%2d月%2d日%2d时%2d分%2d秒",t.year,t.month,		t.mday,t.hour,t.minute,t.second);	refresh();}show(int flag,int sbs,int pbs){	static	int	s=-1,p=-1;	int	i;	void	showtime();	move(2,70);	clrtoeol();	if(nbs!=0)		mvprintw(2,70,"%d/%d",pbs+1,nbs);	else		mvprintw(2,70,"0/0");	if(nbs<=0)	{		clrscr();		return;	}	if(flag==0)		mvaddch(p-s+ROW,col[0]-1,' ');	else	{		for(i=0;i<ROWS&&(sbs+i)<nbs;i++)		{			sigignore(SIGALRM);			showone(ROW+i,sbs+i);			sigset(SIGALRM,showtime);		}		for(;i<ROWS;i++)			move(ROW+i,0),	clrtoeol();	}	mvaddch(pbs-sbs+ROW,col[0]-1,'>');	s=sbs;	p=pbs;	refresh();}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;}showone(int row,int pbs){	int	i,n;	struct	passwd	*upwd;	n=order[pbs];	move(row,0);	clrtoeol();	mvprintw(row,col[0],"%d",bs[n].bus);	mvprintw(row,col[1],"%2d:%02d",bs[n].time/100,bs[n].time%100);	if(bs[n].regi==0)		mvaddstr(row,col[2],"(无)");	else	{		upwd=getpwuid(bs[n].reguser);		if(upwd!=NULL)			mvaddstr(row,col[2],upwd->pw_comment);		else			mvprintw(row,col[2],"%d",bs[n].reguser);	}	mvprintw(row,col[3],"%2d:%02d",bs[n].regtime/100,bs[n].regtime%100);	if(bs[n].check==0)		mvaddstr(row,col[4],"(无)");	else	{		upwd=getpwuid(bs[n].checkuser);		if(upwd!=NULL)			mvaddstr(row,col[4],upwd->pw_comment);		else			mvprintw(row,col[4],"%d",bs[n].checkuser);	}	mvprintw(row,col[5],"%2d:%02d",bs[n].checkbegintime/100,bs[n].checkbegintime%100);	mvprintw(row,col[6],"%2d:%02d",bs[n].checkendtime/100,bs[n].checkendtime%100);	if(bs[n].print==0)		mvaddstr(row,col[7],"(无)");	else	{		upwd=getpwuid(bs[n].printuser);		if(upwd!=NULL)			mvaddstr(row,col[7],upwd->pw_comment);		else			mvprintw(row,col[7],"%d",bs[n].printuser);	}	mvprintw(row,col[8],"%2d:%02d",bs[n].printtime/100,bs[n].printtime%100);	refresh();}int	appoint(int pbs){	int	i,n;	n=bs[order[pbs+1]].time;	if(get_n(INROW,30,"请输入时间: ",&n,6)==-1)		return	-1;	if(n<0||n>2359)	{		showmsg("错误的时间, 请重新输入!");		return	-1;	}	for(i=0;i<nbs&&n>bs[order[i]].time;i++)		;	if(i<nbs)		return	i;	else		return	-1;}sortbybus(){	int	i,j,k,n;	k=nbs/2;	while(k>0)	{		for(j=k;j<nbs;j++)		{			n=order[j];			i=j-k;			while(i>=0&&bs[order[i]].bus>bs[n].bus)			{				order[i+k]=order[i];				i-=k;			}			order[i+k]=n;		}		k/=2;	}	orderflag=1;}sortbytime(){	int	i,j,k,n;	k=nbs/2;	while(k>0)	{		for(j=k;j<nbs;j++)		{			n=order[j];			i=j-k;			while(i>=0&&bs[order[i]].time>bs[n].time)			{				order[i+k]=order[i];				i-=k;			}			order[i+k]=n;		}		k/=2;	}	orderflag=0;}int	print(){	int	i,n,start,end;	char	yes[]="是",no[]="否";		start=0;	while(1)	{		clrin();		if(get_n(INROW,30,"起始序号: ",&start,10)==-1)			return	-1;		if(start>=0&&start<nbs)			break;	}	end=nbs-1;	while(1)	{		clrin();		if(get_n(INROW,30,"结束序号: ",&end,10)==-1)			return	-1;		if(end>=start&&end<nbs)			break;	}	printf("%c{",0x1b);	/* print initialize string */	printf("%30s\n",tab[0]);	printf("%15s%15s%15s%15s%15s%15s\n",title[0],"发车时间",		"报班与否","报班时间","检票与否","结算与否");	printf("%s\n",tab[1]);	for(i=start;i<end;i++)	{		n=order[i];		printf("%15d%12d:%02d",bs[n].bus,bs[n].time/100,bs[n].bus%100);		if(bs[n].regi==0)			printf("%15s%12d:%02d",no,0,0);		else			printf("%15s%12d:%02d",yes,bs[n].regtime/100,				bs[n].regtime%100);		if(bs[n].check==0)			printf("%15s",no);		else			printf("%15s",yes);		if(bs[n].print==0)			printf("%15s",no);		else			printf("%15s",yes);		printf("\n");	}	printf("%c}",0x1b);	/* print end string */	return	0;}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;	short	TZ;	char	*tzs;	short	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};	short	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;	short	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};	short	i;	int	dd1,dd2;	short	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;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -