求C++编程的的工资管理系统源代码 小型的 交给老师的

求C++编程的的工资管理系统源代码 小型的 交给老师的,第1张

#include <stdio.h>

#include <stdlib.h>

#include <malloc.h>

#include <string.h>

#include <conio.h>

#define TITLE "\n 月份 工号 姓名 应发工资 各种折扣 实发工资\n"

#define DATA " %2d %4ld %-10s %6.1f %6.1f %6.1f\n",p1->month,p1->num,p1->name,p1->should_pay,p1->rebate,p1->actual_pay

typedef struct pay

{

long num

short month

char name[20]

float gw,jn,zw,zl,jt,yj

float should_pay

float fz,gj,sd,others

float rebate

float actual_pay

struct pay *next

}PAY

FILE *fp

PAY *p1=NULL,*p2=NULL,*head=NULL

void menu()

PAY *input()

void output()

void save(PAY *head)

PAY *open()

PAY *insert()

void search()

PAY *del()

PAY *revise()

/*主程序模块*/

void main(void)

{

short sel

do

{

menu()

scanf("%d",&sel)

switch(sel)

{

case 1:

head=input() //输入模块

break

case 2:

head=insert() //插入模块

break

case 3:

head=revise() //修改模块

break

case 4:

head=del() //删除模块

break

case 5:

search() //查找模块

break

case 6:

output() //输出模块

break

case 7:

save(head) //保存模块

break

case 0:

break

}

}while(sel!=0)

}

/*菜单*/

void menu()

{

printf("\n\n\n\n\n\n\n")

printf("\t\t\t\t *主菜单选项*\n\n")

printf("\t\t\t\t1.创建工资档案\n")

printf("\t\t\t\t2.新增工资信息\n")

printf("\t\t\t\t3.修改工资信息\n")

printf("\t\t\t\t4.删除工资信息\n")

printf("\t\t\t\t5.查找工资信息\n")

printf("\t\t\t\t6.分类信息列表\n")

printf("\t\t\t\t7.保 存 信 息\n")

printf("\t\t\t\t0.退出\n")

printf("\n\n\n\n\n\n\n\n")

}

/*输入模块*/

PAY *input()

{

short n=1

p1=(PAY*)malloc(sizeof(PAY))

if(p1==NULL)

{

printf("内存不足,无法创建链表!")

getch()

}

printf("\n请输入第%d位职工的信息(以工号为0结束):\n",n)

printf("工号:")

scanf("%d",&p1->num)

if(p1->num==0)

{

printf("按任意键返回!")

getch()

free(p1)

return 0

}

getchar()

printf("姓名:")

gets(p1->name)

printf("工资月份:")

scanf("%d",&p1->month)

printf("岗位工资,技能工资,职务津贴,职龄津贴,交通补贴,业绩津贴:\n")

scanf("%f,%f,%f,%f,%f,%f",&p1->gw,&p1->jn,&p1->zw,&p1->zl,&p1->jt,&p1->yj)

printf("房租扣款,公积金,水电费,其它扣款:\n")

scanf("%f,%f,%f,%f",&p1->fz,&p1->gj,&p1->sd,&p1->others)

p1->should_pay=p1->gw+p1->jn+p1->zw+p1->zl+p1->jt+p1->yj

p1->rebate=p1->fz+p1->gj+p1->sd+p1->others

p1->actual_pay=p1->should_pay-p1->rebate

while(p1!=NULL)

{

if(n==1)

head=p1

else

p2->next=p1

n++

p2=p1

p1=(PAY*)malloc(sizeof(PAY))

if(p1==NULL)

{

printf("内存不足,无法创建链表!")

getch()

}

printf("请输入第%d位职工的信息(以工号为0结束):\n",n)

printf("工号:")

scanf("%d",&p1->num)

getchar()

if(p1->num==0)

{

p1=NULL

break

}

printf("姓名:")

gets(p1->name)

printf("工资月份:")

scanf("%d",&p1->month)

printf("岗位工资,技能工资,职务津贴,职龄津贴,交通补贴,业绩津贴:\n")

scanf("%f,%f,%f,%f,%f,%f",&p1->gw,&p1->jn,&p1->zw,&p1->zl,&p1->jt,&p1->yj)

printf("房租扣款,公积金,水电费,其它扣款:\n")

scanf("%f,%f,%f,%f",&p1->fz,&p1->gj,&p1->sd,&p1->others)

p1->should_pay=p1->gw+p1->jn+p1->zw+p1->zl+p1->jt+p1->yj

p1->rebate=p1->fz+p1->gj+p1->sd+p1->others

p1->actual_pay=p1->should_pay-p1->rebate

}

p2->next=NULL

//edit by Yan-Xingyu Class Network-021

printf("职工信息已输入,请按任意键返回,并存盘……")

getch()

return head

}

