中南大学C语言课程设计之职工工资管理系统

中南大学C语言课程设计之职工工资管理系统

题目:

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

void input();
void menu();
void display(); 
void change();
void search();
void dele();
void count();
void load();
int n;

struct emploee
{
	int id;//ID号 
	char xm[6];//姓名 
	int jb;//基本工资
	int zw;//职务工资 
	int gw;//岗位津贴 
	int yl;//医疗保险 
	int gj;//公积金 
	int zg;//总工资 
}emp[NUM]; 

void showstyle()
{
	system("title 职工工资管理系统");
	system("mode con cols=80 lines=30");
	system("color f0");
}

int main()
{
	showstyle();
	menu();
}

void menu()//主界面
{
	int n;
	do{
		printf("************* 职工工资管理系统 **********\n");
        printf("*            1-----输入信息             *\n");
        printf("*            2-----显示信息             *\n");
        printf("*            3-----修改信息             *\n");
        printf("*            4-----查找信息             *\n");
        printf("*            5-----删除信息             *\n");
        printf("*            6-----统计信息             *\n");
        printf("*            7-----保存信息             *\n");
        printf("*            8-----退出程序             *\n");
        printf("*****************************************\n");
        printf("            输入您的选择(1-8):[ ]\b\b");
        scanf("%d", &n);
        switch (n){
           case 1:input();   break;//输入 
           case 2:display(); break;//显示
           case 3:change();  break;//修改
           case 4:search();  break;//查找
           case 5:dele();    break;//删除
           case 6:count();   break;//统计     
           case 7:load();    break;//保存   
           case 8:return 0;//退出 
           default:printf("Illegal\n");
           } 
    }while (1);
    
 }
 
void input()
{
 	int n,i;
	FILE* fp;
    if ((fp = fopen("emp.txt", "w")) == NULL)
    {

        printf("wrong\n");
        exit(1);
    }
    printf("输入职工人数:");
    scanf("%d", &n);
    printf("输入格式: ID号 姓名 基本工资 职务工资 岗位津贴 医疗保险 公积金 \n");
    for(i = 0; i < n; i++)   /*  循环获取n个职工记录 */
    {
        printf("第%d个职工:", i + 1);
        scanf("%d%s%d%d%d%d%d",&emp[i].id,&emp[i].xm,&emp[i].jb,&emp[i].zw,&emp[i].gw,&emp[i].yl,&emp[i].gj);
        emp[i].zg = emp[i].jb + emp[i].zw + emp[i].gw - emp[i].yl - emp[i].gj;
    }
    for(i = 0; i < n; i++)      /*将n个职工记录写入文件*/
        fwrite(&emp[i], sizeof(struct emploee), 1, fp);
    fclose(fp);
}

void display()
{
    int i;
    FILE* fp;
    if ((fp = fopen("emp.txt", "r")) == NULL)
    {
        printf("wrong\n");
        exit(1);
    }
    printf("序号 ID号 姓名 基本工资 职务工资 岗位津贴 医疗保险 公积金 总工资\n");
    for (i = 0; fread(&emp[i], sizeof(struct emploee), 1, fp) != 0; i++)
    {
        printf("%-6d%-6d%-6s%-6d%-6d%-6d%-6d%-6d%-6d\n", i + 1, emp[i].id,emp[i].xm,emp[i].jb,
		emp[i].zw,emp[i].gw,emp[i].yl,emp[i].gj,emp[i].zg);
    }
    fclose(fp);	
 } 

void change()
{
    FILE* fp;
    int i, j;
    int num;
    if ((fp = fopen("emp.txt", "r+")) == NULL)
    {
        printf("wrong\n");
        exit(1);
    }
    printf("要修改的ID号:");
    scanf("%d",&num);
    for (i = 0; fread(&emp[i], sizeof(struct emploee), 1, fp); i++)
       if (emp[i].id==num)break;
    if (feof(fp))
    {
        printf("\t没有%dID号的职工\n", num);
        exit(2);
    }
    printf("序号 ID号 姓名 基本工资 职务工资 岗位津贴 医疗保险 公积金 总工资\n");
    printf("%-6d%-6d%-6s%-6d%-6d%-6d%-6d%-6d%-6d\n", i + 1, emp[i].id,emp[i].xm,emp[i].jb,
		emp[i].zw,emp[i].gw,emp[i].yl,emp[i].gj,emp[i].zg);
    printf("输入格式: ID号 姓名 基本工资 职务工资 岗位津贴 医疗保险 公积金 \n");
    printf("第%d个记录:", i + 1);
    scanf("%d%s%d%d%d%d%d",&emp[i].id,&emp[i].xm,&emp[i].jb,&emp[i].zw,&emp[i].gw,&emp[i].yl,&emp[i].gj);//获取新的职工记录
    emp[i].zg = emp[i].jb + emp[i].zw + emp[i].gw - emp[i].yl - emp[i].gj;
    fseek(fp, -(long)sizeof(struct emploee), SEEK_CUR);
	fwrite(&emp[i], sizeof(struct emploee), 1, fp);
    fclose(fp);
    if ((fp = fopen("emp.txt", "r+")) == NULL)
    {
        printf("wrong\n");
        exit(1);
    }
    printf(" 修改后:\n");
    printf("序号 ID号 姓名 基本工资 职务工资 岗位津贴 医疗保险 公积金 总工资\n");
    for (i = 0; fread(&emp[i], sizeof(struct emploee), 1, fp) != 0; i++)
    {
        printf("%-6d%-6d%-6s%-6d%-6d%-6d%-6d%-6d%-6d\n", i + 1, emp[i].id,emp[i].xm,emp[i].jb,
		emp[i].zw,emp[i].gw,emp[i].yl,emp[i].gj,emp[i].zg);
    }
	fclose(fp);
}

