0

私は C++ に比較的慣れていません。今年から学習を始めたばかりです。テキストドキュメントを取り込んで配列に保存する小さなプログラムを書くのに苦労しています。次に、その配列を取得し、特定の方法で値をランダム化します。ライダーと馬を適切な位置に配置するためのロスタリング プログラムです。

この関数 (gen() ) で試みているのは、 entry[num] を entry2[num2] にコピーすることです。ここで、num は存在するエントリの量であり、num2 はランダムに生成された rand() の数値です。次に、新しいエントリが古いエントリよりも少なくとも 15 ポジション多いかどうかを確認する必要がありました (この場合、馬のライダーは次のイベントの前に休憩を取ることができます)。

ご想像のとおり、このアプリケーションは機能しません。もっと簡単な方法があると思いますか? 変数をこの配列に送信するにはどうすればよいですか?また、この関数を取得して配列をメインに戻すにはどうすればよいですか?ポインタを介して推測していますか?

以下にコード全体を添付しました。

/*   ________________________________________________________________________________
*    |   TITLE:     main.cpp                                                        |
*    |   AUTHOR:    Samuel Abbott (samuel.d.abbott@gmx.com)                         |
*    |   PURPOSE:   to take camp draft data in, randomise it with certain values,   |
*    |              and output the new roster as a text document                    |
*    |   DATE:      may 1, 2012                                                     |
*    |   LAST EDIT: may 3,2012                                                      |
*    |______________________________________________________________________________|
*/

#include <iostream>
#include <string>
#include <stdlib.h> //random number
#include <time.h> //random number
#include <fstream> //used for input / output of external files

using namespace std;
/*
*   TITLE: gen
*   PURPOSE: to randomise the entries , check to see if they are more then 15 units  apart, and return a pointer to the randomised array
*   string entry[] holds original values
*   int num [] holds number of entries
*/
sting gen(string entry[], int num)
{
   int count = 0;
   string entry2[num]; //randomised array

   /* initialize random seed: */
   srand(time(NULL));

   for (count =0; count < num)
   {
      num2 = rand() % num; //generate random number
      entry[num] = entry2[num2]; //copy number from array to a random position in the next array

      /* a series of if checks to make sure the entry is no less then 15 positions from the previous entry */
      if (entry2[num2]=entry[num-15])
      {
         num2 = rand() % num; //generate random number
         entry[num] = entry2[num2]; //copy number from array to a random position in the next array
      }

      else if (entry2[num2]=entry[num-14])
      {
         num2 = rand() % num; //generate random number
         entry[num] = entry2[num2]; //copy number from array to a random position in the next array
      }

      else if (entry2[num2]=entry[num-13])
      {
         num2 = rand() % num; //generate random number
         entry[num] = entry2[num2]; //copy number from array to a random position in the next array
      }

      else if (entry2[num2]=entry[num-12])
      {
         num2 = rand() % num; //generate random number
         entry[num] = entry2[num2]; //copy number from array to a random position in the next array
      }

      else if (entry2[num2]=entry[num-11])
      {
         num2 = rand() % num; //generate random number
         entry[num] = entry2[num2]; //copy number from array to a random position in the next array
      }

      else if (entry2[num2]=entry[num-10])
      {
         num2 = rand() % num; //generate random number
         entry[num] = entry2[num2]; //copy number from array to a random position in the next array
      }

      else if (entry2[num2]=entry[num-9])
      {
         num2 = rand() % num; //generate random number
         entry[num] = entry2[num2]; //copy number from array to a random position in the next array
      }

      else if (entry2[num2]=entry[num-8])
      {
         num2 = rand() % num; //generate random number
         entry[num] = entry2[num2]; //copy number from array to a random position in the next array
      }

      else if (entry2[num2]=entry[num-7])
      {
         num2 = rand() % num; //generate random number
         entry[num] = entry2[num2]; //copy number from array to a random position in the next array
      }

      else if (entry2[num2]=entry[num-6])
      {
         num2 = rand() % num; //generate random number
         entry[num] = entry2[num2]; //copy number from array to a random position in the next array
      }

      else if (entry2[num2]=entry[num-5])
      {
         num2 = rand() % num; //generate random number
         entry[num] = entry2[num2]; //copy number from array to a random position in the next array
      }

      else if (entry2[num2]=entry[num-4])
      {
         num2 = rand() % num; //generate random number
         entry[num] = entry2[num2]; //copy number from array to a random position in the next array
      }

      else if (entry2[num2]=entry[num-3])
      {
         num2 = rand() % num; //generate random number
         entry[num] = entry2[num2]; //copy number from array to a random position in the next array
      }

      else if (entry2[num2]=entry[num-2])
      {
         num2 = rand() % num; //generate random number
         entry[num] = entry2[num2]; //copy number from array to a random position in the next array
      }

      else if (entry2[num2]=entry[num-1])
      {
         num2 = rand() % num; //generate random number
         entry[num] = entry2[num2]; //copy number from array to a random position in the next array
      }

      else
      {
         entry[num] = entry2[num2];
      }
   }

   string pointer* = entry2[]
   return pointer
}

