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

📄 puser.c

📁 这是一个使用了 cursor 编程技术实现的车站自动售票系统的源代码
💻 C
字号:
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<fcntl.h>#include<signal.h>#include<curses.h>#include<malloc.h>#define	MAXUSER	1000#define	ROWS	15#define	ROW	5#define	INROW	22#define	ERRROW	23#define	NITEM	5struct	users{	int	no;	int	job;	char	code[5];	char	name[10];	char	pw[20];}usr[MAXUSER];int	nusr;int	order[MAXUSER];int	delf[MAXUSER];	int	col[NITEM]={10,20,30,40,52};struct	jobs{	int	no;	char	name[10];	char	desc[21];	char	exec[80];}*job;int	njob;char	*tab[]={	"工 作 人 员 管 理",	"----------------------------------------"	"---------------------------------------",	"Q-退出  N-指定  A-添加  M-修改  D-删除  U-恢复  S-保存  R-排序"};char	*title[]={"编号","职务","编码","姓名","口令"};char	UNo[20],RP[80];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	flag=0;	int	quit;	int	susr,pusr;	int	n;	if(argc!=3)	{		printf("Usage: puser user <ROOT PATH>\n");		return	0;	}	else	{		strcpy(UNo,argv[1]);		strcpy(RP,argv[2]);	}	init();	if((njob=readjob())==-1)		quit=1;	else	{		quit=0;		if((nusr=readusr())==-1)			nusr=0;		susr=0;		pusr=0;	}	while(quit==0)	{		show(susr,pusr);		move(ROW+ROWS+1,41+strlen(tab[2])/2);		refresh();		c=getkey();		clrin();		clrerr();		if(c>='A'&&c<='Z')			c=c-'A'+'a';		switch(c)		{			case	-1:				break;			case	Down:				if(pusr<nusr-1)					pusr++;				if(pusr-susr>=ROWS)					susr++;				break;			case	Up:				if(pusr>0)					pusr--;				if(pusr<susr&&susr>0)					susr--;				break;			case	PgUp:				if(susr>=ROWS)					susr-=ROWS;				else					susr=0;				if(pusr>=ROWS)					pusr-=ROWS;				else					pusr=0;				break;			case	PgDn:				if(susr<nusr-ROWS)					susr+=ROWS;				if(pusr<nusr-ROWS)					pusr+=ROWS;				else					pusr=nusr-1;				break;			case	Home:				susr=0;				pusr=0;				break;			case	End:				if(nusr%ROWS==0)					susr=nusr-ROWS;				else					susr=nusr-nusr%ROWS;				pusr=nusr-1;				break;			case	'n':				n=appoint();				if(n<nusr&&n>=0)				{					susr=n;					pusr=n;				}				break;			case	'a':				if((n=append())!=-1)					flag=1;				if(nusr%ROWS==0)					susr=nusr-ROWS;				else					susr=nusr-nusr%ROWS;				pusr=nusr-1;				break;			case	'm':				if(modify(susr,pusr)==0)					flag=1;				break;			case	'd':				if(delete(pusr)==0)				{					mvaddch(ROW+pusr-susr,col[0]-1,'*');					refresh();					flag=1;				}				break;			case	'u':				if(undelete(pusr)==0)				{					mvaddch(ROW+pusr-susr,col[0]-1,' ');					refresh();				}				break;			case	's':				if(save()==0)					flag=0;				break;			case	'r':				sort();				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	readjob(){	char	fn[80];	char	errs[128];	int	fd;	long	size;	sprintf(fn,"%s/bas/job.dat",RP);	fd=open(fn,O_RDONLY);	if(fd==-1)	{		sprintf(errs,"文件%s打开失败!",fn);		showerr(errs);		return	0;	}	size=lseek(fd,0L,2);	job=(struct jobs *)malloc(size);	if(job==NULL)	{		showerr("Fail to alloc memory!");		return	-1;	}	lseek(fd,0L,0);	read(fd,(char *)job,size);	close(fd);	return	size/sizeof(struct jobs);}int	readusr(){	char	fn[80];	char	errs[128];	int	fd;	long	size;	int	i,nusr;	sprintf(fn,"%s/bas/user.dat",RP);	fd=open(fn,O_RDONLY);	if(fd==-1)	{		sprintf(errs,"文件%s打开失败!",fn);		showerr(errs);		return	0;	}	else	{		size=lseek(fd,0L,2);		if(size>MAXUSER*sizeof(struct users))			size=MAXUSER*sizeof(struct users);		lseek(fd,0L,0);		read(fd,(char *)usr,size);		close(fd);		nusr=size/sizeof(struct users);		for(i=0;i<nusr;i++)			order[i]=i,	delf[i]=0;		return	nusr;	}}sort(){	int	i,j,k,n;	k=nusr/2;	while(k>0)	{		for(j=k;j<nusr;j++)		{			n=order[j];			i=j-k;			while(i>=0&&usr[order[i]].no>usr[n].no)			{				order[i+k]=order[i];				i-=k;			}			order[i+k]=n;		}		k/=2;	}}int	append(){	int	i,j,n;	int	no,jobno;	char	code[5],name[10],pw[20];	int	susr,pusr;	susr=nusr-nusr%ROWS;	i=0;	while(1)	{		nusr++;		if(nusr>=MAXUSER)		{			showerr("空间已满, 不能再增加!");			break;		}		pusr=nusr-1;		order[pusr]=pusr;		if(nusr>1)			no=usr[order[pusr-1]].no+1;		else			no=0;		jobno=job[0].no;		code[0]='\0';		name[0]='\0';		pw[0]='\0';		n=order[pusr];		usr[n].no=no;		usr[n].job=jobno;		usr[n].code[0]='\0';		usr[n].name[0]='\0';		usr[n].pw[0]='\0';		if(pusr-susr>=ROWS)			susr++;		show(susr,pusr);		while(1)		{			if((n=get_n(pusr-susr+ROW,col[0],"",&no,5))==-1)				break;			else			{				for(j=0;j<nusr;j++)					if(no==usr[j].no&&j!=order[pusr])						break;				if(j<nusr)					showerr("此人员编号有重复!");				else					break;			}		}		if(n==-1)			break;		while(1)		{			if((n=get_n(pusr-susr+ROW,col[1],"",&jobno,5))==-1)				break;			for(j=0;j<njob&&jobno!=job[j].no;j++)				;			if(j>=njob)				showerr("此职务编号不正确!");			else				break;		}		if(n==-1)			break;		else		{			mvaddstr(pusr-susr+ROW,col[1],job[j].name);			refresh();		}		while(1)		{			if((n=get_s(pusr-susr+ROW,col[2],"",code,5))==-1)				break;			else			{				for(j=0;j<nusr;j++)					if(strcmp(code,usr[j].code)==0)						break;				if(j<nusr)					showerr("此人员代码有重复!");				else					break;			}		}		if(n==-1)			break;		if(get_s(pusr-susr+ROW,col[3],"",name,10)==-1)			break;		if(get_s(pusr-susr+ROW,col[4],"",pw,20)==-1)			break;		n=order[pusr];		usr[n].no=no;		usr[n].job=jobno;		strcpy(usr[n].code,code);		strcpy(usr[n].name,name);		strcpy(usr[n].pw,pw);		i++;	}	nusr--;	move(pusr-susr+ROW,0);	clrtoeol();	refresh();	if(i>0)		return	i;	else		return	-1;}int	modify(int susr,int pusr){	int	i,j,n;	int	no,jobno;	char	code[5],name[10],pw[20];	no=usr[order[pusr]].no;	while(1)	{		if((n=get_n(pusr-susr+ROW,col[0],"",&no,5))==-1)			break;		else		{			for(j=0;j<nusr;j++)				if(no==usr[j].no&&order[pusr]!=j)					break;			if(j<nusr)				showerr("此人员编号有重复!");			else				break;		}	}	if(n==-1)		return	-1;	jobno=usr[order[pusr]].job;	while(1)	{		if((n=get_n(pusr-susr+ROW,col[1],"",&jobno,5))==-1)			break;		for(i=0;i<njob&&jobno!=job[i].no;i++)			;		if(i>=njob)			showerr("此职务编号不正确!");		else			break;	}	if(n==-1)		return	-1;	else	{		mvaddstr(pusr-susr+ROW,col[1],job[i].name);		refresh();	}	strcpy(code,usr[order[pusr]].code);	while(1)	{		if(get_s(pusr-susr+ROW,col[2],"",code,5)==-1)			return	-1;		for(j=0;j<nusr;j++)			if(strcmp(code,usr[j].code)==0&&j!=order[pusr])				break;		if(j<nusr)			showerr("此人员代码有重复!");		else			break;	}	strcpy(name,usr[order[pusr]].name);	if(get_s(pusr-susr+ROW,col[3],"",name,10)==-1)		return	-1;	strcpy(pw,usr[order[pusr]].pw);	if(get_s(pusr-susr+ROW,col[4],"",pw,20)==-1)		return	-1;	usr[order[pusr]].no=no;	usr[order[pusr]].job=jobno;	strcpy(usr[order[pusr]].code,code);	strcpy(usr[order[pusr]].name,name);	strcpy(usr[order[pusr]].pw,pw);	return	0;}int	delete(int pusr){	delf[order[pusr]]=1;	return	0;}int	undelete(int pusr){	if(delf[order[pusr]])	{		delf[order[pusr]]=0;		return	0;	}	else		return	-1;}int	save(){	char	fn[80];	char	errs[128];	int	fd;	long	size;	int	i;	sprintf(fn,"%s/bas/user.dat",RP);	fd=open(fn,O_WRONLY|O_TRUNC);	if(fd==-1)	{		fd=open(fn,O_CREAT|O_WRONLY);		if(fd==-1)		{			sprintf(errs,"文件%s打开失败!",fn);			showerr(errs);			return	-1;		}	}	sort(nusr);	size=sizeof(struct users);	for(i=0;i<nusr;i++)		if(delf[i]==0)			write(fd,(char *)(usr+i),size);	close(fd);	return	0;}int	get_n(int y,int x,char *prompt,int *n,int b){	char	c,ss[128];	int	i;	sprintf(ss,"%d",*n);	for(i=strlen(ss);i<b-1;i++)		ss[i]=' ';	ss[b-1]='\0';	mvaddstr(y,x,prompt);	x+=strlen(prompt);	mvaddstr(y,x,ss);	refresh();	i=0;	while(1)	{		move(y,x+i);		refresh();		if(i>=b-1)			c=0x0d;		else			c=getkey();		switch(c)		{			case 	0x1b:		/* <ESC> pressed */				return	-1;			case	0x0d:		/* <ENTER> pressed */				if(i)					*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;				ss[i]='\0';				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,s);	refresh();	i=0;	while(1)	{		move(y,x+i);		refresh();		if(i>=n-1)			c=0x0d;		else			c=getkey();		switch(c)		{			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,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(){}show(int susr,int pusr){	static	int	s=-1;	static	int	p=-1;	static	int	o[ROWS];	int	i;	move(2,70);	clrtoeol();	if(nusr<=0)	{		mvaddstr(2,70,"0/0");		clrscr();		refresh();		return;	}	else		mvprintw(2,70,"%d/%d",pusr+1,nusr);	if(nusr==0)		return;	mvaddch(p-s+ROW,col[0]-2,' ');	if(p!=pusr)		p=pusr;	if(s==susr)		for(i=0;i<ROWS&&s+i<nusr&&o[i]==order[s+i];i++)			;	if(s!=susr||(i<ROWS&&s+i<nusr))	{		s=susr;		clrscr();		for(i=0;i<ROWS&&(s+i)<nusr;i++)		{			o[i]=order[s+i];			showone(ROW+i,o[i]);		}	}	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",usr[n].no);	for(i=0;i<njob&&usr[n].job!=job[i].no;i++)		;	if(i<njob)		mvaddstr(row,col[1],job[i].name);	else		mvaddstr(row,col[1],"(无)");	mvaddstr(row,col[2],usr[n].code);	mvaddstr(row,col[3],usr[n].name);	mvaddstr(row,col[4],usr[n].pw);}int	appoint(){	int	n;	n=-1;	if(get_n(INROW,30,"请输入序号: ",&n,6)==-1)		return	-1;	return	n;}clrscr(){	int	i;	for(i=0;i<ROWS;i++)	{		move(ROW+i,0);		clrtoeol();		}	refresh();}showerr(char s[]){	move(ERRROW,0);	clrtoeol();	mvaddstr(ERRROW,(80-strlen(s))/2,s);	refresh();	printf("\7\7");}clrerr(){	move(ERRROW,0);	clrtoeol();	refresh();}clrin(){	move(INROW,0);	clrtoeol();	refresh();}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 + -