MOOS-ivp 实验五 MOOS编程进阶(2)

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++的深入学习在以后也希望可以补足上来,将代码的最后一部分进行完善。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值