您的当前位置:首页正文

C语言课程设计

2020-03-31 来源:爱go旅游网


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 #include #include #include #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 #include #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\");

}

序号错误程序跳

因篇幅问题不能全部显示,请点此查看更多更全内容