C语言课程设计_职工工资管理系统

要求

设计一个职工工资管理系统:

  1. (1)输入记录:将每一个职工的姓名、ID号以及基本工资、职务工资、岗位津贴、医疗保险、公积金的数据作为一个记录。该软件能建立一个新的数据文件或给已建立好的数据文件增加记录。
  2. (2)显示记录:根据用户提供的记录或者根据职工姓名显示一个或几个职工的各项工资和平均工资。
  3. (3)修改记录:可以对数据文件的任意记录的数据进行修改并在修改前后对记录内容进行显示。
  4. (4)查找记录:可以对数据文件的任意记录的数据进行查找并在查找前后对记录内容进行显示。
  5. (5)删除记录:可删除数据文件中的任一记录。 
  6. (6)统计: (A)计算各项工资平均工资及总工资, (B)统计符合指定条件(如职工工资前三项之和在3000元以上、3000~2000元、2000~1000元) 以内的工资职工人数及占总职工人数的百分比。(C)按字符表格形式打印全部职工工资信息表及平均工资(包括各项总的平均工资)。 
  7. (7)保存数据文件功能。

课程设计说明书

(1)系统分析:包括系统功能模块划分、数据的存储和记录属性分析
(2)概要设计:本程序功能模块根据程序设计的要求,将程序划分为6个模块分别编写。六个模块分别为:
1.输入职工基本信息模块
2.显示职工基本信息模块
3.修改职工基本信息模块
4.查找职工基本信息模块
5.删除职工基本信息模块 
6.统计职工基本信息模块
 

源代码 

#include<stdio.h>
#include<windows.h>
#include<string.h>
#include<conio.h>
#define N 100
struct clerk
{
 	int num;         
 	char name[20];   
 	int jbgz;        
 	int zwgz;       
 	int jt;          
 	int yb;         
 	int gjj;        
 	int total;       
}em[100];       
void menu();        //菜单界面
void input();       //输入
void save(int);     //保存文件
void display();     //显示职工文件
void del();         //删除
void search();      //查找
void search_num();  //按工号
void search_name(); //按姓名
void modify();      //修改
void sta();         //统计
void start();       //开始
void start() 
{
    	system("cls");    //清屏
	printf("nnnnnn");
	printf("********进入职工工资管理系统**********");
}
void menu() 
{
	system("cls"); 
	printf("***菜单***nn");
	printf(">>>>>>>>>>>>>>>>>>>>>>>>>  1  输入  nn");
	printf(">>>>>>>>>>>>>>>>>>>>>>>>>  2  显示  nn");
	printf(">>>>>>>>>>>>>>>>>>>>>>>>>  3  查找  nn");
	printf(">>>>>>>>>>>>>>>>>>>>>>>>>  4  删除  nn");
	printf(">>>>>>>>>>>>>>>>>>>>>>>>>  5  添加  nn");
	printf(">>>>>>>>>>>>>>>>>>>>>>>>>  6  修改  nn");
	printf(">>>>>>>>>>>>>>>>>>>>>>>>>  7  统计  nn");
	printf(">>>>>>>>>>>>>>>>>>>>>>>>>  8  退出  nn");
	}
