<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文範例為大家分享了C語言實現員工工資管理系統的具體程式碼,供大家參考,具體內容如下
1. 列舉型別的使用(錄入與輸出)
2. 檔案的使用:用檔案來儲存員工資訊,開始執行程式時從檔案中讀取員工資訊到連結串列退出程式時將員工資訊儲存到檔案中。
2_1. 儲存結構體這樣的資料塊所使用的檔案操作函數;
2_2. feof()函數作為迴圈條件的正確使用方法;
3. 連結串列的相關操作
3_1. 結構體中char型別的資料寫入方式
4. while迴圈下實現的選單與子選單
注:部分功能還沒有實現,涉及到單連結串列的遍歷,比較簡單。
標頭檔案:檔頭.h
#include<malloc.h> #include<stdio.h> #include<stdlib.h> #include<string.h> //列舉型崗位:銷售員、技術員、銷售經理、經理 enum workpost { SALESMAN = 0, TECHNICIAN, SALESMANAGER, MANAGER }; //員工型別:連結串列結點 struct Employee { int id; //員工號:主鍵,唯一 char name[10]; //姓名 char sex[3]; //性別:男或女 int age; //年齡 char department[20]; //部門 enum workpost post; //列舉型崗位 int workHour; //當月工作小時數 double sales; //當月月銷售額 double salary; //月工資 struct Employee * next;//連結串列的指標域 }; #define LENGTH 50 //全域性變數 Employee Employees[LENGTH]; typedef int DataType; Employee *head; int select = 1;//功能選擇變數 int subselect = 1;//子功能選擇變數 FILE *fp; int i = 0;//迴圈變數 //函數宣告 void ListInitiate(Employee **head); void Load(); void Check(); void AddData(); void UpdataData(); void QueryData(); void DeleteData(); void Sorting(); void Statistics(); void Save(); //選單函數 //要求:至少有兩層選單。 void Menu() { while (select) { printf("————————員工工資管理系統————————n"); printf("————1. 增添資料 2. 修改資料————n"); printf("————3. 查詢資料 4. 刪除資料————n"); printf("————5. 排序函數 6. 統計資料————n"); printf("————0. 退出程式 7. 檢視連結串列————n"); printf("請輸入你的選擇:n"); scanf("%d", &select); switch (select) { case 1: AddData(); break; case 2: UpdataData(); break; case 3: QueryData(); break; case 4: DeleteData(); break; case 5: Sorting(); break; case 6: Statistics(); break; case 7: Check(); break; case 0: break; default: printf("輸入錯誤!請重新選擇。n"); } } } //功能函數 //初始化連結串列函數 void ListInitiate(Employee **head)//head是一個指標,*head也是一個指標 { *head = (Employee *)malloc(sizeof(Employee));//申請頭結點 (*head)->next = NULL; } //必須用檔案來儲存員工資訊: //開始執行程式時從檔案中讀取員工資訊到連結串列,退出程式時將員工資訊儲存到檔案中。 void Load() { if ((fp = fopen("Employee.txt", "ab+")) == NULL) { printf("開啟檔案出錯!n"); exit(1); } //未知檔案長度,使用feof(FILE *Stream)判斷檔案結尾 while (!feof(fp)) { //feof(fp)通過fread/fscanf是否讀寫出錯判斷,應該在讀寫操作之後進行判斷,否則多進行一輪迴圈 if (fread(&Employees[i], sizeof(struct Employee), 1, fp) == 0) { continue; } Employee *p, *q;//分別用於指向第i個結點和待插入的新結點 p = head; while (p->next != NULL)//把指標P定位到連結串列尾位置 { p = p->next; } q = (Employee *)malloc(sizeof(Employee));//用指標Q申請新結點 //存入資料到連結串列結點 q->id = i; q->id++; strcpy(q->name, Employees[i].name); strcpy(q->sex, Employees[i].sex); q->age = Employees[i].age; strcpy(q->department, Employees[i].department); q->post = Employees[i].post; q->workHour = Employees[i].workHour; q->sales = Employees[i].sales;//當月月銷售額 q->salary = Employees[i].salary;//月工資 q->next = p->next;//Q指標的next域指向P指標的next域,即第i個結點 p->next = q; i++; } fclose(fp); } //檢查連結串列資料輸入是否準確 void Check() { Employee *p; p = head; if (p->next == NULL) { printf("連結串列為空!n"); } else { printf("連結串列資料內容為:n"); while (p->next != NULL) { p = p->next; printf("%d %s %s %d %s ", p->id, p->name, p->sex, p->age, p->department); switch (p->post) { case 0: printf("SALESMAN "); break; case 1: printf("TECHNICIAN "); break; case 2: printf("SALESMANAGER"); break; case 3: printf("MANAGER "); break; default: printf("資料有誤!n"); break; } printf(" %d %.2lf %.2lfn", p->workHour, p->sales, p->salary); } printf("輸出完畢!n"); } } //增添資料 //新增一個員工,只輸入該員工的基本資訊(姓名、年齡、性別、部門、崗位)。 void AddData() { Employee *p, *q;//分別用於指向第i個結點和待插入的新結點 p = head; while (p->next != NULL)//把指標P定位到連結串列尾位置 { p = p->next; } q = (Employee *)malloc(sizeof(Employee));//用指標Q申請新結點 i++; q->id = i; printf("請輸入員工姓名:n"); scanf("%s", q->name); printf("請輸入員工年齡:n"); scanf("%d", &q->age); printf("請輸入員工性別:n"); scanf("%s", q->sex); printf("請輸入員工部門:n"); scanf("%s", q->department); printf("請輸入員工崗位:n"); scanf("%d", &q->post); q->workHour = 0; if (q->post == 3) { q->salary = 8000.0; } else { q->salary = 0.0; } q->sales = 0.0; q->next = p->next;//Q指標的next域指向P指標的next域,即第i個結點 p->next = q; printf("新增成功!n"); } //修改資料 /* 1)根據員工號來修改任意員工的基本資訊(姓名、年齡、性別、部門、崗位)。 2)批次計算所有技術員的當月工資額(需填寫技術員當月工作時間)。 3)批次計算所有銷售員的當月工資額(需填寫銷售員當月銷售額);然後批次計算所有銷售經理的當月工資額。 */ void UpdataData() { subselect = 1; Employee *p, *p1; p = head; while (subselect) { printf("—————— 修改資料的二級選單 ——————n"); printf("——1. 根據員工號來修改任意員工的基本資訊n"); printf("——2. 批次計算所有技術員的當月工資額n"); printf("——3. 批次計算所有銷售員的當月工資額,然後批次計算所有銷售經理的當月工資額n"); printf("——0. 退出此子選單n"); printf("請輸入你的選擇:n"); scanf("%d", &subselect); switch (subselect) { case 1: p = head; int ID; printf("請輸入待修改的員工資訊的員工號:n"); scanf("%d", &ID); while (p->next != NULL) { p = p->next; if (p->id == ID) { printf("請輸入新的員工姓名:n"); scanf("%s", p->name); printf("請輸入新的員工年齡:n"); scanf("%d", &p->age); printf("請輸入新的員工性別:n"); scanf("%s", p->sex); printf("請輸入新的員工部門:n"); scanf("%s", p->department); printf("請輸入新的員工崗位:n"); scanf("%d", &p->post); printf("資訊錄入成功!n"); break; } } break; case 2: //批次計算所有技術員的當月工資額,技術員工資:工作時間*小時工資(100元每小時) p = head; while (p->next != NULL) { p = p->next; if (p->post == 1) { printf("請填寫員工號為%d的技術員當月工作時間:n", p->id); scanf("%d", &p->workHour); p->salary = p->workHour * 100; } } break; case 3: //銷售員工資:銷售額*4%提成; p = head; while (p->next != NULL) { p = p->next; if (p->post == 0) { printf("請填寫員工號為%d的銷售員當月銷售額:n", p->id); scanf("%lf", &p->sales); p->salary = p->sales*0.04; } } //銷售經理:底薪(5000)+所轄部門銷售額總額*0.5%。 p = head; while (p->next != NULL) { p = p->next; p1 = head; double sum_of_sales = 0.0; if (p->post == 2) { while(p1->next != NULL) { p1 = p1->next; if (strcmp(p->department, p1->department)==0) { sum_of_sales += p1->sales ; } } p->salary = sum_of_sales * 0.005 + 5000; } } break; case 0: break; default: printf("輸入錯誤!請重新選擇。n"); } } } //查詢資料 void QueryData() { subselect = 1; Employee *p; p = head; while (subselect) { printf("—————— 查詢資料的二級選單 ——————n"); printf("——1. 根據工號或者姓名查詢員工資訊n"); printf("——2. 按部門顯示本部門全部員工資訊n"); printf("——3. 分別顯示4種崗位的員工資訊n"); printf("——4. 分頁顯示全部員工的資訊n"); printf("——0. 退出此子選單n"); printf("請輸入你的選擇:n"); scanf("%d", &subselect); switch (subselect) { case 1: p = head; int ID; printf("請輸入工號:n"); scanf("%d", &ID); while (p->next != NULL) { p = p->next; if (p->id == ID) { printf("%d %s %s %d %s ", p->id, p->name, p->sex, p->age, p->department); switch (p->post) { case 0: printf("SALESMAN "); break; case 1: printf("TECHNICIAN "); break; case 2: printf("SALESMANAGER"); break; case 3: printf("MANAGER "); break; default: printf("資料有誤!n"); break; } printf(" %d %.2lf %.2lfn", p->workHour, p->sales, p->salary); printf("輸出完畢!n"); } } break; case 2: char Department[20]; printf("請輸入部門名稱:n"); scanf("%s", &Department); p = head; while(p->next != NULL) { p = p->next; if (strcmp(p->department, Department)==0) { printf("%d %s %s %d %s ", p->id, p->name, p->sex, p->age, p->department); switch (p->post) { case 0: printf("SALESMAN "); break; case 1: printf("TECHNICIAN "); break; case 2: printf("SALESMANAGER"); break; case 3: printf("MANAGER "); break; default: printf("資料有誤!n"); break; } printf(" %d %.2lf %.2lfn", p->workHour, p->sales, p->salary); } } printf("輸出完畢!n"); break; case 3: printf("SALESMAN:n"); p = head; while (p->next != NULL) { p = p->next; if (p->post==0) { printf("%d %s %s %d %s ", p->id, p->name, p->sex, p->age, p->department); switch (p->post) { case 0: printf("SALESMAN "); break; case 1: printf("TECHNICIAN "); break; case 2: printf("SALESMANAGER"); break; case 3: printf("MANAGER "); break; default: printf("資料有誤!n"); break; } printf(" %d %.2lf %.2lfn", p->workHour, p->sales, p->salary); } } printf("TECHNICIAN:n"); p = head; while (p->next != NULL) { p = p->next; if (p->post==1) { printf("%d %s %s %d %s ", p->id, p->name, p->sex, p->age, p->department); switch (p->post) { case 0: printf("SALESMAN "); break; case 1: printf("TECHNICIAN "); break; case 2: printf("SALESMANAGER"); break; case 3: printf("MANAGER "); break; default: printf("資料有誤!n"); break; } printf(" %d %.2lf %.2lfn", p->workHour, p->sales, p->salary); } } printf("SALESMANAGER:n"); p = head; while (p->next != NULL) { p = p->next; if (p->post==2) { printf("%d %s %s %d %s ", p->id, p->name, p->sex, p->age, p->department); switch (p->post) { case 0: printf("SALESMAN "); break; case 1: printf("TECHNICIAN "); break; case 2: printf("SALESMANAGER"); break; case 3: printf("MANAGER "); break; default: printf("資料有誤!n"); break; } printf(" %d %.2lf %.2lfn", p->workHour, p->sales, p->salary); } } printf("MANAGER:n"); p = head; while (p->next != NULL) { p = p->next; if (p->post==3) { printf("%d %s %s %d %s ", p->id, p->name, p->sex, p->age, p->department); switch (p->post) { case 0: printf("SALESMAN "); break; case 1: printf("TECHNICIAN "); break; case 2: printf("SALESMANAGER"); break; case 3: printf("MANAGER "); break; default: printf("資料有誤!n"); break; } printf(" %d %.2lf %.2lfn", p->workHour, p->sales, p->salary); } } printf("輸出完畢!n"); break; case 4: printf("分頁功能略難(沒學過),暫時留空吧n"); break; case 0: break; default: printf("輸入錯誤!請重新選擇。n"); } } } //刪除資料 void DeleteData(){ Employee *p, *s; p = head; printf("請輸入要刪除員工資訊的員工號:n"); scanf("%d", &i); while (p->next != NULL) { s = p; p = p->next; if(p->id==i) break; } s->next = s->next->next; free(p); } //按要求排序 void Sorting() { subselect = 1; Employee *p, *p1; int z = 0; int f=0; int count = 0; double s[20]; double storeNum; p = head; while (subselect) { printf("—————— 排序資料的二級選單 ——————n"); printf("——1. 所有員工資訊按當月工資從高到低並顯示n"); printf("——2. 某個崗位的員工資訊按當月工資從高到低顯示n"); printf("——0. 退出此子選單n"); printf("請輸入你的選擇:n"); scanf("%d", &subselect); switch (subselect) { case 1: p = head; z = 0; while (p->next != NULL) { p = p->next; s[z] = p->salary; z++; } //氣泡排序 for (int i = 0; i < z-1; i++)//因為進行兩兩比較,10個數最壞的情況就需要進行9趟 { for (int j = 0; j < (z-1) - i; j++)//因為每進行一趟就可以排好一個數,所以迴圈次數-i { if (s[j] > s[j+1])//兩兩比較 { double temp = s[j]; s[j] = s[j+1]; s[j+1] = temp; } } } z--; for (int i = z; i >= 0; i--) { if(storeNum == s[i]) { continue; } p = head; while (p->next != NULL) { p = p->next; storeNum = s[i]; if(p->salary==s[i]) { printf("%d %s %s %d %s ", p->id, p->name, p->sex, p->age, p->department); switch (p->post) { case 0: printf("SALESMAN "); break; case 1: printf("TECHNICIAN "); break; case 2: printf("SALESMANAGER"); break; case 3: printf("MANAGER "); break; default: printf("資料有誤!n"); break; } printf(" %d %.2lf %.2lfn", p->workHour, p->sales, p->salary); } } } break; case 2: int Post; z = 0; storeNum = 0.0; printf("請輸入崗位資訊:(SALESMAN = 0, TECHNICIAN, SALESMANAGER, MANAGER)n"); scanf("%d", &Post); p = head; while(p->next != NULL) { p = p->next; if (p->post==Post) { s[z] = p->salary; z++; } } //氣泡排序 for (int i = 0; i < z-1; i++) { for (int j = 0; j < (z-1) - i; j++)//因為每進行一趟就可以排好一個數,所以迴圈次數-i { if (s[j] > s[j+1])//兩兩比較 { double temp = s[j]; s[j] = s[j+1]; s[j+1] = temp; } } } z--; for (int i = z; i >= 0; i--) { if(storeNum == s[i]) { continue; } p = head; while (p->next != NULL) { p = p->next; if(p->salary==s[i]&&p->post==Post) { storeNum = s[i]; printf("%d %s %s %d %s ", p->id, p->name, p->sex, p->age, p->department); switch (p->post) { case 0: printf("SALESMAN "); break; case 1: printf("TECHNICIAN "); break; case 2: printf("SALESMANAGER"); break; case 3: printf("MANAGER "); break; default: printf("資料有誤!n"); break; } printf(" %d %.2lf %.2lfn", p->workHour, p->sales, p->salary); } } } break; case 0: break; default: printf("輸入錯誤!請重新選擇。n"); } } } //統計資料 void Statistics() { printf("hhn"); } //儲存連結串列資料到檔案 void Save() { Employee *p; p = head; i = 0; //第一步將連結串列中的結點資訊存入陣列中 while (p->next != NULL) { p = p->next; Employees[i].id = p->id; strcpy(Employees[i].name, p->name); strcpy(Employees[i].sex, p->sex); Employees[i].age = p->age; strcpy(Employees[i].department, p->department); Employees[i].post = p->post; Employees[i].workHour = p->workHour; Employees[i].sales = p->sales;//當月月銷售額 Employees[i].salary = p->salary;//月工資 i++; } //第二步將陣列資料錄入文字檔案 if ((fp = fopen("employee.txt", "wb+")) == NULL) { printf("開啟檔案出錯!n"); exit(1); } p = head; i = 0; while (p->next != NULL) { p = p->next; if (fwrite(&Employees[i], sizeof(struct Employee), 1, fp) != 1) { printf("寫入檔案出錯!n"); } i++; } fclose(fp); printf("成功儲存資料到文字檔案employeen"); }
Main函數:
#include"檔頭.h" int main() { ListInitiate(&head); Load();//載入已有的資料到連結串列 Menu(); Save();//儲存資料到檔案 printf("歡迎下次使用!n"); }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45