软件工程 通讯录查询系统_软件工程通讯录系统

2020-02-28 其他范文 下载本文

软件工程 通讯录查询系统由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“软件工程通讯录系统”。

《数据结构》课程设计报告

计算机学院 软件工程专业

题目: 通信录查询系统(查找应用)

班级:软件102班 第11组

组长:

姓名:李伟

学号:1006550222 组员:

姓名:李呢

学号:1006550219 姓名:李强

学号:1006550221

指导老师:xxx

日期:2011 年 12月 30日

程序设计书目录

一、程序设计目标

二、问题描述

三、需求分析(说明课程设计的任务)

四、概要设计(说明课程设计中用到的抽象数据类型的定义、主程序的流程以及各程序模块之间的调用关系等)

五、详细设计(实现程序模块的具体算法)

六、软件说明书(给出软件应如何使用,使用时的注意事项)

七、源程序清单(要求400行以上,要有注释说明)

八、测试报告(调试过程中遇到的问题及解决方法,并列出测试结果,包括输入和输出)

九、课程设计总结

一、程序设计目标

通过本次课设进一步的了解哈希表函数及哈希表等有关概念,2 掌握哈希表查找的过程及方法。复习巩固大一时期学过的c语言知识。进一步加深对c语言、数据结构、离散数学等基础技能的理解和掌握。

让我们有一个既动手又动脑,独立实践的机会,可以让我们将课本上的理论知识和实际邮寄的结合起来,锻炼我们的分析解决实际问题的能力。提高我们实践编程能力。

通过本项课程设计,掌握工程软件设计的基本方法,强化上机动手编程能力,闯过理论与实践相 结合的难关!更加了解了c语言的好处和其可用性!同时增加了同学之间的团队合作精神!更加也体会到以后在工作中团队合作的重要性和必要性!通过C语言课程设计,使学生了解高级程序设计语言的结构,掌握基本的程序设计过程和技巧,掌握基本的分析问题和利用计算机求解问题的能力,具备初步的高级语言程序设计能力。为后续各门计算机课程的学习和毕业设计打下坚实基础。

二、问题描述

设计散列表实现通讯录查找系统。

(1)设每个记录有下列数据项:电话号码、用户名、地址;

(2)从键盘输入各记录,分别以电话号码为关键字建立散列表;

(3)采用二次探测再散列法解决冲突;(4)查找并显示给定电话号码的记录;(5)通讯录信息文件保存;

(6)要求人机界面友好,使用图形化界面;

三、需求分析

一.查询:用户有一个电话号码,但不知道此电话号码是谁的,则需要输入号码来查询该号码是不是此通讯录中已记录的人的号码,若是即显示该号码及姓名、所在地,若不是则显示“无记录”。

进入主菜单界面,输入4,进入通讯录查询模块。输入你想要搜索通讯人的电话号码。屏幕输出所搜通讯人的先关信息。二.通讯录信息添加:

若要向通讯录中添加新号码,也分两种情况:1若该通讯录是新的,既没有任何通讯记录的,则直接往里添加,需先输入姓名,随即输入号码和所在地,用于存储。2若通讯录不是空的,再添加新号码时则需在最后一个号码后面进行添加(输入姓名、电话号码及所在地),以此类推。

进入主菜单,输入1,进入通讯录信息添加模块。按照要求依次输入姓名、电话号码、住址。三.通讯录信息删除:

若要对通讯录中的内容进行删除: 然后输入所要删除的号码进行删除

删除成功。出现提示信息。按任意键回到主菜单。

四、概要设计

对功能键相对应的函数分别对各个函数在程序中进行定义如下:

void Menu()void Create()void Append()void CreateHash()void Find()void Delete()void Alter()void List()void Save()

void Load()

然后根据各功能键的选择主函数分别调用功能键相对应 4 的函数来实现通讯录的查询系统。

五、详细设计

1、定义结构体变量

typedef struct people //记录 { NA name;NA tel;//关键字 NA add;}Record;//查找表中记录类型

typedef struct //建立哈希表 { Record *elem[HASHSIZE];//数据元素存储基址 int count;//当前数据元素个数 int size;//当前容量 }HashTable;

2、定义显示函数 void Menu()

3、定义建立时间的函数 void benGetTime()

