首页 > 代码库 > 实现一个简单的个人助理
实现一个简单的个人助理
实 验 报 告
日期:2015年5月10日
院(系):信息科学与技术学院 专业(班级):计算机类
实验题目:实现一个简单的个人助理
----------------------个人作业,如果有后辈的作业习题一致,可以参考学习,一起交流,请勿直接copy
一. 实验目的
1、 本实验面向C++语言的初学者。
2、 主要让实验者熟悉类的使用。
二. 实验内容
实现一个简单的个人助理,包括添加待办事项,列出所有待办事项等。
1、 实验题目
实现一个个人助理Personal Assistant 应用,用于规划提醒个人的工作事项(Task)。其中,工作事项(Task)是使用人需要执行、完成的一些工作,如开发任务、读书任务等。
2、 实验要求
a.分别设计PA 类和Task 两个类。
b.主要接口包括但不限于:列出所有待办事项ListTodos()、添加一个待办事项AddTodo()、标记事项为已完成MarkAsDone()等。可以自行扩展,如提醒功能。
c.实验旨在练习C++类的使用,具体细节,请自己发挥.
三. 实验环境
编程语言: C++
开发工具: Dev-C++
四. 分析与设计
刚开始设计程序的时候,目的清晰又有很多茫然的地方,隐约觉得自己是要设计一个类似存储输出,类似栈空间,又能查找栈空间内数据,并标记修改的类描述。 对于增加的功能,并没有什么多的想法,首先想完成基本的PA功能,在稍微加上实时的报时功能。 总之想法很简单,并没有什么特别复杂的功能。
主要使用中文做界面,方便易懂,而且熟悉的母语很容易给用户一种舒适感和安心感,而且提示语的出现次数也很频繁,但是由于空行的处理,并不会觉得繁杂,同时也避免了用户忘记既定指令,反复翻找的浪费和积累的烦躁厌恶的心理。从程序本身而言,选择vetor是一个使程序简洁稳定的好主意,而且在两个类里实行了类的嵌套,用PA作为父类在main.cpp中控制输出,而Task则负责实现各项功能来供PA调用。
但是在实现的过程中,由于对语言的不熟悉,发生了很多的错误,有很多细小的一眼就能发现的白痴错误,也有很多绞尽脑汁也无从下手的不明错误,问了同学和同一学院的师兄也不明白,问题很多,几乎就没有成功实现,正常运行过,觉得自己真的是快受不了了,没有办法继续完成这个程序了。
但是,最后这些问题都一个个解决或者被剔除了。
下面举一个例子以及解决的方法:
出现了 multiple definition 这一错误,实际检查了之后发现并没有这类的问题,上网百度了之后发现自己并没有出现错误,但还是依照处理方法修改了,问题依旧没有解决。是在想不出来,自己没法解决,就问了其他同学,尝试了各种方法,但是都没有作用。最后师兄通过远程,使用VS编译,居然不再出现这个问题了。而神奇的是,在VS上改了new string之后,在Dev上居然也能正常运行了。
这只是其中的一个问题,具有代表性的无从下手,不知其所,此外,还有许多的各种各样的小问题,我在这里就不详细说明了。但是必须要提到的一点是,我之前采用的是string* works;来做事项的存储的,但是不仅麻烦,而且很容易出错,还要担心溢出的问题添加 ensurecapacity()的函数进行容量的扩充,多次出错之后,就彻底放弃了这一方法改用vetor来存储string类型的数组,避免的上述各种问题的发生。
下图为程序的简单流程图:
- ·程序的简单流程图
五. 实验结果
比较遗憾的是,在程序的设计完善中,并没有留下什么记录,只能大致说明一下曾经出现的主要问题,以及解决方案;
因为起初没有设置循环,所以程序只运行了预期的一部分就终止了,考虑之后,增添了while循环,以便多次输入指令。
然后是因为把works的size和事项的count未加区分,所以,“还有X件事项没有完成”的语句,X的值一直没有减少,考虑之后,在Task的类里重新编写了一个getCount()的函数,区分之后,问题得到解决。
下面就是成功实现之后的实验结果
在选择开始和离开时,选择离开(0)时的结果。
在任意时刻输入 End ,终止程序时的结果。
初始界面;输入用户名Cucu并返回欢迎语句:选择报时,返回24时计北京时间2:20:43;输入1,开始实现;输出开始时的即时时间2:20:45;输入 Add ,实现添加一个待完成事项“和妈妈一起吃饭~”,并返回添加成功的语句;输出指令的解释,对应的功能;继续输入 Add,添加下一个待完成的事项“给妈妈买礼物”,并返回添加成功的语句。
输入List,返回所有的事项列表,并从0开始排序,已完成的事项会在末尾带有 “get √”的记号,而且待完成事项也会随着完成事项的增加而减少;输入“已完成”,返回语句要求输入事项编号;输入事项编号,返回语句表明该事件已完成;再次输入“List”,由于所有事项都已完成,所以并没有输出事项列表,而是一段新的语句/指令。
六. 总结与心得
通过这次大作业的完成和实现,让我对编程有了全新的认识,用户的交互界面我费了很大心思,空行来回改了好多次,返回的语句也用了很多的颜文字,希望能让用户有更好的体验。编程不仅仅是跟电脑打交道,使用程序的用户也通过程序与我们在交流。
而除此之外,我对类这种面向对象的编程也有了深刻的认识,能够自己编出一些小的,并没有什么太多功能的程序,而且在自己实际完成一个小项目的时候,并不同于Sicily上目的性很强的直接完成目的的写代码,而是要更多的加入自己的思考,要用什么类型,要添加什么函数,怎么实现更好……很多问题都必须自己去想去解决。
在这个过程中遇到了不少的问题,自己磕磕巴巴查找资料反复回看debug,更让我体会到了自己知识的欠缺,更灵活地掌握更多的知识,是高效地完成实现一个项目、程序的基础,对用户的设身处地,能使程序受到更多人的喜爱,而出色与众不同的想法,则是为自己的代码打上烙印的方式。
希望自己能多的完成这种练习,不断地锻炼自己。
----------------------------------------------------------------------------------------------------------------------
这是我大一刚刚开始学习程序设计C++的时候编写的一份实验报告,现在回过头觉得自己当初写的程序“十分幼稚”但是又很有趣,里面加了很多不同的类,头文件,嵌套继承,在那之后好像没有一个人写过这么多嵌套继承的C++语言了;程序非常简单,但是对于C++面向对象的特点而言,展示地比较完整,而且便于学习,对于新手算是一份合适的交流资料吧。
也希望自己不要忘记第一次一个人编写程序设计,苦闷又开心的心情。
1 //----------main.cpp--------------- 2 #include <iostream> 3 #include <string> 4 #include <cstring> 5 #include <ctime> 6 #include "PA.h" 7 //#include "Task.h" 8 using namespace std; 9 10 void Time();//时间函数 11 12 int main() 13 { 14 15 string* works; 16 works = new string[10]; 17 18 cout << endl << "-☆☆---------------☆☆-☆☆-☆☆-☆☆-☆☆-☆☆-☆☆-☆☆---------------☆☆-" << endl; 19 cout << endl << " O(∩ _ ∩)O~ 初次见面,我是PA,您的个人助理" << endl; 20 cout << endl << " 感谢使用PA作为您的个人助理,PA将为您竭诚服务~" << endl; 21 cout << endl << "-☆☆---------------☆☆-☆☆-☆☆-☆☆-☆☆-☆☆-☆☆-☆☆---------------☆☆-" << endl; 22 cout << endl << endl << endl << endl; //开始界面 23 24 cout << endl << "☆请输入您的昵称~" << endl; 25 string name; 26 cin >> name; 27 cout << endl << name << " , 下面开始PA之旅,你准备好了吗?" << endl; 28 PersonalAssistant X(name);//新建一个个人服务 29 30 cout << endl << "输入Time,就可以让PA为你报时哦~~~~" << endl; 31 string time; 32 cin >> time; 33 if(time == "Time") Time(); //报时功能 34 35 36 cout << endl << "☆开始请输入 1 ,暂时离开请输入 0 " << endl; 37 int strat; 38 cin >> strat; 39 if (strat == 0) 40 { 41 cout << endl << endl << endl << "☆PA马上就要离开了,期待下次见面,PA会一直帮助你的哟~~" << endl << endl; 42 return 0; 43 }//服务开始; 44 45 else 46 { 47 Time(); //开始前自动报时 48 49 cout << endl << " ☆ 输入Add可以添加您待完成的事项哦~~~(如果您想休息,随时可以输入End来选择退出哟~)" << endl; 50 string DO; 51 cin >> DO;//输入指令,最初为添加指令 52 53 while (DO!="End") 54 { 55 int i = 1; 56 if (DO== "Add") 57 { 58 cout << "☆请输入您要添加的事项(请用连贯、无空格停顿的中文或数字字母描述):" << endl<<endl; 59 cin >> works[i]; 60 X.AddTodo(works[i]); 61 cout <<endl<< "事项:☆" << works[i] << " ☆已经添加成功,请尽快完成哦~" << endl<< endl <<endl <<endl; 62 }//添加一个事项 63 if (DO == "End") 64 { 65 cout << endl << endl << endl << "☆PA马上就要离开了,期待下次见面,PA会一直帮助你的哟~~" << endl << endl; 66 return 0; 67 }//结束服务 68 if (DO == "List") 69 { 70 X.ListTodos(); 71 }//输出查找所有事项 72 if (DO == "已完成") 73 { 74 cout << "☆请输入已完成的事项的编号:" << endl; 75 int num; 76 cin >> num; 77 X.MarkAsDone(num); 78 79 }//标记已完成事项 80 cout << "☆如果你想看到所有的事项,请输入 List" << endl<<endl; 81 cout << "☆如果你已经完成了列表中的某一个,请输入 已完成 " << endl<<endl; 82 cout << "☆如果你想添加待完成的事项,请输入 Add "<<endl<<endl; 83 cout << "(如果您想休息,随时可以输入End来选择退出哟~)" << endl<<endl; 84 cout << "☆请输入相应指令以完成其他您想要的功能~~"<<endl; cout << endl <<endl <<endl; 85 86 cin>>DO; 87 88 } 89 90 } 91 92 return 0; 93 } 94 95 void Time()//时间函数的实现 96 { 97 int alls = time(0); 98 int s = alls % 60; 99 int allm = alls / 60; 100 int m = allm % 60; 101 int allh = allm / 60; 102 int h = (allh + 8) % 24; 103 cout << endl << endl << endl << "当前时间为" << h << ":" << m << ":" << s << ", 一寸光阴一寸金,要好好努力哟☆~" << endl; 104 }
1 //-----------------------------PA.cpp--------------------------------------- 2 #include <iostream> 3 #include <string> 4 #include <cstring> 5 #include "PA.h" 6 //#include "Task.h" 7 using namespace std; 8 9 PersonalAssistant::PersonalAssistant(const string name)//输入姓名 10 { 11 this->name; 12 } 13 14 void PersonalAssistant::AddTodo(string X)//添加事项 15 { 16 T.push(X); 17 } 18 19 void PersonalAssistant::ListTodos() const//列出列表 20 { 21 if (T.empty())//判断是否为空 22 cout << "(≧ ω≦) 好开心! 现在并没有需要完成的事项~~~" << endl 23 << "您现在可以休息一会儿哟~" << endl 24 << "或者您可以输入Add来添加待完成的事项" << endl 25 << "PA会尽力帮你整理的哟(。ì_ í。)" << endl<<endl<<endl<<endl; 26 else 27 { 28 const vector<string>& task = T.getTasks(); 29 int i= T.getCount(); 30 if(i==0)//判断是否事项已全部完成 31 { 32 cout << "(≧ ω≦) 好开心! 现在并没有需要完成的事项~~~" << endl 33 << "您现在可以休息一会儿哟~" << endl 34 << "或者您可以输入Add来添加待完成的事项" << endl 35 << "PA会尽力帮你整理的哟(。ì_ í。)" << endl<<endl<<endl<<endl; 36 } 37 else //列出事项 38 { 39 cout << "PA提醒您:您还有以下" <<T.getCount()<< "项事项并未完成:" << endl<<endl; 40 for (int i = 0; i < task.size(); ++i) 41 { 42 cout << i <<" "<< task[i] << endl; 43 } 44 cout << endl<<"为了您的高效生活,请您尽快完成各项事项~~" <<endl<< endl<<endl<<endl; 45 } 46 47 } 48 } 49 50 void PersonalAssistant::MarkAsDone(int i)//标记已完成事项 51 { 52 const vector<string>& task = T.getTasks(); 53 T.mark(i); 54 }
1 //-----------PA.h-------------------- 2 #ifndef PA_H 3 #define PA_H 4 #include <iostream> 5 #include <string> 6 #include <cstring> 7 #include "Task.h" 8 using namespace std; 9 class PersonalAssistant{ 10 public: 11 12 PersonalAssistant(); 13 PersonalAssistant(const string name);//使用者姓名 14 void AddTodo(string X);//添加一个未完成的事项 15 void ListTodos() const;//列出所有的事项 16 void MarkAsDone(int i);//标记已完成的事项 17 18 19 private: 20 const string name; 21 Task T;//利用Task类里的函数,把Task变成一个子类 22 }; 23 24 #endif
1 //------------Task.cpp----------------- 2 #include <iostream> 3 #include <string> 4 #include <vector> 5 #include "Task.h" 6 using namespace std; 7 8 Task::Task() 9 { 10 count=0; 11 } 12 13 bool Task::empty() const//判断事项(works)数组是否为空 14 { 15 return works.empty(); 16 } 17 18 19 void Task::push(string value) //添加一个事项 20 { 21 works.push_back(value); 22 count++; 23 24 } 25 26 const vector<string>& Task::getTasks() const //get works数组 27 { 28 return works; 29 } 30 31 void Task::mark(int i)//标记已完成的数组 32 { 33 cout<< "呼~ o(* ̄▽ ̄*)ブ"<<works[i]<<" 已经完成啦"<<endl<<endl<<endl<<endl; 34 works[i]= works[i].append(" get √"); 35 count--; 36 } 37 38 vector<string>& Task::getTasks() //get works数组 39 { 40 return works; 41 } 42 int Task::getCount() const//return未完成事项的个数 43 { 44 return count; 45 }
1 //-------------Task.h 2 #ifndef TASK_H 3 #define TASK_H 4 #include <string> 5 #include <vector> 6 using namespace std; 7 8 class Task 9 { 10 public: 11 Task(); 12 void mark(int i); 13 bool empty() const; 14 int getSize() const 15 { 16 return works.size(); 17 }//size指数组的大小 18 int getCount() const ;//count指未完成事项的数目 19 void push(string value); 20 const vector<string>& getTasks() const; 21 vector<string>& getTasks(); 22 23 private: 24 vector<string> works; //向量string数组 25 int count; 26 }; 27 28 #endif
//在重新翻的时候,发现输入已完成事项时,没有做“错误输入,输入序号不存在”的错误处理,可以根据自己的想法做出一些错误输入的应对
总的文件列表如下,可以按照以上代码自行编译测试
实现一个简单的个人助理