void input()   
{
   	int i,m;
   	system("cls");
  	printf("职工人数(1--100):");
   	scanf("%d",&m);
	for (i=0;i<m;i++)
   	{
  		printf("请输入职工号: ");
  		scanf("%d",&em[i].num);
		printf("请输入姓名:  ");
  		scanf("%s",&em[i].name);
 		getchar();
		printf("请输入基本工资:  ");
  		scanf("%d",&em[i].jbgz);
		printf("请输入职务工资:  ");
  		scanf("%d",&em[i].zwgz);
		printf("请输入津贴:  ");
  		scanf("%d",&em[i].jt);
		printf("请输入医疗保险:  ");
  		scanf("%d",&em[i].yb);
		printf("请输入公积金:  ");
  		scanf("%d",&em[i].gjj);
		em[i].total=((em[i].jbgz)+(em[i].zwgz)+(em[i].jt)-(em[i].yb)-(em[i].gjj));
  		printf("n");
   	}
   	printf("n创建完毕!n");
      	save(m);
}
void save(int m)          //开始界面
{
 	int i;
 	FILE*fp;          //声明fp是指针,用来指向FILE类型的对象
 	if ((fp=fopen("clerk_list","wb"))==NULL)   //打开职工列表文件为空
 	{
  		printf ("打开失败n");
     		exit(0);
 	}
	for (i=0;i<m;i++)              //将内存中职工的信息输出到磁盘文件中去
   	if (fwrite(&em[i],sizeof(struct clerk),1,fp)!=1)    //写入数据块
   	printf("文件读写错误n");
   	fclose(fp);               //关闭文件
}
int load()  
{
    	FILE*fp;
 	int i=0;
   	if((fp=fopen("clerk_list","rb"))==NULL)
 	{
  		printf ("cannot open filen");
     		exit(0);
 	}
 	else 
 	{
  		do 
  		{
        		fread(&em[i],sizeof(struct clerk),1,fp);     //读取
    		 	i++;
  		}
  		while(feof(fp)==0);       //检测文件结束符
 	}
	fclose(fp);
 	return(i-1);    //返回人数
}
void display()         //显示信息
{
	int i,sum=0;
 	int m=load();
 	system("cls");
 	printf("职工号   姓名   基本工资  职务工资   津贴    医疗保险  公积金   总工资 n");
 	for(i=0;i<m;i++)
 	{printf("n  %-6d%-6s  %-8d  %-8d  %-8d  %-8d  %-8d %-8d  ",em[i].num,em[i].name,em[i].jbgz,em[i].zwgz,em[i].jt,em[i].yb,em[i].gjj,em[i].total);
  	sum+=em[i].total;
 	}
  	printf("nn职工平均工资为:%d n",sum/m);
}
void del()   
{
 	int m=load();
 	int i,j,n,t,button;
 	char name[20];
	printf("n 原来的职工信息:n");
    	display(); 
    	printf("n");
		printf("按姓名删除:n");
		scanf("%s",name);
		for(button=1,i=0;button&&i<m;i++) //主函数中确定button==1时各函数才可以被调用
		{
  		if(strcmp(em[i].name,name)==0)    //按员工姓名查找到某员工 并调出其资料
  		{
   			printf("n此人原始记录为:n");  //显示选定员工的信息
   			printf("职工号   姓名   基本工资  职务工资   津贴    医疗保险  公积金   总工资 n");
   			printf("n  %-6d%-6s  %-8d  %-8d  %-8d  %-8d  %-8d %-8d  ",em[i].num,em[i].name,em[i].jbgz,em[i].zwgz,em[i].jt,em[i].yb,em[i].gjj,em[i].total);  
   			printf("n确定删除 请按1,不删除请按0n");  
   			scanf("%d",&n);
            		if(n==1)
   			{
     				for(j=i;j<m-1;j++)//从第i项开始 将后一项的各成员的值赋给前一项各对应的成员 完成对第i项的删除
     				{
    					strcpy(em[j].name,em[j+1].name);
                			em[j].num=em[j+1].num;
                			em[j].jbgz=em[j+1].jbgz;
                			em[j].zwgz=em[j+1].zwgz;
                			em[j].jt=em[j+1].jt;
               				em[j].yb=em[j+1].yb;  
               				em[j].gjj=em[j+1].gjj;
               				em[j].total=em[j+1].total;
     				}
    			button=0;   //表明删除已完成
   			}
  		}
 	}
 	if(!button)
    		m=m-1;  //总员工数减少一人
 	else
    		printf("n查无此人!n");
    		printf("n 删除后的所有职工信息:n");
    		save(m);    
    		display();  
 
		printf("n继续删除请按1,不再删除请按0n");
 		scanf("%d",&t);
 		switch(t)
 		{
    			case 1:del();break;
    			case 0:break;
    			default :break;
 		}
}
void search()   //查找
{
    	int t,button;
 	system("cls");
	do
 	{
    		printf("n按1 按工号查询n按2 按姓名查询n按3 回主菜单n");
    		scanf("%d",&t);
    		if(t>=1&&t<=3)
    		{
    			button=1;
    			break;
    		}
    		else
    		{
   			button=0;
   			printf("输入错误");
    		}
 	}
    	while(button==0);
    	while(button==1)
 	{
    		switch(t)   //选择查询方式
    		{ 
     			case 1:printf("按工号查询");search_num();break;
     			case 2:printf("按姓名查询");search_name();break;
				case 3:button=1;break;
				default:break;
    		}
    
 	}

}
void search_num()   //按职工号查询
{
  int a;
  int i,t;
  int m=load();
  printf("请输入要查找的职工号:n");
  scanf("%d",&a);
  for(i=0;i<m;i++)
  if(a==em[i].num)
 {  
  printf("职工号   姓名   基本工资  职务工资   津贴    医疗保险  公积金   总工资 n");
  printf("n  %-6d%-6s  %-8d  %-8d  %-8d  %-8d  %-8d %-8d  ",em[i].num,em[i].name,em[i].jbgz,em[i].zwgz,em[i].jt,em[i].yb,em[i].gjj,em[i].total);   
  break;
 
 }
   if(i==m)  
   printf("n对不起,查无此人n");
   printf("n");
   printf("返回查询函数请按1,继续查询职工号请按2n");
   scanf("%d",&t);
   switch(t)
   { 
   case 1:search();break;
   case 2: break;
   default:break;
   }
}
void search_name()   //按姓名查询
{
  char name[30];
  int i,t;
  int m=load();
  printf("请输入姓名:n");
  scanf("%s",name);
  for(i=0;i<m;i++)
   if(strcmp(em[i].name,name)==0)
 {
    printf("n已找到,其记录为:n");
     printf("职工号   姓名   基本工资  职务工资   津贴    医疗保险  公积金   总工资 n");
     printf("n  %-6d%-6s  %-8d  %-8d  %-8d  %-8d  %-8d %-8d  ",em[i].num,em[i].name,em[i].jbgz,em[i].zwgz,em[i].jt,em[i].yb,em[i].gjj,em[i].total);      
 }
   if(i==m) 
   printf("nn");
   printf("n");
   printf("返回查询菜单请按1,继续查询姓名请按2n");
   scanf("%d",&t);
  switch(t)
  { 
   case 1:search();break;
   case 2:break;
   default :break;
  }
 }