void search()
{
    FILE* fp;
    int i, j;
    int num;
    if ((fp = fopen("emp.txt", "r")) == NULL)
    {
        printf("wrong\n");
        exit(1);
    }
    printf("要查找的ID号:");
    scanf("%d",&num);
    for (i = 0; fread(&emp[i], sizeof(struct emploee), 1, fp); i++)
        if (emp[i].id==num)break;
    if (feof(fp))
    {
        printf("\t没有%dID号的职工\n", num);
        exit(2);
    }
    printf("序号 ID号 姓名 基本工资 职务工资 岗位津贴 医疗保险 公积金 总工资\n");
    printf("%-6d%-6d%-6s%-6d%-6d%-6d%-6d%-6d%-6d\n", i + 1, emp[i].id,emp[i].xm,emp[i].jb,
		emp[i].zw,emp[i].gw,emp[i].yl,emp[i].gj,emp[i].zg);
	fclose(fp);
}

void dele()//此函数错误,仅供参考,可搜集网上的其他借鉴借鉴
{
    FILE* fp;
    int i, j, n;
    int num;
    if ((fp = fopen("emp.txt", "r+")) == NULL)
    {
        printf("wrong\n");
        exit(1);
    }
    printf("删除前:\n");
	display(); 

    printf("要删除的ID号:");
    scanf("%d", &num);

    for (i = 0; (emp[i].id!=num) && (i < n); i++)
        if (i >= n)
        {
            printf("\t没有%dID号的职工\n", num);
            exit(2);
        }
    
    for (j = 0; j < i; j++)
        fwrite(&emp[j], sizeof(struct emploee), 1, fp);
    for (j = i + 1; j < n; j++)
        fwrite(&emp[j], sizeof(struct emploee), 1, fp);
    printf("删除后:\n");
    printf("序号 ID号 姓名 基本工资 职务工资 岗位津贴 医疗保险 公积金 总工资\n");
    for (i = 0; fread(&emp[i], sizeof(struct emploee), 1, fp); i++)
        printf("%-6d%-6d%-6s%-6d%-6d%-6d%-6d%-6d%-6d\n", i + 1, emp[i].id,emp[i].xm,emp[i].jb,
		emp[i].zw,emp[i].gw,emp[i].yl,emp[i].gj,emp[i].zg);
    fclose(fp);
}



void count()//统计 
{
    FILE* fp;
    int i, num;
    if ((fp = fopen("emp.txt", "r")) == NULL)
    {
        printf("wrong\n");
        exit(1);
    }
    printf("请输入工资数:");
    scanf("%d", &num);
    printf("序号 ID号 姓名 基本工资 职务工资 岗位津贴 医疗保险 公积金 总工资\n");
    for (i = 0; fread(&emp[i], sizeof(struct emploee), 1, fp) != 0; i++)
        if (emp[i].zg >= num)
            printf("%-6d%-6d%-6s%-6d%-6d%-6d%-6d%-6d%-6d\n", i + 1, emp[i].id,emp[i].xm,emp[i].jb,
		emp[i].zw,emp[i].gw,emp[i].yl,emp[i].gj,emp[i].zg);
    fclose(fp);
}

void load()          //加载记录或可以计算记录个数的函数
{
    FILE* fp;
    int i, w;
    w = 1;
    if ((fp = fopen("emp.txt", "r")) == NULL)      //以输出打开方式,在此前的记录被覆盖
    {
        printf("\nCannot open file\n");
        w = 0;
        return;
    }
    n = 0;
    for (i = 0; !feof(fp); i++)
    {
        fread(&emp[i], sizeof(struct emploee), 1, fp);
        n++;
    }
    n = n - 1;
    fclose(fp);
    if (w == 1)
    {
        printf("Load file ok!\n");
        getchar();
        menu();
    }
}

本题仅供参考,其中有一些错误未能及时更正,如有异议希望能够提出。

posted @ 2023-11-29 00:36  愛摸鱼的猫  阅读(161)  评论(0)    收藏  举报