/*输出模块*/

void output()

{

short sel,flag,month

float min,max

do

{

do

{

printf("\n\n请选择您的列表方式:\n")

printf("\t\t1.全部清单\n")

printf("\t\t2.按月输出\n")

printf("\t\t3.按工资段输出\n")

printf("\t\t0.返回\n")

scanf("%d",&sel)

}while(sel!=1&&sel!=2&&sel!=3&&sel!=0)

head=open()

if(head==NULL)

return

else

switch(sel)

{

case 1:

printf("\n\t\t\t******全部清单******\n")

printf(TITLE)

p1=head

do

{

printf(DATA)

p1=p1->next

}while(p1!=NULL)

break

case 2:

flag=0

printf("输入要查的月份:")

scanf("%d",&month)

printf("\n\t\t\t******第%d月工资清单******\n",month)

printf(TITLE)

p1=head

do

{

if(p1->month==month)

{

printf(DATA)

p1=p1->next

flag=1

}

else

p1=p1->next

}while(p1!=NULL)

if(flag==0)

printf("没有该月清单\n")

break

case 3:

flag=0

printf("输入最低工资:")

scanf("%f",&min)

printf("输入最高工资:")

scanf("%f",&max)

printf("\n\t\t ******%5.1f到%5.1f工资的名单******\n",min,max)

printf(TITLE)

p1=head

do

{

if(p1->actual_pay>min&&p1->actual_pay<max)

{

printf(DATA)

p1=p1->next

flag=1

}

else

p1=p1->next

}while(p1!=NULL)

if(flag==0)

printf("没有该工资段的职工\n")

break

case 0:

break

}

}while(sel!=0)

}

/*保存文件*/

void save(PAY *head)

{

short write

fp=fopen("pay.txt","w")

if(fp==NULL)

{

printf("创建文件失败!")

getch()

return

}

p1=p2=head

while(p1!=NULL)

{

write=fwrite(p1,sizeof(PAY),1,fp)

if(!write)

{

printf("无法写入文件!")

getch()

return

}

p1=p1->next

}

fclose(fp)

printf("成功存盘!")

getch()

}

/*打开文件*/

PAY *open()

{

short n=1,read

fp=fopen("pay.txt","r")

if(fp==NULL)

{

printf("无法打开档案文件!")

getch()

return NULL

}

if((p1=p2=(PAY*)malloc(sizeof(PAY)))==NULL)

{

printf("内存不足!")

getch()

return NULL

}

read=fread(p1,sizeof(PAY),1,fp)

if(!read)

{

printf("文件读取出错!1")

getch()

return NULL

}

if(p1->next==NULL)

head=p1

else

{

do

{

if(n==1)

head=p1

else

p2->next=p1

n++

p2=p1

if((p1=(PAY*)malloc(sizeof(PAY)))==NULL)

{

printf("内存不足!")

getch()

return NULL

}

read=fread(p1,sizeof(PAY),1,fp)

if(!read)

{

printf("文件读取出错!2")

getch()

return NULL

}

}while(p1->next!=NULL)

p2->next=p1

}

return head

fclose(fp)

}

/*插入模块*/

PAY *insert()

