員工管理系統課程設計?問題描述:為某個單位建立一個員工通訊錄管理系統,可以方便查詢每一個員工的電話與地址設計散列表存儲,設計并實現通訊錄查找系統,下面我們就來說一說關于員工管理系統課程設計?我們一起去了解并探讨一下這個問題吧!
問題描述:
為某個單位建立一個員工通訊錄管理系統,可以方便查詢每一個員工的電話與地址。設計散列表存儲,設計并實現通訊錄查找系統。
1.基本要求(1)每個記錄有下列數據項:電話号碼、用戶名、地址;
(2)從鍵盤輸入各記錄,分别以電話号碼為關鍵字建立散列表;
(3)采用二次探測再散列法解決沖突;
(4)查找并顯示給定電話号碼的記錄;
(5)通訊錄信息文件保存。
2.重點、難點重點:
(1)通過實驗深入理解哈希表既是一種存儲形式,又是一種查找方法;
(2)哈希表的構造;
(3)哈希沖突方案的設計。
難點:哈希表的構造與哈希沖突方案的設計
3.作業及課外學習要求:按照題意要求獨立進行設計,設計結束後要按要求寫出課程設計報告。
本知識點的講授和學習,可以支撐“畢業要求4研究”中的“指标點4.1能夠運用科學的研究方法對複雜軟件工程問題進行需求分析研究;指标點4.2熟悉複雜軟件系統的開發和應用環境,研究制定合理的軟件設計與開發方案。指标點4.3能夠對原型驗證方法進行研究與分析,合理驗證軟件系統”的指标達成度進行評估。使學生在解決具體問題的過程中,能夠靈活熟練地選擇合适的數據結構及設計有效的算法,從而加深對常用數據結構的理解,強化學生的邏輯思維能力和動手能力,鞏固良好的編程習慣,掌握工程軟件設計的基本方法,為後續課程的學習打下堅實基礎。
4.代碼:
#include<cstdio>
#include<stdlib.h>
#include<iostream>
#include<cstring>
#include<cmath>
#define MAXSIZE 300
#define L 300
using namespace std;
class individual
{
public:
char tel[12];
char name[15];
char addr[20];
int key;
};
class population
{
public:
individual addr_list[MAXSIZE 1];
individual hash_list[L];
void info_input();
void init_hash_list();
void hash_list_do();
void search_tel();
void hash_out();
int m,n;
int individuals;
};
population all;
int max_prime(int m)//m>2
{
int i;
if(m%2==0)
m--;
while(m>=3){
for(i=3;i<=sqrt(m);i =2)
if(m%i==0) break;
if(i>sqrt(m))
break;
m-=2;
}
return m;
}
void population::info_input()
{
printf("輸入通訊錄最大長度(<%d):\n",MAXSIZE);
cin>>all.m;
printf("批量輸入人數:");
cin>>all.individuals;
printf("批量輸入%d個成員的信息(用戶名、電話号碼(11位)、地址):\n",all.individuals);
for(int i=1;i<=all.individuals;i )
{
cin>>all.addr_list[i].name;
cin>>all.addr_list[i].tel;
cin>>all.addr_list[i].addr;
if(strlen(all.addr_list[i].tel)!=11)
{
printf("重新輸入第%d位成員的信息:\n",i);
cin>>all.addr_list[i].name;
cin>>all.addr_list[i].tel;
cin>>all.addr_list[i].addr;
}
all.addr_list[i].key=all.addr_list[i].tel[3] all.addr_list[i].tel[10];
}
printf("批量創建成功!!!\n");
}
void population::init_hash_list()
{
for(int i=0;i<L;i )
{
strcpy(all.hash_list[i].addr,"");
strcpy(all.hash_list[i].name,"");
strcpy(all.hash_list[i].tel,"");
all.hash_list[i].key=0;
}
}
void population::hash_list_do()
{
init_hash_list();
int i,j=1,x,temp;
init_hash_list();
all.n=max_prime(all.m);
printf("\n最大長度為:%d 模n=%d\n",all.m,all.n);
for(i=1;i<=all.individuals;i )
{
temp=x=all.addr_list[i].key%all.n;
while(all.hash_list[x].key!=0)//此處需要用二次探測再散列法解決沖突
{
x=temp;
x=(x j*j)%all.n;
if(all.hash_list[x].key!=0)
{
x=temp;
x=(x-j*j)%all.n;
}
j ;
}
all.hash_list[x].key=all.addr_list[i].key;
strcpy(all.hash_list[x].addr,all.addr_list[i].addr);
strcpy(all.hash_list[x].name,all.addr_list[i].name);
strcpy(all.hash_list[x].tel,all.addr_list[i].tel);
}
cout<<"哈希表創建成功!!"<<endl;
}
void population::hash_out()
{
FILE *fp;
if((fp=fopen("address_list.txt","w"))==NULL)
{
printf("open file failed!\n");
exit(0);
}
fprintf(fp,"用戶 電話号碼 地址 \n");
printf("\n輸出Hash表:\n");
printf(" 用戶 電話号碼 地址 關鍵字 \n");
for(int i=0;i<all.m;i )
{
if(all.hash_list[i].key!=0)
{
cout<<all.hash_list[i].name<<" ";
cout<<all.hash_list[i].tel<<" ";
cout<<all.hash_list[i].addr<<" ";
cout<<all.hash_list[i].key<<" "<<endl;
fprintf(fp,"%s %s %s \n",all.hash_list[i].name,all.hash_list[i].tel,all.hash_list[i].addr);
}
}
fclose(fp);
}
void population::search_tel()
{
int i,temp,x,j=1;
char room[12];
printf("\n輸入電話号碼:");
cin>>room;
temp=room[3] room[10];
x=temp%all.n;
if(strcmp(all.hash_list[x].tel,room)==0)
printf("姓名:%-15s 電話号碼:%s 地址:%-5s \n\n",
all.hash_list[x].name,all.hash_list[x].tel,all.hash_list[x].addr);
else
{
while(strcmp(all.hash_list[x].tel,room))
{
x=(temp j*j)%all.n;
if(strcmp(all.hash_list[x].tel,room))
{
x=temp;
x=(x-j*j)%all.n;
}
j ;
}
printf("姓名:%-15s 電話号碼:%s 地址:%-5s \n\n",
all.hash_list[x].name,all.hash_list[x].tel,all.hash_list[x].addr);
}
}
void msgbox()
{
printf("================================\n");
printf("= 基本操作: =\n");
printf("= 電話查詢--S =\n");
printf("= 通信錄人員名單--H =\n");
printf("= 退出系統--E =\n");
printf("================================\n");
}
int main()
{
char op;
cout<<" 警告:當前通信錄還未初始化!!!\n\n ";
all.info_input();
all.hash_list_do();
msgbox();
cout<<"選擇操作\n-";
while(cin>>op)
{
msgbox();
switch(op)
{
case 'S': all.search_tel();break;
case 'H': all.hash_out();break;
case 'E': exit(0);break;
default: continue;
}
}
cout<<"謝謝使用!!!";
}
寫在最後:對于準備學習C/C 編程的小夥伴,如果你想更好的提升你的編程核心能力(内功)不妨從現在開始!
編程學習書籍分享:
編程學習視頻分享:
整理分享(多年學習的源碼、項目實戰視頻、項目筆記,基礎入門教程)
歡迎轉行和學習編程的夥伴,利用更多的資料學習成長比自己琢磨更快哦!
對于C/C 感興趣可以關注小編在後台私信我:【編程交流】一起來學習哦!可以領取一些C/C 的項目學習視頻資料哦!已經設置好了關鍵詞自動回複,自動領取就好了!
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!