/*
*   Title : Loading
*   Purpose: This function generates a loading animation. in other words. just a fancy     graphic.
*   HAS NO LOADING PURPOSE
*/

void loading()
{
   /* Declare loading variable, this variable is just the screen printout */
   string loading = "...";
   int time = 0;
   int loadtime = 10;

   /* print out loading animation */
   while (time != loadtime)
   {
      cout << loading;
      time++;
   }

}
void loading();

/*
*   Title: Main
*   Purpose: this is the main function for the randomisation program
*/
int main()
{
//declare all variables
   string fname = "";
   int count;

   string line;
   ifstream inputfile;
   char c;
   int num=0;


   /* introduction */
   cout << "Roster Randomisation Generator" << endl;
   /* Get input for roster name */
   cout << "Enter a name for the roster, such as 13022012coolah:"<<endl;
   cin>> fname;
   /* Begin generating roster */
   cout << "Roster Generation in progress." << endl;
   loading();
   /* get amount of lines in text file .. used to determine how many entries there are to     avoid printing blank spaces*/

   inputfile.open("output.txt");

   while (inputfile.good())
   {
      c = inputfile.get();

      if (c=='\n')
      {
         num++;
      }
   }

   inputfile.close();
   cout<<"Number of Entries counted is: "<<num<<endl;

   string entry[num];

   cout << "Grabbing entries from entry file..."<<endl;
   /* open text file*/
   inputfile.open("output.txt");

   /* read all data into the array entry[] */
   for (count = 0; count < num; count++)
   {
      getline(inputfile,line);  //Gets a single line from example.txt
      entry[count]=line;

      // inputfile >> entry[count];
   }

   inputfile.close();
   cout <<"Found the following entries: " <<endl;

   /* output captured entries*/
   for (count =0; count < num; count++)
   {
      cout <<entry[count] <<endl;
   }


   return 0;
}
4

3 に答える 3

2

最も簡単な方法は、おそらく配列をそのままコピーしてから、 を使用std::random_shuffleしてコピーをランダム化することです。

于 2012-05-03T05:14:01.137 に答える
2

すぐに2つの主な問題。

まず、gen 関数の 2 行目で、パラメーターのサイズを持つ配列を作成します。

string entry2[num];

通常の「自動」/スタック配列は、一定のサイズで作成する必要があります。

代わりに、おそらく std::vector を調べて、可変サイズの配列を格納する必要があります。


2 つ目は、巨大な if ステートメント、else if ステートメントの連鎖であり、バグがあることは言うまでもありません。

新しいnum2ものも間違っているとどうなりますか?

はるかに少ないコードでこの問題を解決するには、for ループの使用を検討する必要があります。


3 番目の問題は、if、else if ステートメントの巨大なチェーンで間違った演算子を使用していることです。

== 比較のために使用する必要があります。assign( =) を使用すると、機能しているように見えますが、実際には常に true を返すだけです。

于 2012-05-03T05:18:21.487 に答える
1

まず第一に、文字列*を返したい/返したいのですが、関数定義は文字列gen(...)です。これを string* gen(...) に変更するとよいでしょう。

次に、割り当て if(entry2[num2] = entry[num-12]) を実行しています。しかし、私はあなたが比較をしたいと思います。これは if(entry2[num2] == entry[num-12]) で行います。比較には double = を使用し、代入には single = を使用します。

3 番目に、多くのコピー アンド ペーストを行っています。これはループとしてカプセル化できます。

for(int x = 15; x > 0; x--) 
{
    if(entry2[num2] == entry[num - x] 
    {
        num2 = rand() % num;
        entry[num] = entry[num - x];
        break; //maybe ?!
    }
}

第四に、値が等しいかどうかを確認した後で、なぜ新しい数値を作成するのですか? たぶん、比較後にフォルトするのではなく、num2 を保持する必要があります。

第5に、私が正しく見れば、カウントを増やすことは決してありません。これにより、無限ループが発生します。

第 6 に、string[num] の代わりに new ステートメントを使用する必要があります。これは c++ では機能しません。

于 2012-05-03T05:35:12.743 に答える