学年设计
课程名称:软件工程学年设计
实验项目:通讯录管理系统
姓名:XXX
专业:计算机科学与技术
班级:XXX班
学号:XXX
指导教师XXX
计算机科学与技术学院
实验教学中心
XXX 年XX月XX 日
一课程设计目的
1.通过设计程序来检验自己对所学知识的掌握程度。
2.掌握C++的集成环境,并在过程中积累经验,在实践中学习。
3.培养学生综合运用所学知识独立完成课题的能力。
4.培养学生勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。
5.提高学生对工作认真负责、一丝不苟,同学团结友爱,协作攻关的基本素质。
6.培养学生从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。
7.培养软件工程的意识和能力。
8.对学生掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核。
9.将课堂上所学习的内容拿到实践中来,并在实践过程中学习前人的成功经验,转换自己的知识内容。
二设计要求
1.利用学到的编程知识和编程技巧编写程序。
2.进一步掌握VC++6.0集成环境。
3.查阅相关资料,自学具体课题中涉及到的新知识。
4.系统的功能必须完善。
5.可以自选题目。
6.撰写课程设计报告。
三设计意义
在开发此次项目过程中,让我学会了很多课堂上并不太懂的一些C++程序软件知识,在实践中总结经验,提高自己。对课堂上学的知识在实践中加以利用。通过此次设计我可以学习和掌握更多的处理问题的方法和途径。在遇到困难时自行揣摩,学习独立解决问题的方法,通过对课题的设计学习更多的C++语言有关知识,并为以后的学习积累经验,实现理论和实践相结合的道理。把课堂上学习的知识运用到实践中去。通过完成此次题目中遇到的困难也能更好的促进以后对C++语言程序的学习兴趣,对于以后的学习和生活都有益处。
四系统分析
现代社会交往越来越多,人们随身携带有通讯录,对于通讯录进行必要的管理,对于人们实现快速查询记录提供了很大的方便。程序设计一般由两部分组成:算法和数据结构,合理地选择和实现一个数据结构和处理这些数据具有同样的重要性。本软件为通讯录管理系统,可以存放100人的信息。系统提供了良好界面,有安全口令,必须输入密码,才可以进行操作,在信息的管理中提供了10项功能,有:
1.显示所有信息。
2. 查询某人信息。
3. 增加一人信息。
4. 修改某人信息。
5. 删除某人信息。
6. 退出且不存盘。
7. 退出并且存盘。
8. 不退出且存盘。
9. 显示帮助信息。 10. 软件简单介绍。
五 系统设计
框图: 主程序
欢迎界面 菜单
程序开始时添加了声音,具有良好的界面,界面是仿照TurboC 的菜单来制作的,并且设置了密码,以保证系统的美观和安全性。 本软件是通讯录管理系统,为了更好的方便大家之间的联系,更加有效的提取在程序中的每个人的信息和随时都能添加和删除的信息,及时的将信息存盘和保留数据,并且为了更好的使用本软件,系统分了十个备选项项目。功能强,管理方便。
六 详细设计
(一)主函数(main ())
程序采用结构化,模块化设计,主函数是程序的入口,各模块相互独立,并且可以分块调试,均由主函数控制调用。控制功能的实现通过执行一个循环和一个分支语句,该语句的条件值是通过调用主菜单函数得到的返回值,根据该值,调用相应的各功能函数,同时设置一个断点,即当返回值为一定条件时运行
子菜单的实现 删除 某人 查找某人 增加一人 修改某人 退出不存 退出存盘 不退存盘 全部删除 帮助信息 全部信息
exit(0);函数以结束循环,以免造成死循环等现象。
(二)实现所有功能(All_function();)
所有的功能将在此函数中实现,分别被此函数来调用。
算法:
调用密码函数,载入数据,运用while语句来反复运行系统,再通过switch 语句控制不同的功能的调用。
流程图:
Password();
Data_load();
select=Menu();
switch(select){……}
(三)类person和类menu
person类的对象可以存入数据,姓名、性别、地址、邮编、电话、email、QQ、爱好。有两个成员函数,分别用于修改和删除。还有9个友员函数,可以对类的私有成员进行访问。
Menu类的对象的数据成员在构造函数中进行初始化,有7个数据成员和9个成员函数。
(四)全局数组friends[100],全局变量N和全局对象Me
全局数组中存放所有的信息。全局变量用于存放内存中的总人数。全局对象用在菜单功能的实现时。
(五)欢迎界面(Interface())
运用标准输出流类对象cout输出字符串,在屏幕上显示一个英文单词HAPPY,并且带有声音,提示如何继续操作,界面美观。
算法:
此功能的实现,全部运用顺序结构,并且运用格式控制函数控制输出,比较简单。
流程图:
输出声音
输出HAPPY
格式控制输出
getch();
system(“cls”);(清屏)
界面图:
(六)密码(Password();)
在all_function();函数中使用了密码功能,为了程序的保密和其他一些原因在
程序中设置了密码口令,在进入系统之前必须先输入密码“1 2 3 4”。这样才能进
入系统内部。如果输入错误在三次或三次以上就会自动关闭系统,当输入正确的
密码后就会出现“恭喜您,输入成功!” 否则则会出现“输入有误!请重新输入! ”的
信息。
算法:
口令是由一个for语句和一个if 语句来完成的,并且使用了&&的关系运算
符和exit();函数,而且使用getch();函数来输入密码,从而使程序更加完善。
流程图:
cout<<"请输入4位密码(必须为字符且仅有3次机会):"< for(i=0;i<3;i++) i1=getch();cout<<"*";i2=getch();cout<<"*";i3=getch(); cout<<"*";i4=getch();cout<<"*";getch(); (i1==1)&&(i2==2)&&(i3==3)&&(i4==4) F T cout< i=2; i==2 F T exit(0) 界面图: (七)载入数据(Data_load();) 此函数主要用于从磁盘上读取信息,以执行以下的各项操作。 算法: 定义一个流类对象,一输入和二进制模式打开文件。运用一个while语句来读取信息,直到文件结尾结束。最后用关闭文件函数来关闭文件。 流程图: infile.open("c:\\lixiang",ios::in|ios::binary); infile.good() infile.read(); i++; N=i; infile.close(); 界面图: 由于此函数仅用于从文件中读入数据,所以没有界面图。 (八)菜单(Menu();) 此函数将返回一个数字为0~9之间的一个数字,系统运用这个数字来实现不同的功能。 算法: 此函数由两个while和一个switch语句来实现,其中两个while语句均是死循环,switch语句中分别调用不同的函数,将菜单设置的非常美观,并且提示如何操作,非常方便。最后返回一个数字,以便调用相应的函数,实现相应功能和对信息的响应操作。 流程图: 1 1 Me.all(); switch(){……} cin>>select; T select<0||select>9 F 打印:输入错误!break; return select; 界面图: (九)子菜单 在菜单中一共提供了7个选项,每个选项下面分别提供了一个子菜单用于具体说明该功能如何实现或者提供子功能。 算法: 这几项功能的实现用了同一个编程思想,具体为:先进行清屏,再调用Me.all();函数,此函数作为menu类中的成员函数,并且此函数再调用menu类中相应的成员函数来实现不同的功能,最终将总菜单的界面输出,实现了代码的重用。最后用格式控制符进行控制输出。 流程图: system("cls"); Me.all(); cout< 各界面图为: (十)全部信息(Show_all();) 此函数可以将内存中的所有的信息全部输出,并且中间可以随时中断。 算法: 此函数用一个for语句和3个if语句来实现,通过相互嵌套调用得到了功能的实现。 流程图: for(i=1;i 输出一个人的信息。 T(i+1)%2==0 F cin>>c; T c=='y'||c=='Y' F system("cls"); stop=1;break; cout<<"此系统共有"< T stop==0 F cout<<"全部信息已输出!"< 界面图: (十一)查找(Search_name();) 此函数可以方便而迅速的查出某一个人的详细信息。 算法: 此函数运用了一个for语句和一个if语句的嵌套,并且又运用了一个if语句来实现。 流程图: cout<<"请输入您要查询的人的姓名:"< for(i=0;i T !strcmp(friends[i].name,a) F 输出某人信息。findout=1; T findout==0 F 输出“对不起,没有此人!”cout< 界面图: (十二)增加(Increase();) 此函数用于增加一个人的信息。 算法: 均由顺序结构的语句构成,用cin 对象对各个数据成员进行填充。 流程图: 界面图: (十三)修改(Modify();) 此函数用于修改现存的某人的信息。 算法: 先提示用户输入名字,然后将所要修改的名字与全局数组中的每一个对象从开头到结尾,一个一个进行比较,直到找到名字相同的人为止。然后调用person 类中的name_modify();函数,输出此人的名字,提示是否进行修改。最后提示修改成功,并且设置为已找到此人。最终判断是否输出“对不起!没有此人的信息!”。 流程图: cout<<"请输入要修改的名字:"< 输入数据。 打印:恭喜您!输入成功! for(int i=0;i T !strcmp(…) F friends[i].name_modify(i); findout=1; T findout==0 F 打印:对不起!没有此人! 界面图: cin>>a; (十四)删除(Delete();) 此函数用于删除某人的全部信息,它将把系统中所存的关于此人的所有信息,全部删除。 算法: 先提示用户输入名字,然后将所输的信息,与全局对象数组中的信息,从开头到结尾逐个进行比较,若找到的话,显示此人的详细信息,并将变量findout 设置为1。最后根据变量findout的值判断是否输出“对不起!没有此人!”的信息。 流程图: 打印:请输入要删除的名字: cin>>a; for(int i=0;i T!strcmp(…) F 显示用户详细信息。 cin>>c; T c=='y'||c=='Y'F 调用删除函数。 T findout==0 F 打印:对不起,没有此人! 界面图: (十五)退出不存盘(Withdraw_nsave();) 此函数用于不保存修改过的数据,即不更改文件中的数据。 算法: 仅用一条语句来实现,即:exit(0); 流程图: exit(0); 界面图: 此函数运行后关闭了系统,所以没有界面图。 (十六)退出存盘(Withdraw_save();) 此函数用于退出系统并且将所更改的信息进行存盘。 算法: 首先运用文件流类对象以输出、二进制和清空模式打开文件。然后运用输出函数逐个输出数据,最后关闭流类对象所连接的文件。关闭系统。 流程图: 打开文件 for(i=0;i 向文件输出数据。 关闭流类对象所连接的文件。 退出系统。 界面图: 此函数输出数据后关闭了系统,所以没有界面图。、 (十七)保存(Nwithdraw_save();) 此函数用于将所更改的信息及时存盘,但是不退出系统。 算法: 首先运用文件流类对象以输出、二进制和清空模式打开文件。然后运用输出函数逐个输出数据,最后关闭流类对象所连接的文件。 流程图: 打开文件。 for(i=0;i 向文件中读入数据。outfile.writ e(…); outfile.close();(关闭文件) 打印:保存成功! c=='y'||c=='Y' N=1;清空文件。 界面图: (十八)全部删除(All_clear();) 此函数用于将文件和内存中的全部数据删除。 算法: 先提示用户是否要全部删除,如果用户要选择y 或Y 的话,将全局变量N 设置为1,并且将文件清空。 流程图: T F 界面图: (十九)帮助(Help();) 此函数用于提示用户如何方便的使用本系统,以及关于本系统的简介。 算法: 打印第一篇帮助信息,然后提示用户是否接着查看信息,如果选择y 或Y 的话,则将屏幕清空,然后输出第二篇信息。 流程图: 打印第一篇信息。 提示用户是否接着查看。 cin>>c; T c=='y'||c=='Y' F 清屏,打印信息。 界面图: 打印:是否要全部删除。 cin>>c; 七程序清单 #include #include #include #include #include class person {private: char name[20]; char sex[5]; char address[30]; char post_num[10]; char phone[20]; char email[30]; char qq[10]; char love[50]; public: person(){} void name_modify(int); void name_delete(int); friend void Show_all(); friend void Search_name(); friend void Data_load(); friend void Increase(); friend void Modify(); friend void Delete(); friend void Withdraw_save(); friend void Nwithdraw_save(); friend void All_clear(); }; ::person friends[100]; void person::name_modify(int i) {char c; cout< cin>>c; if(c=='y'||c=='Y') {cout<<"请输入名字:"< cin>>friends[i].name; } cout< cout<<"是否要修改?(y/n)"< cin>>c; if(c=='y'||c=='Y') {cout<<"请输入性别:"< cin>>friends[i].sex; } cout< cin>>c; if(c=='y'||c=='Y') {cout<<"请输入地址:"< cin>>friends[i].address; } cout< cin>>c; if(c=='y'||c=='Y') {cout<<"请输入邮编:"< cin>>friends[i].post_num; } cout< cout<<"是否要修改?(y/n)"< cin>>c; if(c=='y'||c=='Y') {cout<<"请输入电话:"< cin>>friends[i].phone; } cout< cout<<"是否要修改?(y/n)"< cin>>c; if(c=='y'||c=='Y') {cout<<"请输入email:"< cin>>friends[i].email; } cout< cout<<"是否要修改?(y/n)"< cin>>c; if(c=='y'||c=='Y') {cout<<"请输入QQ:"< cin>>friends[i].qq; } cout< cout<<"是否要修改?(y/n)"< cin>>c; if(c=='y'||c=='Y') {cout<<"请输入爱好:"< cin>>friends[i].love; } cout<<"修改成功!"< } void person::name_delete(int i) {int n; for(n=i;n {strcpy(friends[n].name,friends[n+1].name); strcpy(friends[n].sex,friends[n+1].sex); strcpy(friends[n].address,friends[n+1].address); strcpy(friends[n].post_num,friends[n+1].post_num); strcpy(friends[n].phone,friends[n+1].phone); strcpy(friends[n].email,friends[n+1].email); strcpy(friends[n].qq,friends[n+1].qq); strcpy(friends[n].love,friends[n+1].love); } N=N-1; cout<<"该人已被成功删除!"< } class menu {private: char f[6]; char i[6]; char m[6]; char d[6]; char w[6]; char s[6]; char h[6]; public: menu(); void ff(); void ii(); void mm(); void dd(); void ww(); void ss(); void hh(); void all(); }; ::menu Me; menu::menu() {strcpy(f,"查询F"); strcpy(i,"增加I"); strcpy(m,"修改M"); strcpy(d,"删除D"); strcpy(w,"退出W"); strcpy(s,"保存S"); strcpy(h,"帮助H"); } void menu::ff() {cout< } void menu::ii() {cout< } void menu::mm() {cout< } void menu::dd() {cout< } void menu::ww() {cout< } void menu::ss() {cout< } void menu::hh() {cout< } void menu::all() {system("cls"); cout< ff(); ii(); mm(); dd(); ww(); ss(); hh(); cout< } void Interface() {cout<<"\n\n\n\n\a\a\a\a\a\a\a\a"< cout<<"o o o o o o o o o o o"< cout<<"o o o o o o o"<