{

PAY *p3=NULL

char sel

head=open()

if(head==NULL)

return NULL

else

do

{

printf("请输入要插入的职工信息:\n")

p3=(PAY*)malloc(sizeof(PAY))

if(p3==NULL)

{

printf("内存不足,无法创建链表!")

getch()

}

printf("工号:")

scanf("%d",&p3->num)

getchar()

printf("姓名:")

gets(p3->name)

printf("工资月份:")

scanf("%d",&p3->month)

printf("岗位工资,技能工资,职务津贴,职龄津贴,交通补贴,业绩津贴:\n")

scanf("%f,%f,%f,%f,%f,%f",&p3->gw,&p3->jn,&p3->zw,&p3->zl,&p3->jt,&p3->yj)

printf("房租扣款,公积金,水电费,其它扣款:\n")

scanf("%f,%f,%f,%f",&p3->fz,&p3->gj,&p3->sd,&p3->others)

p3->should_pay=p3->gw+p3->jn+p3->zw+p3->zl+p3->jt+p3->yj

p3->rebate=p3->fz+p3->gj+p3->sd+p3->others

p3->actual_pay=p3->should_pay-p3->rebate

p1=head

while(p1!=NULL)

{

p2=p1

p1=p1->next

}

p2->next=p3

p3->next=NULL

printf("成功插入,是否继续?是(Y) 否(N)\n")

sel=getch()

}while(sel=='Y'||sel=='y')

printf("\n任意键返回,并存盘……\n")

getch()

return head

}

/*查找模块*/

void search()

{

short sel

long num

char name[20],choose

head=open()

if(head==NULL)

return

else

do

{

do

{

printf("\n选择查找方式:\n")

printf("\t\t1.按工号查找\n")

printf("\t\t2.按姓名查找\n")

scanf("%d",&sel)

getchar()

}while(sel!=1&&sel!=2)

switch(sel)

{

case 1:

printf("输入要查的工号:")

scanf("%ld",&num)

break

case 2:

printf("输入要查的姓名:")

gets(name)

break

}

p1=head

while((p1->next!=NULL)&&(p1->num!=num)&&(strcmp(p1->name,name)!=0)) //用成p1!=NULL有问题?

p1=p1->next

if((p1->num==num)||strcmp(p1->name,name)==0)

{

printf("您要查找的信息如下:\n")

printf(TITLE)

printf(DATA)

}

else

printf("没有该信息!\n")

printf("是否继续?是(Y) 否(N)\n")

choose=getch()

}while(choose=='Y'||choose=='y')

printf("任意键返回")

getch()

}

/*删除模块*/

PAY *del()

{

short sel

long num

char name[20],choose

head=open()

if(head==NULL)

return NULL

else

do

{

do

{

printf("\n选择删除方式:\n")

printf("\t\t1.按工号删除\n")

printf("\t\t2.按姓名删除\n")

scanf("%d",&sel)

getchar()

}while(sel!=1&&sel!=2)

switch(sel)

{

case 1:

printf("输入要删除的工号:")

scanf("%ld",&num)

break

case 2:

printf("输入要删除的姓名:")

gets(name)

break

}

p1=head

if((p1->num==num)||strcmp(p1->name,name)==0)

{

head=p1->next

printf("删除信息成功!")

}

else

{

while((p1->next!=NULL)&&(p1->num!=num)&&(strcmp(p1->name,name)!=0))

{

p2=p1

p1=p1->next

}

if((p1->num==num)||strcmp(p1->name,name)==0)

{

p2->next=p1->next

free(p1)

printf("\n删除信息成功!\n")

}

else

printf("\n没有该信息!\n")

}

printf("是否继续?是(Y) 否(N)\n")

choose=getch()

}while(choose=='Y'||choose=='y')

printf("任意键返回,并存盘……")

getch()

return head

}

/*修改模块*/

PAY *revise()

