首页 > 代码库 > 实现一个简单的个人助理

实现一个简单的个人助理

实 验 报 告

 

日期: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

//在重新翻的时候,发现输入已完成事项时,没有做“错误输入,输入序号不存在”的错误处理,可以根据自己的想法做出一些错误输入的应对

总的文件列表如下,可以按照以上代码自行编译测试

技术分享

 

实现一个简单的个人助理