1 課題描述
每個員工的信息包括:編號、姓名、性別、出生年月、學歷、職務、電話、住址等。系統能夠完成員工信息的查詢、更新、插入、刪除、排序等功能。
2 問題分析和任務定義
要求:
每個員工的信息包括:編號、姓名、性別、出生年月、學歷、職務、電話、住址等。
(1) 排序:按不同關鍵字,對所有員工的信息進行排序。(這里僅按照工號排序)
(2) 查詢:按特定條件(工號、姓名)查找員工。
(3) 更新:按編號對某個員工的某項信息進行修改。
(4) 插入:加入新員工的信息。
(5) 刪除:按編號刪除已離職的員工的信息。
3 邏輯設計
1)數據類型:
對員工的信息進行分析,因為要可以根據工號進行排序,因而將工號設置為整數型,而姓名、性別、出生年月、學歷、職務、電話、住址這些內容設置為字符串類型。並且還要設置一個整數型遍歷num來存儲此時含有的記錄數。
struct staff
{
int id;///編號
char name[20];///姓名
char sex[20];///性別
char age[20];///出生年月
char clas[20];///學歷
char duty[20];///職務
char tel[20];///電話
char addr[20];///住址
} s[1000];
int num;
2)抽象數據類型:
ADT Staff {
數據對象D:D是具有相同特征的數據元素的集合。各數據元素均含有類型相同,可唯一標識數據元素的關鍵字。
數據關系R:數據元素同屬一個集合。
staffinput()
操作結果:輸入員工信息。
staffdisplay()
操作結果:瀏覽員工記錄。
staffsearch()
操作結果:查找員工記錄。
staffdel()
操作結果:刪除員工記錄函數
staffadd()
操作結果:添加員工記錄
staffchange()
操作結果:修改員工記錄
staffsort()
操作結果:對員工排序
}ADT Staff
3)模塊功能:
功能上主要有錄入記錄,查找記錄,增加記錄,刪除記錄,更改記錄,對記錄排序,顯示所有記錄這七大模塊。其中查找記錄和刪除記錄這一模塊既可以根據工號查找,也可以根據姓名查找,靈活方便。而更改記錄這一模塊則能夠修改該員工記錄的所有信息。同時對記錄排序這一模塊需要使用排序算法來實現。
4 詳細設計
員工信息結構體:
struct staff
{
int id;///編號
char name[20];///姓名
char sex[20];///性別
char age[20];///出生年月
char clas[20];///學歷
char duty[20];///職務
char tel[20];///電話
char addr[20];///住址
} s[1000];
int num;
<1>輸入員工信息函數:void staffinput()
輸入多組員工記錄,包括工號、姓名、性別、出生年月、學歷、職務、電話、住址。
<2>瀏覽員工記錄函數:void staffdisplay()
打印所有員工的記錄,工號、姓名、性別、出生年月、學歷、職務、電話、住址
<3>查找員工函數:void staffsearch()
既可以按照員工的工號也可以按照員工的姓名來查找,然后打印該員工信息。
<4>刪除員工記錄函數:void staffdel()
既可以按照員工的工號也可以按照員工的姓名來刪除該員工記錄。刪除該條記錄后num要-1,同時要將該記錄后面的記錄向前挪一位。
<5>添加員工記錄函數:void staffadd()
插入一條新員工的記錄,這條記錄會添加在順序表的表尾,同時num要+1。
<6>修改員工記錄函數:void staffchange()
先按照員工的姓名或者工號查找到該員工的記錄,然后可以對該員工的所有信息都能夠修改。
<7>對員工排序函數:void staffsort()
使用快速排序,對員工的編號進行排序。
5 程序編碼
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct staff { int id;///編號 char name[20];///姓名 char sex[20];///性別 char age[20];///出生年月 char clas[20];///學歷 char duty[20];///職務 char tel[20];///電話 char addr[20];///住址 } s[1000]; int num; void staffinput()///輸入員工信息 { int i,n; printf("請輸入需要創建信息的職工人數n:\n"); scanf("%d",&n); num=n; for(i=0; i<n; i++) { printf("請輸入員工編號: "); scanf("%d",&s[i].id); printf("請輸入姓名: "); scanf(" %s",s[i].name); printf("請輸入性別: "); scanf(" %s",&s[i].sex); printf("請輸入出生年月: "); scanf(" %s",&s[i].age); printf("請輸入學歷: "); scanf(" %s",&s[i].clas); printf("請輸入職務: "); scanf(" %s",&s[i].duty); printf("請輸入電話: "); scanf(" %s",&s[i].tel); printf("請輸入住址: "); scanf(" %s",s[i].addr); printf("\n"); } printf("創建完畢!\n"); } void staffdisplay()///展示員工信息 { int i; printf("\n員工編號\t姓名\t性別\t出生年月\t學歷\t職務\t電話\t住址\n"); for(i=0; i<num; i++) { printf("\n%d\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",s[i].id,s[i].name,s[i].sex,s[i].age,s[i].clas,s[i].duty,s[i].tel,s[i].addr); } return ; } void s_change(int n)///更改員工信息 { int a,b; int id;///編號 char name[20];///姓名 char sex[20];///性別 char age[20];///出生年月 char clas[20];///學歷 char duty[20];///職務 char tel[20];///電話 char addr[20];///住址 printf("確實需要修改此人的信息按1,否則按0\n"); scanf("%d",&a); if(a==1) { while(1) { printf("\n需要進行修改的選項\n 1.員工編號 2.姓名 3.性別 4.出生年月 5.學歷 6.職務 7.電話 8.住址\n"); printf("請輸入你想修改的那一項序號:\n"); scanf("%d",&b); if(b>8||b<1) { printf("\n選擇錯誤,請重新選擇!\n"); getchar(); continue; } else { switch(b) { case 1: printf("員工編號更改為:"); scanf("%d",&id); s[n].id=id; break; case 2: printf("姓名改為: "); scanf(" %s",name); strcpy(s[n].name,name); break; case 3: printf("性別改為: "); scanf(" %s",&sex); strcpy(s[n].sex,sex); break; case 4: printf("出生年月改為: "); scanf("%s",&age); strcpy(s[n].age,age); break; case 5: printf("學歷改為: "); scanf("%s",&clas); strcpy(s[n].clas,clas); break; case 6: printf("職務改為: "); scanf("%s",&duty); strcpy(s[n].duty,duty); break; case 7: printf("電話改為: "); scanf("%s",&tel); strcpy(s[n].tel,tel); break; case 8: printf("住址改為: "); scanf("%s",addr); strcpy(s[n].addr,addr); break; } break; } } } } int my_cmp(staff a, staff b) { return a.id<b.id; } void staffsort()///按照編號給員工排序 { printf("這里按照員工編號排序:\n"); sort(s,s+num,my_cmp); printf("按照員工編號排序之后的記錄:\n"); staffdisplay(); } void staffchange() { int a,b,c,i,j; char x[20]; printf("1.按照姓名查找需要修改員工的信息\n"); printf("2.按照工號查找需要修改員工的信息\n"); scanf("%d",&a); if(a==1) { getchar(); printf("請輸入要修改信息的員工姓名\n"); scanf("%s",&x); for(i=0; i<num; i++) { if(strcmp(s[i].name,x)==0) { printf("找到此人,原始記錄為:\n"); printf("\n員工編號\t姓名\t性別\t出生年月\t學歷\t職務\t電話\t住址\n"); printf("\n%d\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",s[i].id,s[i].name,s[i].sex,s[i].age,s[i].clas,s[i].duty,s[i].tel,s[i].addr); s_change(i); break; } } if(i>=num) { printf("查無此人!!!\n"); } } if(a==2) { printf("請輸入要修改信息的員工工號\n"); scanf("%d",&c); for(i=0; i<num; i++) { if(s[i].id==c) { printf("找到此人,原始記錄為:\n"); printf("\n員工編號\t姓名\t性別\t出生年月\t學歷\t職務\t電話\t住址\n"); printf("\n%d\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",s[i].id,s[i].name,s[i].sex,s[i].age,s[i].clas,s[i].duty,s[i].tel,s[i].addr); s_change(i); break; } } if(i>=num) { printf("查無此人!!!\n"); } } } void staffsearch() { int a,b,c; int i,j; char x[20]; printf("1.按照姓名查找員工信息\n"); printf("2.按照工號查找員工信息\n"); scanf("%d",&a); if(a==1) { getchar(); printf("請輸入要查找員工的姓名\n"); scanf("%s",&x); for(i=0; i<num; i++) { if(strcmp(s[i].name,x)==0) { printf("找到此人,原始記錄為:\n"); printf("\n員工編號\t姓名\t性別\t出生年月\t學歷\t職務\t電話\t住址\n"); printf("\n%d\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",s[i].id,s[i].name,s[i].sex,s[i].age,s[i].clas,s[i].duty,s[i].tel,s[i].addr); break; } } if(i>=num) { printf("查無此人!!!\n"); } } if(a==2) { printf("請輸入要查找員工的工號\n"); scanf("%d",&c); for(i=0; i<num; i++) { if(s[i].id==c) { printf("找到此人,原始記錄為:\n"); printf("\n員工編號\t姓名\t性別\t出生年月\t學歷\t職務\t電話\t住址\n"); printf("\n%d\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",s[i].id,s[i].name,s[i].sex,s[i].age,s[i].clas,s[i].duty,s[i].tel,s[i].addr); break; } } if(i>=num) { printf("查無此人!!!\n"); } } } void staffadd() { printf("請輸入要插入的新員工的信息:\n"); int i; i=num; num++; printf("請輸入員工編號: "); scanf("%d",&s[i].id); printf("請輸入姓名: "); scanf(" %s",s[i].name); printf("請輸入性別: "); scanf(" %s",&s[i].sex); printf("請輸入出生年月: "); scanf(" %s",&s[i].age); printf("請輸入學歷: "); scanf(" %s",&s[i].clas); printf("請輸入職務: "); scanf(" %s",&s[i].duty); printf("請輸入電話: "); scanf(" %s",&s[i].tel); printf("請輸入住址: "); scanf(" %s",s[i].addr); printf("\n"); } void staffdel()///刪除員工記錄 { int a,b,c; int i,j; char x[20]; printf("1.按照姓名刪除員工信息\n"); printf("2.按照工號刪除員工信息\n"); scanf("%d",&a); if(a==1) { getchar(); printf("請輸入要刪除員工的姓名\n"); scanf("%s",&x); for(i=0; i<num; i++) { if(strcmp(s[i].name,x)==0) { printf("找到此人,原始記錄為:\n"); printf("\n員工編號\t姓名\t性別\t出生年月\t學歷\t職務\t電話\t住址\n"); printf("\n%d\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",s[i].id,s[i].name,s[i].sex,s[i].age,s[i].clas,s[i].duty,s[i].tel,s[i].addr); printf("繼續刪除請按1,不再刪除請按0\n"); scanf("%d",&b); if(b==1) { for(j=i; j<num-1; j++)///后面的內容移動到前面 { s[j].id=s[j+1].id; strcpy(s[j].name,s[j+1].name); strcpy(s[j].sex,s[j+1].sex); strcpy(s[j].age,s[j+1].age); strcpy(s[j].clas,s[j+1].clas); strcpy(s[j].duty,s[j+1].duty); strcpy(s[j].tel,s[j+1].tel); strcpy(s[j].addr,s[j+1].addr); } num--; } break; } } if(i>=num) { printf("查無此人!!!\n"); } } if(a==2) { printf("請輸入要刪除員工的工號\n"); scanf("%d",&c); for(i=0; i<num; i++) { if(s[i].id==c) { printf("找到此人,原始記錄為:\n"); printf("\n員工編號\t姓名\t性別\t出生年月\t學歷\t職務\t電話\t住址\n"); printf("\n%d\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",s[i].id,s[i].name,s[i].sex,s[i].age,s[i].clas,s[i].duty,s[i].tel,s[i].addr); printf("繼續刪除請按1,不再刪除請按0\n"); scanf("%d",&b); if(b==1) { for(j=i; j<num-1; j++) { s[j].id=s[j+1].id; strcpy(s[j].name,s[j+1].name); strcpy(s[j].sex,s[j+1].sex); strcpy(s[j].age,s[j+1].age); strcpy(s[j].clas,s[j+1].clas); strcpy(s[j].duty,s[j+1].duty); strcpy(s[j].tel,s[j+1].tel); strcpy(s[j].addr,s[j+1].addr); } num--; } break; } } if(i>=num) { printf("查無此人!!!\n"); } } } void load() { printf("\n\n"); printf(" ******************歡迎進入職工信息管理系統****************\n"); printf(" 1.錄入職工信息"); printf(" 2.瀏覽職工信息\n"); printf(" 3.查詢職工信息"); printf(" 4.刪除職工信息\n"); printf(" 5.添加職工信息"); printf(" 6.修改職工信息\n"); printf(" 7.排序職工信息\n"); printf(" 8.退出\n"); printf(" ********************謝謝使用******************\n"); printf("\n"); return ; } int main() { int n; int flag=1; char a; num=0; while(1) { load();/*調用菜單函數*/ printf("請選擇你需要操作的步驟(1--8):\n"); scanf("%d",&n); if(n>=1&&n<=8) { flag=0; switch(n) { case 1: printf(" *****輸入職工信息*****\n"); printf("\n"); staffinput(); break; case 2: printf(" *****瀏覽職工信息*****\n"); printf("\n"); staffdisplay(); break; case 3: printf(" *****按職工號或姓名查詢職工信息*****\n"); printf("\n"); staffsearch(); break; case 4: printf(" *****刪除職工信息*****\n"); printf("\n"); staffdel(); break; case 5: printf(" *****添加職工信息*****\n"); printf("\n"); staffadd(); break; case 6: printf(" *****修改職工信息*****\n"); printf("\n"); staffchange(); break; case 7: printf(" *****對職工信息排序*****\n"); printf("\n"); staffsort(); break; default : return 0; } } else { printf("您輸入有誤,請重新選擇!\n"); getchar(); continue; } } return 0; }
6 程序調試與測試
1)菜單目錄:
2)輸入員工信息:
3)顯示全部員工信息:
4)查詢員工信息:
按姓名和工號查找
5)刪除員工信息:
刪除后的所有數據:
6)修改員工信息:
修改后的記錄:
7)員工信息排序:
按照員工的編號排序:
7 結果分析
這里只有員工編號為整數型,其他的都是字符串類型,因而錯誤類型的輸入會造成亂碼和死循環的產生。該程序主要是基於結構體數組來實現排序和輸出的,因而屬於順序表,遍歷輸出的時間復雜度是O(n),空間復雜度也是O(n)。同時在這里刪除某一員工的記錄后,需要將其后面的所有記錄都要向前移動一位,會花費一些時間;而插入一條記錄只需要早順序表之后添加即可。排序所使用的快速排序時間復雜度是O(nlogn)~O(n^2),空間復雜度是O(logn)~O(n)。
8 總結
該程序能夠完成員工信息的查詢、更新、插入、刪除、排序等功能。基本達到了題目要求的目標了。但仍然存在着一些問題,比如在實現排序功能的時候,該程序僅僅實現了按照員工編號排序的功能,這也與程序的要求有關。比如如果按照職務排序,計算機並不能去識別到底哪一個職務大,更何況不同的公司有不同的情況,這只能在編寫程序的時候按照該公司的職務安排提前規定各個職務的優先級,學歷也是如此。該程序在任務要求中並沒有規定這些,就導致了漏洞很大。同時該程序使用的是順序表類型的存儲結構,雖然實現了隨機存取,但在刪除記錄信息的過程中需要挪動被刪記錄之后的所有記錄,耗時間。編寫該程序並不是很難,但從這次程序中,我學到了以后工作時需要多與客戶和產品經理交流溝通,明確客戶的需求,減少程序中的漏洞,從實際出發,編寫合適有效的程序。