2013-03-19 5 views
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 

ответ

0

В C++ вы можете использовать ссылки вместо указателей. Например, вместо

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

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

вы можете передать х по ссылке, например, так:

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

Передача ссылки вроде как передаете указатель, за исключением того, что вам не нужно разыменования указателя каждый раз, когда вы хотите получить доступ к значению, на которое оно указывает. Вы можете Google «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) 
+0

Большое вам спасибо – user2184484

0

ссылки & и указатели * являются полезным когда:
1. вы имеете дело с экземплярами сложных классов, что передача по ссылке является ресурс (процессорное время & основной памяти) с операция onsuming;
2. когда вы хотите изменить аргументы, которые передаются (так как любая функция в C++ может возвращать только одно значение, противоположное для ex. На python, где могут быть возвращены значения умножения, вы можете справиться с этим ограничением, передав с помощью & или *);
3. Другие случаи ...

Встроенный (атомарные) типы могут быть переданы по значению (что это вы так) без снижения эффективности.