void modify()    //修改
{
    	int num;
    	char name[20];
    	int jbgz;  
    	int zwgz;
    	int jt;
    	int yb;
    	int gjj;
    	int b,c,i,n,t,button;
		int m=load();
    	system("cls");
		printf("n 原来的职工信息:n");
    	display(); 
 	printf("n");
    printf("请输入要修改的职工的姓名:n");
 	scanf("%s",name);
 	for(button=1,i=0;button&&i<m;i++)
 	{
  		if(strcmp(em[i].name,name)==0)
  		{
    			printf("n此人原始记录为:n");
     			printf("职工号   姓名   基本工资  职务工资   津贴    医疗保险  公积金   总工资 n");
     			printf("n  %-6d%-6s  %-8d  %-8d  %-8d  %-8d  %-8d %-8d  ",em[i].num,em[i].name,em[i].jbgz,em[i].zwgz,em[i].jt,em[i].yb,em[i].gjj,em[i].total);    
     			printf("n确定 按1 ; 不修改请按0n");
     			scanf("%d",&n);
            		if(n==1)
   			{
               			printf("n需要进行修改的选项n 1.职工号 2.姓名 3.基本工资 4.职务工资 5.津贴 6.医疗保险 7.公积金 8.返回上层n");  
               			printf("请选择序号1-8:n");  
               			scanf("%d",&c);  
               			if(c>8||c<1)  
         				printf("n选择错误,请重新选择!n");  
   			}
        		button=0;
  		}		
        
 	}
    	if(button==1)
 	printf("n查无此人n");
		do  
 	{
  		switch(c)      
  		{  
           		case 1:printf("职工号改为: ");
      		 	       scanf("%d",&num);
      			       em[i-1].num=num;
           		       break;  
           		case 2:printf("姓名改为: ");
                               scanf("%s",name);
                               strcpy(em[i-1].name,name); 
                               break;  
           		case 3:printf("基本工资改为: ");
                               	getchar();
                               	scanf("%d",&jbgz);
                               	em[i-1].jbgz=jbgz;
      			       	em[i-1].total=( em[i-1].jbgz+ em[i-1].zwgz + em[i-1].jt- em[i-1].yb- em[i-1].gjj);
           			break;  
           		case 4:printf("职务工资改为: ");
      				scanf("%d",&zwgz);
      				em[i-1].zwgz=zwgz;
     		 		em[i-1].total=( em[i-1].jbgz+ em[i-1].zwgz + em[i-1].jt- em[i-1].yb- em[i-1].gjj);
           			break;  
           		case 5:printf("津贴改为: ");
      				scanf("%d",&jt);
      				em[i-1].jt=jt; 
      				em[i-1].total=( em[i-1].jbgz+ em[i-1].zwgz + em[i-1].jt- em[i-1].yb- em[i-1].gjj);
           			break;  
           		case 6:printf("医疗保险改为: ");
      				scanf("%d",&yb);
      				em[i-1].yb=yb;
      				em[i-1].total=( em[i-1].jbgz+ em[i-1].zwgz + em[i-1].jt- em[i-1].yb- em[i-1].gjj);
           			break;  
           		case 7:printf("公积金改为: ");
      				scanf("%d",&gjj);
      				em[i-1].gjj=gjj;
      				em[i-1].total=( em[i-1].jbgz+ em[i-1].zwgz + em[i-1].jt- em[i-1].yb- em[i-1].gjj);
           			break;  
           		case 8:modify(); 
           			break;  
  		}
		printf("n");
  		printf("nn 确定修改 请按1 ; 重新修改 请按2:  n"); 
  		scanf("%d",&b);
 	}	  
   	while(b==2);
   	printf("n修改后的所有职工信息:n");
   	printf("n");
   	save(m);
   	display();
   	printf("n按1 继续修改 ,不再修改请按0n");
   	scanf("%d",&t);
   	switch(t)
 	{
    		case 1:modify();break;
    		case 0:break;
    		default :break;
 	}
}
void sta()    //统计
{
 	int i;
 	int sum=0; 
 	int a=0,b=0,c=0;
 	int m=load();
	system("cls");
 	for(i=0;i<m;i++) 
 		{sum+=em[i].total;
  		if((em[i].total)<=2000&&em[i].total>=1000) 
    			{a++;}
  		if(em[i].total>2000&&em[i].total<=3000) 
    			{b++;}
  		if(em[i].total>3000) 
    			{c++;}
		}
	printf("nn工资总额为:%dn",sum);
	printf("平均工资为:%dn",sum/m);
	printf("n基本工资、职务工资、津贴之和n");
	printf("在1000-2000圆的员工占总员工的百分之%dn",a*100/m); 
	printf("在2000-3000圆的员工占总员工的百分之%dn",b*100/m); 
	printf("在3000圆以上的员工占总员工的百分之%dn",c*100/m);
	printf("nn按任意键继续");
	getch();
	menu();
}
void main()
{   
	int n,button;
 	start();
	getch();
 	menu();
	do
 	{
    		printf("功能选择(1--7):");
    		scanf("%d",&n);
    		if(n>=1&&n<=7)
    		{
    			button=1;
    			break;
    		}
    		else
    		{
   			button=0;
   			printf("您输入有误,请重新选择!");
    		}
 	}
    	while(button==0);
    	while(button==1)
     {
			switch(n)
  	{	
       		case 1: input();break;
       		case 2: display();break;
       		case 3: search();break; 
       		case 4:del();break;
       		case 5:modify();break;
       		case 6:sta();break;
       		case 7:exit(0);break;
       		default :break;
  	}
			getchar();
  	printf("n");
  	printf("按任意键继续n");
  	getch();
     	system("cls");  
     	menu();
     	printf("功能选择(1--7):");
     	scanf("%d",&n);
     	printf("n");
     }
 
}

设计心得 

 这两周的c语言课程设计,我加深了对c语言程序设计的理解,使自己的操作更加熟练,发现了自己的不足,为自己今后的继续学习指明了方向。在我看来,考试考察的仅仅是个别知识点,而课程设计就比较的全面。虽然说只是做了一个程序,但是其中运用到的知识确实很多所学到的内容,很好的考验了我们的综合能力。在这次课程设计中,我巩固所了学过的知识,能用汇编语言熟练地运用顺序、选择、循环三大结构,进一步掌握结构体数组的使用,文件函数的使用,掌握了子程序的定义及调用。并在调试过程中不断发现与改正错误,完善算法,改进用户体验等等。调试索然繁琐而艰苦,但极大的促进了我编程能力的提高。由于自己目前能力有限,该程序还有诸多不足,感谢指正。感谢老师的悉心教导与细致的帮助。虽然c语言的课程与课程设计都已结束,但通过这次课程设计我也发现了差距,并将在未来努力学习,积极实践,使自己能真正的掌握运用c语言。

附件:源码下载

计算机课程设计-C语言课程设计职工工资管理系统.zip-C文档类资源-CSDN文库https://download.csdn.net/download/NBITer/87372935?spm=1001.2014.3001.5503