{

short sel

long num

char name[20],choose

head=open()

if(head==NULL)

return NULL

else

do

{

do

{

printf("\n查找要修改的对象:\n")

printf("\t\t1.按工号查找\n")

printf("\t\t2.按姓名查找\n")

scanf("%d",&sel)

getchar()

}while(sel!=1&&sel!=2)

switch(sel)

{

case 1:

printf("输入要查的工号:")

scanf("%ld",&num)

break

case 2:

printf("输入要查的姓名:")

gets(name)

break

}

p1=head

while((p1->next!=NULL)&&(p1->num!=num)&&(strcmp(p1->name,name)!=0)) //用成p1!=NULL有问题?

p1=p1->next

if((p1->num==num)||strcmp(p1->name,name)==0)

{

printf("您要修改的原始信息如下:\n")

printf(TITLE)

printf(DATA)

printf("\n将上述信息改为如下信息:\n")

printf("工号:")

scanf("%d",&p1->num)

getchar()

printf("姓名:")

gets(p1->name)

printf("工资月份:")

scanf("%d",&p1->month)

printf("岗位工资,技能工资,职务津贴,职龄津贴,交通补贴,业绩津贴:\n")

scanf("%f,%f,%f,%f,%f,%f",&p1->gw,&p1->jn,&p1->zw,&p1->zl,&p1->jt,&p1->yj)

printf("房租扣款,公积金,水电费,其它扣款:\n")

scanf("%f,%f,%f,%f",&p1->fz,&p1->gj,&p1->sd,&p1->others)

p1->should_pay=p1->gw+p1->jn+p1->zw+p1->zl+p1->jt+p1->yj

p1->rebate=p1->fz+p1->gj+p1->sd+p1->others

p1->actual_pay=p1->should_pay-p1->rebate

}

else

printf("你要修改的信息不存在!\n")

printf("是否继续?是(Y) 否(N)\n")

choose=getch()

}while(choose=='Y'||choose=='y')

printf("任意键返回,并存盘……")

getch()

return head

}

#include <stdio.h>

#include <string.h>

#include <ctype.h>

#include <stdlib.h>

#define MONTH_NUM 5 /* 最多的月份 */

struct worker

{

int number /* 每个工人的工号 */

char name[15]/* 每个工人的姓名 */

int salary[MONTH_NUM] /* 每个工人M月的工资 */

int sum /* 每个工人的总工资 */

float average /* 每个工人的平均工资 */

struct worker *next

}

typedef struct worker STU

char Menu(void)

int Ascending(int a, int b)

int Descending(int a, int b)

void IntSwap(int *pt1, int *pt2)

void CharSwap(char *pt1, char *pt2)

void FloatSwap(float *pt1, float *pt2)

STU *AppendNode(STU *head, const int m)

STU *DeleteNode(STU *head, int nodeNum)

STU *ModifyNode(STU *head, int nodeNum, const int m)

STU *SearchNode(STU *head, int nodeNum)

STU *Appendsalary(STU *head, const int m)

void Totalsalary(STU *head, const int m)

void Printsalary(STU *head, const int m)

STU *Deletesalary(STU *head, const int m)

void Modifysalary(STU *head, const int m)

void Sortsalary(STU *head, const int m, int (*compare)(int a, int b))

void Searchsalary(STU *head, const int m)

void DeleteMemory(STU *head)

main()

{

char ch

int m

STU *head = NULL

printf("输入要记录的月份(m<10):")

scanf("%d", &m)

while (1)

{

ch = Menu()

switch (ch)

{

case'1':head = Appendsalary(head, m)

Totalsalary(head, m)

break

case'2':Printsalary(head, m)

break

case'3':head = Deletesalary(head, m)

printf("\nAfter deleted\n")

Printsalary(head, m)

break

case'4':Modifysalary(head, m)

Totalsalary(head, m)

printf("\nAfter modified\n")

Printsalary(head, m)

break

case'5':Searchsalary(head, m)

break

case'6':Sortsalary(head, m, Descending)

printf("\nsorted in descending order by sum\n")

Printsalary(head, m)

break

case'7':Sortsalary(head, m, Ascending)

printf("\nsorted in ascending order by sum\n")

Printsalary(head, m)

break

case'0':exit(0)

DeleteMemory(head)

printf("End of program!")

break

default:printf("Input error!")

break

}

}

}

char Menu(void)

