2.問題描述
1、設(shè)每個(gè)記錄有下列數(shù)據(jù)項(xiàng):電話號碼、用戶名、地址;
2、從鍵盤輸入各記錄,分別以電話號碼和用戶名為關(guān)鍵字建立哈希表;
3、查找并顯示給定電話號碼的記錄;
4、查找并顯示給定用戶名的記錄。
5、在哈希函數(shù)確定的前提下,使用各種不同類型處理沖突的方法(開放定址法、 ?拉鏈法),討論平均查找長度的變化。
3.需求分析
3.1 數(shù)據(jù)需求
????電話號碼查詢系統(tǒng)需要存儲的數(shù)據(jù)項(xiàng)有電話號碼、用戶名、地址三個(gè)字段。
3.2 基本功能需求
1.需要使用兩個(gè)解決沖突的方式來進(jìn)行hash存儲
2.分別使用姓名和電話號兩個(gè)屬性進(jìn)行hash存儲。
3.可以插入新的用戶記錄,包括電話號碼、用戶名、地址三個(gè)字段。
4.可以查詢用戶記錄: 可以通過電話號碼或姓名來查詢用戶記錄。
5.開放定址法: 使用數(shù)組存儲數(shù)據(jù),當(dāng)發(fā)生沖突時(shí),通過查找下一個(gè)空閑單元來解決沖突。
6.鏈地址法: 使用鏈表存儲數(shù)據(jù),當(dāng)發(fā)生沖突時(shí),將新數(shù)據(jù)插入鏈表中,通過鏈表來解決沖突。
3.3 非功能性需求
用戶界面需求:簡潔、易用、易懂、友好的用戶界面。
硬件要求:裝有Visual?Studio 2019的計(jì)算機(jī)。
可靠性需求:保證用戶在正常使用本系統(tǒng)時(shí),用戶的操作或誤操作不會(huì)產(chǎn)生數(shù)據(jù)的丟失。
4.概要設(shè)計(jì)
4.1 數(shù)據(jù)結(jié)構(gòu)
-
開放定址法: 使用 HashNode 類型的數(shù)組來存儲數(shù)據(jù),每個(gè)元素包含一個(gè)Record_1類型的data字段和一個(gè)int類型的is_empty字段。
- 鏈地址法: 使用結(jié)構(gòu)體Record_2存儲數(shù)據(jù),每個(gè)結(jié)構(gòu)體包含電話號碼、用戶名、地址三個(gè)字段和一個(gè)指向下一個(gè)結(jié)構(gòu)體的指針next。
4.2 系統(tǒng)包含的函數(shù)
- hash_func_1: 使用簡單的哈希函數(shù)計(jì)算給定字符串的哈希值
- search_by_phone_1: 通過電話號碼在哈希表中搜索記錄,并打印該記錄的姓名和地址
- search_by_name_1: 通過姓名在哈希表中搜索記錄,并打印該記錄的電話號碼和地址
- insert_data_by_phone_1: 在哈希表中插入一條新記錄,根據(jù)電話號碼計(jì)算哈希值
- print_avg_lengths_phone_1: 打印哈希表中每個(gè)桶的平均長度,根據(jù)電話號碼計(jì)算哈希值
- print_avg_lengths_name_1: 打印哈希表中每個(gè)桶的平均長度,根據(jù)姓名計(jì)算哈希值
- insert_data_by_name_1: 在哈希表中插入一條新記錄,根據(jù)姓名計(jì)算哈希值
- init_hash_table_2: 初始化哈希表,將所有元素的next指針設(shè)為NULL
- hash_by_phone_2: 計(jì)算電話號碼的哈希值
- hash_by_name_2: 計(jì)算姓名的哈希值
- display_record_2: 打印一條記錄的電話號碼,姓名和地址
- insert_by_phone_2: 插入一條新記錄,根據(jù)電話號碼計(jì)算哈希值
- insert_by_name_2: 插入一條新記錄,根據(jù)姓名計(jì)算哈希值
- search_by_phone_2: 通過電話號碼在哈希表中搜索記錄,并打印該記錄的電話號碼,姓名和地址
- search_by_name_2: 通過姓名在哈希表中搜索記錄,并打印該記錄的電話號碼,姓名和地址
- print_avg_lengths_by_name_2: 打印哈希表中每個(gè)桶的平均長度,根據(jù)姓名計(jì)算哈希值
- print_avg_lengths_by_phone_2: 打印哈希表中每個(gè)桶的平均長度,根據(jù)電話號碼計(jì)算哈希值
- main2(): 主函數(shù),用于測試哈希表2
- main1(): 主函數(shù),用于測試哈希表1
4.3 函數(shù)間的關(guān)系
- hash_func_1, hash_by_phone_2, hash_by_name_2 這三個(gè)函數(shù)都是用于計(jì)算哈希值的,hash_func_1是用來計(jì)算第一個(gè)哈希表中哈希值的,hash_by_phone_2和hash_by_name_2是用來計(jì)算第二個(gè)哈希表中哈希值的。
- insert_by_phone_2和insert_by_name_2這兩個(gè)函數(shù)是用來在第二個(gè)哈希表中插入記錄的,它們使用了hash_by_phone_2和hash_by_name_2函數(shù)來計(jì)算哈希值
- search_by_phone_1,search_by_name_1,search_by_phone_2,?search_by_name_2這四個(gè)函數(shù)都是用來在哈希表中搜索記錄的,它們分別對應(yīng)第一個(gè)哈希表和第二個(gè)哈希表中搜索電話號碼和姓名。
- display_record_2函數(shù)是用來打印第二個(gè)哈希表中搜索到的記錄的電話號碼,姓名和地址。
- init_hash_table_2函數(shù)是用來初始化第二個(gè)哈希表的,它會(huì)將所有的鏈表指針都設(shè)置為NULL。
- main2()和main1()是程序的主入口,它們分別調(diào)用了第一個(gè)哈希表和第二個(gè)哈希表的插入,查詢和顯示函數(shù)來測試哈希表的功能。
4.4 系統(tǒng)功能模塊圖
5.詳細(xì)設(shè)計(jì)
5.1 結(jié)構(gòu)體的詳細(xì)定義
typedef struct {
? ? char phone[20];//電話號碼
? ? char name[20];//姓名
? ? char address[100];//地址
} Record_1;
typedef struct {//結(jié)構(gòu)體定義
? ? Record_1 data;
? ? int is_empty;
} HashNode;
struct Record_2 {
? ? char phone[20];
? ? char name[20];
? ? char address[100];
? ? struct Record_2* next;
}
5.2 系統(tǒng)函數(shù)詳細(xì)介紹
- hash_func_1: 使用簡單的哈希函數(shù)計(jì)算給定字符串的哈希值
- search_by_phone_1: 通過電話號碼在哈希表中搜索記錄,并打印該記錄的姓名和地址
- search_by_name_1: 通過姓名在哈希表中搜索記錄,并打印該記錄的電話號碼和地址
- insert_data_by_phone_1: 在哈希表中插入一條新記錄,根據(jù)電話號碼計(jì)算哈希值
- print_avg_lengths_phone_1: 打印哈希表中每個(gè)桶的平均長度,根據(jù)電話號碼計(jì)算哈希值
- print_avg_lengths_name_1: 打印哈希表中每個(gè)桶的平均長度,根據(jù)姓名計(jì)算哈希值
- insert_data_by_name_1: 在哈希表中插入一條新記錄,根據(jù)姓名計(jì)算哈希值
- init_hash_table_2: 初始化哈希表,將所有元素的next指針設(shè)為NULL
- hash_by_phone_2: 計(jì)算電話號碼的哈希值
- hash_by_name_2: 計(jì)算姓名的哈希值
- display_record_2: 打印一條記錄的電話號碼,姓名和地址
- insert_by_phone_2: 插入一條新記錄,根據(jù)電話號碼計(jì)算哈希值
- insert_by_name_2: 插入一條新記錄,根據(jù)姓名計(jì)算哈希值
- search_by_phone_2: 通過電話號碼在哈希表中搜索記錄,并打印該記錄的電話號碼,姓名和地址
- search_by_name_2: 通過姓名在哈希表中搜索記錄,并打印該記錄的電話號碼,姓名和地址
- print_avg_lengths_by_name_2: 打印哈希表中每個(gè)桶的平均長度,根據(jù)姓名計(jì)算哈希值
- print_avg_lengths_by_phone_2: 打印哈希表中每個(gè)桶的平均長度,根據(jù)電話號碼計(jì)算哈希值
- main2(): 主函數(shù),用于測試哈希表2
- main1(): 主函數(shù),用于測試哈希表1
5.3 系統(tǒng)功能模塊介紹
本系統(tǒng)包括兩個(gè)模塊:
一個(gè)是線性探測模塊(如圖5-3-1),一個(gè)是拉鏈法模塊(如圖5-3-2)。
?圖5-3-1線性探測法模塊流程圖
?
圖5-3-2 拉鏈法模塊流程圖
5.4?各相關(guān)數(shù)據(jù)結(jié)構(gòu)、算法間的對比
- search_by_phone_1: 根據(jù)電話號碼在第一個(gè)哈希表中查找記錄。首先使用hash_func_1函數(shù)計(jì)算電話號碼的哈希值,然后在哈希表中循環(huán)查找,直到找到對應(yīng)的記錄或者遍歷完整個(gè)哈希表。如果找到,則輸出記錄的姓名和地址,如果沒有找到,則輸出沒有找到該人員信息。
- search_by_name_1: 根據(jù)姓名在第一個(gè)哈希表中查找記錄。首先使用hash_func_1函數(shù)計(jì)算姓名的哈希值,然后在哈希表中循環(huán)查找,直到找到對應(yīng)的記錄或者遍歷完整個(gè)哈希表。如果找到,則輸出記錄的電話號碼和地址,如果沒有找到,則輸出沒有找到該人員信息。
- insert_data_by_phone_1: 根據(jù)電話號碼在第一個(gè)哈希表中插入記錄。首先使用hash_func_1函數(shù)計(jì)算電話號碼的哈希值,然后在哈希表中循環(huán)查找空閑位置插入記錄。如果遍歷了整個(gè)哈希表都沒有空閑位置,則輸出錯(cuò)誤信息。
- insert_data_by_name_1: 根據(jù)姓名在第一個(gè)哈希表中插入記錄。首先使用hash_func_1函數(shù)計(jì)算姓名的哈希值,然后在哈希表中循環(huán)查找空閑位置插入記錄。如果遍歷了整個(gè)哈希表都沒有空閑位置,則輸出錯(cuò)誤信息。
- print_avg_lengths_phone_1:計(jì)算第一個(gè)哈希表中電話號碼的平均查找長度。這個(gè)函數(shù)會(huì)遍歷整個(gè)哈希表,查找每個(gè)記錄對應(yīng)的電話號碼的查找長度,然后計(jì)算總長度的平均值。
- print_avg_lengths_name_1: 與print_avg_lengths_phone_1類似,計(jì)算第一個(gè)哈希表中姓名的平均查找長度。
- insert_by_phone_2: 根據(jù)電話號碼在第二個(gè)哈希表中插入記錄。首先hash_by_phone_2函數(shù)計(jì)算電話號碼的哈希值,然后在對應(yīng)的哈希值位置插入新節(jié)點(diǎn)。
- search_by_phone_2根據(jù)電話號碼在第二個(gè)哈希表中查找記錄:首先使用hash_by_phone_2函數(shù)計(jì)算電話號碼的哈希值。根據(jù)哈希值找到相應(yīng)的鏈表在鏈表中遍歷每一個(gè)節(jié)點(diǎn),如果找到匹配的電話號碼輸出信息,否則輸出沒有找到。
- insert_by_name_2: 根據(jù)姓名在第二個(gè)哈希表中插入記錄。首先hash_by_name_2函數(shù)計(jì)算姓名的哈希值,然后在對應(yīng)的哈希值位置插入新節(jié)點(diǎn)。
- search_by_name_2根據(jù)姓名在第二個(gè)哈希表中查找記錄:首先使用hash_by_name_2函數(shù)計(jì)算姓名的哈希值。根據(jù)哈希值找到相應(yīng)的鏈表在鏈表中遍歷每一個(gè)節(jié)點(diǎn),如果找到匹配的姓名輸出信息,否則輸出沒有找到。
數(shù)據(jù)結(jié)構(gòu)對比:
-
線性探測法(Open Addressing):當(dāng)發(fā)生沖突時(shí),在哈希表中往后探測一個(gè)單位(如+1或+2),直到找到一個(gè)空位置。優(yōu)點(diǎn)是在哈希表中使用空間更緊湊,缺點(diǎn)是當(dāng)哈希表較滿時(shí),查詢性能會(huì)受到影響。
- 拉鏈法(Chaining):當(dāng)發(fā)生沖突時(shí),將哈希值相同的記錄放入一個(gè)鏈表中。優(yōu)點(diǎn)是當(dāng)哈希表較滿時(shí),查詢性能依然較好,缺點(diǎn)是需要額外的空間來存儲
改進(jìn)思路:開放定址法中可以使用雙重散列函數(shù),以減少?zèng)_突的可能。界面應(yīng)該設(shè)計(jì)更加人性化,方便非專業(yè)人員使用,以及提高代碼的健壯性,對程序進(jìn)行不斷的測試,測試出程序中,不嚴(yán)謹(jǐn)問題。
6.調(diào)試分析
本軟件是基于Windows的編程開發(fā),所以,軟件調(diào)試必須在Windows環(huán)境下進(jìn)行。調(diào)試前須做好準(zhǔn)備工作:
1.需要安裝Visual?Studio 2019的計(jì)算機(jī)一臺;
配置好之后,在Visual?Studio 2019環(huán)境下進(jìn)行軟件的調(diào)試。
2.測試數(shù)據(jù):
沖突選擇輸入:
在“main”模塊中,根據(jù)控制臺主界面提示,選擇解決沖突的方式,鍵入數(shù)字1,會(huì)選擇線性探測法(開放定址法),鍵入2會(huì)選擇拉鏈法。?
在“查詢數(shù)據(jù)”模塊中,根據(jù)主界面提示,鍵入數(shù)字2,確定,再按提示進(jìn)行操作測試,鍵入姓名如小黑,確定,程序顯示該姓名相關(guān)記錄的所有信息,如果沒有找到該姓名的記錄,程序提示“該人員沒有找到”。
3.算法改進(jìn)設(shè)想:
開放定址法中可以使用雙重散列函數(shù),以減少?zèng)_突的可能。界面應(yīng)該設(shè)計(jì)更加人性化,方便非專業(yè)人員使用,以及提高代碼的健壯性,對程序進(jìn)行不斷的測試,測試出程序中,不嚴(yán)謹(jǐn)問題。
4.使用說明
1.電話號碼為關(guān)鍵字建立的哈希表,按電話號碼查詢,線性探測法解決沖突,成功找到該人員并打印該人員信息和平均查找成功和失敗長度。(如圖7-1)
?圖7-1
2.電話號碼為關(guān)鍵字建立的哈希表,按電話號碼查詢,拉鏈法解決沖突,成功找到該人員并打印該人員信息和平均查找成功和失敗長度。(如圖7-2)
?如圖7-2
3.姓名為關(guān)鍵字建立的哈希表,按姓名查詢,線性探測法解決沖突,成功找到該人員并打印該人員信息和平均查找成功和失敗長度。(如圖7-3)
如圖7-3
4.姓名為關(guān)鍵字建立的哈希表,按姓名查詢,拉鏈法解決沖突,成功找到該人員并打印該人員信息和平均查找成功和失敗長度。(如圖7-4)
?如圖7-4
5.電話號碼為關(guān)鍵字建立的哈希表,按電話號碼查詢,線性探測法解決沖突,沒有找到該人員,打印平均查找成功和失敗長度。(如圖7-5)
(如圖7-5)
6.電話號碼為關(guān)鍵字建立的哈希表,按電話號碼查詢,拉鏈法解決沖突,沒有找到該人員,打印平均查找成功和失敗長度(如圖7-6)
?
(如圖7-6)
7.源代碼(首尾一小部分,中間部分略)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define SIZE ?7
typedef struct {
? ? char phone[20];//電話號碼
? ? char name[20];//姓名
? ? char address[100];//地址
} Record_1;
typedef struct {//結(jié)構(gòu)體定義
? ? Record_1 data;
? ? int is_empty;
} HashNode;
struct Record_2 {
? ? char phone[20];
? ? char name[20];
? ? char address[100];
? ? struct Record_2* next;
};
unsigned int hash_func_1(const char* str) {//使用簡單的哈希函數(shù)計(jì)算給定字符串的哈希值
????unsigned int hash = 0;
????while (*str) {
????????hash = hash * 31 + *str++;
????}
????return hash % SIZE;
}
void insert_data_by_phone_1(HashNode table[], Record_1 record_1) {//在哈希表中插入一條新記錄,根據(jù)電話號碼計(jì)算哈希值(第一個(gè)哈希表)
????unsigned int index = hash_func_1(record_1.phone);
????int cnt = 1;
????while (1) {
????????if (table[index].is_empty == 0) {
????????????table[index].data = record_1;
????????????table[index].is_empty = 1;
????????????return;
????????}
????????if (strcmp(table[index].data.phone, record_1.phone) == 0) {
????????????printf("該電話 %s 已經(jīng)存在\n", record_1.phone);
????????????return;
????????}
????????index = (index + 1) % SIZE;
????????cnt++;
????????if (cnt == SIZE) {
????????????printf("hash表已滿!\n");
????????????return;
????????}
????}
}
int search_by_phone_1(HashNode table[], const char* phone) {//通過電話號碼在哈希表中搜索記錄,并打印該記錄的姓名和地址(第一個(gè)哈希表)
????unsigned int index = hash_func_1(phone);
????int cnt = 0;
????while (1) {
????????if (table[index].is_empty == 0) {
????????????printf("沒有找到該人員信息!\n");
????????????return cnt;
????????}
????????if (strcmp(table[index].data.phone, phone) == 0) {
????????????printf("姓名: %s, 地址: %s\n", table[index].data.name, table[index].data.address);
????????????return cnt;
????????}
????????index = (index + 1) % SIZE;
????????cnt++;
????????if (cnt == SIZE) {
????????????printf("沒有找到該人員信息!\n");
????????????return cnt;
????????}
????}
}
int search_by_phone_11(HashNode table[], const char* phone) {
? ? unsigned int index = hash_func_1(phone);
? ? int cnt = 0;
? ? while (1) {
? ? ? ? if (table[index].is_empty == 0) {
? ? ? ? ? ? //printf("沒有找到該人員信息!\n");
? ? ? ? ? ? return cnt;
? ? ? ? }
? ? ? ? if (strcmp(table[index].data.phone, phone) == 0) {
? ? ? ? ? ? //printf("姓名: %s, 地址: %s\n", table[index].data.name, table[index].data.address);
? ? ? ? ? ? return cnt;
? ? ? ? }
? ? ? ? index = (index + 1) % SIZE;
? ? ? ? cnt++;
? ? ? ? if (cnt == SIZE) {
? ? ? ? ? ? //printf("沒有找到該人員信息!\n");
? ? ? ? ? ? return cnt;
? ? ? ? }
? ? }
}
void print_avg_lengths_phone_1(HashNode table[]) {//打印哈希表中每個(gè)桶的平均長度,根據(jù)電話號碼計(jì)算哈希值(第一個(gè)哈希表)
? ? char phone[20] = "qwer";
? ? int total_count = 0;
? ? int total_length = 0;
? ? int fail_count = 0;
? ? int fail_length = 0;
? ? for (int i = 0; i < SIZE; i++) {
? ? ? ? if (table[i].is_empty == 1) {
? ? ? ? ? ? total_count++;
? ? ? ? ? ? total_length += search_by_phone_11(table, table[i].data.phone);
? ? ? ? ? ? fail_length += search_by_phone_11(table, phone);
? ? ? ? }
? ? }
? ? printf("平均查找成功長度: %f\n", (float)total_length / total_count);//計(jì)算第一個(gè)哈希表中電話號碼的平均查找長度(第一個(gè)哈希表)
? ? printf("平均查找失敗長度: %f\n", (float)fail_length / SIZE);
}
(中間部分略)。。。。。。
int main() {
????int choice;
????while (1) {
????????printf("\n-------------------------------------------------------------\n");
????????printf("*****************歡迎使用電話號碼查詢系統(tǒng)********************\n");
????????printf("-------------------------------------------------------------\n");
????????printf("請選擇解決沖突的方法:\n");
????????printf("\t\t\t\t\t\t1.開放定址法\n");
????????printf("\t\t\t\t\t\t2.拉鏈法\n");
????????printf("\t\t\t\t\t\t請選擇!\n");
????????printf("請輸入:");
????????scanf("%d", &choice);
????????if (choice == 1) {
????????????main1();
????????}
????????else if (choice = 2) {
????????????main2();
????????}
????????else {
????????????printf("輸入錯(cuò)誤!");
????????}
????}
}
8.設(shè)計(jì)總結(jié)
在進(jìn)行本次實(shí)驗(yàn)時(shí),我學(xué)會(huì)了使用哈希表的相關(guān)算法,包括線性探測法和拉鏈法,并對比了這兩種算法在實(shí)現(xiàn)上的不同。我還學(xué)會(huì)了在 C 語言中使用結(jié)構(gòu)體來存儲數(shù)據(jù),以及如何使用鏈表來實(shí)現(xiàn)拉鏈法。
在實(shí)驗(yàn)過程中,我首先使用了線性探測法實(shí)現(xiàn)哈希表,并在該算法的基礎(chǔ)上改進(jìn)了拉鏈法的實(shí)現(xiàn)。通過對比兩種算法的實(shí)現(xiàn),我發(fā)現(xiàn)拉鏈法更加靈活,能夠解決線性探測法中的沖突問題。
在實(shí)驗(yàn)中我還學(xué)會(huì)了如何對哈希表中的數(shù)據(jù)進(jìn)行插入、查找等操作。通過實(shí)驗(yàn),我們深刻地理解了哈希表在實(shí)際應(yīng)用中的重要性,并增強(qiáng)了對算法實(shí)現(xiàn)的理解。
在實(shí)驗(yàn)過程中遇到了許多問題,包括:
- 計(jì)算姓名和電話號碼的哈希值:使用hash_by_phone_2函數(shù)計(jì)算電話號碼的哈希值,使用hash_by_name_2函數(shù)計(jì)算姓名的哈希值。
int hash_by_phone_2(char* phone) {//計(jì)算電話號碼的哈希值
????int hash = 0;
????for (int i = 0; i < strlen(phone); i++) {
????????hash = (hash * 10 + phone[i] - '0') % SIZE;
????}
????return hash;
}
int hash_by_name_2(char* name) {//計(jì)算姓名的哈希值
????int hash = 0;
????for (int i = 0; i < strlen(name); i++) {
????????hash = (hash * 26 + name[i] - 'A') % SIZE;
????}
????return hash;
}
- 平均查找成功和失敗長度的計(jì)算:如用print_avg_lengths_phone_1函數(shù)計(jì)算第一個(gè)哈希表中電話號碼的平均查找長度。這個(gè)函數(shù)會(huì)遍歷整個(gè)哈希表,查找每個(gè)記錄對應(yīng)的電話號碼的查找長度,然后計(jì)算總長度的平均值,其中平均查找成功長度=對應(yīng)的電話號碼的查找成功總長度/哈希表元素個(gè)數(shù);平均查找失敗長度=對應(yīng)的電話號碼的查找失敗總長度/哈希表表長。
- 調(diào)試過程中,出現(xiàn)返回值scanf被忽略,取消NULL指針對new_node的引用等警告,通過關(guān)閉配置屬性里的SDL檢查解決等等。
- 不足之處:沒有實(shí)現(xiàn)用txt文件來讀出與寫入,保存學(xué)生信息,還有不熟練怎么向他人講述清楚自己的代碼等等,這些還需要自己下去更多的查閱資料和練習(xí)。
- 比較好的部分是,實(shí)現(xiàn)了不同沖突解決辦法的平均長度比較。
總之,本次實(shí)驗(yàn)讓我深入理解了哈希表的算法原理,并且提高了我的編程能力,為以后的算法學(xué)習(xí)打下了堅(jiān)實(shí)的基礎(chǔ)。
9.參考文獻(xiàn)
[1]Robert L. Kruse,Data Structures And Program Design in C++,高等教育出版社,2001.5.
[2]嚴(yán)蔚敏等編著,數(shù)據(jù)結(jié)構(gòu)(C 語言版),清華大學(xué)出版社,1997.4;
[3]趙文靜等編著,數(shù)據(jù)結(jié)構(gòu)與算法,科學(xué)出版社,2005.08;
[4]Clifford,A.Shaffer編著,數(shù)決結(jié)構(gòu)與算法分析(C++版),電子工業(yè)出版社,2005.7
[5] 趙文靜編著,數(shù)據(jù)結(jié)構(gòu)-C++語言描述,西安交通大學(xué)出版社,1999.01
[6] 孫鑫,于安萍編著,VC++深入詳解,電子工業(yè)出版社,2007.7文章來源:http://www.zghlxwxcb.cn/news/detail-493088.html
[7] COHOON & DAVIDSON編著,C++程序設(shè)計(jì),清華大學(xué)出版社,2005.8文章來源地址http://www.zghlxwxcb.cn/news/detail-493088.html
到了這里,關(guān)于《程序設(shè)計(jì)綜合設(shè)計(jì)》課程設(shè)計(jì)--電話號碼查詢系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!