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

📄 cmain.c

📁 纯用C写的图形化的职工管理系统 虽然只实现了基本功能 但很有代表性
💻 C
📖 第 1 页 / 共 2 页
字号:
		}
	}
}

/*排序函数*/
void mysort(void)
{
	char choice[2];
	WORKERTYPE *temp;
	int i,j,p;
	mylist(workersum,pworker);
	do
	{
		setcolor(LIGHTBLUE);
		outtextxy(310,300,"Press ESC to EXIT...");
		hz(30,13,15,1,LIGHTGREEN,
			"请选择:0     1           2  3   4 ");
		do
		{
			setcolor(RED);
			rectangle(268,28,278,39);
			setfillstyle(SOLID_FILL,BK_COLOR);
			bar(269,29,277,38);
			ginput(270,30,1,0,BK_COLOR,WHITE,choice);
		}while(*choice>'4'||*choice<'0');

		*choice-='0';
		for (i=0;i<workersum-1;i++)
		{/*选择排序*/
			p=i;
			for (j=i;j<workersum;j++)
				if(p_way[*choice](pworker[p],pworker[j])>0)
					p=j;
			if (p!=i)
			{
				temp=pworker[i];
				pworker[i]=pworker[p];
				pworker[p]=temp;
			}
		}
		setcolor(RED);
		mylist(workersum,pworker);
		outtextxy(310,300,"Press ESC to EXIT...");

	}while(KB_ESC!=keyreg());
	setcolor(BK_COLOR);
}


/*查找函数*/
void myfind(void)
{
	do
	{
		int i,counter=0;
		WORKERTYPE *found[MAX_WORKERS]={'\0'};
		char choice[2];
		char temp[30],yn;
		WORKERTYPE tempwork;

		setfillstyle(SOLID_FILL,BK_COLOR);
		bar(74,50,500,320);
		setcolor(LIGHTBLUE);
		outtextxy(310,300,"Press ESC to EXIT...");
		hz(30,13,15,1,LIGHTGREEN,
			"请选择:0     1           2  3   4 ");
		hz(75,30,15,1,YELLOW,
				"职工号   姓名          性别 年龄  月薪 ");

		do
		{
			setcolor(RED);
			rectangle(268,28,278,39);
			setfillstyle(SOLID_FILL,BK_COLOR);
			bar(269,29,277,38);
			ginput(270,30,1,0,BK_COLOR,WHITE,choice);
		}while(*choice>'4'||*choice<'0');

		*choice-='0';

		setfillstyle(SOLID_FILL,YELLOW);
		bar(BAR_LEFT,BAR_TOP,BAR_RIGHT,BAR_BOTTOM);
		setcolor(RED);

		switch (*choice)
		{
		case 0:
			do
			{
				hz(HINT_LEFT,HINT_TOP,15,1,RED," 请输入职工号(最长6位):");
				rectangle(INPUT_MID-6*4-2,INPUT_TOP-2,INPUT_MID+6*4+1,INPUT_TOP+9);
				ginput(INPUT_MID-6*4,INPUT_TOP,6,0,YELLOW,TEXT_COLOR,temp);
				bar(BAR_LEFT,BAR_TOP,BAR_RIGHT,BAR_BOTTOM);
			}while(!strlen(temp));
			tempwork.num=atol(temp);
			break;

		case 1:
			do
			{
				hz(HINT_LEFT,HINT_TOP,15,1,RED,"   请输入职工姓名:");
				rectangle(INPUT_MID-19*4-2,INPUT_TOP-2,INPUT_MID+19*4+1,INPUT_TOP+9);
				ginput(INPUT_MID-19*4,INPUT_TOP,19,1,YELLOW,TEXT_COLOR,temp);
				bar(BAR_LEFT,BAR_TOP,BAR_RIGHT,BAR_BOTTOM);
			}while(!strlen(temp));
			strcpy(tempwork.name,temp);
			break;

		case 2:
			do
			{
				hz(HINT_LEFT,HINT_TOP,15,1,RED," 请输入职工性别(m/f):");
				rectangle(INPUT_MID-4-2,INPUT_TOP-2,INPUT_MID+4+1,INPUT_TOP+9);
				ginput(INPUT_MID-4,INPUT_TOP,1,1,YELLOW,TEXT_COLOR,temp);
				bar(BAR_LEFT,BAR_TOP,BAR_RIGHT,BAR_BOTTOM);
			}while(*temp!='m'&&*temp!='M'&&*temp!='f'&&*temp!='F');
			tempwork.sex=toupper(*temp);
			break;


		case 3:
			do
			{
				hz(HINT_LEFT,HINT_TOP,15,1,RED,"   请输入职工年龄:");
				rectangle(INPUT_MID-2*4-2,INPUT_TOP-2,INPUT_MID+2*4+1,INPUT_TOP+9);
				ginput(INPUT_MID-2*4,INPUT_TOP,2,0,YELLOW,TEXT_COLOR,temp);
				bar(BAR_LEFT,BAR_TOP,BAR_RIGHT,BAR_BOTTOM);
			}while(atoi(temp)>55||atoi(temp)<18);
			tempwork.age=atoi(temp);
			break;

		case 4:
			do
			{
				hz(HINT_LEFT,HINT_TOP,15,1,RED,"   请输入职工月薪:");
				rectangle(INPUT_MID-5*4-2,INPUT_TOP-2,INPUT_MID+5*4+1,INPUT_TOP+9);
				ginput(INPUT_MID-5*4,INPUT_TOP,5,0,YELLOW,TEXT_COLOR,temp);
				bar(BAR_LEFT,BAR_TOP,BAR_RIGHT,BAR_BOTTOM);
			}while(atol(temp)<200);
			tempwork.salary=atol(temp);
		}

		for (i=0;i<workersum;i++)
		{
			if(p_way[*choice](pworker[i],&tempwork)==0)
			{
				found[counter]=pworker[i];
				counter++;
			}
		}
		setcolor(RED);
		mylist(counter,found);
		outtextxy(310,300,"Press ESC to EXIT...");
	}while(KB_ESC!=keyreg());
	setcolor(BK_COLOR);
}

