-2

我迫切需要帮助。我正在为我的系统软件课程使用 C++ 编写人口程序。

这是我第一次涉足 C++ 领域,我只有一些 Java 知识可以帮助我。基本上,该程序应该模拟一个简单的人口。指导方针如下:

  1. 第一个元素(起始人口)具有随机的年龄和性别。
  2. 如果两个元素的寿命介于 [0.25,0.50] 之间(假设它们在 1 时死亡)并且它们是异性,则它们可以配对。
  3. 每个元素只能配对两次。

所以这是我的代码,放轻松,我还不太精通 C++...:

#include <vector>
#include <ctime>
#include <stdlib.h>
#include <iostream>
#include <iterator>
using namespace std;

class Element {
  public:
    int pair;
    double life;
    int tag;

  void setValues(double, int);

  int getPair() {
    return pair;
  }

  void incrementPair() {
    pair = pair++;
  }

  double getLife() {
    return life;
  }

  void incrementLife() {
    life = life + 0.05;
  }

  int getTag() {
    return tag;
  }
}; //Element

void Element::setValues(double b, int c) {
    pair = 0;
    life = b;
    tag = c;
}

int main() {
  double Time = 0.0;

  srand(time(NULL));
  vector<Element> vec;

  for (int i = 0; i<50; ++i) {
    Element x;
    x.setValues(((double) rand() / (RAND_MAX)), rand()%2);
    vec.push_back(x);
  }//for

  while (vec.size() != 0) {
    int newPopCount = 0;
    int Dead = 0;

    for(int count = 0; count != vec.size(); ) {
      std::vector<Element>::iterator p = vec.begin();
      std::vector<Element>::iterator i = vec.begin() + 1;

      if ((p->getPair() == 2) || (p->getLife() < 0.25) || (p->getLife() > 0.50)) {
        count++;
        p++;
      }//if
      else {      

        for(int count1 = count + 1 ; count1 != vec.size() ; ) {
          if ((i->getLife() < 0.25) || (i->getLife() > 0.50) || (i->getPair() == 2) || (p->getTag() == i->getTag())) {
            ++i;
            count1++;
          }//if
          else {
            cout << i->getTag() << " " << p->getTag() << endl;
            cout << i->getPair() << " " << p->getPair() << endl;
            cout << i->getLife() << " " << p->getLife() << endl;
            p->incrementPair();
            i->incrementPair();
            newPopCount++;
            count1++;
            count++;
            p++;
            i++;            
          }//else     
        }//for
      }//else
    }//for 
    Time += 0.05;
    for ( vector<Element>::iterator m = vec.begin(); m != vec.end(); ++m ) {
      m->incrementLife();
      if ( m->getLife() >= 1.00 ) {
        Dead++; 
        //vec.clear();
        vec.erase(m);
        //vec.shrink_to_fit();
      }//if
      for (int i = 0; i = newPopCount; i++) {
        Element woo;
        woo.setValues(0.0, rand()%2);
        vec.push_back(woo);
      }//for
    }//for 
    cout << "The total number of dead is: " << Dead << endl;
    cout << "The total number born is: " << newPopCount << endl;
    cout << "Current population is: " << vec.size() << endl;
    cout << "Population has survived for: " << Time << endl;
    sleep(1);
  }//while



  cout<< "The populace is now extinct." << endl;
  cout<< "The populace survived for: " << Time << endl;

}//main

你可以看到我愚蠢的调试方法,我之前遇到过 Segmentation Fault 错误,但我相信它会被修复。现在的问题是我陷入了困境。该程序似乎几乎不规律地运行,我无法在比其中一个循环内部更近的地方查明问题。我的死整数递增并正确显示,但 newPopCount 整数不是,这对我来说毫无意义。此外,该程序永远不会退出 while 循环,它会继续运行,直到它陷入我拥有的众多循环中的另一个。我遇到了其他几个问题,我一直在缓慢但肯定地修复这些问题,正如您从我的拼凑代码中看到的那样。任何帮助都将不胜感激。

4

2 回答 2

1

vec.erase(m);导致无效m。你想做m = vec.erase(m)

于 2013-10-18T22:27:43.913 回答
1

两个明显的问题,如果你把警告调得足够高,你的编译器会警告你。

第一的:

void incrementPair() {
    pair = pair++;
}

这是未定义的行为。应该只是:

void incrementPair() {
    ++pair;
}

第二:

for (int i = 0; i = newPopCount; i++) {
    Element woo;
    woo.setValues(0.0, rand()%2);
    vec.push_back(woo);
}

循环中的那个条件for几乎肯定是错误的。它可能应该是i <= newPopcount,或类似的东西。

附带说明一下,您的setValues()成员函数看起来像是在做构造函数应该做的工作。

编辑:看这里:

for(int count = 0; count != vec.size(); ) {
    std::vector<Element>::iterator p = vec.begin();
    std::vector<Element>::iterator i = vec.begin() + 1;

想象一下,你有一个std::vector只有一个元素的 a,然后想想i当你i->getLife()稍后做几行时会代表什么。只是在for循环中包含这些定义本身看起来有点可疑,因为您在循环期间pi期间都增加了,但是您将在每次迭代时再次重置它们,但遵循逻辑并不是那么容易,所以也许这就是你的意图。

于 2013-10-18T22:31:11.990 回答