0

このプログラムでポインター変数とポインターベースの参照渡しを使用しないようにするにはどうすればよいですか? 私のインストラクターが言ったように、ポインターを使用する必要はありません。これはカメとウサギのシミュレーターです。番号生成を使用して、この記憶に残るイベントのシミュレーションを開発します。

#include <iostream>
using std::cout;
using std::endl;

#include <cstdlib>
using std::rand;
using std::srand;

#include <ctime>
using std::time;

#include <iomanip>
using std::setw;

const int RACE_END = 70;

// prototypes
void moveTortoise( int *const );
void moveHare( int *const );
void printCurrentPositions( const int *const, const int *const );

int main()
{
   int tortoise = 1;
   int hare = 1;
   int timer = 0;

   srand( time( 0 ) );

   cout << "ON YOUR MARK, GET SET\nBANG !!!!"
      << "\nAND THEY'RE OFF !!!!\n";

   // loop through the events
   while ( tortoise != RACE_END && hare != RACE_END )
   {
      moveTortoise( &tortoise );
      moveHare( &hare );
      printCurrentPositions( &tortoise, &hare );
      timer++;
   } // end loop

   if ( tortoise >= hare )
      cout << "\nTORTOISE WINS!!! YAY!!!\n";
   else
      cout << "\nHare wins. Yuch.\n";

   cout << "\nTIME ELAPSED = " << timer << " seconds" << "\n" << endl;

   system("pause");

   return 0; // indicates successful termination
} // end main

// progress for the tortoise
void moveTortoise( int * const turtlePtr )
{
   int x = 1 + rand() % 10; // random number 1-10

   if ( x >= 1 && x <= 5 ) // fast plod
      *turtlePtr += 3;
   else if ( x == 6 || x == 7 ) // slip
      *turtlePtr -= 6;
   else // slow plod
      ++( *turtlePtr );

   if ( *turtlePtr < 1 )
      *turtlePtr = 1;
   else if ( *turtlePtr > RACE_END )
      *turtlePtr = RACE_END;
} // end function moveTortoise

// progress for the hare
void moveHare( int * const rabbitPtr )
{
   int y = 1 + rand() % 10; // random number 1-10

   if ( y == 3 || y == 4 ) // big hop
      *rabbitPtr += 9;
   else if ( y == 5 ) // big slip
      *rabbitPtr -= 12;
   else if ( y >= 6 && y <= 8 ) // small hop
      ++( *rabbitPtr );
   else if ( y > 8 ) // small slip
      *rabbitPtr -= 2;

   if ( *rabbitPtr < 1 )
      *rabbitPtr = 1;
   else if ( *rabbitPtr > RACE_END )
      *rabbitPtr = RACE_END;
} // end function moveHare

// display new position
void printCurrentPositions( const int * const snapperPtr,
   const int * const bunnyPtr )
{
   if ( *bunnyPtr == *snapperPtr )
      cout << setw( *bunnyPtr ) << "OUCH!!!";
   else if ( *bunnyPtr < *snapperPtr )
      cout << setw( *bunnyPtr ) << 'H'
         << setw( *snapperPtr - *bunnyPtr ) << 'T';
   else
      cout << setw( *snapperPtr ) << 'T'
         << setw( *bunnyPtr - *snapperPtr ) << 'H';

   cout << '\n';
} // end function printCurrentPositions
4

2 に答える 2

0

参照とポインター* は次の場合に役立ちます。 1.参照渡しがリソース (CPU 時間とメイン メモリ) を消費する
複雑なクラスのインスタンスを処理する場合
2. 渡される引数を変更したい場合(C++ の関数は 1 つの値しか返すことができないため、乗算値を返すことができる Python とは逆に、& または * を使用して渡すことでその制限に対処できます);
3.その他の場合...

組み込み(アトミック)型は、効率を低下させることなく値で渡すことができます(これはあなたの場合です)。

于 2013-03-19T00:56:35.847 に答える
0

C++ では、ポインターの代わりに参照を使用できます。たとえば、代わりに

void foo(int *x) {
  *x = *x + 1;
}

int main() {
  int a = 0;
  foo(&a);
  return 0;
}

次のように、参照によって x を渡すことができます。

void foo(int &x) {
  x = x + 1;
}
int main() {
  int a = 0;
  foo(a);
  return 0;
}

参照を渡すことは、ポインターを渡すのと似ていますが、ポインターが指す値にアクセスするたびにポインターを逆参照する必要はありません。このチュートリアルなどの詳細については、「C++ 参照渡し」をグーグルで検索できます: http://www.learncpp.com/cpp-tutorial/73-passing-arguments-by-reference/

または、プログラムでint引数を渡して新しい値を返すこともできます。

int moveTortoise(int turtle) {
  ...
  turtle = turtle + 3;
  ...
  return turtle;
}

tortoise = moveTortoise(tortoise)
于 2013-03-19T00:35:35.263 に答える