{

char ch

printf("\n管理工人的工资\n")

printf(" 1.添加记录\n")

printf(" 2.列出记录\n")

printf(" 3.删除记录\n")

printf(" 4.修改记录\n")

printf(" 5.查找记录\n")

printf(" 6.降序排列\n")

printf(" 7.升序排列\n")

printf(" 0.退出\n")

printf("请输入你的选择:")

scanf(" %c", &ch)/*在%c前面加一个空格,将存于缓冲区中的回车符读入*/

return ch

}

STU *Appendsalary(STU *head, const int m)

{

int i = 0

char c

do{

head = AppendNode(head, m) /*向链表末尾添加一个节点*/

printf("你想添加一个新的记录吗(Y/N)?")

scanf(" %c",&c) /*%c前面有一个空格*/

i++

}while (c=='Y' || c=='y')

printf("%d new nodes have been apended!\n", i)

return head

}

STU *Deletesalary(STU *head, const int m)

{

int i = 0, nodeNum

char c

do{

printf("请输入你想删除的记录编号:")

scanf("%d", &nodeNum)

head = DeleteNode(head, nodeNum)/*删除工号为nodeNum的工人信息*/

Printsalary(head, m) /*显示当前链表中的各节点信息*/

printf("Do you want to delete a node(Y/N)?")

scanf(" %c",&c)/*%c前面有一个空格*/

i++

}while (c=='Y' || c=='y')

printf("%d nodes have been deleted!\n", i)

return head

}

void Modifysalary(STU *head, const int m)

{

int i = 0, nodeNum

char c

do{

printf("请输入你想修改的记录编号:")

scanf("%d", &nodeNum)

head = ModifyNode(head, nodeNum, m) /*修改工号为nodeNum的节点*/

printf("Do you want to modify a node(Y/N)?")

scanf(" %c",&c) /*%c前面有一个空格*/

i++

}while (c=='Y' || c=='y')

printf("%d nodes have been modified!\n", i)

}

void Totalsalary(STU *head, const int m)

{

STU *p = head

int i

while (p != NULL) /*若不是表尾,则循环*/

{

p->sum = 0

for (i=0i<mi++)

{

p->sum += p->salary[i]

}

p->average = (float)p->sum / m

p = p->next /*让p指向下一个节点*/

}

}

void Sortsalary(STU *head, const int m, int (*compare)(int a, int b))

{

STU *pt

int flag = 0, i

do{

flag = 0

pt = head

/*若后一个节点的总工资比前一个节点的总工资高,则交换两个节点中的数据

注意只交换节点数据,而节点顺序不变,即节点next指针内容不进行交换*/

while (pt->next != NULL)

{

if ((*compare)(pt->next->sum, pt->sum))

{

IntSwap(&pt->number, &pt->next->number)

CharSwap(pt->name, pt->next->name)

for (i=0i<mi++)

{

IntSwap(&pt->salary[i], &pt->next->salary[i])

}

IntSwap(&pt->sum, &pt->next->sum)

FloatSwap(&pt->average, &pt->next->average)

flag = 1

}

pt = pt->next

}

}while(flag)

}

/*交换两个整型数*/

void IntSwap(int *pt1, int *pt2)

{

int temp

temp = *pt1

*pt1 = *pt2

*pt2 = temp

}

/*交换两个实型数*/

void FloatSwap(float *pt1, float *pt2)

{

float temp

temp = *pt1

*pt1 = *pt2

*pt2 = temp

}

/*交换两个字符串*/

void CharSwap(char *pt1, char *pt2)

{

char temp[15]

strcpy(temp, pt1)

strcpy(pt1, pt2)

strcpy(pt2, temp)

}

/*决定数据是否按升序排序,a<b为真,则按升序排序*/

int Ascending(int a, int b)

{

return a <b

}

/* 决定数据是否按降序排序,a>b为真,则按降序排序 */

int Descending(int a, int b)

{

return a >b

}

void Searchsalary(STU *head, const int m)

{

int number, i

STU *findNode

printf("请输入你想查找的记录编号:")

scanf("%d", &number)

findNode = SearchNode(head, number)

if (findNode == NULL)

{

printf("Not found!\n")

}

else

{

printf("\nNo.%3d%8s", findNode->number, findNode->name)

for (i=0i<mi++)

{

printf("%7d", findNode->salary[i])

}

printf("%9d%9.2f\n", findNode->sum, findNode->average)

}

}

