资源描述
. .
课 程 设 计
QQ好友管理系统
课程设计名称: 数据构造课程设计
专 业 班 级 : 16机电二班
小组成员 :王守锋 石松轶 陆永斌 智斌 浩明
指 导 教 师 : 徐丽萍
课程设计时间: 2021年5月30日
计算机应用技术 专业课程设计任务书
学生XX
专业班级
学号
题 目
QQ好友讯录管理系统
课题性质
工程设计
课题来源
自拟课题
指导教师
同组XX
无
主要容
运用C语言和数据构造知识设计QQ好友管理系统
QQ不仅仅是个社交平台,还应是个工作平台,将通讯录保存在QQ用时更加方便。
通过QQ可以直接呼叫联系人。
任务要求
1 添加好友信息 2 显示好友信息
3 删除好友信息 4 更改好友信息
5 查询好友信息
参考文献
?数据构造〔C语言版〕?严蔚敏 清华大学
?C语言程序设计?〔第三版〕谭浩强 清华大学
审查意见
指导教师签字:
教研室主任签字: 年 月 日
. .word.zl.
. .
目 录
1 需求分析1
2概要设计1
3 详细设计1
4 运行环境1
5 开发工具和编程语言1
6 程序设计1
7 调试分析1
8 测试结果1
9参考文献1
10心得体会1
11 成绩评价表1
1 需求分析
QQ的普及度越来越高,其功能也需要加强。将通讯录的功能添加到QQ好友管理系统中,使其在聊天中就可以呼叫联系人,并且将通讯录的信息可以QQ中长期保存,在无手机的情况下也查找好友手机号。从而使QQ功能更加完善,使用起来更加方便和快捷。
2概要设计
〔1〕实现功能:
菜 单
推出系统
查找好友
删除好友
显示好友
添加好友
修改信息
〔2〕序中各函数程简单说明见下:
返回值
函数名
参数表
函数说明
提供客户
int
main
void
主函数
是
void
menu
void
显示功能
是
int
reads
Haoyou stu[N]
读取
否
void
save
haoyou stu[N],n
保存
是
void
add
void
添加
是
void
del
void
删除
否
void
query
void
查找
是
void
chang
void
修改
否
void
show
void
信息显示
是
(3) 对程序中的各个函数功能的描述
[1]主函数main
系统开场、完毕界面的显示、各个功能函数的调用、转换以及参数的传递、定义QQ头结点并传递给各个功能函数
[2]功能显示menu
介绍程序的功能,按那些键实现其特点功能。
[3]读取函数reads
读取用户输入的信息,将其按线性表的形式呢存储,
联系人的编号为其头结点。
[4]保存函数save
将输入的信息保存,假设失败返回保持失败。
[5]添加联系人函数add
增加联系人到QQ通讯录的尾部,返回增加是否成功。
[6]删除函数del
按照用户指定的联系人编号删除相应联系人信息,返回删除是否成功。
[7]查找函数query
按照用户提供的联系人XX查找第一个合法XX对应的信息,查找成
功那么显示信息,失败那么提示无此联系人,返回是否查找到。
[8]修改函数chang
按照用户提供的联系人XX修改联系人所有信息,返回修改是否
成功。
[9]显示信息函数show
显示当前通讯录中所有联系人的信息,假设为空通讯录,那么显示无联
系人。
主函数main
3 详细设计
显示功能show
修改功能chang
查找功能query
删除功能del
添加功能add
保存功能save
读取功能reads
显示功能menu
4 运行环境
1) 软件环境
操作系统:Windows7,Windows8
2) 硬件环境
处理器:Intel Pentium 166MX 或更高
存:32MB以上
硬盘空间:1GB以上
显卡:SVGA 显示适配
5 开发工具和编程语言
Microsoft visual C++
C语言
6 程序设计
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"conio.h"/*conio.h主要做图形图像,例如说设置背风光的函数,字体颜色的函数、输出格式的函数等*/
#define N 30
typedef struct haoyou/*typedef是类型定义的意思。typedef struct 是为了使用这个构造体方便。 具体区别在于:假设struct node {}这样来定义构造体的话。在申请node 的变量时,需要这样写,struct node n;假设用typedef,可以这样写,typedef struct node{}NODE; 。在申请变量时就可以这样写,NODE n; 区别就在于使用时,是否可以省去struct这个关键字*/
{
char num[20];
char name[10];
char adress[50];
char QQ[15];
char tel[15];
}haoyou;
void menu();
int reads(haoyou stu[N]); //读取
void save(haoyou stu[N],int n); //保存
void add(); //添加
void del(); //删除
void query(); //查询
void change(); //修改
void show(); //信息显示
void main()
{
int n;
while(1)/*while(1)其中1代表一个常量表达式,他永远不会等于0。所以,循环会一直执行下去。除非你设置break等类似的跳出循环语句循环才会中止*/
{
menu();
printf("→→→→→→→→→→→→→→→→→→→→→\n");
printf(" 您现在看到的是QQ中的通讯录 \n");
printf("←←←←←←←←←←←←←←←←←←←←←\n");
printf("→→→→→→→→→→→→→→→→→→→→→\n");
printf(" 请输入您要选择的操作编号,按回车键确认:\n");
printf("←←←←←←←←←←←←←←←←←←←←←\n");
scanf("%d",&n);
switch(n)
{
case 1: add();break;
case 2: show();break;
case 3: del();break;
case 4: change();break;
case 5: query();break;
case 0: exit(0);
default:
printf("***********************************\n");
printf(" 输入错误,请输入列表中存在的编号 \n ");
printf("***********************************\n");
}
printf("*************\n");
printf(" 按任意键返回\n");
printf("*************\n");
getch(); /*getch();或ch=getch(); 用getch();会等待你按下任意键,再继续执行下面的语句;用ch=getch();会等待你按下任意键之后,把该键字符所对应的ASCII码赋给ch,再执行下面的语句。*/
}
}
void menu()
{
system("color 1f");//颜色
system("cls");//清屏
printf("***********xxx好友信息管理系统*******************\n");
printf("** 1 添加好友信息 **\n");
printf("** 2 显示好友信息 **\n");
printf("** 3 删除好友信息 **\n");
printf("** 4 更改好友信息 **\n");
printf("** 5 查询好友信息 **\n");
printf("** 0 退出 **\n");
printf("*******************************************************\n");
}
int reads(haoyou stu[N]) // 读取好友文件中的容
{
FILE *fp;
int i=0;
if((fp=fopen("d:\\haoyou.txt","r"))==NULL)
{
printf("文件翻开失败!\n");
return 0;
}
else
{
for(i=0;!feof(fp);i++)
fscanf(fp,"%s %s %s %s %s\n",stu[i].num,stu[i].name,stu[i].adress,stu[i].QQ,stu[i].tel);
}
fclose(fp);
return i;
}
void save(haoyou stu[N],int n) // 好友信息改变后更新文件
{
FILE *fp;
int i=0;
if((fp=fopen("d:\\haoyou.txt","w"))==NULL)
{
printf("文件翻开失败!\n");
return ;
}
else
{
for(i=0;i<n;i++)
fprintf(fp,"%s %s %s %s %s\n",stu[i].num,stu[i].name,stu[i].adress,stu[i].QQ,stu[i].tel);
}
fclose(fp);
}
void add()/*添加好友信息*/
{
FILE *fp;
int n,i;
haoyou stu;
if((fp=fopen("d:\\haoyou.txt","a"))==NULL) /*如果文件已经存在,可以追加好友信息*/
{
if((fp=fopen("d:\\haoyou.txt","w"))==NULL) /* 文件不存在时,创立新文件,输入好友信息*/
{
printf("文件翻开失败!\n");
return;
}
}
printf("**************************************\n");
printf(" 请输入要添加的好友数量,按回车键确认:\n");
printf("**************************************\n");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
printf("*****************************************************\n");
printf(" 请输入第%d个好友的编号、XX,用空格分开,并按回车键确认:\n",i);
printf("*******************************************************\n");
scanf("%s%s",stu.num,stu.name);
printf("******************************************************\n");
printf(" 请输入第%d个好友的地址、QQ号和,用空格分开,并按回车键确认:\n",i);
printf("*****************************************************\n");
scanf("%s%s%s",stu.adress,stu.QQ,stu.tel);
fprintf(fp,"%s %s %s %s %s\n",stu.num,stu.name,stu.adress,stu.QQ,stu.tel);
}
fclose(fp);
}
void show() // 好友信息显示函数
{
haoyou stu[N];
int i,n;
n=reads(stu);
printf("*************所有的好友信息如下*******************\n\n");
printf(" 序号 编号 XX 地址 QQ号 \n");
printf("*******************************************************\n");
for(i=0;i<n;i++)
printf("\n%3d %s %s %s %s %s\n",i+1,stu[i].num,stu[i].name,stu[i].adress,stu[i].QQ,stu[i].tel);
printf("*******************************************************\n");
getch();
}
void del() /*好友信息删除函数*/
{
haoyou stu[N];
char number[20];
int n,i,j;
n=reads(stu);
printf("********************************************\n");
printf("请输入要删除信息的好友编号,按回车键确认:\n");
printf("********************************************\n");
scanf("%s",number);
for(i=0;i<n;i++)
if(strcmp(number,stu[i].num)==0) break;
if(i>=n)
{
printf("没有找到该好友信息!\n");
return;
}
else
{
for(j=i+1;j<n;j++)
stu[j-1]=stu[j];
}
save(stu,n-1);
printf("删除成功!\n");
}
void change() //好友信息更改
{
haoyou stu[N];
int n,i;
char number[20];
printf("******************************************\n");
printf("请输入要更改信息的好友编号,按回车键确认:\n");
printf("******************************************\n");
scanf("%s",number);
n=reads(stu);
for(i=0;i<n;i++)
if(strcmp(number,stu[i].num)==0)
break;
if(i>=n)
{
printf("无此好友信息!");
return;
}
printf("******************************************************\n");
printf("请输入更改后好友的编号,XX,地址,QQ号,,按回车键确认:\n");
printf("******************************************************\n");
scanf("%s%s%s%s%s",stu[i].num,stu[i].name,stu[i].adress,stu[i].QQ,stu[i].tel);
save(stu,n);
}
void query() // 按编号对好友信息查询
{
haoyou stu[N];
char number[20];
int i,n;
n=reads(stu);
printf("****************************************\n");
printf("请输入待查询的好友编号,按回车键确认:\n");
printf("****************************************\n");
scanf("%s",number);
for(i=0;i<n;i++)
if(strcmp(number,stu[i].num)==0) break;
if(i>=n)
{
printf("没有找到该好友信息!\n");
return;
}
else
{
printf("******************************************************\n");
printf(" 编号 XX 地址 QQ号 \n");
printf("*******************************************************\n");
printf("\n%s %s %s %s %s\n",stu[i].num,stu[i].name,stu[i].adress,stu[i].QQ,stu[i].tel);
printf("****************************************************\n");
}
}
7 调试分析
1 在测试删除QQ联系人函数时发现无论通讯录中现存多少条记录只 要删除一条测试中的问题举例:之后,通讯录就会被清空,经过检查发现是删除函数中的条件控制设置有错,导致只要一删除一个联系人就会事头结点与尾结点指向同一个,导致再显示联系人时显示无联系人。经过调整已 处理好。算法改进设想举例:
2 程序中还有很多地方不能很好的模拟QQ通讯录的功能,比方在增肌联系人时,不管原来新联系人XX是否已存在,都会被参加通讯录,这样一来就有可能重复记录。此外在查找联系人时只要查找到一个合法记录就会中断查找操作,如此有可能导致记录的漏查。结合以上两点应优化增加查找联系人算法,在存入之间进展防重判断。
8 测试结果
1. 测试数据举例
编号
XX
地址
QQ号
手机号
1
duanbao
henan
163388
3768388
2
xiaoming
henan
37838282
83263848
3
xiaowang
henan
67284784
474847382
2. 按如下顺序进展测试:
1) 显示各个功能所对应的建
2) 添加好友信息
3) 显示好友信息
4) 删除好友信息
5) 更改好友信息
6) 查询好友信息
7) 退出系统
3 按照如上提供的测试步骤得出以下结果运行图:
1) 显示各个功能所对应的建如图1
图1 运行实例
2) 添加好友信息如图2
图2 运行实例
3〕 显示好友信息如图3
图3 运行实例
3) 删除好友信息如图4
图4 运行实例
5〕 更改好友信息如图
图5 运行实例
6〕 查询好友信息如图6
图6 运行实实例
7) 退出系统如图7
图7 运行实例
9参考文献
[1]严蔚敏,?数据构造〔C语言版〕? 清华大学
[2]谭浩强.?C语言程序设计?〔第三版〕 清华大学
[3]Peter Van Der Linden ,C专家编程,人民邮电
[4]Kenneth A.Reek C和指针 ,人民邮电
10心得体会
通过这次数据构造实践作业,我更深刻的体会到了C语言的语句简洁性、紧凑性,将文件与构造体结合可以实现好多功能。
语言是程序的骨肉,而数据构造和算法即使程序的灵魂,要想成功的编写程序必须选好适宜的数据构造,比方这次课程设计中,最开场我准备用普通的构造体进展设计,后来发现那样很不方便,后来改为用文件之后就方便了许多。
另外,我觉得比较重要的一点是在编复杂程序时要有宏观思想,想从整体把握设计好各个板块的调用关系,最好先做出一个流程图,再按照这个总体设想进一步具体、细化!这样才不会在需要调用其它函数时手忙脚乱!
此外,进展如上所述的操作前提都是以扎实的语言根底做为前提的,在最开场的代码编辑阶段,我曾被指针很深的困扰,后来对此一节找了些资料进展“补课〞,自己也进展的深入的理解,后来才逐渐顺利起来!
11计算机应用技术学院课程设计成绩评价表
课程名称:数据构造课程设计
设计题目:QQ好友讯录系统
专业: 班级: XX: 学号:
序号
评审工程
分 数
总分值标准说明
1
容
思路清晰;语言表达准确,概念清楚,论点正确;实验方法科学,分析归纳合理;结论严谨,设计有应用价值。任务饱满,做了大量的工作。
2
创 新
容新颖,题目能反映新技术,对前人工作有改进或突破,或有独特见解
3
完整性、实用性
整体构思合理,理论依据充分,设计完整,实用性强
4
数据准确、可靠
数据准确,公式推导正确
5
规 性
设计格式、绘图、图纸、实验数据、标准的运用等符合有关标准和规定
6
纪 律 性
能很好的遵守各项纪律,设计过程认真;
7
答 辩
准备工作充分,答复以下问题有理论依据,根本概念清楚。主要问题答复简明准确。在规定的时间作完报告。
总 分
综
合
意
见
指导教师 年 月 日
教育之通病是教用脑的人不用手,不教用手的人用脑,所以一无所能。教育革命的对策是手脑联盟,结果是手与脑的力量都可以大到不可思议。
. .word.zl.
展开阅读全文