************
2011/1/3-2011/1/7
目 录
一.系统设计总说明…………………………………………3
1.1设计目的……………………………………‥…3 1.2设计要求…………………………………………3 1.3设计任务内容……………………………………4 1.4系统功能间介……………………………………4 1.5设计平台…………………………………………4 二.面向对象程序设计报告…………………………………4 2.1需求分析……………………………………………4 2.2概要设计……………………………………………5 2.2.1整体设计……………………………………5 2.2.2系统总体结构图……………………………5 2.3详细设计……………………………………………6 2.3.1录入功能设计………………………………6 2.3.2显示信息设计………………………………6
2.3.3添加功能设计………………………………7 2.3.4删除功能设计………………………………7
2.3.5查找功能设计………………………………8
2.3.6排序功能设计………………………………9
2.4显示功能界面………………………………………10 2.5课程设计心得与体会………………………………15
2.6附录1:参考文献……………………………………15 2.7附录2: 附注释的部分程序清单…………………15
2.7.1头文件说明……………………………‥…15 2.7.2类、对象和函数声明………………………16
2.7.3函数定义的主要部分………………………16
2.7.4主函数………………………………………17
2
一.系统设计总说明
1.1设计目的
《面向对象程序设计》是信息管理与信息系统专业的重要实践性课程。课程实习作为独立的教学环节,是学习完《面向对象程序设计》课程后进行的一次全面的综合练习。课程设计为学生提供了一个手脑并用、独立实践的机会。目的在于培养学生分析问题和解决问题的能力,将课本的理论知识与实际应用问题进行有机结合,提高学生程序设计、程序调试及项目开发能力。
通过本课程设计的实践,全面总结C++课程学习中的数据类型、程序结构、数组、函数、类和对象、派生与继承、虚函数与多态性、运算符重载、c++语言的输入和输出、指针、结构体、读入文本等基本概念,熟悉并掌握其使用方法。培养使用面向对象的程序设计方法编写计算机程序的能力。所以完成本颗题目要求学生较强的设计能力,特别是要具有综合应用能力。如何调程序也非常重要,通过这个程序可以学习到以前调试短程序没有的的经验。
该课程是要设计学生通讯录管理系统,改系统能够提高便捷与强大的信息查询功能;能够提高便捷与强大的信息添加、删除、查询、排序等功能;具有较强的灵活性及拓展性,能够存储一定数量的学生信息,并方便有效地进行数据操作和管理;可以提供数据存储的效率,保证数据的完整性和一致性。总的来说设计学生通讯录管理系统是具有很有意义的,例如我们在以后工作单位中可以运用现在所学的东西来做某某单位的员工通讯录管理系统等等。
1.2设计要求
1、分析课程设计题目的要求 2、写出详细设计说明
3、编写程序代码,调试程序使其能正确运行 4、设计完成的软件要便于操作和使用
5、设计完成后提交课程设计报告,课程设计报告内容包括:课程设计目的、设计任务与要求、设计说明书、设计成果和设计心得五个部分,具体要求见设计报告模板。
3
1.3设计内容
设计一个学生通讯录理系统。
以本班同学的具体数据为背景,设计一个本班同学通讯录,能够实现通讯录编辑(添加、删除);按不同的项进行查找;对已存在的通讯录按不同的项排序;将通讯录写入文件;从文件读入通讯录。其中通讯录至少应该有以下数据项:姓名,地址,电话,邮编,E-mail。
1.4系统功能简介
A. 通讯录编辑(录入、显示、添加、删除、查找、排序、退出)。
B.按不同方式进行删除。 C. 按不同的项进行查找。
D. 对已存在的通讯录按不同的项排序。 E.退出通讯录管理系统。
1.5设计平台
本系统是在windows环境下开发的,使用软件为Microsoft公司的Visual C++ 6.0,并采用了面向过程的技术。
二.面向对象程序设计报告
2.1需求分析
学生通讯录管理功能: 1.录入功能
录入信息:录入学生的信息,其信息包括姓名、地址、电话、邮编、电
子邮件; 2.显示功能
显示信息:显示信息前要先录入学生信息,录入完毕后会显示学生的姓
名、地址、电话、邮编、电子邮件; 3.添加功能
添加信息:想再添加学生的信息,其信息包括姓名、地址、电话、邮编、
电子邮件; 4.删除功能
删除信息:<1>通过姓名删除学生的姓名、地址、电话、邮编、电子邮
4
件这些信息。<2>通过电子邮件这种方法删除学生的姓名、地址、电话、邮编、电子邮件这些信息。若输入的姓名或电子邮件存在则执行删除功能,若不存在,则要重新输入,返回显示界面再次执行所选功能; 5.查找功能
查找信息: <1>按姓名查找 <2>按地址查找 <3>按电话查找
6.排序功能
排列信息:<1>按姓名排序 <2>按电话排序
7.退出系统
退出通讯录管理系统:当不想执行时,退出系统。
2.2概要设计
2.2.1整体设计
严格按照老师给予的要求,经需求分析,本系统共设计了六大功能模块,包括录入信息、显示信息、添加信息、删除信息、查找信息、对信息进行排序。本系统涉及两个类:一个是通讯录(Address_list)类;一个是通讯录管理(Address_listmanage)类,用来管理通讯录信息,以实现各种函数。
通讯录(Address_list)类的功能在于设置学生基本信息,包括姓名、地址、电话、邮编、电子邮件;通讯录管理(Address_listmanage)类的功能在于实现对学生通讯录的相关操作,包括录入信息、显示信息、添加信息、删除信息、查找信息、对信息进行排序。
其中录入信息后要记得保存到“f:\\\\filetest.txt”文件中;从文件“f:\\\\filetest.txt”读入通讯录,显示学生通讯信息;实际录入的人数为N,再要添加学生通讯录信息的就要实现不仅要从文件“f:\\\\filetest.txt”读入原先录入的学生通讯录信息,还要把后来添加后得到的N(N++)个学生通讯录信息保存到“f:\\\\filetest.txt”文件;要实现删除功能,首先要从“f:\\\\filetest.txt”文件读入通讯录,运用不同的方法删除,删除后还要重新保存信息;从“f:\\\\filetest.txt”文件读入通讯录,按照姓名、地址或电话的方式进行查找显示到屏幕;按不同的方式进行排序。
2.2.2系统总体结构图
通讯录管理系统 录入 系统菜单 显示 添加 删除 查找 排序 退出 5
2.3详细设计
在整体设计部分大家了解到我所做的学生通讯录管理系统定义了通讯录(Address_list)类和通讯录管理(Address_listmanage)类这两个类,其中通讯录管理(Address_listmanage)类中要实现录入信息、显示信息、添加信息、删除信息、查找信息、对信息进行排序这六大主要功能,下面我将用图表、程序或文字来详细说明我是如何设计的,并能够实现其功能的。
①录入信息:实现关于学生信息(姓名、地址、电话、邮编、电子邮件)
的录入。
输入学生人数(实际录入数N)—>录入第一个学生信息—>录入第二个学生信息—>录入第N个学生信息—>保存数据
如图表: 实际录入 数目N 录入第一录入第N…… 个 个 姓名 地址 电话 邮编 电子邮件 姓名 地址 电话 邮编 电子邮件 保存数据
②显示信息:从文件“f:\\\\filetest.txt”读入通讯录,显示学生通讯信息。
设置好规定的宽度输出学生的“姓名”、“地址”、“电话”、“邮编”、“电子邮件”,这些文字只输出一次,接着循环,显示实际录入的学生信息,其宽度值与上相对应,这样结构就比较整齐。
6
相关程序代码为:
void Address_listmanage::show() {
int N; N=read();
cout< ③添加信息:实际录入的人数为N,再要添加学生通讯录信息的就要实现不仅 要从文件“f:\\\\filetest.txt”读入原先录入的学生通讯录信息,还要把后来添加后得到的N(N++)个学生通讯录信息保存到“f:\\\\filetest.txt”文件。需要注意的是,因为原先实际录入人数为N,再添加的就是输入第(N+1)个学生的信息。 相关程序代码为: void Address_listmanage::add() { int N; N=read(); string name; string address; string tele; string post_code; string e_mail; cout<<\"请输入\"< addr[i]=Address_list(name,address,tele,post_code,e_mail); N++;//通讯录增加一个学生的信息 save(N); } ④删除信息:要实现删除功能,首先要从“f:\\\\filetest.txt”文件读入通讯 录,运用不同的方法删除,删除后还要重新保存信息,否则显示的是原先的信息,没有体现出有删除这个功能。删除功能的实现能重新放置好是通过,每删除一个学生的相关信息往后的学生的信息位置都要往前放置来实现的。可以通过按姓名 7 的方式删除的相关程序来说明: case 1: //按姓名的方式删除 { cout<<\"请输入想要删除的学生姓名:\"< 话的方式进行查找显示到屏幕。有按姓名查找,有按地址查找,有按电话查找,现以电话查找为例。输入想要查找的电话,如果改电话存在,则会显示拥有该电话的学生的姓名、地址、电话、邮编、电子邮件这些信息。如不存在则提醒“该电话不存在,请重新输入。” 此部分相关程序代码为: case 3://按电话查找 { cout<<\"请输入想要查找的电话:\"< 以按姓名排序这部分相关程序代码为例: void Address_listmanage::sort() { int N; N=read(); cout<<\"☆☆☆☆☆☆☆☆☆☆\"< case 1://按姓名排序 { int i,j;//j是轮数 Address_list k; for(j=0;j )< 2.4.1录入功能界面 2.4.2显示信息界面 10 2.4.3添加功能界面 2.4.4删除功能界面 ①按姓名方法删除 11 ②按电子邮件方法删除 2.4.5查找功能界面 ①按姓名查找 12 ②按地址查找 ③按电话查找 13 2.4.7排序功能界面 ①按姓名排序 ②按电话排序 14 2.5设计心得与体会 虽然我们班在机房上机实习的时间只有四天,但我们都很清楚,主要是靠我们平时的学习请教,和利用这周时间在宿舍上机操作编程才能把这次的面向对象程序设计的学生通讯录管理系统做好。做这个学生通讯录管理系统前后修修改改,调试又调试,我的面向对象程序的学生通讯录管理系统终于得以诞生! 在这个过程中,我发现即使我平时听课会了,看书看过了,也能接受,但到实际上机操作时还是有很多细节会忘记,有些有不会做,要注意的东西也偶尔会会忽略掉。所以我总结了有很多很多知识光学光看是不行的,还要实际操作运用,然而这往往是我们同学所忽略的。还有看别人的例子的时候好像很简单,自己一上机操作就有问题。调试的时候系统总是报错,还有很多警告,每添加一个函数,往往都要要调试很久。系统虽然完成了,也可以运行,一些基本的功能也能够实现,但我知道,还有很多的不足。 另外,我发现帮助文件真的很有用,每当我看别人例子看不懂的时候,都是去帮助文件搜索,如果里面的信息不够完整,再利用各大网站的搜索引擎来寻找答案,许多问题就迎刃而解了。以后还会有很多课程设计,一定要吸取这次的教训,知识不是看过就可以了,而是要把知识学透、学精,才能够真。所以说光是课本的东西是不能满足实际的需要和完成任务的,我们还要运用好网络,问同学,问老师,当你主动利用一切适当的可用的方法去解决问题时,即便是过程艰难了一些,但看到自己最终的劳动成果,努力成果,心里美滋滋的! 千里之行,积于跬步。学习编程也是一样的道理,只要每天学一点,那么每个月、每年所学的就不仅仅是一点点了。看程序书时,不要因为一段程序写不下去了,就把他放在一边;要有硬着皮头把书从头看到尾,真真正正理解领会,最终才能挖到甘泉,有所收益。 我总结到,以后需要注意的地方有:需要多注意对程序的分析,坚强逻辑思维,减少不必要的代价。另外我想对老师和同学的帮助说声谢谢! 2.6参考文献 1.面向对象程序设计教程(清华大学出版社); 2.C++程序设计教程(中国水利水电出版社);. 3.罗移祥老师提供的面向对象程序设计的相关参考资料; 2.7附录:附注释的部分程序清单 2.7.1头文件说明 #include #include #include #include 15 屏方法system(“cls”)和设计颜色属性system(“color 1d”) #include 2.7.2类、对象和函数声明部分 class Address_list //定义通讯录类 { private: //私有数据成员 class Address_listmanage //通讯录管理类定义开始 { Address_list addr[MAX];//类Address_list的对象数组addr[MAX]为类string name; //姓名 string address; //地址 string tele; //电话 string post_code; //邮编 string e_mail; //电子邮箱 Address_list() //无参构造函数 {} public: //共有函数 Address_listmanage的对象成员 public: void input(int N); //录入通讯录信息的方法,其中N表示实际录入的人数 void show(); //显示通讯录信息的方法 void add(); //添加通讯录信息的方法 void del(); //删除通讯录信息的方法 void seek(); //查找通讯录信息的方法 void sort(); //对通讯录信息进行排序的方法 void save(int N); //将通讯录信息保存到文件的方法,其中N表示实际写入的记录数 }; int read(); //从文件读取通讯录信息的方法,返回值为读出的记录数 2.7.3函数定义的主要部分 16 void Address_listmanage::input(int N) //录入通讯录信息的方法的定义,其中N表示实际录入的人数 void Address_listmanage::show() //实现将录入的学生信息显示出来 void Address_listmanage::add() //实现往通讯录中添加学生信息的功能 void Address_listmanage::del() //实现彻底删除学生相关信息 void Address_listmanage::seek() //实现按不同方式查找相关的学生相关信息 void Address_listmanage::sort() //实现按不同方式排序学生信息 int Address_listmanage::read() //实现从文件读入通讯录 void Address_listmanage::save(int N) //实现将通讯录写入文件 2.7.4主函数(main) int main() { Address_listmanage m; //定义类Address_listmanage的对象m int select3; do { system(\"cls\"); //清屏方法 system(\"color 1d\"); //颜色属性的设计,第一个代表背景颜色,第二个代表的是前景颜色 cout<<\" .........................................................\"< *********************************************************\"< 17 *\"< *********************************************************\"< if(select3<0||select3>6) {cout<<\"输入有误,重新选择!\"< cout< m.input(n);//通过Address_listmanage类对象m来调用录入函数 m.save(n); system(\"pause\") ;//使程序暂停的方法 break; case 2: m.show();//通过Address_listmanage类对象m来调用显示函数 system(\"pause\") ; break; case 3: m.add();//通过Address_listmanage类对象m来调用添加函数 system(\"pause\") ; break; case 4: m.del();//通过Address_listmanage类对象m来调用调用删除函数 system(\"pause\") ; break; case 5: m.seek();//通过Address_listmanage类对象m调用查找函数 system(\"pause\") ; break; case 6: m.sort();//通过Address_listmanage类对象m来调用排序函数 system(\"pause\") ; break; } }while(select3<7); return 1; } 18 另附全部源程序代码如下: #include const int MAX=40; //MAX最多人数 class Address_list //定义通讯录类 { private: string name; //姓名 string address;//地址 string tele;//电话 string post_code;//邮编 string e_mail;//电子邮箱 public: Address_list()//无参构造函数 {} Address_list(string name,string address,string tele,string post_code,string e_mail) // 有参构造函数 { this->name=name; this->address=address; this->tele=tele; this->post_code=post_code; this->e_mail=e_mail; } void print() //信息输出 { cout< 19 this->address=address; this->tele=tele; this->post_code=post_code; this->e_mail=e_mail; } void setName(string name)//设置姓名 { this->name=name; } string getName() //获得姓名 { return this->name; } void setAddress(string address) //设置地址 { this->address=address; } string getAddress() //获得地址 { return this->address; } void setTele(string tele) //设置电话 { this->tele=tele; } string getTele() //获得电话 { return this->tele; } void setPost_code(string post_code) //设置邮编 { this->post_code=post_code; } string getPost_code()//获得邮编 { return this->post_code; } void setE_mail(string e_mail) //设置电子邮件 { this->e_mail=e_mail; } string getE_mail()//获得电子邮件 { return this->e_mail; 20 } }; //通讯录定义结束 class Address_listmanage //通讯录管理类定义开始 { Address_list addr[MAX]; public: void input(int N); //录入通讯录信息的方法,其中N表示实际录入的人数 void show(); //显示通讯录信息的方法 void add(); //添加通讯录信息的方法 void del(); //删除通讯录信息的方法 void seek(); //查找通讯录信息的方法 void sort(); //对通讯录信息进行排序的方法 void save(int N); //将通讯录信息保存到文件的方法,其中N表示实际写入的记录数 int read(); //从文件读取通讯录信息的方法,返回值为读出的记录数 }; void Address_listmanage::input(int N) { string name; string address; string tele; string post_code; string e_mail; for(int i=0;i void Address_listmanage::show() { int N; N=read(); cout< void Address_listmanage::add() { int N; N=read(); string name; string address; string tele; string post_code; string e_mail; for(int i=N;i void Address_listmanage::del() { int select; int i,N,m; N=read(); m=N; cout<<\"☆☆☆☆☆☆☆☆☆☆☆☆☆☆\"< 22 for(i=0;i 23 cout<<\"☆☆☆☆☆☆☆☆☆☆\"< break; } else { cout<<\"该地址不存在此address_list中,请重新输入。\"< 25 { case 1://按姓名排序 { int i,j;//j是轮数 Address_list k; for(j=0;j 26 string name; string address; string tele; string post_code; string e_mail; const char * file=\"f:\\\\filetest.txt\"; ifstream in(file,ios_base::in); if(!in.is_open()) { cout<<\"无法打开\"< addr[i].setAddress_list(name,address,tele,post_code,e_mail);//用读出的数据重新去设置对象数组元素的值 i++; } in.close(); return i-1;//返回从文件读出的记录条数 } void Address_listmanage::save(int N) { const char * file=\"f:\\\\filetest.txt\"; ofstream out(file,ios_base::out); if(!out.is_open()) { cout<<\"无法打开\"< } int main() { Address_listmanage m; int select3; do { system(\"cls\"); //清屏方法 system(\"color 1d\"); cout<<\" .........................................................\"< 入 示 加 除 找 序 出 28 cout<<\"输入学生人数:\"; cin>>n; m.input(n); m.save(n); system(\"pause\") ;//使程序暂停的方法 break; case 2: m.show(); system(\"pause\") ; break; case 3: m.add(); system(\"pause\") ; break; case 4: m.del(); system(\"pause\") ; break; case 5: m.seek(); system(\"pause\") ; break; case 6: m.sort(); system(\"pause\") ; break; } }while(select3<7); return 1; } 29 因篇幅问题不能全部显示,请点此查看更多更全内容