C语言课设工资管理系统(大作业)

请添加图片描述

一、设计功能(文章仅供参考)

大致思路就是输入函数,输出函数,修改函数,删除函数,添加函数,查询函数,用于统计成绩的函数,还有保存文件的函数,以及菜单函数,最后全部在主函数里调用

二、功能展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述

三、思维导图

在这里插入图片描述

四、程序源码

#include<stdio.h>
#include<windows.h>
#include<string.h>
#include<conio.h>
#define N 100


struct clerk
{
 	int num;         //ID号
 	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 add();
void search();
void search_num();
void search_name();
void modify();  
void sta();
void start(); /*定义各函数*/



void start() //开始界面
{
    system("cls");//清屏
	printf("\n\n\n\n\n\n");
	printf("************************************************");
	printf("********<<<<<<欢迎使用工资管理系统>>>>>>********");
	printf("************************************************");
	printf("\t\t\t      ***按任意键进入***\n");

}


void menu() //菜单界面
{
	system("cls");
	system("color 1F"); //设置背景色蓝色 文字颜色为白色
	printf("***菜单***\n\n");
	printf(">>>>>>>>>>>>>>>>>>>>>>>>>  1  输入  \n\n");
	printf(">>>>>>>>>>>>>>>>>>>>>>>>>  2  显示  \n\n");
	printf(">>>>>>>>>>>>>>>>>>>>>>>>>  3  查找  \n\n");
	printf(">>>>>>>>>>>>>>>>>>>>>>>>>  4  删除  \n\n");
	printf(">>>>>>>>>>>>>>>>>>>>>>>>>  5  添加  \n\n");
	printf(">>>>>>>>>>>>>>>>>>>>>>>>>  6  修改  \n\n");
	printf(">>>>>>>>>>>>>>>>>>>>>>>>>  7  统计  \n\n");
	printf(">>>>>>>>>>>>>>>>>>>>>>>>>  8  退出  \n\n");
	printf("说明:*如首次使用 尚未输入数据 请先输入数据 \n      *输入的数据将自动保存 \n      *再次选择输入功能时原数据将被覆盖\n\n");
	int n,button=0;
 	char a; 
	do
 	{
    	printf("功能选择(1--8):\n");
    	scanf("%d",&n);
    	if(n>=1&&n<=8)
    		{
    		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:add();break;
       			case 6:modify();break;
       			case 7:sta();break;
       			case 8:exit(0);break;
       			default :break;
  			}
  			getchar();
  			printf("\n");
  			printf("按任意键继续\n");
  			getch();
   			system("cls");  /*清屏*/
   			menu(); /*调用菜单函数*/
  	    	printf("功能选择(1--8):\n");
   			scanf("%d",&n);
   	    	printf("\n");
		}
}



void input()   /*录入函数*/
{
   	int i,m;
   	system("cls");
  	printf("职工人数(1--100):\n");
   	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);//保存职工人数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)//写入数据块   &em[i]:是要输出数据的地址  sizeof(struct clerk):获取一个单体的长度  1:数据项的个数  fp:目标文件指针
   	    printf("文件读写错误\n");
   	fclose(fp);// 缓冲区内最后剩余的数据输出到磁盘文件中,并释放文件指针和有关的缓冲区
}



