资源描述
《C语言程序设计》课程设计任务书
设计时间:第2周
学时周数:每班/周
一、设计目的
课程设计是C语言程序设计课程教学的最后一个环节,是对学生进行全面的系统的训练,让学生全面熟悉、掌握C语言基本知识,掌握C程序设计中的顺序、分支、循环三种结构及数组、函数和C语言基本图形编程等方法,把编程和实际结合起来,增强对不同的问题运用和灵活选择合适的数据结构以及算法描述的本领,熟悉编制和调试程序的技巧,掌握分析结果的若干有效方法,进一步提高上机动手能力,培养使用计算机解决实际问题的能力,养成提供文档资料的习惯和规范编程的思想,为以后在专业课程中应用计算机系统解决计算、分析、实验和设计等学习环节打下较扎实的基础。
二、设计内容及要求
个人通讯录管理系统 (难度系数★★★)
主要内容:该系统实现了对个人通讯录批量录入、浏览、修改、删除、添加和查询功能。具体要求如下:
个人通讯录信息包括:姓名、单位、固定电话、移动手机、类别(如同事、朋友、同学、家人)、住址、E-mail,试设计个人通讯录信息管理系统,使之能提供以下功能:
①系统以菜单方式工作:提供一个字符主菜单使用户可以选择不同的字符来实现系统的各个功能,各个功能实现后又能够返回到主菜单。
②批量录入功能:在录入的过程中,通过询问用户是否继续录入的方法来录入多个通讯录的信息。
③浏览功能:按一定的格式显示所有通讯录的信息。
④修改功能:输入要修改的姓名,先对该姓名进行查询,如果查询成功,则可以根据提示对该通讯录每项信息进行修改,如果查询不成功,则显示相应的提示信息。
⑤删除功能:输入要删除的姓名,先对该姓名进行查询,如果查询成功,则删除该通讯录的所有信息,如果查询不成功,则显示相应的提示信息。
⑥增加功能:输入要添加的姓名,先对该姓名进行查询,如果查询成功,则提示输入的姓名已存在的信息,并要求能够重新输入,如果查询不成功,则输入该通讯录的其他信息,从而完成一个通讯录信息的录入。
⑦查询功能:能够分别按输入的姓名和电话号码查询通讯录的信息,如果查询成功,则按一定的格式显示查询结果,如果查询不成功,则显示相应的提示信息。
⑧分类浏览功能:输入要浏览的类别(同事、朋友、同学、家人),按一定的格显示属于该类别的所有通讯录的信息。
内容提要
个人通讯录管理系统,该系统主要实现了对个人通讯录批量录入、浏览、修改、删除、添加、查询、加密和解密功能。
编程软件采用Microdoft Visual C++6.0。
所使用的知识点有函数,数组,指针等。
1
目录
一、 课程的意义与项目简介 1
二、 需求分析 1
三、 功能分析 1
四、 设计流程及描述 1
五、 软件的流程图 2
六、 系统测试及使用说明 4
七、 结论 8
八、 心得体会 8
九、 附录 9
18
一、 课程的意义与项目简介
简介
本系统采用C语言建立通讯录,输入姓名、电话号码、住址等信息,然后对通讯录进行显示、查找、添加、修改及删除。并且通过文本方式对用户所录入的信息进行保存,能够对录入的个人信息进行保存和读取。并且在原要求的基础上,新增了登陆密码,利用system系统函数增加系统时钟,文件的加密和解密功能。
意义
掌握利用C语言进行程序设计的能力。
理解和运用结构化程序设计的思想和方法。
初步掌握开发一个小型实用系统的基本方法。
学会调试一个较长程序的基本方法。
学会利用流程图表示算法。
根据题目要求,运用所学知识,完成设计和实现工作。
二、 需求分析
随着计算机的普及,人们的生活摆脱了传统式的记事本、电话簿,越来越多的靠计算机来帮助人们记住这些事情,极其简便。这就需要有一个实用的个人通讯录管理系统,用户可以方便的通过自己电脑的通讯录管理系统,来随时查阅自己所需要的信息,而不必再大费周折去翻开那繁琐的记事本。
目标:本软件的目的是为了实现手机通讯录的管理功能,给用户呈现出简单,美观的界面,是用户能够更加容易与快捷的实现自己想要完成的操作。
三、 功能分析
1. 系统以菜单方式工作:提供一个字符主菜单使用户可以选择不同的字符来实现系统的各个功能,各个功能实现后又能够返回到主菜单。
2. 通讯录管理:增加删除联系人,修改联系人数据。
3. 通讯录查询:可以实现按姓名和电话号码分别查询。
4. 浏览功能:按一定的格式显示所有通讯录的信息。
5. 文件加密解密:并且在保存时可以对文件进行加密处理,通过计算秘钥长度,读取文件的每一个字节,异或后写入另一个文件来实现文件的加密功能。异或的特点是原始值经过两次异或某一个数后会变成原来的值,所以有时利用这个特性来进行加密,加密端把数据与一个密钥进行异或操作,生成密文。接收方收到密文后利用加密方提供的密钥进行再次异
6. 或操作就能得到明文。
7. 用户管理:密码修改,增加删除用户。
8. 安全性:系统设置访问用户需要输入密码,才能进入主菜单,保证信息安全。
四、 设计流程及描述
建立13个子函数,分别用来添加、浏览、删除、查询、修改、保存,读取加密,解密通讯录信息,完成通讯录的功能。
主函数采用密码,保护了通讯录数据,可以调用13个子函数,分别完成添加记录、显示记录、删除记录、查询记录、修改记录、保存记录、读取记录、加密文件、解密文件等功能。在主函数中可以以1、2、3、4、5、6、7、8、9、0数字键分别可以执行某个功能模块。
创建文件
用fopen()建立一个文本文件,然后向其中输入数据(例如,向文件中输入“姓名”,“地址”,“号码”等),并对文件进行命名。
添加联系人
通过键盘输入通讯录人员的姓名、电话号码、地址信息便可实现将信息添加到通讯录文件内,添加完毕后,系统会自动询问你是否继续添加,如你想继续添加,再通过键盘输入通讯录人员的姓名、电话号码、地址信息即可实现继续添加。
显示和查询联系人
通过前面第一个模块打得录入我们便可以执行第二个模块,通过第二个模块我们可以进行对联系人进行显示和查找。
我通过调用Display ()函数来进行显示所有的联系人,Display ()函数可以实现逐个显示联系人。
对于查找联系人我则采用了chick()函数来进行查找联系人,我提供了两种查找方法:①按照姓名查找;②按照电话号码查找。
删除联系人
我调用delete ()函数来实现删除功能。
五、 软件的流程图
由于程序流程图较为复杂,我采用了分块画出程序流程图
添加联系人系统流程图
显示和查询系统流程图
删除联系人系统流程图
修改联系人系统流程图
六、 系统测试及使用说明
主页面
通过键入程序中的密码来实现登陆通讯录系统。在主函数中设置了密码,而且当密码输入错误三次时,系统会自动退出。
添加联系人功能
在主菜单下键入“1”,实现开始添加联系人。
浏览联系人功能
在主菜单页面,通过键入“2”实现浏览所保存的联系人信息。
删除联系人功能
在主菜单页面,键入“3”,通过输入要删除的联系人名字来实现删除联系人。
查询联系人功能
在主菜单页面,键入“4”,再键入所用查询类型的代号,实现查询联系人。
修改联系人功能
在主菜单页面,键入“5”,通过键入联系人姓名来修改所有信息。
保存联系人功能
在主菜单页面,键入“6”,输入文件名称来实现保存联系人。
文件加密功能
在主菜单页面,键入“8”,输入要加密文件的完整名称(后缀也需要),
输入加密密码,再输入加密后文件,程序通过计算秘钥长度,读取文件的每一个字节,异或后写入另一个文件来实现文件的加密功能。
文件解密功能
在主菜单页面,键入“9”,输入需要解密文件的完整名称,再输入加密密码,输入解密后的文件名,实现解密。
程序结束功能
测试过程中遇到的问题
在最初设计时,定义固定电话、移动手机时使用long tel; long mob;在测试的时候发现当输入11位电话号码的数值总是负值,经检查发现问题long型可以表示的整型数字范围为-2,147,483,648 ~ 2,147,483,647, 即-2^32 ~ 2^32-1,而输入的值超出这个范围,经修改char tel[15];char mob[15]; 能正常显示。
七、 结论
本程序基本达到了任务书上的要求。并且在系统中增加了密码登陆功能、系统时间显示功能、文件加密解密功能。
程序特点:主菜单界面美观,操作简单。
困难:由于刚开始学习C语言对一些知识理解的还不透彻,还不能应用自如,特别在有些地方编程时需要用到一些课本上没接触过的函数,很难编出我们需要的正确程序,而且不能将各种不同的程序相互联系在一起。编译连接时,时常出现重定义、初始化失败等问题。
解决途径:查阅指导书关于C库函数的使用,同学间的交流,网上查询,以及所学的关于函数知识和编程,参照以上的资料,依依解决问题,最终,在多次程序调试中,完成了此次课程设计。
不足之处:在主菜单下,当输入选择数字时如果不是0-9,程序就会按输入数字的首位进行运行。
设想:在运行窗口进行登陆密码的修改,美化登录界面,添加BGM和音效。
八、 心得体会
在这次实训中,我对对C语言有了一个更深的了解认识,也对这个学期学的知识得到巩固,还尝试运行编程,每次运行程序成功,让我对下面的项目就充满信心。通过自己与同学合作编写程序,最终把最初的理论知识转化基本技能。这次的实训,使我对C语言的学习产生浓厚的兴趣。通过实践,我也发现我的好多不足之处。
首先,对C语言的知识掌握不够,对文件的调用、打开和保存方式比较陌生,通过老师讲解,我基本上掌握了文件的知识;
其次,对c语言的一些标准库函数不太了解,还有对函数调用的正确使用不够熟悉。
还有对C语言中经常出现的错误也不了解,通过实践,使我在程序修改方面有了一个较大的提高。
通过C语言课程设计的学习,我认识到学好计算机知识需要我们不断的实践操作,只有重视实践操作,才能学到最有用的知识。
不仅仅是学习C语言,学习其他知识,都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己学到有用的知识。
九、 附录
头文件
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
int unpasswd(); /*函数声明*/
int passwd(); /*函数声明*/
void encrypt(char *in_filename,char *pwd,char *out_file) ;
static int n=0; /*定义静态全局变量,存储已经读入记录的条数。*/
typedef struct
{
char name[10]; /*姓名*/
char unit[20]; /*工作单位*/
char tel[15]; /*固定电话*/
char mob[15]; /*移动手机*/
char typ[10]; /*类别*/
char adds[20]; /*住址*/
char email[20]; /*邮箱*/
}Student;
Student T[100];
主函数
int main()
{
int flag1;
char person[20];
char ch[7];
int i,n;
printf ("\t\t******个人通讯录管理系统!*******\n\n");
printf ("\t\t\t用 户 登 录 \n\n");
printf("\t\t\t请输入密码:");
for(i=0;i<3;i++)
{
for(n=0;n<6;n++)
{
ch[n] = getch();
printf("*");
}
printf("\n");
ch[n] = '\0';
if(0 == strcmp(ch,"123456"))
{
printf("\t\t******欢迎你进入本系统!*********\n");
getch();
Menu();
break;
}
else
{
printf("密码错误,请重新输入\n");
}
}
if(i==3)
{
printf("你输入的错误的密码次数达到上限,系统自动退出!");
}
return 0;
}
录入联系人函数
int Input(Student stu[])
{
int i=0;
char sign;
while(sign!='n'&&sign!='N')
{
printf("\t\t\t姓 名:");
scanf("\t%s",stu[n+i].name);
printf("\t\t\t单 位:");
scanf("\t%s",stu[n+i].unit);
printf("\t\t\t固定电话:");
scanf("\t%s",stu[n+i].tel);
printf("\t\t\t移动手机:");
scanf("\t%s",&stu[n+i].mob);
printf("\t\t\t类 别:");
scanf("\t%s",stu[n+i].typ);
printf("\t\t\t住 址:");
scanf("\t%s",stu[n+i].adds);
printf("\t\t\t邮 箱:");
scanf("\t%s",stu[n+i].email);
printf("\n\t\t是否继续添加?(Y/N)");
scanf("\t%c",&sign);
i++;
}
return(n+i);
}
浏览联系人函数
void Display(Student stu[])
{
int i;
printf("---------------------------------------------------------------------------------------\n");
printf("姓名 单位 固定电话 移动手机 类别 住址 邮箱\n");
printf("---------------------------------------------------------------------------------------\n");
for(i=1;i<n+1;i++)
printf("%-8s%-15s%-15s%-15s%-15s%-15s%-15s\n",stu[i-1].name,stu[i-1].unit,stu[i-1].tel,stu[i-1].mob,stu[i-1].typ,stu[i-1].adds,stu[i-1].email);
/*-8s% -表示左对齐8表示十四个字节的位置,不足用空格补齐*/
printf("----------------------------------------------------------------------------------------\n");
system("pause");/*系统函数停止*/
}
删除联系人函数
int Delete(Student stu[])
{
int i=0,j;
char m[20];
printf("\t请输入想删除记录中的姓名:");
scanf("%s",&m);
while(strcmp(stu[i].name,m)!=0&&i<n)
i++;
if(i==n)
{
printf("\t通讯录中没有此人!\n");
}
else
{
for(j=i;j<n-1;j++) /*后一条记录覆盖前一条记录*/
{
strcpy(stu[j].unit,stu[j+1].unit);
strcpy(stu[j].tel,stu[j+1].tel);
strcpy(stu[j].mob,stu[j+1].mob);
strcpy(stu[j].typ,stu[j+1].typ);
strcpy(stu[j].adds,stu[j+1].adds);
strcpy(stu[j].email,stu[j+1].email);
strcpy(stu[j].name,stu[j+1].name);
}
printf("\t\t\t已经成功删除!\n");
n=n-1;
}
return (n);
}
查询联系人函数
void Chick(Student stu[])
{
int m;
printf("\t\n请选择查询方式:\n");
printf("\t**************************************\n");
printf("\t**1--姓名查询*************************\n");
printf("\t**2--电话查询*************************\n");
printf("\t**************************************\n");
printf("请选择:");
scanf("%d",&m);
while(m!=1&&m!=2)
{
printf("输入错误,请重新选择:\n");
scanf("%d",&m);
return;
}
if(m==1) /*此处对名字进行特殊处理*/
{
char s[20];
int i=0;
printf("\t请输入想查询的姓名:");
scanf("\t%s",s);
loop:while(strcmp(stu[i].name,s)!=0&&i<n )
{
i++;
}
if(i==n)
{
printf("\t通讯录中没有此人!\n");
return;
}
else
{
printf("\t单位 : %s\n",stu[i].unit);
printf("\t固定电话: %s\n",stu[i].tel);
printf("\t移动手机: %s\n",stu[i].mob);
printf("\t类别 : %s\n",stu[i].typ);
printf("\t住址 : %s\n",stu[i].adds);
printf("\t邮箱 : %s\n",stu[i].email);
}
if(i<n-1) /*运用 goto 语句实现对人名重复的人全部输出。*/
{
i++;
goto loop;
}
} ;
if(m==2) /*用电话作为索引查询*/
{
char s[20];
int i=0;
printf("\t请输入想查询的电话:");
scanf("\t%s",s);
while(strcmp(stu[i].tel,s)!=0&&i<n)
i++;
if(i==n)
{
printf("\t通讯录中没有此人!\n");
return;
}
printf("\t姓名 : %s\n",stu[i].name);
printf("\单位 : %s\n",stu[i].unit);
printf("\t移动手机: %s\n",stu[i].mob);
printf("\t类别 : %s\n",stu[i].typ);
printf("\t住址 : %s\n",stu[i].adds);
printf("\t电子邮箱: %s\n",stu[i].email);
} ;
}
修改联系人函数
void Change(Student stu[])
{
int i=0;
char m[20];
printf("\t请输入想修改的记录中人的姓名:");
scanf("%s",&m);
while(strcmp(stu[i].name,m)!=0&&i<n)
i++;
if(i==n)
{
printf("\t通讯录中没有此人!\n");
return;
}
printf("\t姓名:");
scanf("\t%s",stu[i].name);
printf("\t单位:");
scanf("\t%s",stu[i].unit);
printf("\t固定电话:");
scanf("\t%s",stu[i].tel);
printf("\t移动手机:");
scanf("\t%s",stu[i].mob);
printf("\t类别:");
scanf("\t%s",stu[i].typ);
printf("\t住址:");
scanf("\t%s",stu[i].adds);
printf("\t邮箱:");
scanf("\t%s",stu[i].email);
printf("\t修改成功!");
}
保存联系人函数
void WritetoText(Student stu[])
{
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");
return;
}
while(i<n)
{
fprintf(fp,"%-8s%-15s%-15s%-15s%-15s%-15s%-15s\n",stu[i].name,stu[i].unit,stu[i].tel,stu[i].mob,stu[i].typ,stu[i].adds,stu[i].email);
i++;
}
fclose(fp); /*关闭文件*/
printf("保存成功!\n");
}
读取文件中联系人信息函数
void Read(Student stu[])
{
FILE *fp;
int i;
char filename[20];
printf("输入要读入的文件名:");
scanf("\t%s",filename);
if((fp=fopen(filename,"r"))==NULL)
{
printf("找不到%s文件!\n",filename);
system("pause");
exit(0);
}
n=0;
for(i=0;i<100&&!feof(fp);i++) /*这里的100 是前面已经说明了 最多可以存100条记录*/
{
fscanf(fp,"%s %s %s %s %s %s %s\n",stu[i].name,stu[i].unit,stu[i].tel,stu[i].mob,stu[i].typ,stu[i].adds,stu[i].email);
n++;
}
fclose(fp);
printf("读取成功,文件%s中的所有信息已经读入!\n",filename);
}
加密调用函数
int passwd()
{
char in_filename[30];
char out_filename[30];
char pwd[8];
printf("\t为了安全起见,这里要对文件做加密处理:\n");
printf("\t\n请输入需要加密文件的名字:\n");
fflush(stdin);
gets(in_filename);
printf("\t\n请输入加密的密码:\n");
gets(pwd);
printf("\t\n请输入加密后文件的名字\n");
gets(out_filename);
encrypt(in_filename,pwd,out_filename);
return 0;
}
解密函数
void encrypt(char *in_filename,char *pwd,char *out_filename)
{
FILE *fp1,*fp2;
char ch;
int j=0;
int j0=0;
fp1=fopen(in_filename,"rb");
if(fp1==NULL)
{
printf("cannot open in-file.\n");
exit(1);
}
fp2=fopen(out_filename,"wb");
if(fp2==NULL)
{
printf("cannot open or create out-file.\n");
exit(1);
}
while(pwd[++j0]);
ch=fgetc(fp1);
while(!feof(fp1))
{
fputc(ch^pwd[j>=j0?j=0:j++],fp2);
ch=fgetc(fp1);
}
printf("恭喜文件加密成功!\n");
printf("请牢记您的密码!\n");
fclose(fp1);
fclose(fp2);
}
解密调用函数
int unpasswd()
{
char in_filename[30];
char out_filename[30];
char pwd[8];
printf("\t\n请输入需要解密文件的名字:\n");
fflush(stdin);
gets(in_filename);
printf("\t\n请输入密码:\n");
gets(pwd);
printf("\t\n请输入解密后文件的名字\n");
gets(out_filename);
encrypt(in_filename,pwd,out_filename);
return 0;
}
主菜单函数
void Menu()
{
for(;;)
{
switch(Menu_Select())
{
case 1:printf("\n\t\t\t添加记录到通讯录\n");n=Input(T);break;
case 2:printf("\n\t\t\t通讯录记录表\n");Display(T);break;
case 3:printf("\n\t\t\t从通讯录中删除记录\n");n=Delete(T);printf("\t");system("pause");break;
case 4:printf("\n\t\t\t在通讯录中查找记录\n");Chick(T);printf("\t");system("pause");break;
case 5:printf("\n\t\t\t修改通讯录中的记录\n");Change(T);printf("\t");system("pause");break;
case 6:printf("\n\t\t\t保存功能\n");WritetoText(T);printf("\t");system("pause");break;
case 7:printf("\n\t\t\t读取功能\n");Read(T);printf("\t");system("pause");break;
case 8:printf("\n\t\t\t对文件进行加密处理\n\n");passwd();system("pause");break;
case 9:printf("\n\t\t\t对文件进行解密处理\n\n");unpasswd();system("pause");break;
case 0:printf("\n\t欢迎您再次使用本程序!\n");message();printf("\n\t\t\n");system("pause");
exit(0);
}
}
}
主菜单界面函数
int Menu_Select()
{
int c;
do
{
system("cls");
system("date /T");
system("time /T");
printf("\t\t\t****学生通讯录****\n");
printf("\t\t\t******************\n");
printf("\t\t\t** 1. 添加记录 **\n");
printf("\t\t\t** 2. 浏览记录 **\n");
printf("\t\t\t** 3. 删除记录 **\n");
printf("\t\t\t** 4. 查询记录 **\n");
printf("\t\t\t** 5. 修改记录 **\n");
printf("\t\t\t** 6. 保存记录 **\n");
printf("\t\t\t** 7. 读取记录 **\n");
printf("\t\t\t** 8. 文件加密 **\n");
printf("\t\t\t** 9. 文件解密 **\n");
printf("\t\t\t** 0. 退出程序 **\n");
printf("\t\t\t******************\n");
printf("\t\t\t请选择功能(0-9):");
c=getchar();
}
while(c<'0'||c>'9');
return(c-'0');
}
展开阅读全文