C语言及程序设计 课程设计报告
一、题目内容描述
8、输入10个员工的信息,每个员工含有成员名为“工号、姓名、基本工资、补贴、奖金、水电费、房租、实发工资、工资排名”,分别编写六个函数求:
(1)输入一个员工的工号,查询该员工的信息并输出,若不存在显示没找到。 (2)输入一个新员工的信息,按工号顺序将该员工的信息插入后输出。 (3)输入一个已存在员工的姓名信息,删除该员工的信息后输出。
(4)求每个员工的实发工资(实发工资=基本工资+补贴+奖金-水电费-房租); (5)求所有员工的基本工资、补贴、奖金、水电费、房租和实发工资的总和并输出;
(6)对所有员工的信息按实发工资升序排序,并填写工资排名后输出; 要求:
10个员工的数据用文件存储,每个员工的结构体用数组和单链表。当程序执行后先显示“菜单”,当输入为1时,执行第(1)个函数;当输入为2时,执行第(2)个函数;当输入为3时,执行第(3)个函数;当输入为4时,执行第(4)个函数;当输入为5时,执行第(5)个函数;当输入为6时,执行第(6)个函数;当输入为7时,退出系统,当输入其他数字时,提示输入有错误。
二、应用程序功能的详细说明
此应用程序为员工管理系统,通过文本文件读入信息并通过多种功能实现用户所需。具体功能如下:
(1)通过工号查询到此员工的全部数据。
(2)输出新员工的信息可以按工号顺序插入并输出所有数据。
(3)输入员工的名字可以得到删除此员工所有数据后的信息。 (4)得到所有员工的实得工资。 (5)得到员工各项信息的数据总和。
(6)将所有员工按实得工资升序排列并排名。
三、输入数据类型,格式和内容
数组版:
struct yuangong //定义员工结构体
{ int gonghao; //工号 char name[10]; //名字 int gongzi; //基本工资 int buti; //补贴 int jiangjin; //奖金 int shuidian; //水电费 int fangzu; //房租 }xinxi[20]; 链表版:
struct yuangong 义员工结构体 {
int gonghao; //定//工号
char name[10]; //名字 int gongzi; //基本
工资 int butie; //补贴 int jiangjin; //奖金 int shuidian; int fangzu;
int realmoney; 工资
struct yuangong *next; 下一个结构体的指针 };
四、程序源代码清单
数组版:
// 课程设计数组.cpp : 定义控制台应用程序的入口点。 //
#include \"stdafx.h\" #include jmp_buf fanhuizhi; 数 struct yuangong { //水电费 //房租 //实发 //指向 //定义一个跳跃用参//定义员工结构体 int gonghao; //工号 int gongzi; //基本工资 int butie; //补贴 int jiangjin; //奖金 int shuidian; //水电费 int fangzu; //房租 char name[10]; //名字 }xinxi[20]; void fanhuicaidan() //定义一个返回菜单的选择函数 { } void search(yuangong xinxi[]) //(1)查找员工信息函数 { 息 { printf(\"\\n\\\┌────────────────────────────printf(\"\\\│工号 姓名 基本工资 补贴 printf(\"\\\├─────────────────────────────printf(\"\\\│%-8d%-24s%-16d%-10d%-10d%-8d%-8d│\\n\", xinxi[i].gonghao, xinxi[i].name, xinxi[i].gongzi, xinxi[i].butie, int i,j=0,x; int h; begin1: //程序返回开始处 printf(\"请输入想要查询员工的工号:\"); scanf(\"%d\",&h); for (i = 0; i < 10; i++) //判断是否有此工号 { if (xinxi[i].gonghao==h) //如果找到文件中有此工号,输出信int x; printf(\"是否返回主菜单?是请按1,退出程序请按0并回车键确定:\"); scanf(\"%d\", &x); switch (x) { case 1:longjmp(fanhuizhi, 0); break; //如果选1则跳跃回case 0:exit(0); break; } setjmp处 ──────────────┐\\n\"); 奖金 水电 房租 │\\n\"); ─────────────┤\\n\"); xinxi[i].jiangjin, xinxi[i].shuidian, xinxi[i].fangzu); void add(yuangong xinxi[],int realmoney[]) //(2)添加员工信息函数 { if (xinren.gonghao < xinxi[0].gonghao) //小于第一个员工工号{ for (i = 10; i > 0; i--) { 时插入到第一个位置 int x,i,j,k,m; struct yuangong xinren; //定义新员工结构体 begin2: //程序返回开始处 printf(\"请以下次序输入新员工的信息\\n\"); printf(\"工号 姓名 基本工资 补贴 奖金 水电 房租\\n\");scanf(\"%d%s%d%d%d%d%d\",&xinren.gonghao, xinren.name, for (i = 0; i < 10; i++) //判断输入的新员工工{ } if (xinren.gonghao == xinxi[i].gonghao) { } printf(\"当前工号已存在,请检查后重新输入\\n\"); goto begin2; //如果工号已经存在, if(j==0) { } fanhuicaidan(); } printf(\"此员工不存在\\n\"); goto begin1; //若无此工号返回重 } } printf(\"\\\└─────────────────────────────j=1; ─────────────┘\\n\"); 新输入 &xinren.gongzi,&xinren.butie,&xinren.jiangjin,&xinren.shuidian,&xinren.fangzu); 号是否已经存在 返回到开始处重新输入 } } xinxi[i] = xinxi[i - 1]; xinxi[0] = xinren; if (xinren.gonghao > xinxi[9].gonghao) //大于最后一个员工工{ } for (j = 0; j < 10; j++) //找到新员工工号位于 printf(\"\\n\\\┌────────────────────────────────printf(\"\\\│工号 姓名 基本工资 补贴 奖金 printf(\"\\\├─────────────────────────────────for (i = 0; i < 11; i++) { printf(\"\\\│%-8d%-24s%-16d%-10d%-10d%-8d%-8d│\\n\", xinxi[i].gonghao, { } if (xinren.gonghao > xinxi[j].gonghao && xinren.gonghao < { } for (k = 10; k > j; k--) xinxi[k] = xinxi[k - 1]; xinxi[j + 1] = xinren; xinxi[10] = xinren; 号时插入到最后位置 哪两个之间 xinxi[j + 1].gonghao) ──────────┐\\n\"); 水电 房租 │\\n\"); ─────────┤\\n\"); xinxi[i].name, xinxi[i].gongzi, xinxi[i].butie, xinxi[i].jiangjin, xinxi[i].shuidian, xinxi[i].fangzu); } printf(\"\\\└─────────────────────────────────} ─────────┘\\n\"); void del(yuangong xinxi[]) //(3)删除员工信息函数 { if (m == 0) //通过m的{ } else { for(j=0;j<10;j++) if (strcmp(name, xinxi[j].name) == 0) { for (k = j; k < 9; k++) xinxi[k] = xinxi[k + 1]; printf(\"未找到此员工,请核实后重新输入\\n\"); goto begin3; //未找到员 值进行操作 int x,i,j,k,m=0; char name[20]; begin3: //程序返回printf(\"请输入要删除员工的名字:\"); scanf(\"%s\", name); for (i = 0; i < 10; i++) //判断文件{ } if (strcmp(name, xinxi[i].name) == 0) m = 1; 开始处 中有没有输入的名字并改变m的值 工,返回重新输入 } } printf(\"\\n\\\┌────────────────────────────────printf(\"\\\│工号 姓名 基本工资 补贴 奖金 printf(\"\\\├─────────────────────────────────for (i = 0; i < 9; i++) { printf(\"\\\│%-8d%-24s%-16d%-10d%-10d%-8d%-8d│\\n\", xinxi[i].gonghao, ──────────┐\\n\"); 水电 房租 │\\n\"); ─────────┤\\n\"); xinxi[i].name, xinxi[i].gongzi, xinxi[i].butie, xinxi[i].jiangjin, xinxi[i].shuidian, xinxi[i].fangzu); } printf(\"\\\└─────────────────────────────────} ─────────┘\\n\"); void real(yuangong xinxi[],int realmoney[]) //(4)计算实发工资函数 { } void all(yuangong xinxi[], int realmoney[]) //(5)求所有员工各项总和函数 { int x,allgongzi=0, allbutie=0,alljiangjin=0, allshuidian=0, allfangzu=0,allshifa=0,i; for (i = 0; i < 10; i++) { } printf(\"\\n\\\┌────────────────────────────────printf(\"\\\│总基本工资 总补贴 总奖金 总水电费 总房租 总printf(\"\\\├─────────────────────────────────printf(\"\\\│%-18d%-12d%-13d%-12d%-12d%-17d│ allgongzi = allgongzi + xinxi[i].gongzi; allbutie = allbutie + xinxi[i].butie; alljiangjin = alljiangjin + xinxi[i].jiangjin; allshuidian = allshuidian + xinxi[i].shuidian; allfangzu = allfangzu + xinxi[i].fangzu; allshifa = allshifa + realmoney[i]; int i,x; printf(\"\\n\\\┌────────────────┐\\n\"); printf(\"\\\│工号 姓名 实发工资 │\\n\"); printf(\"\\\├────────────────┤\\n\"); for(i=0;i<10;i++) printf(\"\\\│%-9d%-12s%-11d│\\n\", xinxi[i].gonghao, xinxi[i].name,realmoney[i]); printf(\"\\\└────────────────┘\\n\"); printf(\"是否返回主菜单?是请按1,退出程序请按0并回车键确定:\"); scanf(\"%d\", &x); switch (x) { case 1:longjmp(fanhuizhi, 0); break; case 0:exit(0); break; } ──────────┐\\n\"); 实发工资 │\\n\"); ─────────┤\\n\"); \\n\",allgongzi,allbutie,alljiangjin,allshuidian,allfangzu,allshifa); void rank(yuangong xinxi[], int realmoney[]) //(6)排序函数 { } printf(\"\\n\\\┌──────────────────────────────printf(\"\\\│工号 姓名 基本工资 补贴 奖金 水电 printf(\"\\\├───────────────────────────────for (i = 0; i < 10; i++) printf(\"\\\│%-8d%-14s%-16d%-10d%-10d%-8d%-14d%-14d%-6d│\\n\", xinxi[i].gonghao, xinxi[i].name, xinxi[i].gongzi, xinxi[i].butie, ────────────────────┐\\n\"); 房租 实发工资 实发工资排名│\\n\"); ───────────────────┤\\n\"); int i,x, j, k, t; struct yuangong change; //定义一个用for (i = 0; i < 9; i++) //通过冒泡法{ } for (j = 0; j < 9 - i; j++) if (realmoney[j] > realmoney[j + 1]) { } change = xinxi[j]; xinxi[j] = xinxi[j + 1]; xinxi[j + 1] = change; t = realmoney[j]; realmoney[j] = realmoney[j + 1]; realmoney[j + 1] = t; printf(\"\\\└─────────────────────────────────fanhuicaidan(); } ─────────┘\\n\"); 于交换的结构体 依据实发工资排序 xinxi[i].jiangjin, xinxi[i].shuidian, xinxi[i].fangzu, realmoney[i], i + 1); printf(\"\\\└───────────────────────────────fanhuicaidan(); ───────────────────┘\\n\"); void main() { int a,i,s=0; int realmoney[10]; //定义一个计算实FILE *fp; system(\"color 30\"); //更换背景为湖蓝fp = fopen(\"G://课程设计员工信息.txt\", \"r\"); printf(\"\\ ╭═════════■□■□═══╮\\n\"); //菜单界面 printf(\"\\│ 员工信息管理系统 │\\n\"); printf(\"\\╰═══■□■□══════════╯\\n\"); printf(\"\\ ┌─────────────—┐\\n\"); printf(\"\\ │ 1. 查询信息 2. 添加员工 │\\n\"); printf(\"\\ │ │\\n\"); printf(\"\\ │ 3. 删除信息 4. 实发工资 │\\n\"); printf(\"\\ │ │\\n\"); printf(\"\\ │ 5. 费用总和 6. 工资排名 │\\n\"); printf(\"\\ │ │\\n\"); printf(\"\\ │ 0. 退出程序 │\\n\"); printf(\"\\ └─────────────—┘\\n\"); if (setjmp(fanhuizhi)) //longjum跳到{ } { for (i = 0; i < 10; i++) fscanf(fp, \"%d%s%d%d%d%d%d\", &xinxi[i].gonghao, xinxi[i].name, fclose(fp); goto begin; 发工资的数组 色,字体为黑色 此处 &xinxi[i].gongzi, &xinxi[i].butie, &xinxi[i].jiangjin, &xinxi[i].shuidian, &xinxi[i].fangzu); for (i = 0; i < 10; i++) realmoney[i] = xinxi[i].gongzi + xinxi[i].jiangjin + xinxi[i].butie - xinxi[i].shuidian - xinxi[i].fangzu; //计算实发工资 begin: printf(\"\\请您选择(0-6):\"); scanf(\"%d\", &a); //序号选择 if (a >= 0 && a <= 6) //判断序号是 //程序返回开始处 否合法 } } system(\"pause\"); { } else { } printf(\"\\**请输入正确的功能序号**\\n\"); goto begin; //序号错误程switch (a) { case 0:exit(0); break; case 1:search(xinxi); system(\"pause\"); break; case 2:add(xinxi,realmoney); system(\"pause\"); break; case 3:del(xinxi); system(\"pause\"); break; case 4:real(xinxi, realmoney); system(\"pause\"); break; case 5:all(xinxi, realmoney); system(\"pause\"); break; case 6:rank(xinxi, realmoney); system(\"pause\"); break; } 序跳回输出序号处 链表版: // 课程设计链表.cpp : 定义控制台应用程序的入口点。 // #include \"stdafx.h\" #include #include #define LEN sizeof(struct yuangong) //宏定义 jmp_buf fanhuizhi; //定义跳跃用参数 struct yuangong //定义员工结构体 { int gonghao; //工号 char name[10]; //名字 int gongzi; //基本工资 }; int butie; //补贴 int jiangjin; //奖金 int shuidian; //水电费 int fangzu; //房租 int realmoney; //实发工资 struct yuangong *next; //指向下一个结构体的指针 void fanhuicaidan() //定义一个返回菜单的选择函数 { 处 } int n; struct yuangong *lianbiao() //创建链表函数 { struct yuangong *head; struct yuangong *p1, *p2; FILE *fp; fp = fopen(\"G://课程设计员工信息.txt\n = 0; p1 = p2 = (struct yuangong *)malloc(LEN); head = NULL; while (fscanf(fp, \"%d%s%d%d%d%d%d\&p1->gonghao, p1->name, &p1->gongzi, &p1->butie, { n = n + 1; if (n == 1) head = p1; p2->next = p1; else case 0:exit(0); break; } int x; printf(\"是否返回主菜单?是请按1,退出程序请按0并回车键确定:\"); scanf(\"%d\switch (x) { case 1:longjmp(fanhuizhi, 0); break; //如果选1则跳跃回setjmp &p1->jiangjin, &p1->shuidian, &p1->fangzu) == 7) //判断文件输入返回值是否为7并执行 } } p2 = p1; p1 = (struct yuangong*)malloc(LEN); p2->next = NULL; return(head); //函 数返回值为链表头指针 void printf(struct yuangong *head) { } void search(struct yuangong *head) //(1)查找员工信息函数 { struct yuangong *q; int i, j = 0; q= head; printf(\"请输入想要查询员工的工号:\"); scanf(\"%d\while (q!= NULL) { if (q->gonghao == i) struct yuangong *p; printf(\"员工信息为:\\n\"); p = head; printf(\"\\n\\\┌──────────────────────────────────printf(\"\\\│工号 姓名 基本工资 补贴 奖金 水电 printf(\"\\\├───────────────────────────────────if (head != NULL) do { printf(\"\\\│%-8d%-24s%-16d%-10d%-10d%-8d%-8d│\\n\p->gonghao, p->name, p = p->next; ────────┐\\n\"); 房租 │\\n\"); ───────┤\\n\"); p->gongzi, p->butie, p->jiangjin, p->shuidian, p->fangzu); } while (p != NULL); printf(\"\\\└───────────────────────────────── ─────────┘\\n\"); begin1: } } { } else q = q->next; printf(\"\\n\\\┌──────────────────────────────printf(\"\\\│工号 姓名 基本工资 补贴 奖金 printf(\"\\\├───────────────────────────────printf(\"\\\ │ %-8d%-24s%-16d%-10d%-10d%-8d%-8d │ ────────────┐\\n\"); 水电 房租 │\\n\"); ───────────┤\\n\"); \\n\ printf(\"\\\└───────────────────────────────j = 1; break; ───────────┘\\n\"); if (j == 0) { } fanhuicaidan(); printf(\"此员工不存在\\n\"); goto begin1; //若无此工号返回重新输入 void { add(struct yuangong *head,int realmoney[]) //(2)添加员工信息函数 struct yuangong *p1,*p2; yuangong *n = (yuangong *)malloc(LEN); p2 = head; begin2: //程序返回开始处 printf(\"请以下次序输入新员工的信息\\n\"); printf(\"工号 姓名 基本工资 补贴 奖金 水电 房租\\n\"); scanf(\"%d%s%d%d%d%d%d\while ((n->gonghao > p2->gonghao)&&(p2->next!=NULL)) { } p1 = p2; p2 = p2->next; an,&n->fangzu); if (n->gonghao <= p2->gonghao) { if (head == p2) { printf(\"当前工号已存在,请检查后重新输入\\n\"); head = n; else if (n->gonghao == p2->gonghao) goto begin2; } else p1->next = n; n->next = p2; } else { p2->next = n; n->next = NULL; } printf(head); fanhuicaidan(); } void del(struct //(3)删除员工信息函数 { struct yuangong *p1,*p2; yuangong *del= (yuangong *)malloc(LEN); begin3: p2 = head; printf(\"请输入要删除员工的名字:\"); scanf(\"%s\ while ((strcmp(del->name, p2->name) //找到要删除的名字位于那两个结点之间 { p1 = p2; p2 = p2->next; } if ((strcmp(del->name, p2->name) == 0)) { if (p2 //等于头地址的话说明要删除的结点位于第一个 head = p2->next; else yuangong 0) && == *head) NULL)) head) != (p2->next != } } p1->next = p2->next; //删除结点p2 else { } printf(head); fanhuicaidan(); printf(\"未找到此员工,请核实后重新输入\\n\"); goto begin3; //输出链表 void { } void { int i; real(struct yuangong *head, int realmoney[]) //(4)计算实发工资函数 printf(\"\\n\\\┌────────────────┐\\n\"); printf(\"\\\│工号 姓名 实发工资 │\\n\"); printf(\"\\\├────────────────┤\\n\"); for (i = 0; i < 10; i++) { } printf(\"\\\└────────────────┘\\n\"); fanhuicaidan(); printf(\"\\\│%-9d%-12s%-11d│\\n\head = head->next; all(struct yuangong *head, int realmoney[]) //(5)求所有员工各项总和函数 int x, allgongzi = 0, allbutie = 0, alljiangjin = 0, allshuidian = 0, allfangzu = 0, allshifa for (i = 0; i < 10; i++) { allgongzi = allgongzi + head->gongzi; allbutie = allbutie + head->butie; alljiangjin = alljiangjin + head->jiangjin; allshuidian = allshuidian + head->shuidian; allfangzu = allfangzu + head->fangzu; = 0, i; } } allshifa = allshifa + realmoney[i]; head = head->next; printf(\"\\n\\\┌──────────────────────────────────printf(\"\\\│总基本工资 总补贴 总奖金 总水电费 总房租 总实发printf(\"\\\├───────────────────────────────────printf(\"\\\│%-18d%-12d%-13d%-12d%-12d%-17d│\\n\allgongzi, allbutie, alljiangjin, printf(\"\\\└───────────────────────────────────fanhuicaidan(); ────────┐\\n\"); 工资 │\\n\"); ───────┤\\n\"); allshuidian, allfangzu, allshifa); ───────┘\\n\"); void { rank(struct yuangong *head, int realmoney[]) //(6)排序函数 int num,j=1; char str[256]; struct yuangong *p1, *p2, *real; real = (struct yuangong *)malloc(LEN); int i = 0; p1 = head; for (real = head; real!= NULL; real = real->next) //将主函数{ } for (p1; p1->next != NULL; p1 = p1->next) //开始冒泡{ for (p2 = p1->next; p2 != NULL; p2 = p2->next) { if (p1->realmoney > p2->realmoney) { num = p1->gonghao; //交换结p1->gonghao = p2->gonghao; p2->gonghao = num; real->realmoney = realmoney[i]; i = i + 1; 中计算的实发工资赋值到链表中 排序 点元素 } } } strcpy(str, p1->name); strcpy(p1->name, p2->name); strcpy(p2->name, str); num = p1->gongzi; p1->gongzi = p2->gongzi; p2->gongzi = num; num = p1->butie; p1->butie = p2->butie; p2->butie = num; num = p1->jiangjin; p1->jiangjin = p2->jiangjin; p2->jiangjin = num; num = p1->shuidian; p1->shuidian = p2->shuidian; p2->shuidian = num; num = p1->fangzu; p1->fangzu = p2->fangzu; p2->fangzu = num; num = p1->realmoney; p1->realmoney = p2->realmoney; p2->realmoney = num; printf(\"\\n\\\┌──────────────────────────────────printf(\"\\\│工号 姓名 基本工资 补贴 奖金 水电 房租 printf(\"\\\├───────────────────────────────────while (head!= NULL) { printf(\"\\\│%-8d%-14s%-16d%-10d%-10d%-8d%-14d%-14d%-6d│\\n\head->gonghao, ────────────────┐\\n\"); 实发工资 实发工资排名│\\n\"); ───────────────┤\\n\"); head->name, head->gongzi, head->butie, head->jiangjin, head->shuidian, head->fangzu, head->realmoney,j); } } printf(\"\\\└───────────────────────────────────fanhuicaidan(); head = head->next; j = j + 1; ───────────────┘\\n\"); void main() { 法 { switch (a) { case 0:exit(0); break; case 1:search(lianbiao()); system(\"pause\"); break; case 2:add(lianbiao(), realmoney); system(\"pause\"); break; int a, i, j, s = 0; int realmoney[10]; //定义一个计算实发工struct yuangong *head; FILE *fp; system(\"color 30\"); //更换背景为湖蓝色,fp = fopen(\"G://课程设计员工信息.txt\ printf(\"\\ ╭═════════■□■□═══╮\\n\"); //菜单界面 printf(\"\\│ 员工信息管理系统 │\\n\"); printf(\"\\╰═══■□■□══════════╯\\n\"); printf(\"\\ ┌─────────────—┐\\n\"); printf(\"\\ │ 1. 查询信息 2. 添加员工 │\\n\"); printf(\"\\ │ │\\n\"); printf(\"\\ │ 3. 删除信息 4. 实发工资 │\\n\"); printf(\"\\ │ │\\n\"); printf(\"\\ │ 5. 费用总和 6. 工资排名 │\\n\"); printf(\"\\ │ │\\n\"); printf(\"\\ │ 0. 退出程序 │\\n\"); printf(\"\\ └─────────────—┘\\n\"); if (setjmp(fanhuizhi)) //longjum跳到此处 { head = lianbiao(); for (j = 0; j < 10; j++) { } printf(\"\\ 请 您 选 择 realmoney[j] = head->gongzi + head->butie + head->jiangjin - head->shuidian - head = head->next; goto begin; 资的数组 字体为黑色 head->fangzu; //计算实发工资 begin: (0-6):\"); //程序返回开始处 scanf(\"%d\序号选择 if (a >= 0 && a <= 6) //判断序号是否合 case 3:del(lianbiao()), system(\"pause\"); break; case 4:real(lianbiao(), realmoney); system(\"pause\"); break; case 5:all(lianbiao(), realmoney); system(\"pause\"); break; case 6:rank(lianbiao(), realmoney); system(\"pause\"); break; } } else { printf(\"\\**请输入正确的功能序号**\\n\"); goto begin; //回输出序号处 } } system(\"pause\"); } 序号错误程序跳 因篇幅问题不能全部显示,请点此查看更多更全内容