同学通讯录课设报告.docx
- 文档编号:7526139
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:19
- 大小:374.13KB
同学通讯录课设报告.docx
《同学通讯录课设报告.docx》由会员分享,可在线阅读,更多相关《同学通讯录课设报告.docx(19页珍藏版)》请在冰豆网上搜索。
同学通讯录课设报告
沈阳航空航天大学
课程设计报告
课程设计名称:
数据结构课程设计
课程设计题目:
同学通讯录
院(系):
计算机学院
专业:
计算机科学与技术
班级:
学号:
姓名:
指导教师:
目录
1课程设计介绍1
1.1课程设计内容1
1.2课程设计要求1
2概要设计2
2.1课设题目粗略分析2
2.2功能模块分析2
3详细设计3
3.1存储结构3
3.2算法描述3
3.3流程图4
4调试与分析13
4.1调试过程13
4.2程序执行过程13
参考文献16
附录(关键部分程序清单)17
1课程设计介绍
1.1课程设计内容
设计程序,实现算术表达式求值,系统主要功能如下:
1.录入、修改及删除同学信息;
2.查询:
按照姓名、城市等查询,查找算法可以使用折半查找;
3.排序:
按照同学姓名排序,排序方法不唯一。
建立一个同学通讯录,并实现录入、修改、查询、删除等功能,最后输出结果。
1.2课程设计要求
1.开发语言可以选择C语言或者面向对象的C++等;
2.按时独立完成课程设计任务;
3.按照课程设计规范书写课程设计报告。
2概要设计
2.1课设题目粗略分析
设计出创建线性表的函数,用来创建通讯录,还要完成通讯者信息的添加、查找、修改、删除和对整个通讯录的输出,供使用者浏览通讯录,也就要设计出添加函数、查找函数、修改函数、删除函数和输出函数。
然后用主函数选择性调用。
1.考虑到通讯录中每人包含多项信息,因此采用自定义结构体存储每人的信息;
2.为进行查找操作时方便,程序采用线性表的顺序存储结构;
3.考虑到程序的交互性,在代码中加入分割符号增加程序的交互性。
2.2功能模块分析
设计出创建线性表的函数,用来创建通讯录,还要完成通讯者信息的添加、查找、修改、删除和对整个通讯录的输出,供使用者浏览通讯录,也就要设计出添加函数、查找函数、修改函数、删除函数和输出函数。
功能模块图如图2.1所示。
图2.1功能模块图
3详细设计
3.1存储结构
typedefstructinfo{
//定义一个结构体保存各个节点的信息
charname[10];//姓名
charsex[10];//性别
charcity[12];//城市
charmobile[13];//手机号码
charemail[20];//电子邮箱
}datatype;
typedefstructnode{
//使用线性表存储各个节点
datatype*elem;//线性表基地址
intlength;//当前存储长度
intlistsize;//最大存储长度
}sqlist;
3.2算法描述
(1)折半查找:
折半查找的过程是:
先确定待查记录所在的区间,然后逐步缩小范围直到找到或找不到该记录为止。
intlist_find(sqlist&L)//查找函数(折半查找)
{
charname[10];
intlow,high,mid,temp;
scanf("%s",name);//输入要查找的姓名
low=0;//下界指针
high=L.length-1;//上界指针
while(low<=high)//折半查找过程
{
mid=(low+high)/2;
if(compare(name,L.elem[mid].name)==0)
{
temp=mid;//如果成功,记录该位置信息
break;
}
else
if(compare(name,L.elem[mid].name)>0)
low=mid+1;
else
high=mid-1;
}
if(low>high)
temp=-1;//如果找不到,使temp=-1
returntemp;//返回要查找位置的序号
}
(2)向有序线性表中插入信息,并保持有序性:
先输入要插入的姓名,然后确定插入位置。
若插入位置在表尾,则直接在表尾插入该节点,表长加1;否则,插入位置之后的所有元素向后移1,在插入位置插入该节点,表长加1。
3.3流程图
(1)main函数
main函数负责调用菜单函数,并根据返回值分别调用录入、插入、修改、查询、删除函数,并输出结果。
main函数流程图如图2.2所示。
图2.2main函数流程图
(2)
menu_select函数
该函数是用来输出通讯录管理系统菜单,并接收操作序列号,返回主函数。
menu_select函数流程图如图2.3所示。
图2.3menu_select函数流程图
(3)compare函数
比较函数用于比较两字符串的先后顺序,并返回比较结果。
compare函数流程图如图2.4所示。
图2.4compare函数流程图
(4)
creat_list函数
该函数负责建立同学通讯录的线性表存储结构。
creat_list函数流程图如图2.5所示。
图2.5creat_list函数流程图
(5)
Insert_node函数
向有序线性表中插入新的信息,并保持表的有序性。
Insert_node函数流程图如图2.7所示。
图2.6Insert_node函数流程图
(6)
list_find函数
根据输入的姓名查询其个人信息在线性表中的位置。
本函数采用折半查找的算法。
list_find函数流程图如图2.7所示。
图2.7list_find函数流程图
(7)change_node函数
调用查找函数得到要修改的姓名位置,然后修改改姓名下的全部信息。
change_node函数流程图如图2.8所示。
图2.8change_node函数流程图
(8)del_node函数
调用查找函数得到要删除的姓名位置,然后删除该姓名下的全部信息。
del_node函数流程图如图2.9所示。
图2.9del_node函数流程图
4调试与分析
4.1调试过程
在调试程序是主要遇到一下几类问题:
(1)问题描述:
errorC2065:
'exit':
undeclaredidentifier
问题分析:
exit函数没有定义,无法使用
解决方法:
添加该函数的头文件#include”stdlib.h”
(2)问题描述:
warningC4700:
localvariable't'usedwithouthavingbeeninitialized程序编译能够通过,但是在执行时出错
问题分析:
变量t没有存储空间
解决方法:
先给t分配空间t=(datatype*)malloc(Long);
(3)问题描述:
程序编译通过,但是在执行插入个人信息的时候出错,插入一个人信息后,他后面的人信息也发生了变化。
问题分析:
可能是再插入时后面信息移动发生了错误。
解决方法:
仔细阅读程序,修改移动语句。
(4)问题描述:
在查找函数运行时,总不能输出查找的结果。
问题分析:
在查找函数中有compare函数,应该是该函数数出现了问题。
解决方法:
重新编写compare函数,使得其返回值有意义。
4.2程序执行过程
进入程序界面,按照菜单提示输入命令序号。
如图4.1所示。
图4.1初始界面
选择1,建立通讯录,如图4.2所示。
图4.2建立通讯录
向建立好的通讯录中插入新节点,如图4.3所示。
图4.3信息插入
在通讯录中查询信息,如图4.4所示。
图4.4通讯录信息的查询
删除某一节点信息,如图4.5所示。
图4.5信息的删除
通讯录完整输出,如图4.6所示。
图4.6通讯录完整输出
参考文献
[1]严蔚敏,吴伟民.数据结构[M].北京:
清华大学出版社,2007.
[2]张长海,陈娟.C程序设计[M].北京:
高等教育出版社,2004.
[3]谭浩强.C程序设计[M].北京:
清华大学出版社,2005.
[4]苏仕华,贾伯琪,黄学俊.数据结构解析·习题·课程设计[M].合肥:
中国科学技术大学出版社,2009.
[5]吴永辉,王建德.数据结构编程实验[M].北京:
机械工业出版社,2012.
[6]K.N.King.C语言程序设计:
现代方法[M].北京:
人民邮电出版社,2007.
[7]李建学,李光元,吴春芳.数据结构课程设计案例精编(用C/C++描述)[M].北京:
清华大学出版社,2007.2.
[8]王敬华,林萍,张清国.C语言程序设计教程(第二版)[M].北京:
清华大学出版社,2009.8.
[9]郭翠英.C语言课程设计案例精编[M].北京:
中国水利水电出版社,2004.3.
[10]王为清,张圣亮.语言实战105例[M].人民邮电出版社,2005.4.
[11]胡超,闫玉宝.三数据结构标准教程[M].化学工业出版社,2001.
附录(关键部分程序清单)
程序代码
#include"stdio.h"
#include"malloc.h"
#include"string.h"
#include"stdlib.h"
#defineLongsizeof(datatype)
#defineLIST_INIT_SIZE100//初始长度
#defineLISTINCREMENT10//每次增加的长度
typedefstructinfo{//信息节点
charname[10];
charsex[10];
charcity[12];
charmobile[13];
charemail[20];
}datatype;
typedefstructnode{//线性表信息节点
datatype*elem;//线性表基地址
intlength;//当前存储长度
intlistsize;//最大存储长度
}sqlist;
intmenu_select();//菜单选项
intcompare(charc1[],charc2[]);
voidcreat_list(sqlist&L)//创建线性表通讯录
{
inti,j;
datatype*t;
t=(datatype*)malloc(Long);
L.elem=(datatype*)malloc(LIST_INIT_SIZE*Long);//申请基地址
if(L.elem==NULL)
exit(0);//存储分配失败
L.length=0;//空表长度为0
L.listsize=LIST_INIT_SIZE;//初始存储容量
printf("姓名输入#号键结束输入\n");
while
(1)
{
printf("姓名:
");
scanf("%s",L.elem[L.length].name);
if(L.elem[L.length].name[0]=='#')
break;
printf("性别(男/女):
");
scanf("%s",L.elem[L.length].sex);
while(strcmp(L.elem[L.length].sex,"男")!
=0&&strcmp(L.elem[L.length].sex,"女")!
=0)
{
printf("请输入正确的性别:
\n");
scanf("%s",L.elem[L.length].sex);
}
printf("城市:
");
scanf("%s",L.elem[L.length].city);
printf("手机(11位):
");
scanf("%s",L.elem[L.length].mobile);
printf("电子邮箱(20字节以内):
");
scanf("%s",L.elem[L.length].email);
L.length++;
}
for(i=0;i for(j=0;j { if(compare(L.elem[j].name,L.elem[j+1].name)>0) { strcpy(t->name,L.elem[j].name); strcpy(L.elem[j].name,L.elem[j+1].name); strcpy(L.elem[j+1].name,t->name); strcpy(t->sex,L.elem[j].sex); strcpy(L.elem[j].sex,L.elem[j+1].sex); strcpy(L.elem[j+1].sex,t->sex); strcpy(t->city,L.elem[j].city); strcpy(L.elem[j].city,L.elem[j+1].city); strcpy(L.elem[j+1].city,t->city); strcpy(t->mobile,L.elem[j].mobile); strcpy(L.elem[j].mobile,L.elem[j+1].mobile); strcpy(L.elem[j+1].mobile,t->mobile); strcpy(t->email,L.elem[j].email); strcpy(L.elem[j].email,L.elem[j+1].email); strcpy(L.elem[j+1].email,t->email); } } } voidInsert_node(sqlist&L);//插入通讯者信息 intlist_find(sqlist&L)//查找函数(折半查找) { charname[10]; intlow,high,mid,temp; scanf("%s",name); low=0; high=L.length-1; while(low<=high){ mid=(low+high)/2; if(compare(name,L.elem[mid].name)==0){ temp=mid; break; } else if(compare(name,L.elem[mid].name)>0) low=mid+1; else high=mid-1; } if(low>high) temp=-1; returntemp; } voidchange_node(sqlist&L);//修改通讯者个人信息 voiddel_node(sqlist&L);//删除通讯者信息 voidprint_list(sqlist&L);//输出通讯录信息 intmain(intargc,char*argv[]); 课程设计总结: 此次设计让我意识到程序设计是脑力劳动和体力劳动相结合的,没有平时基础的训练是不会写出高效的算法。 这一次的程序设计不仅锻炼了我们发现问题、理解问题和解决问题的能力,还暴露了我们在解决问题过程中知识储备不充足、眼高手低和粗心大意的弱点和不足。 深刻的让我们意识到学好一门课程所需要的努力和勤劳。 在这一次课程设计的过程中,充分的让我意识到了动手实践的重要性。 只有理论是远远不够的,将理论和实践有机的结合在一起才是真正的王道,也只有这样才能真正地把一门课程学好、学透、学精,也印证了“纸上得来终觉浅”这句老话。 两周的课程设计结束了,在老师、学长和同学的帮助下,并借网上原有的相同程序才得以完成。 所以我要对他们发出诚挚的谢意。 同时我也意识到自己掌握的知识有很大的缺陷,在以后的学习过程中会更加的努力,更加的认真来弥补自己在知识上的缺口,全面的了解知识,让自己做得更好。 此次课程设计时间虽短,但我所收获的是永恒的。 它让我尝到了学习的快乐,成功的喜悦,更让我懂得了不少做人的道理。 要完成一项任务或把东西学好就必须有足够的信心,持久的耐心,有面对困难无所畏惧的精神,这对我日后的学习和生活产生了深远一个影响。 指导教师评语: 指导教师(签字): 年月日 课程设计成绩
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 同学 通讯录 报告