void Printsalary(STU *head, const int m)

{

STU *p = head

char str[100] = {'\0'}, temp[3]

int i, j = 1

strcat(str, "Number Name ")

for (i=1i<=mi++)

{

strcat(str, "salary")

itoa(i,temp, 10)

strcat(str, temp)

strcat(str, " ")

}

strcat(str," sum average")

printf("%s", str) /* 打印表头 */

while (p != NULL)/*若不是表尾,则循环打印*/

{

printf("\nNo.%3d%15s", p->number, p->name)

for (i=0i<mi++)

{

printf("%7d", p->salary[i])

}

printf("%9d%9.2f", p->sum, p->average)

p = p->next /*让p指向下一个节点*/

j++

}

printf("\n")

}

STU *AppendNode(STU *head, const int m)

{

STU *p = NULL

STU *pr = head

int j

p = (STU *)malloc(sizeof(STU)) /*为新添加的节点申请内存*/

if (p == NULL) /*若申请内存失败,则打印错误信息,退出程序*/

{

printf("No enough memory to alloc")

exit(0)

}

if (head == NULL) /*若原链表为空表,则将新建节点置为首节点*/

{

head = p

}

else/*若原链表为非空,则将新建节点添加到表尾*/

{

/*若未到表尾,则继续移动指针pr,直到pr指向表尾*/

while (pr->next != NULL)

{

pr = pr->next

}

pr->next = p/*将新建节点添加到链表的末尾*/

}

pr = p/*让pr指向新建节点*/

printf("Input node data......")

printf("\nInput number:")

scanf("%d", &p->number)

printf("Input name:")

scanf("%s", p->name)

for (j=0j<mj++)

{

printf("Input salary%d:", j+1)

scanf("%d", p->salary+j)

}

pr->next = NULL /*将新建节点置为表尾*/

return head /*返回添加节点后的链表的头节点指针*/

}

STU *ModifyNode(STU *head, int nodeNum, const int m)

{

int j

STU *newNode

newNode = SearchNode(head, nodeNum)

if (newNode == NULL)

{

printf("Not found!\n")

}

else

{

printf("Input the new node data:\n")

printf("Input name:")

scanf("%s", newNode->name)

for (j=0j<mj++)

{

printf("Input salary%d:", j+1)

scanf("%d", newNode->salary+j)

}

}

return head

}

STU *DeleteNode(STU *head, int nodeNum)

{

STU *p = head, *pr = head

if (head == NULL) /*链表为空,没有节点,无法删除节点*/

{

printf("No Linked Table!\n")

return(head)

}

/*若没找到节点nodeNum且未到表尾,则继续找*/

while (nodeNum != p->number &&p->next != NULL)

{

pr = p

p = p->next

}

if (nodeNum == p->number) /*若找到节点nodeNum,则删除该节点*/

{

if (p == head)/*若待删节点为首节点,则让head指向第2个节点*/

{

head = p->next

}

else /*若待删节点非首节点,则将前一节点指针指向当前节点的下一节点*/

{

pr->next = p->next

}

free(p) /*释放为已删除节点分配的内存*/

}

else /*没有找到待删除节点*/

{

printf("This Node has not been found!\n")

}

return head /*返回删除节点后的链表的头节点指针*/

}

STU *SearchNode(STU *head, int nodeNum)

{

STU *p = head

int j = 1

while (p != NULL)/*若不是表尾,则循环*/

{

if (p->number == nodeNum) return p

p = p->next /*让p指向下一个节点*/

j++

}

return NULL

}

void DeleteMemory(STU *head)

{

STU *p = head, *pr = NULL

while (p != NULL) /*若不是表尾,则释放节点占用的内存*/

{

pr = p /*在pr中保存当前节点的指针*/

p = p->next /*让p指向下一个节点*/

free(pr) /*释放pr指向的当前节点占用的内存*/

}

}

凑合着用吧,一些缺少的功能自己加上去就行了。。。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/10863003.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-11
下一篇2023-05-11

发表评论

登录后才能评论

评论列表(0条)

    保存