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

📄 return.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>#define	MAXSEAT	60#define	INROW	22#define	MSGROW	23#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	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 */	int	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=NULL;int	*locate=NULL;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	returnt{	int	user;	int	date;	int	bus;	char	flag;	int	time;	int	seat;	int	sta;	int	price;	int	fee;	int	rprice;	unsigned	number;}*rtic=NULL;struct	ticketlib{	int	bus;	int	state;	int	time;	int	nseat;	int	lseat;	int	gate;	int	model;	int	laststa;	char	tab[MAXSEAT];}tl;int	tllocate;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;int	uno;main(){	long	tn;	struct	time	t;	int	date,num=0,ntic=1,flag;	char	msg[80];	RP=getenv("ROOTPATH");	if(RP==NULL)		return	-1;	uno=getuid();	signal(SIGINT,SIG_IGN);	initscr();	raw();	nonl();	noecho();	clear();	refresh();	tn=time(0);	gettime(tn,&t);	date=t.year*10000+t.month*100+t.mday;	mvaddstr(9,25,"***** 退 票 系 统 *****");	refresh();	while(1)	{		if(get_n(12,30,"日期: ",&date,10)==-1)			break;		if(get_n(13,30,"首号: ",&num,10)==-1)			continue;		if(get_n(14,30,"张数: ",&ntic,5)==-1)			continue;		showmsg("0--折扣退    1--全退");		flag=0;		if(get_n(15,30,"方式: ",&flag,3)==-1)			continue;		if(retfun(date,num,ntic,flag)==0)			showmsg("退票成功!");	}	erase();	clear();	refresh();	endwin();}int	retfun(int date,int number,int ntic,char flag){	int	fd;	char	fn[80];	long	tn;	struct	time	t;	char	msg[80],s[10]="n";	int	bus,btime,dd,tt;	int	i,j;	long	size,ss;	unsigned	rprice=0,fee=0;	if(ntic<=0)		return	-1;	if(tic!=NULL)		free(tic);	if(locate!=NULL)		free(locate);	if(rtic!=NULL)		free(rtic);	tic=(struct ticket *)malloc(ntic*sizeof(struct ticket));	locate=(int *)malloc(ntic*sizeof(int));	rtic=(struct returnt *)malloc(ntic*sizeof(struct returnt));	if(tic==NULL||locate==NULL||rtic==NULL)	{		showmsg("为退票数据分配内存出错!");		return	-1;	}	sprintf(fn,"%s/data/ticket/%d",RP,date);	fd=open(fn,O_RDONLY);	if(fd==-1)	{		sprintf(msg,"文件 %s 无法打开, 不能退票!",fn);		showmsg(msg);		return	fd;	}	size=sizeof(struct ticket);	for(i=0,j=0;j<ntic;i++)	{		ss=read(fd,(char *)(tic+j),size);		if(ss!=size)			break;		if(tic[j].number>=number&&tic[j].number<number+ntic)			locate[j++]=i;	}	close(fd);	if(j==0)	{		showmsg("查无此票, 请核实后酌情处理!");		return	-1;	}	ntic=j;	sprintf(fn,"%s/data/ticlib/%d",RP,date);	fd=open(fn,O_RDONLY);	if(fd==-1)	{		sprintf(msg,"文件 %s 无法打开, 不能退票!",fn);		showmsg(msg);		return	fd;	}	size=sizeof(struct ticketlib);	for(i=0;;i++)	{		ss=read(fd,(char *)&tl,size);		if(ss!=size)		{			close(fd);			showmsg("票库数据与售票数据不一致, "				"请排除故障后重新办理退票!");			return	-1;		}		if(tl.bus==tic[0].bus)		{			tllocate=i;			break;		}	}	close(fd);	sprintf(fn,"%s/data/state/%d",RP,date);	fd=open(fn,O_RDONLY);	if(fd==-1)	{		sprintf(msg,"文件 %s 无法打开, 系统存在故障!",fn);		showmsg(msg);		return	-1;	}	for(i=0;i<ntic;i++)	{		if(tic[i].checkflag!=0)		{			close(fd);			sprintf(msg,"票号为 %d 的票已办理过检票手续, "				"不允许退票!",tic[i].number);			showmsg(msg);			return	-1;		}		if(tic[i].ruser!=-1)		{			close(fd);			sprintf(msg,"票号为 %d 的票已办理过退票手续, "				"不允许重办, 应予以没收!",tic[i].number);			showmsg(msg);			return	-1;		}		if(tl.tab[tic[i].seat-1]==0)		{			close(fd);			showmsg("票库数据与售票数据不一致, "				"请排除故障后重新办理退票!");			return	-1;		}		else			tl.tab[tic[i].seat-1]=0;		bus=tic[i].bus;		lseek(fd,0L,0);		while(1)		{			size=read(fd,(char *)&bs,sizeof(struct busstate));			if(size!=sizeof(struct busstate))			{				close(fd);				showmsg("售票文件与班次状态文件的数据不一致!");				return	-1;			}			if(bs.bus==bus)				break;		}		btime=bs.time;		tn=time(0);		gettime(tn,&t);		dd=t.year*10000+t.month*100+t.mday;		tt=t.hour*100+t.minute;		tic[i].ruser=uno;		tic[i].rdate=dd;		tic[i].rtime=tt;		if(flag==1)			tic[i].rprice=tic[i].price;		else		  if(date>dd)			tic[i].rprice=tic[i].price*90/100;		  else		    if(tt-btime>=100)	/* one hour later */		    {			close(fd);			sprintf(msg,"%d号票所在班车发车已超过一小时, 不能办理退票!",tic[i].number);			showmsg(msg);			return	-1;		    }		    else			if(btime-tt>200)	/* before two hours */				tic[i].rprice=tic[i].price*90/100;			else				if(btime-tt>0)	/* in two hours */					tic[i].rprice=tic[i].price*80/100;				else					tic[i].rprice=tic[i].price*50/100;		tl.lseat++;		rtic[i].user=tic[i].ruser;		rtic[i].date=tic[i].rdate;		rtic[i].bus=tic[i].bus;		rtic[i].flag=-1;		rtic[i].time=tic[i].rtime;		rtic[i].seat=tic[i].seat;		rtic[i].sta=tic[i].sta;		rtic[i].price=tic[i].price;		rtic[i].fee=tic[i].price-tic[i].rprice;		rtic[i].rprice=tic[i].rprice;		rtic[i].number=tic[i].number;	}	close(fd);	for(i=0;i<ntic;i++)	{		rprice+=rtic[i].rprice;		fee+=rtic[i].fee;	}	mvprintw(16,30,"退款: %d.%02d元",rprice/100,rprice%100);	mvprintw(17,30,"手续费: %d.%02d元",fee/100,fee%100);	refresh();	if(get_s(INROW,30,"以上数据正确吗?(y/n)? ",s,10)==-1)	{		showmsg("请注意: 你取消了此次退票!");		return;	}	if(s[0]!='y'&&s[0]!='Y')	{		showmsg("请注意: 你取消了此次退票!");		return;	}		sprintf(fn,"%s/data/ticlib/%d",RP,date);	fd=open(fn,O_RDWR);	if(fd==-1)	{		sprintf(msg,"文件 %s 无法打开, 退票数据不能写入!",fn);		showmsg(msg);		return	-1;	}	size=sizeof(struct ticketlib);	lseek(fd,size*tllocate,0);	lockf(fd,F_LOCK,size);	write(fd,(char *)&tl,size);	lseek(fd,size*tllocate,0);	lockf(fd,F_ULOCK,size);	close(fd);	sprintf(fn,"%s/data/ticket/%d",RP,date);	fd=open(fn,O_RDWR);	if(fd==-1)	{		sprintf(msg,"文件 %s 无法打开, 退票数据不能写入!",fn);		showmsg(msg);		return	-1;	}	size=sizeof(struct ticket);	for(i=0;i<ntic;i++)	{		lseek(fd,size*locate[i],0);		lockf(fd,F_LOCK,size);		write(fd,(char *)(tic+i),size);		lseek(fd,size*locate[i],0);		lockf(fd,F_ULOCK,size);	}	close(fd);	sprintf(fn,"%s/data/user/%d",RP,date);	fd=open(fn,O_RDWR|O_APPEND);	if(fd==-1)	{		fd=open(fn,O_CREAT|O_RDWR);		if(fd==-1)		{			sprintf(msg,"文件 %s 无法打开, 退票员数据不能写入!",fn);		showmsg(msg);		return	-1;		}		else		chmod(fn,0666);		}	size=ntic*sizeof(struct returnt);	lockf(fd,F_LOCK,0L);	write(fd,(char *)rtic,size);	close(fd);	return	0;}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++,days-=ydays)		if(t->year%400==0||(t->year%4==0&&t->year%100!=0))			ydays=366;		else			ydays=365;	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;}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();	}}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");	refresh();}

⌨️ 快捷键说明

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