语音播报
沈阳航空航天大学课程设计
学号
班级
姓名
指导教师
2013年6月20日
沈阳航空航天大学
课程设计任务书
院系:专业:班级:
学号:题目:同学通讯录信息管理
一 、课程设计时间
2010~11第2学期第15周,共计1周,20学时 。
二 、课程设计内容
用C语言编写软件完成以下任务:
能够对同学的通讯信息进行数字化管理,人数不少于3人。通讯信息应保存到文件myfile.dat中 。
三 、课程设计要求
程序质量:
✧贯彻结构化的程序设计思想。
✧用户界面友好,功能明确,操作方便 。
✧用户界面中的菜单至少应包括“同学信息录入” 、“同学信息查询(根据姓名,或
编号等 。)”、“显示全部同学信息” 、“退出”4项 。
✧代码应适当缩进,并给出必要的注释,以增强程序的可读性 。
课程设计说明书:
✧课程结束后,上交课程设计说明书和源程序。课程设计说明书的内容参见提供的
模板 。
四 、指导教师和学生签字
指导教师:________学生签名:
五、说明书成绩
六 、教师评语
目录
一 、需求分析 (1)
二、程序流程图 (2)
三、核心技术的实现说明及相应程序段 (7)
四 、个人总结 (10)
五、参考文献 (10)
六 、源程序 (10)
I
一 、需求分析
通过对程序设计题目和要求的分析整个程序的设计实现主要分五个模块,其中每一个模块对应一个函数,他们的功能分别是:添加学生通讯录(Input),查询学生通讯录(Query),显示学生通讯录(Display),删除学生通讯录(Delete)以及保存(WritetoText)。在这些函数当中,前两个函数的实现是整个程序的核心,较为复杂 。
1、添加主要实现程序最初运行时学生通讯录的录入及其后的运行中录入学生通讯录的追加功能;
2、查询主要功能是按照学号或姓名对学生的通讯录记录进行查询;
3 、显示主要功能是将学生通讯录的全部信息显示出来
4 、删除主要功能是删除一些不需要的学生信息;
4、保存实现功能为将新的通讯录信息保存到文件中;
除上面介绍的功能之外,程序还具有退出,复制,以及其他附属功能,可以在程序的一次运行当中循环执行所有的功能,并根据需要终止程序的执行。每一个学生记录
1
都包含序号、姓名和电话,在程序当中,将学生通讯录类型定义为结构体类型,添加以及追加的学生通讯录信息现存入结构体数组中,再在save函数中写入myfile.dat文件中,其他函数每次对学生通讯录的访问,其数据来源都是结构体数组并可以对学生数据进行永久保存。
二 、程序流程图
1、程序总体结构图
显示主菜单
switch…..case
真n=1
假
添加
真n=2
假
显示
真n=3
假
删除
真n=4
假
查询
真n=5
假
修改
n=6保存
退出
图1程序总体结构图
2
2 、具体功能框图
(1)添加函数
Input
图2添加函数程序及运行截图(2)查询函数Query
3
4
图3查询函数程序及姓名查询,号码查询截图
5
6
(3)保存程序
WritetoText
图4保存程序运行结果截图
三 、核心技术的实现说明及相应程序段
本程序主要由七个自定义函数和一个主函数组成,其中主函数以菜单的形式调用其他函数来实现要求的所有功能 。在这些函数当中,添加学生通讯录、查询学生通讯录是程序中较为核心的部分,下面分别进行说明 。
1 、添加学生通讯录
添加学生通讯录是将学生通讯录信息以结构体数组的形式储存到结构体数组中去 。具体的程序段如下: int Input(Person per[],int n)
{
int i=0;
char sign;
while(sign!='n'&&sign!='N')/*判定是否继续添加信息*/
{
printf("\t编号:");
scanf("\t%d",&per[n+i].score);
printf("\t姓名:");
scanf("\t%s",per[n+i].name);
printf("\t电话号码:");
scanf("\t%s",per[n+i].num);
printf("\n\t是否继续添加?(Y/N)");
scanf("\t%c",&sign);
i++;
7
return(n+i);
}
2、查询学生通讯录
通过调用两个自定义函数分别实现学号查询和姓名查询两种查询通讯录的方式。While……if分支结构进行两种查询方式的选择。
void Query_a_record(Person per[],int n)
{
/*********先显示出查询目录************/
int m;
printf("\t\n请选择查询方式:\n");
printf("\t┌──────┐\n");
printf("\t│1------姓名│\n");
printf("\t│2------电话│\n");
printf("\t│3------返回│\n");
printf("\t└──────┘\n");
printf("请选择:");
scanf("%d",&m);
while(m!=1&&m!=2&&m!=3)
{
printf("输入错误,请重新选择:");
scanf("%d",&m);
}
if(m==1)/********姓名查询*******/
{
char s[20];
int i=0;
printf("\t请输入想查询的姓名:");
scanf("\t%s",s);
while(strcmp(per[i].name,s)!=0&&i<n)i++;/***字符串比较,以确定是否有此人*******/
8
if(i==n)
{
printf("\t通讯录中没有此人!\n");
return;
}
/********输出查询信息*******/
printf("\t此人编号:%d\n",per[i].score);
printf("\t电话号码:%s\n",per[i].num);
};
if(m==2)/********号码查询*******/
{
char s[20];
int i=0;
printf("\t请输入想查询的电话:");
scanf("\t%s",s);
while(strcmp(per[i].num,s)!=0&&i<n)i++;/***字符串比较,以确定是否有此人*******/
if(i==n)
{
printf("\t通讯录中没有此人!\n");
return;
}
/********输出查询信息*******/
printf("\t此人编号:%d\n",per[i].score);
printf("\t此人姓名:%s\n",per[i].name);
};
}
9
四 、个人总结
通过这次的课设学习我对C语言知识有了更深一层的认识和了解,也提高了对C语言的认识及掌握和操作能力。在做课设的过程中虽然遇到了很多困难,但通过老师,上网查资料和同学的帮助最后顺利完成了本次课设 。而且在做的过程中也体会到C语言的用处及应用,也能更好的使用函数及调用函数问题。通过这次学习让我更多的认识和掌握一门知识,有了更多的体会!
五 、参考文献
1谭浩强.C程序设计.北京:清华大学出版社,2005
2刘成等.C语言程序设计实验指导与习题集.北京:中国铁道出版社,2006
六、源程序
#include<stdio.h>/*I/O函数*/
10
#include<stdlib.h>/*标准库函数*/
#include<string.h>/*字符串函数*/
typedef struct/*定义数据结构*/
{
char score;/*序号*/
char name[10];/*姓名*/
char num[15];/*号码*/
}Person;
Person pe[80];
int menu_select()/*菜单函数*/
{
char c;
do{
system("cls");/*清屏*/
printf("\t\t*****通讯录*****\n");
printf("\t\t┌───────┐\n");
printf("\t\t│1.添加记录│\n");
printf("\t\t│2.显示记录│\n");
printf("\t\t│3.删除记录│\n");
printf("\t\t│4.查询记录│\n");
printf("\t\t│5.修改记录│\n");
printf("\t\t│6.保存记录│\n");
printf("\t\t│0.退出程序│\n");
printf("\t\t└───────┘\n");
printf("\t\t请您选择(0-6):");
c=getchar();
}while(c<'0'||c>'6');
return(c-'0');/*返回数字,不是ascall码*/ }
int Input(Person per[],int n)/*添加函数*/
{
int i=0;
char sign;
while(sign!='n'&&sign!='N')
11
{
printf("\t编号:");
scanf("\t%d",&per[n+i].score);
printf("\t姓名:");
scanf("\t%s",per[n+i].name);
printf("\t电话号码:");
scanf("\t%s",per[n+i].num);
printf("\n\t是否继续添加?(Y/N)");
scanf("\t%c",&sign);
i++;
}
return(n+i);/*返回i值到主函数*/
}
void Display(Person per[],int n)/*显示函数*/
{
int i;
printf("-------------------------------------------\n");
printf("编号姓名电话号码\n");
printf("-------------------------------------------\n");
for(i=1;i<n+1;i++)/*循环函数,以显示每个记录*/
{
printf("%-5d%-8s%-13s%\n",per[i-1].score,per[i-1].name,per[i-1].num);
if(i>1&&i%10==0)
{
printf("\t---------------------------------\n");
printf("\t");
system("pause");
printf("\t---------------------------------\n");
}
}
printf("-------------------------------------------\n");
system("pause");/*按任意键继续*/
}
12
int Delete_a_record(Person per[],int n)/*删除函数*/
{
char s[20];
int i=0,j;
printf("\t请输入想删除记录中的名字:");
scanf("%s",s);
while(strcmp(per[i].name,s)!=0&&i<n)i++;/***字符串比较,以确定是否有此人*******/
if(i==n)
{
printf("\t通讯录中没有此人!\n");
return(n);
}
for(j=i;j<n-1;j++)
{
strcpy(per[j].num,per[j+1].num);
strcpy(per[j].name,per[j+1].name);
per[j].score=per[j+1].score;
}/*将后一条记录的电话拷贝到前一条*/
printf("\t\t\t已经成功删除!\n");
return(n-1);
}
void Query_a_record(Person per[],int n)/*查询函数*/
{
int m;
printf("\t\n请选择查询方式:\n");
printf("\t┌──────┐\n");
printf("\t│1------姓名│\n");
printf("\t│2------电话│\n");
printf("\t│3------返回│\n");
printf("\t└──────┘\n");
printf("请选择:");
scanf("%d",&m);
13
while(m!=1&&m!=2&&m!=3)
{
printf("输入错误,请重新选择:");
scanf("%d",&m);
}
if(m==1)/*选择姓名查询*/
{
char s[20];
int i=0;
printf("\t请输入想查询的姓名:");
scanf("\t%s",s);
while(strcmp(per[i].name,s)!=0&&i<n)i++;
if(i==n)
{
printf("\t通讯录中没有此人!\n");
return;
}
printf("\t此人编号:%d\n",per[i].score);
printf("\t电话号码:%s\n",per[i].num);
};
if(m==2)/*选择号码查询*/
{
char s[20];
int i=0;
printf("\t请输入想查询的电话:");
scanf("\t%s",s);
while(strcmp(per[i].num,s)!=0&&i<n)i++;
if(i==n)
{
printf("\t通讯录中没有此人!\n");
return;
}
printf("\t此人编号:%d\n",per[i].score);
printf("\t此人姓名:%s\n",per[i].name);};
14
}
void Change(Person per[],int n)/*修改函数*/
{
char s[20];
int i=0;
printf("\t请输入想修改的记录中的名字:");
scanf("%s",s);
while(strcmp(per[i].name,s)!=0&&i<n)i++;
if(i==n)
{
printf("\t通讯录中没有此人!\n");
return;
}
printf("\t编号:");
scanf("\t%d",&per[i].score);
printf("\t姓名:");
scanf("\t%s",per[i].name);
printf("\t电话号码:");
scanf("\t%s",per[i].num);
printf("\t修改成功!");
}
void WritetoText(Person per[],int n)/*保存函数*/ {
int i=0;
FILE*fp;
char filename[20];
printf("\t保存到文件\n");
printf("\t请输入所保存的文件名:");
scanf("\t%s",filename);
if((fp=fopen(filename,"w"))==NULL)
{
printf("\t无法打开文件\n");
system("pause");
15
return;
}
fprintf(fp,"******通讯录**********************\n");
fprintf(fp,"编号姓名电话号码\n");
fprintf(fp,"----------------------------------\n");
while(i<n)
{
fprintf(fp,"%-3d\t%-6s\t%-13s\n",per[i].score,per[i].name,per[i].num);
i++;
}
fprintf(fp,"----------------------------------\n");
fprintf(fp,"***共有%d条记录*****************\n",n);
fclose(fp);
printf("保存成功!\n");
}
/******主函数开始*******/
void main()
{
int n=0;
for(;;)
{
switch(menu_select())/*调用主菜单函数,返回值整数作开关语句的条件*/
{
case1:
printf("\n\t添加记录到通讯录\n");
n=Input(pe,n);
break;
case2:
printf("\n\t\t\t通讯录记录表\n");
Display(pe,n);
break;
case3:
16
printf("\n\t从通讯录中删除记录\n");
n=Delete_a_record(pe,n);
printf("\t");
system("pause");
break;
case4:
printf("\n\t在通讯录中查找记录\n");
Query_a_record(pe,n);
printf("\t");
system("pause");
break;
case5:
printf("\n\t修改通讯录中的记录\n");
Change(pe,n);
printf("\t");
system("pause");
break;
case6:
printf("\n\t保存功能\n");
WritetoText(pe,n);
printf("\t");
system("pause");
break;
case0:/*如返回值为0则程序结束*/
printf("\n\t\t谢谢使用,再见!\n");
printf("\n\t\t");
system("pause");
exit(0);
}
}
}
17