/*删除函数*/
void mydel(void)
{
	char temp[7];
	int i,j;
	WORKERTYPE tempwork;
	
	setfillstyle(SOLID_FILL,YELLOW);
	bar(BAR_LEFT,BAR_TOP,BAR_RIGHT,BAR_BOTTOM);
	setcolor(RED);
	do
	{
		hz(HINT_LEFT,HINT_TOP,15,1,RED," 请输入职工号(最长6位):");
		rectangle(INPUT_MID-6*4-2,INPUT_TOP-2,INPUT_MID+6*4+1,INPUT_TOP+9);
		ginput(INPUT_MID-6*4,INPUT_TOP,6,0,YELLOW,TEXT_COLOR,temp);
		bar(BAR_LEFT,BAR_TOP,BAR_RIGHT,BAR_BOTTOM);
	}while(!strlen(temp));
	tempwork.num=atol(temp);/*得到职工号*/

	for (i=0;i<workersum;i++)
		if(p_way[0](pworker[i],&tempwork)==0)
			break;
	if(i==workersum)
	{
		/*没找到*/
		hz(180,HINT_TOP+20,15,1,RED,"   没找到该职工!");
		keyreg();
		return;
	}
	/*找到了,释放资源*/
	free((void*)pworker[i]);
	/*依次前移*/
	for (;i<workersum-1;i++)
	{
		pworker[i]=pworker[i+1];
	}
	/*最末一个指针置零*/
	pworker[--workersum]=NULL;
	savedflag=0;
	hz(180,HINT_TOP+20,15,1,RED,    "    删除成功!");
	setcolor(BK_COLOR);
	keyreg();
}

/*图表函数*/
void mychart(void)
{
	int i,old,part[8]={0};
	char temp[10]={0},itemhint[8][6]={"18-19","20-24","25-29","30-34",
					  "35-39","40-44","45-49","50-55"};
	float cur=0,next;
	hz(225,15,15,1,YELLOW,"职工年龄分布图");
	for (i=0;i<workersum;i++)
	{
		old=pworker[i]->age;
		if (old<20)
			part[0]++;
		else if (old<25)
			part[1]++;
		else if (old<30)
			part[2]++;
		else if (old<35)
			part[3]++;
		else if (old<40)
			part[4]++;
		else if (old<45)
			part[5]++;
		else if (old<50)
			part[6]++;
		else
			part[7]++;
	}
	for(i=0;i<8;i++)
	{
		next=cur+part[i];
		setcolor(BK_COLOR);
		setfillstyle(SOLID_FILL,i+1);
		pieslice(200,170,cur/workersum*360,next/workersum*360,90);
		fillellipse(420,55+30*i,13,8);
		sprintf(temp,"%.2f%",part[i]/(double)workersum*100);
		setcolor(WHITE);
		outtextxy(180+125*cos(PI*(next+cur)/workersum),
			170-125*sin(PI*(next+cur)/workersum),temp);
		outtextxy(450,52+30*i,itemhint+i);
		cur=next;
	}
	setcolor(BK_COLOR);
	keyreg();
}