4、定义创建新的通讯录并添加信息的函数

void Create(Record* a)

5、定义关键字比较函数

Status eq(NA x,NA y)

6、定义添加信息函数

void Append(Record* a)

7、定义显示通讯录中所有信息函数

void List(Record* a)

8、定义哈希函数

int Hash(NA str)

9、定义冲突处理函数

Status collision(int p,int &c)

10、定义建立散列表的函数

void CreateHash(HashTable* H,Record* a)

11、定义通讯录查找的函数

void Find(HashTable* H,int &c)

12、定义修改信息的函数

void Alter(HashTable* H,int &c)

13、定义删除信息的函数

void Delete(HashTable* H,int &c)

14、定义保存信息到指定文件的函数

void Save(HashTable* H)

15、定义从指定文件中读取信息的函数

void Load()

16、定义主函数int main(int argc, char* argv[]){ system(“color FO”);system(“CLS”);int c,flag=1;HashTable *H;H=(HashTable*)malloc(LEN);for(int i=0;ielem[i]=NULL;H->size=HASHSIZE;H->count=0;Record a[MAXSIZE];donghua();while(1){ face();printf(“请输入一个任务选项>>>”);printf(“n”);int num;scanf(“%d”,&num);getchar();switch(num){ case 1:Create(a);break;case 2:Append(a);break;case 3:CreateHash(H,a);break;case 4:c=0;Find(H,c);break;case 5:c=0;Delete(H,c);break;case 6:c=0;Alter(H,c);break;case 7:List(a);break;case 8:Save(H);break;case 9:Load();break;

case 0:Quit();return 0;break;case 10:;;break;default: printf(“你输错了,请重新输入!”);printf(“n”);}

system(“CLS”);} return 0;}

六、软件说明书

双击程序,程序运行后,进入通信录查询系统菜单的操作界面,然后采用键盘进行操作。各功能键的选择如下:

1、创建新的通讯录并写入新的信息

2、添加某人的信息

3、以电话号码建立散列表

4、查找并显示给定电话号码的记录

5、删除某人的信息

6、修改某人的信息

7、显示通讯录中所有记录

8、保存通讯录所有记录到指定文件

9、从指定文件中读取通讯录中的记录 0、退出选单

选择1,建立新的通讯录,通讯录创建成功,按Enter键进入添加信息界面,界面会出现

根据系统提示进行相应的添写,添加成功之后,按Enter键返回主菜单。

选择2,在通讯录的末尾写入新的信息,与上诉添加信息操作相同。同样按Enter键返回主菜单。

选择3,会立即调用冲突处理函数以及建立散列表,界面上会显示冲突次数,哈希表容量和当前储存记录的个数,按Enter键返回主菜单。3功能键必须在4、5、6功能键之前选择,才能使4、5、6功能键派上用场。

选择4,查找某人信息,写入查找的电话号码,如果通讯录中有则会出现查找成功否则出现此人不存在,查找不成功。按Enter键返回主菜单。

选择5,删除某人信息,写入删除的电话号码,如果通讯录中有则会出现删除成功否则出现此人不存在,删除不成功。按Enter键返回主菜单。

选择6,修改某人信息,写入修改的电话号码,通过查找函数找到要修改的信息,在对找的的信息进行修改,如果通讯录中有则会出现原信息让用户输入修改后的信息,根据系统的提示输入修改后的信息,按Enter键会出现修改成功,否则出现此人不存在,修改不成功。按Enter键返回主菜单。

选择7,界面会输出全部成员的信息。按Enter键返回主菜单。选择8,利用存盘函数保存数据到指定文件,界面会出现保存成功,按Enter键返回主菜单。

选择9,载入存储过的电话、姓名、地址,界面会出现指定文件所存储的所有信息。按Enter键返回主菜单。选择0,显示再见,按Enter键退出系统。

七、源程序清单

#include #include #include #include #include #include using namespace std;#define MAXSIZE 20 //电话薄记录数量 #define MAX_SIZE 20 //人名的最大长度 #define HASHSIZE 60 //定义表长 #define SUCCESS 1 #define UNSUCCESS-1 #define LEN sizeof(HashTable)//为建立的对象定义长度 typedef int Status;//为现有类型添加一个同义字 typedef char NA[MAX_SIZE];// typedef 掩饰数组类型 static int m=0;

typedef struct people //记录 { NA name;NA tel;//关键字 NA add;}Record;//查找表中记录类型

typedef struct //建立哈希表{ Record *elem[HASHSIZE];//数据元素存储基址 int count;//当前数据元素个数 int size;//当前容量 }HashTable;int i;void Menu(){ printf(“

n”);printf(“ ## ttt ―――――― ttt ##n”);printf(“

# ttt

1.创建

丨 # n”);printf(“

# ttt

―――――― #n”);printf(“

# ttt

2.写入

丨 #n”);printf(“

# ttt

―――――― #n”);printf(“

# ttt

3.建表

丨 #n”);printf(“

# ttt

―――――― #n”);printf(“

# ttt

4.查找

丨 #n”);printf(“

# ttt

―――――― #n”);printf(“

# ttt

5.删除

丨 #n”);printf(“

# ttt

―――――― #n”);printf(“

# ttt

6.修改

丨 #n”);printf(“

# ttt

―――――― #n”);printf(“

# ttt

7.查看

丨 #n”);printf(“

# ttt

―――――― #n”);printf(“

# ttt

8.保存

丨#n”);printf(“

# ttt

―――――― #n”);printf(“

# ttt

9.读取

丨 #n”);printf(“

# ttt

―――――― #n”);printf(“

# ttt

0.退出

丨 #n”);printf(“

## ttt

―――――― ##n”);printf(“

n”);}