int load()  /*导入函数  int型*/
{
    FILE*fp;
 	int i=0;
   	if((fp=fopen("clerk_list","rb"))==NULL)    /*“rb”打开一个二进制文件,只允许读 */
 	{
  		printf ("cannot open file\n");
     	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++) /*m为输入部分的职工人数*/
 	{
		printf("\n  %02d      %-6s   %-8d  %-8d  %-8d  %-8d %-8d%-6d  ",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("\n\n职工平均工资:%-8d \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  %02d    %-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,不删除请按0\n");
   			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)//button==0表明删除已完成
    	m=m-1;//总员工数减少一人
 	else
    	printf("\n查无此人!\n");
    getch();
    save(m);     //调用保存函数
    display();  //调用浏览函数
 	printf("\n继续删除请按1,不再删除请按0\n");
 	scanf("%d",&t);
 	switch(t)
 	{
    	case 1:del();break;
    	case 0:break;
    	default :break;
 	}
}



void add()/*添加函数*/
{
 	FILE*fp;
 	int n;
    int count=0;
    int i;
    int m=load();
    printf("\n 原来的职工信息:\n");
    display();  
   	printf("\n");
    fp=fopen("clerk_list","a");     /*已追加文件的形式打开clerk_list文件追加信息*/
    printf("请输入想增加的职工数:\n");//确定要加入的职工数n
 	scanf("%d",&n);
    for (i=m;i<(m+n);i++)//添加n名员工的信息
  	{
  		printf("\n 请输入新增加职工的信息:\n");
  		printf("请输入职工号:  ");
  		scanf("%d",&em[i].num);
        printf("请输入姓名:  ");
     	scanf("%s",em[i].name);
        printf("请输入基本工资:  ");
     	scanf("\t%d",&em[i].jbgz);
        printf("请输入职务工资:  ");
     	scanf("%d",&em[i].zwgz);
     	printf("请输入津贴:  ");
     	scanf("%d",&em[i].jt);
     	printf("请输入医疗保险:  ");
     	scanf("\t%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");
     	count=count+1;
 	}
    printf("\n添加成功,请按任意键\n"); 
    getch();
    m=m+count;//将新添加员工的人数加到总员工人数中
 	save(m);
    display();//显示添加后的信息
   	fclose(fp);
}



void search()/*查询函数*/
{
    int t,button;
 	system("cls");//清屏
 	do
 	{
    	printf("\n按1 按工号查询\n\n按2 按姓名查询\n\n按3 回主菜单\n");
    	scanf("%d",&t);
    	if(t>=1&&t<=3)
    	{
    		button=1;
    		break;
    	}
    	else
    	{
   			button=0;
   			printf("输入错误,请重新输入\n");
    	}
 	}while(button==0);//回到查询选择项
    while(button==1)
 	{
    	switch(t)//选择查询方式
    	{ 
     		case 1:printf("按工号查询\n");search_num();break;
     		case 2:printf("按姓名查询\n");search_name();break;
    	 	case 3:menu();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  %02d    %-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,继续查询职工号请按2\n");
   	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  %02d    %-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("\n对不起,查无此人\n");
   	printf("\n返回查询菜单请按1,继续查询姓名请按2\n");
   	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  %02d    %-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 ; 不修改请按0\n");
     		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)      /*因为当找到第i个职工时,for语句后i自加了1,所以下面的应该把改后的信息赋值给第i-1个人*/
  		{  
           	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("\n\n 确定修改 请按1 ; 重新修改 请按2:  \n"); 
  		scanf("%d",&b);
 	}while(b==2);
   	printf("\n");
   	save(m);
   	display();
   	printf("\n按1 继续修改 ,不再修改请按0\n");
   	scanf("%d",&t);
   	switch(t)
 	{
    	case 1:modify();break;
    	case 0:break;
    	default :break;
 	}
}



void sta()//统计函数
{
 
 	int i,sum=0,suma=0,sumb=0,sumc=0,sumd=0,sume=0;
 	int m=load();
 	system("cls");
 	printf("职工号    姓名   基本工资  职务工资   津贴    医疗保险  公积金   总工资 \n");
 	for(i=0;i<m;i++) /*m为输入部分的职工人数*/
 	{
	 	printf("\n  %02d      %-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;//计算员工总工资之和
 	  	suma+=em[i].jbgz;
 	  	sumb+=em[i].zwgz;
 	  	sumc+=em[i].jt;
 	  	sumd+=em[i].yb;
 	  	sume+=em[i].gjj;
	}
  	printf("\n\n职工各项平均工资: %-8d  %-8d  %-8d  %-8d %-8d%-8d \n",suma/m,sumb/m,sumc/m,sumd/m,sume/m,sum/m);
}



int main()//主函数
{   
	start();
	getch();
 	menu();  
}

请添加图片描述

大家可以点个关注后续会持续更新0.0(在此先谢过各位了)

  • 34
    点赞
  • 155
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kui954

感谢各位的支持o(* ̄3 ̄)o

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值