C 语言课程综合实验设计设计题目:同学通讯录程序设计学院: 计算机与信息科学学院、软件学院班级:2012级教育技术学*名:***学号:***************2013年6月14日1.题目功能分析以及整体思路1.1整体设计思路建立一个函数,用来添加、显示、删除、查询、修改、保存,读取和统计通讯录等信息,完成通讯录的功能。
主函数采用密码,保护了通讯录数据,可以调用8个子函数,分别完成添加记录、显示记录、删除记录、查询记录、修改记录、保存记录、读取记录、统计记录、退出系统等功能。
在主函数中可以以1、2、3、4、5、6、7、8、0数字键分别可以执行某个功能模块。
1.2程序设计1.2.1根据图1定义数据类型建立函数typedef struct{long score; /*学号*/char name[10]; /*姓名*/char sex[8]; /*性别*/char adds[20]; /*工作单位*/char num[15]; /*电话号码*/char email[20]; /*邮箱*/}Person;Person pe[80];1.2.2主函数设置密码和调用函数主函数通过for循环和字符比较函数可以实现密码功能,登陆成功后可以调用menu函数。
我们定义的menu函数主要是利用switch语句对数据进行处理,流程图如下:void main() /*主函数*/{int h,flag1,flag2;char name[20]="zxq",password[10]="931009";char person[20],password1[10];printf ("\t\t ************* 通讯录管理系统!*************\n\n");printf ("\t\t\t 用户登录\n\n");for(h=0;h!=5;){printf("\t\t\t\t 用户名:");gets(person);flag1=strcmp(person,name);printf("\t\t\t\t 密码:");gets(password1);flag2=strcmp(password,password1);if(flag1==0 && flag2==0){printf("\t\t\t\t 登陆成功!\n\n");menu();break;}else{printf ("\t\t\t 用户名或密码错误!\n\n");printf ("\t\t\t 请注意:您还剩%d次机会!\n\n",4-h);h++;}}if (h=5)printf ("对不起,您输入的用户名或密码有误,已被强制退出。
\n");}1.2.3增加函数及其流程图本程序设计具有通讯信息的录入,进行保存、查找、删除、修改、统计等功能,操作界面简洁美观,易于操作。
程序用了条件、循环、指针、结构体等知识点,综合了文件的打开和保存编写的。
可运用于小的管理软件。
软件运用菜单实现交互式管理,用户轻松的按键既可实现对软件的操作,操作简单易懂,功能丰富,可以很好的满足的需要。
1.2.3.1.删除通讯录记录流程图 4. 删除通讯录记录流程图:int Delete_a_record(Person per[]) /*删除通讯录*/ {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");}for(j=i;j<n-1;j++){strcpy(per[j].num,per[j+1].num);strcpy(per[j].name,per[j+1].name);strcpy(per[j].sex,per[j+1].sex);strcpy(per[j].adds,per[j+1].adds);strcpy(per[j].email,per[j+1].email);per[j].score=per[j+1].score;}printf("\t\t\t已经成功删除!\n");n=n-1;return (n);}1.2.3.2. 文件写入和读取功能:该段程序可以通过文件指针,for循环,while循环,if循环可以实现文件的写入和读取功能。
void WritetoText(Person per[]) /*写入文件*/{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,"%-3d%-6s\t%-3s\t%-13s\t%-20s\t%-20s\n",per[i].score,per[i].name,pe r[i].sex,per[i].num,per[i].adds,per[i].email);i++;}fclose(fp); /*关闭文件*/printf("保存成功!\n");}2.设计结果与分析2.1运行程序将源程序编译、链接后生成可执行文件,运行该文件会看到如图1所示用户登录界面,输入用户名和密码。
图1.登陆界面运行主函数时,首先调用函数menu();,该函数主要是利用输出函数printf进行输出,其图2所示。
图2.菜单函数界面3.2 增加信息3.2.1输入1显示添加通讯录界面。
图3.添加通讯录界面图这一函数实现了对字符串赋值的功能[1]。
系统提示通讯录使用者输入相应信息,然后用scanf函数获取输入数据。
每次输入结束后,系统输出询问是否继续添加的信息,然后执行switch语句,如果返回值是“y”,则继续执行addnewcard()函数添加用户,否则返回主菜单。
3.2.2输入2显示显示通讯录界面。
图4.显示通讯录界面图这一函数实现了对字符串赋值的功能[2]。
系统提示通讯录使用者输入相应信息,然后用scanf函数获取输入数据。
,然后执行switch语句,如果返回值是“y”,则继续执行函数显示,否则返回主菜单。
3.2.3在主菜单输入6显示保存通讯录界面图5.保存通讯录记录界面图进入保存功能后,系统会调用void WritetoText(Person per[]) 函数并且提示通讯录管理者关于保存的信息进行记录自动保存。
从而便于我们直接查询。
3.2.4在主菜单输入7读取保存的通讯录文件图6.读取通讯录文件界面图3.2.4在主菜单输入8统计通讯录的人数图7.统计通讯录人数界面图4.设计体会当我选择通讯录这个题目时,一开始想运用大量链表及指针来完成,但是在慢慢琢磨之后,觉得这个不一定要用链表,于是改变了编程思路。
当然还有不少文件的读写问题,不过还是通过不断测试之后顺利解决了。
另外一点要说的就是这个程序用了很多的循环,因此对于循环的控制要十分小心,有时while和do-while的区别也是十分重要的。
还有一点体会就是,书上和老师教的内容是有限的,我们需要不断地靠自己去学习,向他人请教,了解和掌握更多的知识,这样我们才能编出更好的C程序。
总体来说,这次C语言课程设计还是比较顺利的,虽然最终程序还存在一些不足,但能在有限的时间里完完整整的完成任务我还是比较高兴的。
最后,要感谢学校为我们提供这次课设机会,也要感谢马老师和周老师的指导和同学们对我的帮助与支持。
附录源程序用户名:zxq 密码:931009#include<stdio.h>#include<stdlib.h>#include<string.h>static int n=0; /*定义静态全局变量*/typedef struct{long score; /*学号*/char name[10]; /*姓名*/char sex[8]; /*性别*/char adds[20]; /*工作单位*/char num[15]; /*电话号码*/char email[20]; /*邮箱*/}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│7. 读取记录│\n");printf("\t\t│8. 统计记录│\n");printf("\t\t│0. 退出程序│\n");printf("\t\t└───────┘\n");printf("\t\t请您选择(0-8):");c=getchar();}while(c<'0'||c>'8');return(c-'0');}int Input(Person per[]){int i=0;char sign,x[10];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].sex);printf("\t电话号码:");scanf("\t%s",per[n+i].num);printf("\t工作地址:");scanf("\t%s",per[n+i].adds);printf("\t电子邮箱:");scanf("\t%s",per[n+i].email);gets(x);printf("\n\t是否继续添加?(Y/N)");scanf("\t%c",&sign);i++;}return(n+i);}sum(Person per[]) /*统计通讯录人数*/{int b=0,g=0,i;for(i=0;per[i].name[0]&&i<n;i++){if(strcmp(per[i].sex,"男")==0)b++;}g=i-b;printf("\t\t通讯录总人数为%d个,\n\t\t 其中男孩有%d个。