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

📄 routetic.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<errno.h>#include<unistd.h>#include<pwd.h>#include<memory.h>#define	MAXSEAT	9999#define	ROWS	15#define	ROW	5#define	SHOWROW	21#define	INROW	22#define	MSGROW	23#define	NITEM	9#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	ticketlib{	int	bus;	int	state;	int	time;	int	nseat;	int	lseat;	int	gate;	int	model;	int	laststa;	char	tab[MAXSEAT];}*bus;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 */	unsigned	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[MAXSEAT];int	ntic=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	settleuser;	int	settletime;}bs;struct	station{	int	no;	char	code[5];	char	name[10];	unsigned int	howfar;}*sta;int	nsta;char	*tab[]={	"*** 站 点 售 票 查 询 ***",	"----------------------------------------"	"---------------------------------------",	"Q-退出   B-站点   D-日期   P-打印日报"};char	*title[]={"班次","座位","票号","性质","票价","日期","时间",		"售票人","检否"};int	col[NITEM]={2,8,18,28,34,42,50,58,68};int	uno;struct	passwd	*upwd;char	route[5];char	ucode[5],uname[10];int	date,psta,tflag,number=-1;char	ucode[5],uname[10],csta[10];int   showcol[5]={8,24,43,57,70};char	*RP;int total=0;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};main(int argc,char *argv[]){	char	c;	int	stic,ptic,quit;		long	tn;	struct	time	t;	int	m,mm,n;	RP=getenv("ROOTPATH");	if(RP==NULL)		return	-1;	uno=getuid();	upwd=getpwuid(uno);	if(upwd==NULL)	{		printf("\n用户%d不存在!\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;	nsta=readsta();	if(nsta==-1)		quit=1;	else         {                quit=0;		stic=0;		ptic=0;         }	while(quit==0)	{		show(stic,ptic);		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.second%10==0&&sta->no!=-1)				{			/*		m=readtic(date,sta->no);*/					if(m!=-1)					{						if(m<ntic)						{							if(stic>=m)								stic=ntic-1;							if(ptic>=m)								ptic=ntic-1;						}						ntic=m;					}				}				break;			case	Down:				if(ptic<ntic-1)					ptic++;				if(ptic-stic>=ROWS)					stic++;				break;			case	Up:				if(ptic>0)					ptic--;				if(ptic<stic&&stic>0)					stic--;				break;			case	PgUp:				if(ptic>=ROWS)					ptic-=ROWS;				else					ptic=0;				if(stic>=ROWS)					stic-=ROWS;				else					stic=0;				break;			case	PgDn:				if(ptic<ntic-ROWS)					ptic+=ROWS;				else					ptic=ntic-1;				if(stic<ntic-ROWS)					stic+=ROWS;				break;			case	Home:				ptic=0;				if(stic>0)					stic=0;				break;			case	End:				ptic=ntic-1;				if(ptic-stic>=ROWS)					stic=ntic-ROWS;				break;			case	'd':				n=indate(date);				if(n==-1||checkdate(n)==0)				{					date=n;					if(ntic==-1)						ntic=0;					show(1,stic,ptic);				}				break;			case	'b':				mm=insta();				if(mm!=-1)				{					m=readtic(date,mm);					if(m!=-1)					{						ntic=m;						stic=0;						ptic=0;						strcpy(route,sta->code);					}				}				break;                        case    'p':                                print();                                break;			case	'q':				quit=1;				break;			default:				printf("\07");				break;		}	}	sigignore(SIGALRM);	erase();	refresh();	endwin();}int	indate(int date){	int	d=date;               total=0;	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;}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	readtic(int date,int no){	char	fn[80];	int	fd;	long	s,size;	int	i,j;	sprintf(fn,"%s/data/ticket/%d",RP,date);	fd=open(fn,O_RDONLY);	if(fd==-1)	{		showmsg("票库数据有错误!");		return	-1;	}	size=sizeof(struct ticket);	for(i=0;i<MAXSEAT;)	{		s=read(fd,(char *)(tic+i),size);		if(s!=size)			break;		if(tic[i].sta==no)                 {                        total+=tic[i].price;			i++;                 }	}	close(fd);	return	i;}int	insta(){	int	i;	char	code[5]="cdc";        total=0;	while(1)	{		if(get_s(SHOWROW+1,30,"站点代码:",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	psta;		}		else			showmsg("输入的站点不存在!");	}}int	inticnum(){	int	n=0;	if(get_n(INROW,30,"请输入票号: ",&n,10)==-1)		return	-1;	return	n;}show(int stic,int ptic){	static	int	n=-1;	static	int	s=-1;	static	int	p=-1;	static	char	b[5];	int	i;	void	showtime();	move(2,70);	clrtoeol();	if(sta->no!=-1)		mvprintw(2,0,"站点: %s",/*sta->name*/csta);	if(ntic>0)                {                mvprintw(2,15,"金额:%d.%d",total/100,total%100);		mvprintw(2,70,"%d/%d",ptic+1,ntic);                }	else	{		mvaddstr(2,70,"0/0");		clrscr();		refresh();		return;	}	mvaddch(p-s+ROW,col[0]-1,' ');	if(p!=ptic)		p=ptic;	for(i=0;i<ROWS&&s+i<ntic;i++)		;	if(n!=ntic||s!=stic||(i<ROWS&&s+i<ntic)||b!=route)	{		n=ntic;		s=stic;		strcpy(b,route);		for(i=0;i<ROWS&&(s+i)<ntic;i++)		{			sigignore(SIGALRM);			showone(ROW+i,s+i);			sigset(SIGALRM,showtime);		}		for(;i<ROWS;i++)			move(ROW+i,0),	clrtoeol();	}	move(p-s+ROW,0),	clrtoeol();	showone(p-s+ROW,p);	mvaddch(p-s+ROW,col[0]-1,'>');	refresh();}showone(int row,int n){	int	i,j,k,l;	char	sname[20];	move(row,0),	clrtoeol();	mvprintw(row,col[0],"%d",tic[n].bus);	mvprintw(row,col[1],"%d",tic[n].seat);	mvprintw(row,col[2],"%d",tic[n].number);	if(tic[n].flag)		mvaddstr(row,col[3],"半票");	else		mvaddstr(row,col[3],"全票");	mvprintw(row,col[4],"%4d.%02d",tic[n].price/100,tic[n].price%100);	mvprintw(row,col[5],"%2d.%d",tic[n].date%10000/100,tic[n].date%100);	mvprintw(row,col[6],"%2d:%02d",tic[n].time/100,tic[n].time%100);	if(getuser(tic[n].user,sname)==0)		mvaddstr(row,col[7],sname);	else		mvaddstr(row,col[7],"(无)");	if(tic[n].checkflag)		mvaddstr(row,col[8],"已检");	else		mvaddstr(row,col[8],"未检");	refresh();}int	getuser(int uno,char uname[]){	struct	passwd	*psw;	if(uno==-1)		return	-1;	else	{		psw=getpwuid(uno);		if(psw!=NULL)		{			strcpy(uname,psw->pw_comment);			return	0;		}		else			return	-1;	}}void	showtime(){	long	tn;	struct	time	t;	char	s[80];	tn=time(0);	gettime(tn,&t);	sprintf(s,"%4d.%02d.%02d/%02d:%02d:%02d",t.year,		t.month,t.mday,t.hour,t.minute,t.second);	mvaddstr(0,0,s);	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%400==0||(t->year%4==0&&t->year%100!=0))			ydays=366;		else			ydays=365;		days-=ydays;	}	t->yday=days;	t->month=1;	if(t->year%400==0||(t->year%4==0&&t->year%100!=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;}print(){	printf("%c{",0x1b);printf("          站点售票情况日报\n\n");printf("   日期:%d.%d.%d\n",date/10000,date%10000/100,date%100);printf("   站点:%s  金额: %d.%02d  票数:%d张\n\n\n",csta,total/100,total%100,ntic);	printf("%c}",0x1b);return;}showmsg(char s[]){	move(MSGROW,0);	clrtoeol();	mvaddstr(MSGROW,40-strlen(s)/2,s);	refresh();	printf("\7\7");}clrmsg(){	move(MSGROW,0);	clrtoeol();	refresh();}clrin(){	move(INROW,0);	clrtoeol();	refresh();}clrscr(){	int	i;	for(i=0;i<ROWS;i++)	{		move(ROW+i,0);		clrtoeol();		}	refresh();}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();	}}int	get_s(int y,int x,char prompt[],char s[],int n)	/* x,y  location of cursor; s  the string  */	/* n  length of s; */{	char	c,ss[128];	int	i;	for(i=0;i<n-1;i++)		ss[i]=' ';	ss[n-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>=n-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';					strcpy(s,ss);				}				return	0;			case	0x08:		/* <BS> pressed */				if(i<=0)					continue;				else					ss[--i]=' ';				break;			default:				ss[i++]=c;				break;		}		mvaddstr(y,x,ss);		refresh();	}}getkey(){	char	c,key;	char	keys[]={Up,Down,Right,Left,NONE,End,PgDn,Home,		PgUp,NONE,NONE,Ins};	key=getch();	refresh();	if(key==0x1b)	{		alarm(1);		if(getch()!=-1)		{			c=getch();			refresh();			key=keys[c-'A'];		}	}	return	key;}

⌨️ 快捷键说明

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