通讯录程序设计.docx
- 文档编号:8429830
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:29
- 大小:211.54KB
通讯录程序设计.docx
《通讯录程序设计.docx》由会员分享,可在线阅读,更多相关《通讯录程序设计.docx(29页珍藏版)》请在冰豆网上搜索。
通讯录程序设计
学生通讯录系统
学校:
中北大学
姓名:
张泽新
学号:
1314010132
班级:
A02
学院:
软件学院
指导教师:
尹四清
题目:
学生通讯录
实训目的:
掌握C语言的基本语法规则,以及深入理解函数的调用,指针,结构体和链表的相关知识点。
做好项目的具体分析。
实训内容:
完成对学生通讯录程序调试以及运行
实训内容:
设计一个实用的小型通讯录程序,具有添加,查询和删除功能。
由姓名,电话号码1,电话号码2,QQ号组成,姓名可以由字符和数字混合编码。
电话号码可由字符和数字组成。
实现功能:
实训要求:
(1)系统应显示这样的菜单,请选择系统功能项:
a信息录入功能
b信息浏览功能
c信息查询功能((按姓名查询)
d信息修改功能
e系统退出功能
(2)执行一个具体的功能之后,程序将重新显示菜单。
(3)将通讯录基本信息保存到文件中。
*总体设计模块和程序规划结构图如图1.0,其中包含各个函数的调用
程序详细结构图以及涉及到的核心代码:
录入信息结构图1.1
开始
是否继续输入学生信息
调用输入函数
调用菜单函数
结束
YN
voidinput_record1()//输入函数总,包含了创建学生还有指针移动
{
//voidprint_menu_main();//输入菜单
charcontinue_input='N';//判断是否继续输入
stu*pLastStu=NULL;//最后学生的指针
stu*pNewStu=(stu*)malloc(sizeof(stu));//创建学生节点返回其地址,这是链表
pNewStu->next=NULL;//节点的指针指向空
create_stu_by_input(pNewStu);//创建一个学生
if(head==NULL)
{
head=pNewStu;
}else{
pLastStu=get_last_student(head);//移动指针
pLastStu->next=pNewStu;//连接节点
}
printf("继续输入学生成绩?
(Y继续,N返回菜单)");
getchar();
continue_input=getchar();
if(continue_input=='n'||continue_input=='N'){
print_menu_main();
}
else{
input_record1();
}
}
输出函数结构图以及核心代码
输出表头结构
依次打印表中的元素
输出表尾结构
返回菜单函数
结束
voidshow_record1(){//输出函数总:
包含了三部分表格头,表格尾巴,含有学生信息
voidprint_menu_main();//
stu*p=head;
print_table_head();
while(p!
=NULL){
print_table_row(p);
p=p->next;
}
print_table_buttom();
printf("按任意键返回菜单...\n");
getch();
print_menu_main();
}
保存文件结构图以及核心代码
开始
确定文件名以及文件是用来写的
While循环,是否头指针为空?
结束循环关闭流
把学生信息写进文件中
结束
yn
voidsave_to_file1(){//保存文件总
voidprint_menu_main();//所调用的函数的声明
voidsave_to_file();
FILE*fp;
char];
stu*p=head;
printf("请输入文件名:
");
scanf("%s",file);
save_to_file();
fp=fopen(file,"w");
while(p!
=NULL){
fprintf(fp,"%d%s%s%s%s%s\n",
p->xuhao,p->num,p->name,p->sex,p->QQ,p->phone);
p=p->next;
}
fclose(fp);
printf("保存成功!
\n按任意键返回菜单..\n");
getchar();
getchar();
print_menu_main();
}
加载信息结构图以及核心代码
开始
把链表释放掉,使链表为空
输入文件名字,格式设置为读取
是否遇到输入文件结束的标志?
从文件中读取信息然后连接成单链表
结束循环
结束
yn
voidload_from_file1(){//重新加载函数总
voidprint_menu_main();
voidclear_record(stu*p);//所调用的函数声明
FILE*fp;
char];
clear_record(head);/*释放整个链表*/
stu*p=head,*q;
printf("请输入文件名:
");
scanf("%s",file);
fp=fopen(file,"r");
stu*pLastStu=NULL;
while(!
feof(fp)){//如果未遇到输入文件的结束标志
stu*pNewStu=(stu*)malloc(sizeof(stu));
pNewStu->next=NULL;
fscanf(fp,"%d%s%s%s%s%s",
&(pNewStu->xuhao),pNewStu->num,pNewStu->name,pNewStu->sex,
pNewStu->QQ,pNewStu->phone);
if(head==NULL){//指针移动
head=pNewStu;
}
else{
pLastStu=get_last_student(head);
pLastStu->next=pNewStu;//将链表连接起来
}
}
//释放加载后的空间
q=head;
while(q->next->next!
=NULL){
q=q->next;
}
free(q->next);
q->next=NULL;
fclose(fp);
printf("装载成功!
\n按任意键返回菜单..\n");
getchar();
getchar();
print_menu_main();
}
按名字查询信息核心代码以及结构图
开始
请输入要查询的名字初始化名字
是否与输入的名字相等
得到学生信息的指针
移动指针
输出要查询的学生是信息
结束
Yn
voidinquire_name1()
{
voidprint_menu_main();
stu*p=head;
charname[20];
printf("\n请输入你要查询的名字:
");
scanf("%s",&name);
while(strcmp(p->name,name)!
=0)
{
p=p->next;
}
if(p==NULL)
{
printf("\n你所输入的学生暂时不存在");
printf("按任意键返回菜单...\n");
getch();
print_menu_main();
}
system("cls");
printf("\n该学生的有关信息\n");
printf("+----------+----------+----------+----------+-----------+------------+\n");
printf("|序号|学号|姓名|性别|QQ|电话|\n");
printf("+----------+----------+----------+----------+-----------+------------+\n");
printf("|%10d|%10s|%10s|%10s|%10s|%11s|\n",
p->xuhao,p->num,p->name,p->sex,p->QQ,p->phone);
printf("+----------+----------+----------+----------+-----------+------------+\n");
printf("按任意键返回菜单...\n");
getch();
print_menu_main();
}
信息修改核心代码以及流程图
开始
输入要修改学生的名字
是否找到要修改的学生
移动指针
得到指针,修改信息
结束
yn
voidrevise_message()
{
printf("输入要修改的学生的姓名:
\n");
scanf("%s",name);
while(strcmp(p->name,name)!
=0)
{
p=p->next;//寻找要修改的学生
}
if(p==NULL)
{
printf("\n你所输入的学生暂时不存在");
printf("按任意键返回菜单...\n");
getch();
print_menu_main();
}else{
printf("\n您要修改那一项?
\n");
printf("\n1序号\n");
printf("\n2学号\n");
printf("\n3姓名\n");
printf("\n4性别\n");
printf("\n5QQ\n");
printf("\n6电话\n");
scanf("%d",&choice);
switch(choice)
{
case1:
printf("\n请输入修改后的序号\n");
scanf("%s",&p->xuhao);
break;
case2:
printf("\n请输入修改后的学号\n");
scanf("%s",p->num);
break;
case3:
printf("\n请输入修改后的姓名\n");
scanf("%s",p->name);
break;
case4:
printf("\n请输入修改后的性别\n");
scanf("%s",p->sex);
break;
case5:
printf("\n请输入修改后的QQ\n");
scanf("%s",p->QQ);
break;
case6:
printf("\n请输入修改后的电话\n");
scanf("%s",p->phone);
break;
}
}
system("cls");
printf("修改信息成功\n");
printf("按任意键返回菜单...\n");
getch();
print_menu_main();
}
程序运行截图
1输入学生的成绩截图
2显示学生的信息截图
3保存文件截图
4读取信息
6查询截图
附录程序完整代码
#include
#include
#include
//主要是一些用户通过按键盘产生的对应操作,比如getch()函数等等。
//包含的函数
#include
#defineTITLE"学生通讯录系统"/*标题文字*/
#defineMAX20/**/
#defineERROR0
#defineMENU_MAIN_COUNT9/*主菜单的选项个数*/
#defineMENU_SEARCH_COUNT4/*查询子菜单的选项个数*/
#defineMENU_CALC_COUNT3/*统计子菜单的选项个数*/
typedefstructstudent{
charname[MAX];/*姓名*/
charnum[MAX];/*学号*/
charsex[MAX];/*性别*/
charQQ[MAX];/*QQ*/
charphone[11];/*电话*/
intxuhao;/*序号这是一个学生的信息不能用数组存储*/
structstudent*next;/*指向学生的指针*/
}stu;
stu*head=NULL;/*定义结构体链表的头指针*/
//函数的声明
//菜单类
voidprint_menu_main();//主菜单
voidprint_menu_tile(char*title);//标题菜单
//功能菜单
//功能菜单函数的声明--------------
//输入函数
voidinput_record1();//输入函数记录1
voidcreate_stu_by_input(stu*pNewStu);//2输入函数记录1的子函数创建一个学生
stu*get_last_student(stu*p);//这个函数移动链表的指针在2中调用
//输出函数
voidshow_record1();//输出函数子函数总1
voidprint_table_head();//输出的格式头部
voidprint_table_buttom();//格式的底部
voidprint_table_row(stu*p);//输出函数中间学生的信息这里用了一个while循环进行指针的移动
//保存信息
voidsave_to_file();//保存信息的子函数
voidsave_to_file1();//保存信息总
//加载信息
voidload_from_file1();//加载信息总
voidclear_record(stu*p);//信息的子函数清楚数据
voidexit_system1();
//信息查询功能(按姓名查询)
voidinquire_name1();
//修改信息
voidrevise_message();
//添加信息
voidtianjia(stu*s);
voidtianjia1();
//删除信息
voidshanchu(stu*s);
voidshanchu1();
//---------------------------函数声明结束
//输入信息函数
voidcreate_stu_by_input(stu*pNewStu){
printf(">请输入学生信息(注:
最大长度是10个字符):
\n");
printf("序号:
");scanf("%d",&(pNewStu->xuhao));
printf("学号:
");scanf("%s",pNewStu->num);
printf("姓名:
");scanf("%s",pNewStu->name);
printf("性别:
");scanf("%s",pNewStu->sex);
printf(">请输入%s的信息:
\n",pNewStu->name);
printf("QQ:
");scanf("%s",&(pNewStu->QQ));
printf("电话:
");scanf("%s",&(pNewStu->phone));
}
stu*get_last_student(stu*p)//这个函数的目的是移动链表的指针
{
if(p->next==NULL)
{
returnp;
}
else{
get_last_student(p->next);
}
}
voidinput_record1()//输入函数总,包含了创建学生还有指针移动
{
//voidprint_menu_main();//输入菜单
charcontinue_input='N';//判断是否继续输入
stu*pLastStu=NULL;//最后学生的指针
stu*pNewStu=(stu*)malloc(sizeof(stu));//创建学生节点返回其地址,这是链表
pNewStu->next=NULL;//节点的指针指向空
create_stu_by_input(pNewStu);//创建一个学生
if(head==NULL)
{
head=pNewStu;
}else{
pLastStu=get_last_student(head);//移动指针
pLastStu->next=pNewStu;//连接节点
}
printf("继续输入学生成绩?
(Y继续,N返回菜单)");
getchar();
continue_input=getchar();
if(continue_input=='n'||continue_input=='N'){
print_menu_main();
}
else{
input_record1();
}
}
//输出函数菜单的函数部分
voidprint_table_head(){//输出的格式头部
printf("+----------+----------+----------+----------+-----------+------------+\n");
printf("|序号|学号|姓名|性别|QQ|电话|\n");
printf("+----------+----------+----------+----------+-----------+------------+\n");
}
voidprint_table_buttom(){//格式的底部
printf("+----------+----------+----------+----------+-----------+------------+\n");
}
voidprint_table_row(stu*p){//学生信息表格
printf("|%10d|%10s|%10s|%10s|%10s|%11s|\n",
p->xuhao,p->num,p->name,p->sex,p->QQ,p->phone);
}
voidshow_record1(){//输出函数总:
包含了三部分表格头,表格尾巴,含有学生信息
voidprint_menu_main();//
stu*p=head;
print_table_head();
while(p!
=NULL){
print_table_row(p);
p=p->next;
}
print_table_buttom();
printf("按任意键返回菜单...\n");
getch();
print_menu_main();
}
//----------------------------------
//添加学生(增加)
voidtianjia1()
{
voidprint_menu_main();
stu*p=head;
tianjia(p);
printf("按任意键返回菜单...\n");
getch();
print_menu_main();
}
voidtianjia(stu*s)
{
stu*p,*q,*r;
intj=0,i;
p=(stu*)malloc(sizeof(stu));
system("cls");
printf("\n请输入所添加学生的序号:
");
scanf("%d",&(p->xuhao));
printf("\n请输入所添加学生的学号:
");
scanf("%s",p->num);
printf("\n请输入添加学生的姓名:
");
scanf("%s",p->name);
printf("\n请输入添加学生的性别:
");
scanf("%s",p->sex);
printf("\n请输入添加学生的QQ:
");
scanf("%s",p->QQ);
printf("\n请输入添加学生的电话:
");
scanf("%s",p->phone);
p->next=NULL;
if(s==NULL)
{
s=p;//头指针为空,p作为新的头指针
}
q=s;//使q指向头结点
while(q->next&&j<(p->xuhao)-1)//要考虑p是头结点的情况
{
q=q->next;
++j;
}
if(q!
=p){//p不是头结点才连接结点
p->next=q->next;//连接节点
q->next=p;
}
//p->next=NULL;
//q=s;//使q指向头结点
//if(s==NULL)
//{
//s=p;
//}
//i=p->xuhao;
//while(q&&j //{ //q=q->next; //++j; //} //p->next=q->next;//连接节点 //q->next=p; } //-------------------------- //删除信息 voidshanchu(stu*s) { stu*p,*q; inti,j=0; p=s; printf("请输入您要删除的学生的序号\n"); scanf("%d",&i); while(p->next&&j { p=p->next; ++j; } //if(! (p->next)||j>i-1)returnERROR q=p->next; p->next=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 通讯录 程序设计