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

📄 dayrep.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	60#define	ROWS	15#define	ROW	5#define	SHOWROW	21#define	INROW	22#define	MSGROW	23#define	NITEM	0#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 */	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 */};char	*tab[]={	"*** 班 次 售 票 查 询 ***",	"----------------------------------------"	"---------------------------------------",	"Q-退出    D-日期"};/*char	*title[]={};*//*int	col[NITEM]={};*/int	uno;struct	passwd	*upwd;char	ucode[5],uname[10];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	ntic,nctic,nrtic;unsigned long	money,cmoney,rmoney,rprice;main(int argc,char *argv[]){	char	c;	long	tn;	struct	time	t;	int	n,quit,date;	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;	quit=0;	while(quit==0)	{		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 */				break;			case	'd':				n=indate(date);				if(n!=-1&&checkdate(n)==0)					if(readtic(n)!=-1)					{						date=n;						show();					}				break;			case	'q':				quit=1;				break;			default:				printf("\07");				break;		}	}	sigignore(SIGALRM);	erase();	refresh();	endwin();}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;}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	readtic(int date){	char	fn[80];	int	fd;	long	s,size;	struct	ticket	tic;	sprintf(fn,"%s/data/ticket/%d",RP,date);	fd=open(fn,O_RDONLY);	if(fd==-1)	{		showmsg("票库数据有错误, 请处理以后重新检票!");		return	-1;	}	size=sizeof(struct ticket);	ntic=0;	money=0L;	nctic=0;	cmoney=0L;	nrtic=0;	rprice=0L;	rmoney=0L;	for(ntic=0;;)	{		s=read(fd,(char *)&tic,size);		if(s!=size)			break;		ntic++;		money+=tic.price;		if(tic.checkflag!=0)		{			nctic++;			cmoney+=tic.price;		}		if(tic.ruser!=-1)		{			nrtic++;			rprice+=tic.price;			rmoney+=tic.rprice;		}	}	close(fd);	return	0;}show(){	mvprintw(ROW+2,25,"总票数: %d",ntic);	mvprintw(ROW+3,25,"总金额: %ld.%02ld",money/100,money%100);	mvprintw(ROW+4,25,"退票数: %d",nrtic);	mvprintw(ROW+5,25,"退票金额: %d.%02d",rprice/100,rprice%100);	mvprintw(ROW+6,25,"退票手续费: %d.%02d",(rprice-rmoney)/100,			(rprice-rmoney)%100);	mvprintw(ROW+7,25,"结算票数: %d",nctic);	mvprintw(ROW+8,25,"结算金额: %ld.%02ld",cmoney/100,cmoney%100);	mvprintw(ROW+9,25,"实际售票: %d",ntic-nrtic);	mvprintw(ROW+10,25,"实际金额: %ld.%02ld",(money-rmoney)/100,			(money-rmoney)%100);	refresh();}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;}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();	}}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 + -