/*加载函数*/
void myload(void)
{
	FILE *fpinfo;
	WORKERTYPE temp;
	int i,errflag=0,eofflag;
	pworker[0]=(void*)NULL;
	workersum=0;
	if((fpinfo=fopen("workinfo.dat","rb"))==NULL)
		errflag=1;
	else
	{
		for(i=0;i<MAX_WORKERS;i++)
			if(fread((void*)&temp,sizeof(WORKERTYPE),1,fpinfo)!=1)
				break;
			else
			{
				pworker[i]=malloc(sizeof(WORKERTYPE));
				memcpy((void*)pworker[i],(void*)&temp,sizeof(WORKERTYPE));
				workersum++;
			}
	}
	if(errflag!=1)
		fclose(fpinfo);
	if(errflag==0&&workersum!=0)
		hz(HINT_LEFT,HINT_TOP,15,1,YELLOW,"    载入成功:)");
	else
		hz(HINT_LEFT,HINT_TOP,15,1,YELLOW,"    载入失败:(");
	savedflag=1;
	setcolor(BK_COLOR);
	keyreg();
}

/*保存函数*/
void mysave(void)
{
	FILE *fpinfo;
	int i,errflag=0;
	if (workersum==0)/*没有数据不保存*/
	{
		hz(HINT_LEFT,HINT_TOP,15,1,RED,"     没有数据");
		keyreg();
		return;
	}
	if((fpinfo=fopen("workinfo.dat","wb"))==NULL)
	{
		errflag=1;
	}
	else
	{
		for(i=0;i<workersum;i++)
			if(fwrite((void*)pworker[i],sizeof(WORKERTYPE),1,fpinfo)!=1)
			{
				errflag=2;
				break;
			}
	}
	if(errflag!=1)/*因为errflag==1时,是因为没能打开文件*/
		fclose(fpinfo);
	setcolor(LIGHTRED);
	if(errflag==0)
	{
		hz(HINT_LEFT,HINT_TOP,15,1,YELLOW,"    保存成功:)");
		savedflag=1;/*数据已存*/
	}
	else
		hz(HINT_LEFT,HINT_TOP,15,1,YELLOW,"    保存失败:(");
	setcolor(BK_COLOR);
	keyreg();
}

/*退出函数*/
void myexit(void)
{
	/* exit program */
	char yn;
	int i;
	hz(HINT_LEFT,HINT_TOP,15,1,LIGHTRED,"  确定退出?(y/n)");
	yn=getch();
	if (yn=='y' || yn=='Y')
	{
		clearviewport();
		if(savedflag==0&&workersum!=0)/*有资料未存*/
		{
			hz(HINT_LEFT,HINT_TOP,15,1,LIGHTRED,"  是否存盘?(y/n)");
			yn=getch();
			if(yn=='y' || yn=='Y')
			{
				clearviewport();
				mysave();
			}
		}
		for(i=0;i<workersum;i++)
			free((void*)pworker[i]);/*释放所有动态申请的内存*/
		close_child_viewport();
		cleardevice();
		bye();
		sound(1000);/*响铃提示*/
		delay(500);
		nosound();
		closehzk();
		closegraph();
		exit(1);
	}
	else
	{
		setcolor(BK_COLOR);
	}
}
/********************************************************/

/*将按钮与函数挂钩的函数*/
void fuc_match_button(void)
{
	button_fuc[0]=myinput;
	button_fuc[1]=mysort;
	button_fuc[2]=myfind;
	button_fuc[3]=mydel;
	button_fuc[4]=mychart;
	button_fuc[5]=myload;
	button_fuc[6]=mysave;
	button_fuc[7]=myexit;
}


void main()
{
	inithzk();
	logo();
	initgr();
	fuc_match_button();
	setbkcolor(BK_COLOR);
	interface_draw();
	setcolor(LIGHTGRAY);
	while(1)
	{
		switch (keyreg())
		{
		case KB_LEFT:
		case KB_UP:
			cur_button_l();		/*当前按钮左移*/
			break;

		case KB_RIGHT:
		case KB_DOWN:
		case KB_TAB:
			cur_button_r();		/*当前按钮右移*/
			break;
		
		case KB_ENTER:
			
			buttonflat(cur_button,CUR_COLOR);/*按钮的处理*/
			delay(4000);
			button(cur_button,CUR_COLOR);    /*按钮弹回*/

			open_child_viewport();		/*开视口*/
			button_fuc[cur_button]();	/*执行程序*/
			close_child_viewport();		/*关闭视口*/
			
			break;

		case KB_ESC:
			open_child_viewport();
			myexit();
			close_child_viewport();
			break;
		
		default:
			break;
		}
	}
}

⌨️ 快捷键说明

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