當前位置:編程學習大全網 - 源碼下載 - 課程設計,工資管理系統完整源代碼

課程設計,工資管理系統完整源代碼

#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=0; i<m; i++)

{

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=0; i<m; i++)

{

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=0; i<m; i++)

{

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=1; i<=m; i++)

{

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=0; i<m; i++)

{

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=0; j<m; j++)

{

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=0; j<m; j++)

{

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指向的當前節點占用的內存*/

}

}

湊合著用吧,壹些缺少的功能自己加上去就行了。。。

  • 上一篇:中國衛星導航學術年會的往屆年會
  • 下一篇:crm銷售系統那個好用
  • copyright 2024編程學習大全網