void benGetTime()//建立时间函数 { SYSTEMTIME sys;GetLocalTime(&sys);printf(“%4d/%02d/%02d %02d:%02d:%02d.%03d n”,sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute, sys.wSecond,sys.wMilliseconds);}

Status NUM_BER;//记录的个数 Status NUM_BER1;

void Create(Record* a)//创建新的通讯录 { system(“CLS”);//调用DOS命令CLS能够清屏

FILE *fp1,*fp2;if((fp1=fopen(“record.txt”,“r”))!=NULL)//打开文件

{ fclose(fp1);//关闭文件

} else {

fp2=fopen(“record.txt”,“w”);//如果不存在record.txt就创建一个

fclose(fp2);11 }

printf(“n”);

printf(“

#####n”);printf(“==================== → 创建成功 ← ===================n”);

printf(“

#####n”);

printf(“n”);printf(“◇◆请按ENTER进入添加通讯信息菜单◇◆n”);getchar();system(“CLS”);system(“CLS”);//调用DOS命令CLS能够清屏

printf(“

#####n”);printf(“==================== → 用户信息记录表 ← ===================n”);

printf(“

#####n”);printf(“输入要添加的个数:n”);scanf(“%d”,&NUM_BER);for(i=0;i

{ printf(“请输入第%d个记录的用户名:n”,i+1);scanf(“%s”,a[i].name);printf(“请输入%d个记录的电话号码:n”,i+1);scanf(“%s”,a[i].tel);printf(“请输入第%d个记录的地址:n”,i+1);scanf(“%s”,a[i].add);

} getchar();

printf(“

#n”);

printf(“添加成功!!n”);

benGetTime();printf(“~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~n”);printf(“◇◆请按ENTER返回功能操作菜单◇◆n”);printf(“

#n”);12 getchar();}

Status eq(NA x,NA y)//关键字比较,相等返回SUCCESS;否则返回UNSUCCESS { if(strcmp(x,y)==0){ return SUCCESS;} else return UNSUCCESS;}

void Append(Record* a)//键盘输入各人的信息 { system(“CLS”);//调用DOS命令CLS能够清屏

printf(“

#####n”);printf(“==================== → 用户信息记录表 ← ===================n”);

printf(“

#####n”);printf(“输入要添加的个数:n”);scanf(“%d”,&NUM_BER1);int j=i;for(i;i

printf(“

#n”);

printf(“添加成功!!n”);

benGetTime();13 printf(“~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~n”);printf(“◇◆请按ENTER返回功能操作菜单◇◆n”);printf(“

#n”);getchar();}

void List(Record* a)//显示通讯录中所有记录 { Record *p;p=a;int i;system(“CLS”);//调用DOS命令CLS能够清屏

printf(“

#####n”);printf(“==================== → 用户信息记录表 ← ===================n”);

printf(“

#####n”);if(a!=NULL){

printf(“nn姓名t电话号tt地址n”);

printf(“_____________________________________________________n”);for(i=0;i

{

printf(“%st%stt%sn”,a[i].name,a[i].tel,a[i].add);

printf(“_____________________________________________________n”);

} } else { printf(“对不起!没有任何联系人记录!nn”);

printf(“===============n”);} benGetTime();printf(“

#####n”);14 printf(“◇◆请按ENTER返回功能操作菜单◇◆n”);printf(“

#####n”);getchar();}

int Hash(NA str)//哈希函数 { system(“CLS”);//调用DOS命令CLS能够清屏 long n;int m;n = atoi(str);//整型数.m=n%HASHSIZE;//造哈希函数

return m;//}

Status collision(int p,int &c)//用二次探测再散列法解决冲突 { int i,q;i=c/2+1;while(i=0)

{

return q;

} else

{

i=c/2+1;

} } else { q=(p-i*i)%HASHSIZE;把字符串转换成用除留余数法构并返回模值 冲突处理函数,采15 c++;if(q>=0)

{

return q;

} else

{ i=c/2+1;

} } } return UNSUCCESS;}

void CreateHash(HashTable* H,Record* a)//建表,以电话号码为关键字,建立相应的散列表 { system(“CLS”);//调用DOS命令CLS能够清屏

int i,p=-1,c,pp;for(i=0;ielem[pp]!=NULL)

{ pp=collision(p,c);//若哈希地址冲突,进行冲突处理 if(pp

{

printf(“

#####n”);printf(“==================== → 用户信息记录表 ← ===================n”);

printf(“

#####n”);printf(“第%d记录无法解决冲突”,i+1);//需要显示冲突次数时输出 continue;

} //无法解决冲突,跳入下一循环

} H->elem[pp]=&(a[i]);//求得哈希地址,将信息存入 H->count++;

printf(“

#####n”);printf(“==================== → 用户信息记录表 ← ===================n”);

printf(“

#####n”);printf(“第%d个记录冲突次数为%d。n”,i+1,c);//需要显示冲突次数时输出

} printf(“n建表完成!n此哈希表容量为%d,当前表内存储的记录个数为%d.n”,HASHSIZE,H->count);benGetTime();printf(“

#####n”);printf(“◇◆请按ENTER返回功能操作菜单◇◆n”);printf(“

#####n”);getchar();}

void Find(HashTable* H,int &c)//在通讯录里查找电话号码关键字,若查找成功,显示信息 { system(“CLS”);//调用DOS命令CLS能够清屏

printf(“

#####n”);printf(“==================== → 用户信息记录表 ← ===================n”);

printf(“

#####n”);benGetTime();17 NA tele;printf(“n请输入要查找记录的电话号码:n”);scanf(“%s”,tele);int p,pp;p=Hash(tele);pp=p;while((H->elem[pp]!=NULL)&&(eq(tele,H->elem[pp]->tel)==-1))pp=collision(p,c);if(H->elem[pp]!=NULL&&eq(tele,H->elem[pp]->tel)==1){

printf(“

#####n”);printf(“==================== → 用户信息记录表 ← ===================n”);

printf(“

#####n”);printf(“n查找成功!n查找过程冲突次数为%d.以下是您需要要查找的信息:nn”,c);// printf(“姓

名:%sn电话号码:%sn联系地址:%sn”,H->elem[pp]->name,H->elem[pp]->tel,H->elem[pp]->add);

printf(“nn姓名t电话号tt地址n”);

printf(“_____________________________________________________n”);

printf(“%st%stt%sn”,H->elem[pp]->name,H->elem[pp]->tel,H->elem[pp]->add);

printf(“_____________________________________________________n”);} else

printf(“n此人不存在,查找不成功!n”);benGetTime();getchar();printf(“

#####n”);printf(“◇◆请按ENTER返回功能操作菜单◇◆n”);printf(“

#####n”);getchar();} void Alter(HashTable* H,int &c)//在通讯录里修改某人信息 { system(“CLS”);//调用DOS命令CLS能够清屏

printf(“

#####n”);printf(“==================== → 用户信息记录表 ← ===================n”);

printf(“

#####n”);benGetTime();NA tele;printf(“n请输入要修改记录的电话号码:n”);scanf(“%s”,tele);int p,pp;p=Hash(tele);pp=p;while((H->elem[pp]!=NULL)&&(eq(tele,H->elem[pp]->tel)==-1))pp=collision(p,c);if(H->elem[pp]!=NULL&&eq(tele,H->elem[pp]->tel)==1){

printf(“

#####n”);printf(“==================== → 用户信息记录表 ← ===================n”);

printf(“

#####n”);

printf(“n以下是您需要修改的信息:”);

printf(“n”);

printf(“nn姓名t电话号tt地址n”);

printf(“_____________________________________________________n”);

printf(“%st%stt%sn”,H->elem[pp]->name,H->elem[pp]->tel,H->elem[pp]->add);printf(“_____________________________________________________n”);

(H->elem)[pp]->tel[0]='';

printf(“请输入修改后记录的用户名:n”);scanf(“%s”,H->elem[pp]->name);printf(“请输入修改后记录的电话号码:n”);scanf(“%s”,H->elem[pp]->tel);printf(“请输入修改后记录的地址:n”);scanf(“%s”,H->elem[pp]->add);

printf(“修改成功!!”);} else {

printf(“

#####n”);printf(“==================== → 用户信息记录表 ← ===================n”);

printf(“

#####n”);

benGetTime();

printf(“n此人不存在,修改不成功!n”);} getchar();printf(“

#####n”);printf(“◇◆请按ENTER返回功能操作菜单◇◆n”);printf(“

#####n”);getchar();}

void Delete(HashTable* H,int &c)//在通讯录里查找电话号码关键字,若查找成功,显示信息然后删除 { system(“CLS”);//调用DOS命令CLS能够清屏

printf(“

#####n”);printf(“==================== → 用户信息记录表 ← ===================n”);printf(“

#####n”);benGetTime();NA tele;printf(“n请输入要删除记录的电话号码:n”);m++;scanf(“%s”,tele);int p,pp;p=Hash(tele);pp=p;while((H->elem[pp]!=NULL)&&(eq(tele,H->elem[pp]->tel)==-1))pp=collision(p,c);if(H->elem[pp]!=NULL&&eq(tele,H->elem[pp]->tel)==1){

printf(“

#####n”);printf(“==================== → 用户信息记录表 ← ===================n”);

printf(“

#####n”);printf(“n以下是您需要要删除的信息:nn”,c);

printf(“nn姓名t电话号tt地址n”);

printf(“_____________________________________________________n”);

printf(“%st%stt%sn”,H->elem[pp]->name,H->elem[pp]->tel,H->elem[pp]->add);

printf(“_____________________________________________________n”);

printf(“n”);

(H->elem)[pp]->tel[0]='';

printf(“删除成功!!”);} else

printf(“n此人不存在,删除不成功!n”);benGetTime();getchar();printf(“

#####n”);printf(“◇◆请按ENTER返回功能操作菜单◇◆n”);21 printf(“

#####n”);getchar();}

void Save(HashTable * H)//将记录保存到指定文件 {

system(“CLS”);

FILE* fp;

if((fp=fopen(“record.txt”,“w”))!=NULL)

{

fprintf(fp,“

#####n”);fprintf(fp,“==================== → 用户信息记录表 ← ===================n”);

fprintf(fp,“

#####n”);for(int i=0;i

{

if((H->elem)[i]!='')

{

fprintf(fp,“======n”);fprintf(fp,“联系人姓名:%sn”,H->elem[i]->name);fprintf(fp,“联系人电话:%sn”,H->elem[i]->tel);fprintf(fp,“联系人地址:%sn”,H->elem[i]->add);

fprintf(fp,“======n”);

}

}

fclose(fp);

printf(“

#####n”);printf(“==================== → 用户信息记录表 ← ===================n”);

printf(“

#####n”);

benGetTime();22

printf(“nn恭喜你!成功储存,你能在record.txt找到相应纪录n”);

printf(“

#####n”);

system(“pause”);

}

else

{

benGetTime();

printf(“抱歉,保存记录失败!”);

system(“pause”);

} }

void Load(){ system(“CLS”);ifstream inFile;inFile.open(“record.txt”);// 打开文件 string str;// 行字符串缓存

if(inFile.is_open())// 若成功打开文件

{ while(!inFile.eof())// 若未到文件结束

{ getline(inFile, str, 'n');// 读取一行内容,并存入缓存str中,'n'表示一行结束的回车符

cout

} } inFile.close();printf(“

#####n”);printf(“◇◆请按ENTER返回功能操作菜单◇◆n”);printf(“

#####n”);getchar();}

void Quit()//结束 {

system(“cls”);23

system(“color F0”);

printf(“

n”);

printf(“☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★n”);

printf(“ 谢谢使用!再见!!n”);

printf(“☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★n”);

printf(“

n”);}

int main(int argc, char* argv[]){ system(“color F0”);system(“CLS”);//调用DOS命令CLS能够清屏 int c,flag=1;HashTable *H;H=(HashTable*)malloc(LEN);for(int i=0;ielem[i]=NULL;H->size=HASHSIZE;H->count=0;Record a[MAXSIZE];while(1){ Menu();printf(“请输入一个任务选项>>>”);int num;scanf(“%d”,&num);getchar();switch(num){ case 1:Create(a);break;case 2:Append(a);break;case 3:CreateHash(H,a);break;case 4:c=0;Find(H,c);break;case 5:c=0;Delete(H,c);break;case 6:c=0;Alter(H,c);break;case 7:List(a);break;case 8:Save(H);break;24 case 9:Load();break;

case 0:Quit();return 0;break;case 10:;;break;default: printf(“你输错了,请重新输入!”);printf(“n”);}

system(“CLS”);} return 0;}

八、测试报告

首先在编程过程中最先遇到的问题是用int整形定义电话号只能存10位,而现在手机号都为11位,用double双精度浮点型在进行哈希函数时会有错误,我们组最后经查询与询问老师后确定的解决办法是以字符串形式进行存储,哈希函数进行计算时把字符串转换成整型数。

起初我们在进行本地保存和读取是数据时是以数据块的形式进行存储但是后期遇到问题在进行修改和删除时过于复杂和繁琐,违背了程序的本意,经网上与书籍查询和老师的指导最后换为以字符进行存储.在建立哈希函数后进行的二次探测在散列的(1,-1,4,-4,9,-9。。。)的算法没有及时总结出来,最后经我组讨论以如下方法解决:

Status collision(int p,int &c)//冲突处理函数,采用二次探测再散列法解决冲突

{ int i,q;i=c/2+1;while(i

c++;q=(p+i*i)%HASHSIZE;if(q>=0)

{

return q;

} else

{

i=c/2+1;

} } else { q=(p-i*i)%HASHSIZE;c++;if(q>=0)

{

return q;

} else

{ i=c/2+1;

} } } return UNSUCCESS;} 第一次c传进来的值为0运行时i为1,c%2=0,c++(c为1),p+i*i(i*i=1)。

第二次c传进来的值为1运行时i仍然为1(因为i是整型),c%2不等于0,p-i*i(i*i=1),c++(c为2)。下面为程序的运行测试:进入界面首先输入1创建通讯录;

提示创建成功输入回车直接进入添加功能;

输入添加数1,姓名电话和地址然后回车确认,提示添加成功;

回车退回选单输入2进入追加通讯信息功能;输入2添加两个记录提示添加成功按回车回到选单;

输入3进入建表功能提示有三个记录冲突数为2,***与***冲突;回车回到选单是,输入4进入查询功能;

输入电话号回车显示查询成功,显示信息;如果不存在这显示不成功;

回车返回选单输入5进入删除功能,输入电话号;

显示删除信息,提示删除成功;

回车返回选单,输入6进入修改功能,输入电话号;

查询到信息则显示并提示输入新信息人,输入后提示成功;

没有提示侧人不存在;

回车返回选单,输入7查看所有信息;

回车返回选单,输入8保存信息到record.txt中;

record.txt文件中的信息;

输入9读取信息,显示所有已存信息;

回车返回选单,输入0显示再见,退出程序。

《软件工程 通讯录查询系统.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
软件工程 通讯录查询系统
点击下载文档
相关专题 软件工程通讯录系统 软件工程 查询系统 通讯录 软件工程通讯录系统 软件工程 查询系统 通讯录
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文