MOOS-ivp 实验五 MOOS编程进阶(2)
今天继续我的实验,感觉每个实验都要被卡住,这种感觉真的好难受,但是如果把问题成功的解决掉,又会给人以非常大的成就感。今天写这篇博客,希望我可以相对顺利的把自己想做的内容做出来。
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
最后还是被C++的使用所卡住了,主要感觉自己还是算法使用方法的掌握不足,没办法实现最后的功能。这个我在此做一个记号,如果以后学习到了足够的知识再回过头来解决它,卡住钻牛角尖浪费时间无疑是一个相对比较愚蠢的行为
提示:以下是本篇文章正文内容,下面案例可供参考
四、C++STL内容补充
在编写程序过程中使用到了两个STL库中的list和vector下面把其大概用法列举一下:
vector
list
示例:使用list添加和删除元素
添加元素:
1 #include <list>
2 #include <string>
3
4 list<string> my_strings;
5 my_strings.push_back("apples");
6 my_strings.push_back("watermelons");
7 my_strings.push_back("pears");
8 my_strings.push_back("blackberry");
9
10 list<string>::iterator p;
11 for(p=my_strings.begin(); p!=my_strings.end(); p++) {
12 string str = *p;
13 if(str.length() > 6)
14 cout << "Long fruit name: " << str << endl;
15 }
16 cout << "List size: " << my_strings.size() << endl;
运行后可以得到结果:
Long fruit name: watermelons
Long fruit name: blackberry
List size: 4
删除元素:
1 #include <list>
2 #include <string>
3
4 list<string> my_strings;
5 my_strings.push_back("apples");
6 my_strings.push_back("watermelons");
7 my_strings.push_back("pears");
8 my_strings.push_back("blackberry");9
9
10 list<string>::iterator p;
11 for(p=my_strings.begin(); p!=my_strings.end(); ) {
12 string str = *p;
13 if(str.length() > 6) {
14 cout << "Removing long fruit: " << str << endl;
15 p = my_strings.erase(p);
16 }
17 else
18 ++p;
29 }
20 cout << "List size: " << my_strings.size() << endl;
运行后可以得到结果:
Removing long fruit: watermelons
Removing long fruit: blackberry
List size: 2
五、质因数分解程序
1.算法原理
算法原理非常简单,主要是使用循环不断的对原数据进行取余运算,将质因数单独记录下来然后进行发布
代码如下(示例):
// CPP.cpp : 定义控制台应用程序的入口点。
//
#include<iostream>
#include<cstdlib>
#include<cmath>
using namespace std;
int main()
{
int n, i;
cout << "Please input a integer\n";
cin >> n;
if (n <= 0)
{
cout << "Your input is not larger than 0.\n";
exit(-1);
}
cout << n << "=";
while (n % 2 == 0 && n != 2)
{
cout << "2*";
n /= 2;
}
int val = sqrt(n);
for (i = 3; i <= val; i += 2)
{
while (val >= i)
{
if (n % i == 0)
{
cout << i << '*';
n /= i;
val = sqrt(n);
}
else
break;
}
}
cout << n << endl;
return 0;
}
2.迁移到MOOS系统中来
代码如下(示例):
/************************************************************/
/* NAME: Pitt Gao */
/* ORGN: MIT */
/* FILE: PrimeFactor.cpp */
/* DATE: */
/************************************************************/
#include <iterator>
#include "MBUtils.h"
#include "PrimeFactor.h"
#include <cstdlib>
#include <sstream>
#include <cmath>
using namespace std;
//---------------------------------------------------------
// Constructor
PrimeFactor::PrimeFactor()
{
m_iterations = 0;
m_timewarp = 1;
m_value = 0;
m_str = "";
}
//---------------------------------------------------------
// Destructor
PrimeFactor::~PrimeFactor()
{
}
//---------------------------------------------------------
// Procedure: OnNewMail
bool PrimeFactor::OnNewMail(MOOSMSG_LIST &NewMail)
{
MOOSMSG_LIST::iterator p;
for(p=NewMail.begin(); p!=NewMail.end(); p++) {
CMOOSMsg &msg = *p;
#if 0 // Keep these around just for template
string key = msg.GetKey();
string comm = msg.GetCommunity();
double dval = msg.GetDouble();
string sval = msg.GetString();
string msrc = msg.GetSource();
double mtime = msg.GetTime();
bool mdbl = msg.IsDouble();
bool mstr = msg.IsString();
#endif
string key = msg.GetKey();
if(key == "NUM_VALUE")
{
string m_str = msg.GetString();
m_stringslist.push_back(m_str);
}
}
return(true);
}
//---------------------------------------------------------
// Procedure: OnConnectToServer
bool PrimeFactor::OnConnectToServer()
{
// register for variables here
// possibly look at the mission file?
// m_MissionReader.GetConfigurationParam("Name", <string>);
// m_Comms.Register("VARNAME", 0);
RegisterVariables();
return(true);
}
//---------------------------------------------------------
// Procedure: Iterate()
// happens AppTick times per second
bool PrimeFactor::Iterate()
{
m_iterations++;
list<string>::iterator p;
string str ="";
for(p=m_stringslist.begin(); p!=m_stringslist.end();p++ ) {
string str = *p;
string str_answer = str+"=";
m_value = strtoul(str.c_str(), NULL, 0);
while (m_value % 2 == 0 && m_value != 2)
{
str_answer = str_answer +"2:";
m_value /= 2;
}
unsigned long int val = sqrt(m_value);
unsigned long int i;
for (i = 3; i <= val; i += 2)
{
while (val >= i)
{
if (m_value % i == 0)
{
stringstream ss;
ss << i;
string str1 = ss.str();
str_answer = str_answer +str1+":";
m_value /= i;
val = sqrt(m_value);
}
else
break;
}
}
stringstream ss;
ss << m_value;
string str1 = ss.str();
str_answer = str_answer +str1;
Notify("NUM_RESULT", str_answer);
p = m_stringslist.erase(p);
return(true);
}
//---------------------------------------------------------
// Procedure: OnStartUp()
// happens before connection is open
bool PrimeFactor::OnStartUp()
{
list<string> sParams;
m_MissionReader.EnableVerbatimQuoting(false);
if(m_MissionReader.GetConfiguration(GetAppName(), sParams)) {
list<string>::iterator p;
for(p=sParams.begin(); p!=sParams.end(); p++) {
string original_line = *p;
string param = stripBlankEnds(toupper(biteString(*p, '=')));
string value = stripBlankEnds(*p);
if(param == "FOO") {
//handled
}
else if(param == "BAR") {
//handled
}
}
}
m_timewarp = GetMOOSTimeWarp();
RegisterVariables();
return(true);
}
//---------------------------------------------------------
// Procedure: RegisterVariables
void PrimeFactor::RegisterVariables()
{
// m_Comms.Register("FOOBAR", 0);
Register("NUM_VALUE", 0);
}
3.最后结果
质因数成功被分解,但是以我目前的知识水平还是不能够做到去实现小位数的数据不被大位数的数据所中断。这个需要额外的一些内容,我们需要不仅能存储原始的整数,还能存储到目前为止找到的素数列表,以及先前工作停止的一些指示。这个应该可以用vector来实现,但是我还是没有想出来该如何编写,最后附上教程中发布的一个头文件,它希望我们自己添加上相应的程序文件,来实现我所说的功能。
// File: PrimeEntry.h
#include <string>
#include <vector>
#include <cstdint>
#ifndef PRIME_ENTRY_HEADER
#define PRIME_ENTRY_HEADER
class PrimeEntry
{
public:
PrimeEntry();
~PrimeEntry() {};
void setOriginalVal(unsigned long int v);
void setReceivedIndex(unsigned int v) {m_received_index=v;};
void setCalculatedIndex(unsigned int v) {m_calculated_index=v;};
void setDone(bool v) {m_done=v;};
bool done() {return(m_done);};
bool factor(unsigned long int max_steps);
std::string getReport();
protected:
uint64_t m_start_index;
uint64_t m_orig;
bool m_done;
unsigned int m_received_index;
unsigned int m_calculated_index;
std::vector<uint64_t> m_factors;
};
#endif
总结
在这里耗时大约已有三天,虽然深感自己C++所学不足,但是归根结底学习MOOS是主要目的。对于C++的深入学习在以后也希望可以补足上来,将代码的最后一部分进行完善。