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

📄 ptwo.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>#define	MAXTWO	1000#define	ROWS	15#define	ROW	5#define	INROW	22#define	MSGROW	23#define	NITEM	4#define	BEGINYEAR	1970#define	DSEC	86400#define	HSEC	3600#define	MSEC	60struct	twoseat{	int	bus;	int	date;	int	today;	int	nextday;}two[MAXTWO];int	ntwo;int	order[MAXTWO];int	delf[MAXTWO];	int	col[NITEM]={10,20,40,60};struct	buses{	int	no;	int	time;	int	owner;	int	rate;	int	gate;	int	model;	int	nseat;}*bus;int	nbus;struct	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	*/};char	*tab[]={	"***** 隔 日 班 信 息 *****",	"----------------------------------------"	"---------------------------------------",	"Q-退出  N-指定  A-添加  M-修改  D-删除  U-恢复  S-保存  R-排序  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;main(int argc,char *argv[]){	char	c;	int	flag=0;	int	quit=0;	int	stwo,ptwo;	int	n;	RP=getenv("ROOTPATH");	if(RP==NULL)		return	-1;	init();	nbus=readbus();	if(nbus!=-1)	{		quit=0;		ntwo=readtwo();		if(ntwo!=-1)		{			sort();			for(n=0;n<ntwo;n++)				delf[n]=0;		}		else			ntwo=0;		stwo=0;		ptwo=0;	}	else		quit=1;	while(quit==0)	{		show(stwo,ptwo);		move(21,41+strlen(tab[2])/2);		refresh();		c=getkey();		clrin();		clrmsg();		if(c>='A'&&c<='Z')			c=c-'A'+'a';		switch(c)		{			case	-1:				break;			case	Down:				if(ptwo<ntwo-1)					ptwo++;				if(ptwo-stwo>=ROWS)					stwo++;				break;			case	Up:				if(ptwo>0)					ptwo--;				if(ptwo<stwo&&stwo>0)					stwo--;				break;			case	PgUp:				if(stwo>=ROWS)					stwo-=ROWS;				else					stwo=0;				if(ptwo>=ROWS)					ptwo-=ROWS;				else					ptwo=0;				break;			case	PgDn:				if(stwo<ntwo-ROWS)					stwo+=ROWS;				if(ptwo<ntwo-ROWS)					ptwo+=ROWS;				else					ptwo=ntwo-1;				break;			case	Home:				stwo=0;				ptwo=0;				break;			case	End:				if(ntwo%ROWS==0)					stwo=ntwo-ROWS;				else					stwo=ntwo-ntwo%ROWS;				ptwo=ntwo-1;				break;			case	'n':				n=appoint(ptwo);				if(n!=-1)				{					stwo=n;					ptwo=n;				}				break;			case	'a':				if(append()==0)					flag=1;				if(ntwo%ROWS==0)					stwo=ntwo-ROWS;				else					stwo=ntwo-ntwo%ROWS;				ptwo=ntwo-1;				break;			case	'm':				if(modify(stwo,ptwo)==0)					flag=1;				break;			case	'd':				if(delete(stwo,ptwo)==0)					flag=1;				break;			case	'u':				undelete(stwo,ptwo);				break;			case	's':				if(save()==0)					flag=0;				break;			case	'r':				sort();				break;			case	'p':				print();				break;			case	'q':				if(flag==0)					quit=1;				else					if(save()==0)						quit=1;					else						if(yn("fail to save, quit(y/n)? ")==0)							quit=1;				break;			default:				printf("\07");				break;		}	}	clear();	refresh();	endwin();}init(){	int	i;	signal(SIGINT,SIG_IGN);	initscr();	raw();	nonl();	noecho();	clear();	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	readtwo(){	char	fn[80];	char	msg[128];	int	fd,i,ntwo;	long	size;	sprintf(fn,"%s/bas/twoseat.dat",RP);	fd=open(fn,O_RDONLY);	if(fd==-1)	{		sprintf(msg,"文件%s打开失败!",fn);		showmsg(msg);		return	-1;	}	else	{		for(ntwo=0;ntwo<MAXTWO;)		{			size=read(fd,(char *)(two+ntwo),sizeof(struct twoseat));			if(size!=sizeof(struct twoseat))				break;			for(i=0;i<nbus&&two[ntwo].bus!=bus[i].no;i++)				;			if(i<nbus)				ntwo++;		}		close(fd);		return	ntwo;	}}int	readbus(){	char	fn[80];	char	msg[128];	int	fd;	long	size;	sprintf(fn,"%s/bas/bus.dat",RP);	fd=open(fn,O_RDONLY);	if(fd==-1)	{		sprintf(msg,"文件%s打开失败!",fn);		showmsg(msg);		return	-1;	}	else	{		size=lseek(fd,0L,2);		bus=(struct buses *)malloc(size);		if(bus==NULL)		{			showmsg("为班次数据分配内存出错!");			close(fd);			return	-1;		}		lseek(fd,0L,0);		read(fd,(char *)bus,size);		close(fd);		return	size/sizeof(struct buses);	}}sort(){	int	i,j,k,n;	for(i=0;i<ntwo;i++)		order[i]=i;	k=ntwo/2;	while(k>0)	{		for(j=k;j<ntwo;j++)		{			n=order[j];			i=j-k;			while(i>=0&&two[order[i]].bus>two[n].bus)			{				order[i+k]=order[i];				i-=k;			}			order[i+k]=n;		}		k/=2;	}}int	append(){	char	ret=0;	long	tn;	struct	time	t;	int	i;	int	busno,today,nextday;	int	n,stwo,ptwo;	int	pbus;	n=ntwo;	stwo=n-n%ROWS;	while(ret==0)	{		ntwo++;		if(ntwo>=MAXTWO)		{			showmsg("空间已满, 不能再增加!");			break;		}		ptwo=ntwo-1;		order[ptwo]=ptwo;		if(nbus>ntwo-1)			busno=bus[ntwo-1].no;		else			busno=0;		tn=time(0);		gettime(tn,&t);		two[ptwo].bus=busno;		two[ptwo].date=t.year*10000+t.month*100+t.mday;		two[ptwo].today=0;		two[ptwo].nextday=0;		if(ptwo-stwo>=ROWS)			stwo++;		show(stwo,ptwo);		while(ret==0)			if(get_n(ptwo-stwo+ROW,col[0],"",&busno,col[1]-col[0])==-1)				ret=1;			else			{				for(pbus=0;pbus<nbus&&busno!=bus[pbus].no;pbus++)					;				if(pbus>=nbus)					showmsg("不存在此班次!");				else				{					for(i=0;i<ntwo;i++)						if(busno==two[i].bus&&i!=ptwo)							break;					if(i<ntwo)						showmsg("此班次编号有重复!");					else						break;				}			}		if(ret==0)		{			mvprintw(ptwo-stwo+ROW,col[1],"%d.%2d.%2d",				t.year,t.month,t.mday);			refresh();		}		while(ret==0)		{			today=bus[pbus].nseat;			if(get_n(ptwo-stwo+ROW,col[2],"",&today,col[3]-col[2])==-1)				ret=1;			else				if(today<0||today>bus[pbus].nseat)					showmsg("错误的座位数!");				else					break;		}		while(ret==0)		{			nextday=bus[pbus].nseat;			if(get_n(ptwo-stwo+ROW,col[3],"",&nextday,79-col[3])==-1)				ret=1;			else				if(nextday<0||nextday>bus[pbus].nseat||nextday==today)					showmsg("错误的座位数!");				else					break;		}		if(ret==0)		{			two[ptwo].bus=busno;			two[ptwo].today=today;			two[ptwo].nextday=nextday;		}	}	ntwo--;	move(ptwo-stwo+ROW,0);	clrtoeol();	refresh();	if(ntwo!=n)		return	0;	else		return	-1;}int	modify(int stwo,int ptwo){	long	tn;	struct	time	t;	int	i;	int	busno,today,nextday;	int	pbus;	busno=two[order[ptwo]].bus;	while(1)		if(get_n(ptwo-stwo+ROW,col[0],"",&busno,col[1]-col[0])==-1)			return	-1;		else		{			for(pbus=0;pbus<nbus&&busno!=bus[pbus].no;pbus++)				;			if(pbus>=nbus)				showmsg("不存在此班次!");			else{				for(i=0;i<ntwo;i++)					if(busno==two[i].bus&&order[ptwo]!=i)						break;				if(i<ntwo)					showmsg("此班次编号有重复!");				else					break;			}		}	tn=time(0);	gettime(tn,&t);	two[order[ptwo]].date=t.year*10000+t.month*100+t.mday;	mvprintw(ptwo-stwo+ROW,col[1],"%d.%2d.%2d",t.year,t.month,t.mday);	today=two[order[ptwo]].today;	while(1)		if(get_n(ptwo-stwo+ROW,col[2],"",&today,col[3]-col[2])==-1)			return	-1;		else			if(today>bus[pbus].nseat||today<0)				showmsg("错误的座位数!");			else				break;	nextday=two[order[ptwo]].nextday;	while(1)		if(get_n(ptwo-stwo+ROW,col[3],"",&nextday,79-col[3])==-1)			return	-1;		else			if(nextday<0||nextday>bus[pbus].nseat||nextday==today)				showmsg("错误的座位数!");			else				break;	two[order[ptwo]].bus=busno;	two[order[ptwo]].today=today;	two[order[ptwo]].nextday=nextday;	return	0;}int	delete(int stwo,int ptwo){	if(ntwo<=0)		return	-1;	delf[order[ptwo]]=1;	mvaddch(ROW+ptwo-stwo,col[0]-1,'*');	refresh();	return	0;}int	undelete(int stwo,int ptwo){	if(ntwo<=0)		return	-1;	if(delf[order[ptwo]])	{		delf[order[ptwo]]=0;		mvaddch(ptwo-stwo+ROW,col[0]-1,' ');		refresh();		return	0;	}	else		return	-1;}int	save(){	char	fn[80];	char	msg[128];	int	fd;	long	size;	int	i;	sprintf(fn,"%s/bas/twoseat.dat",RP);	fd=open(fn,O_WRONLY|O_TRUNC);	if(fd==-1)	{		fd=open(fn,O_CREAT|O_WRONLY);		if(fd==-1)		{			sprintf(msg,"文件%s打开失败!",fn);			showmsg(msg);			return	-1;		}	}	size=sizeof(struct twoseat);	for(i=0;i<ntwo;i++)		if(delf[i]==0)			write(fd,(char *)(two+i),size);	close(fd);	chmod(fn,0666);	return	0;}int	print(){	int	i,n,start,end;		start=0;	while(1)	{		clrin();		if(get_n(INROW,30,"起始序号: ",&start,10)==-1)			return	-1;		if(start>=0&&start<ntwo)			break;	}	end=ntwo-1;	while(1)	{		clrin();		if(get_n(INROW,30,"结束序号: ",&end,10)==-1)			return	-1;		if(end>=start&&end<ntwo)			break;	}	printf("%c{",0x1b);	/* print initialize string */	printf("%30s\n%-10s%-10s%-10s%s\n%s\n",tab[0],title[0],title[1],		title[2],title[3],tab[1]);	for(i=start;i<=end;i++)	{		n=order[i];		printf("%-10d%-10d%-10d%d\n",two[n].bus,two[n].date,			two[n].today,two[n].nextday);	}	printf("%c}",0x1b);	/* print end string */	return	0;}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	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(){}show(int stwo,int ptwo){	static	int	n=-1;	static	int	s=-1;	static	int	p=-1;	static	int	o[ROWS];	int	i;	move(2,70);	clrtoeol();	if(ntwo>0)		mvprintw(2,70,"%d/%d",ptwo+1,ntwo);	else	{		mvaddstr(2,70,"0/0");		clrscr();		refresh();		return;	}	mvaddch(p-s+ROW,col[0]-2,' ');	if(p!=ptwo)		p=ptwo;	for(i=0;i<ROWS&&s+i<ntwo&&o[i]==order[s+i];i++)		;	if((n!=ntwo&&(p-s)>=ROWS)||s!=stwo||(i<ROWS&&s+i<ntwo))	{		n=ntwo;		s=stwo;		clrscr();		for(i=0;i<ROWS&&(s+i)<ntwo;i++)		{			o[i]=order[s+i];			showone(ROW+i,o[i],s+i);		}	}	else	{		move(p-s+ROW,0);		clrtoeol();		showone(p-s+ROW,order[p],p);	}	mvaddch(p-s+ROW,col[0]-2,'>');	refresh();}showone(int row,int n,int nn){	int	i;	if(delf[n])		mvaddch(row,col[0]-1,'*');	mvprintw(row,col[0],"%d",two[n].bus);	mvprintw(row,col[1],"%d.%2d.%2d",two[n].date/10000,		two[n].date%10000/100,two[n].date%100);	mvprintw(row,col[2],"%d",two[n].today);	mvprintw(row,col[3],"%d",two[n].nextday);}int	appoint(int ptwo){	int	n;	char	prompt[]="请输入序号: ";	n=ptwo+1;	if(get_n(INROW,40-strlen(prompt)/2,prompt,&n,10)==-1)		return	-1;	if(n-1<ntwo)		return	n-1;	else		return	-1;}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;}int	yn(char *p){	char	c;	do{		move(INROW,0);		clrtoeol();		mvprintw(INROW,40-strlen(p)/2,p);		move(INROW,41+strlen(p)/2);		refresh();		c=getkey();	}while(c!='y'&&c!='Y'&&c!='n'&&c!='N');	if(c>='A'&&c<='Z')		c=c-'A'+'a';	if(c=='y')		return	0;	else		return	1;}

⌨️ 快捷键说明

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