2015-06-18 2 views
1

Я строю программу, которая имитирует черепаху и расу зайца. Как я это делаю, я создаю массив SIZE 70 из '_' для имитации ипподрома. Затем я создаю 2 указателя, char *harePtr и char *tortoisePtr, которые указывают на элементы в этом массиве (каждый из которых начинается с [0]). Элементы в массиве, на которые указывают указатели, я также пытаюсь изменить на «T» и «H ', чтобы имитировать их местоположения на трассе.Черепаха и указатели Займа

Оттуда я разработал алгоритмы, чтобы определить, на основе генератора случайных чисел, каждое действие будет выполняться.

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

#define SIZE 70 

enum winner {TORTOISE, HARE}; 

int raceRunner (char wRaceTrack[], void (*moveHare)(char *harePtr, int i), void (*moveTortoise)(char *tortoisePtr, int i)); 

void moveHare (char *harePtr, int i); 
void moveTortoise (char *tortoisePtr, int i); 

int main() { 

    char racetrack [SIZE]; 

    size_t i; 
    for (i = 0; i < SIZE; i++) 
     racetrack[i] = '_'; 

    int winner; 

    winner = raceRunner(racetrack, moveHare, moveTortoise); 

    if (winner == 1) 
     printf("The hare won!"); 

    if (winner == 2) 
     printf("The tortoise won!"); 


} 


int raceRunner (char wRaceTrack[], void (*moveHare)(char *harePtr, int i), void (*moveTortoise)(char *tortoisePtr, int i)){ 

    srand(time(NULL)); 
    int move = 1 + rand() %10; 

    char *harePtr = wRaceTrack; 
    char *tortoisePtr = wRaceTrack; 

    size_t i; 
    for (i = 0; i < SIZE; i++) 
     printf("%c,", wRaceTrack[i]); 

    printf("\n\n"); 

    moveHare(harePtr, move); 
    moveTortoise(tortoisePtr, move); 

    i = 0; 
    for (i = 0; i < SIZE; i++) 
     printf("%c,", wRaceTrack[i]); 

    printf("\n\n"); 

    if (harePtr = tortoisePtr) 
     printf("OUCH! Damn tortoise bit the hare!\n\n"); 

    if (harePtr[69]) 
     return 1; 

    else if (tortoisePtr[69]) 
     return 2; 

    else 
     raceRunner(wRaceTrack, moveHare, moveTortoise); 


} 

void moveHare (char *harePtr, int i) { 

    if (i == 1) { 
     *harePtr = '_'; 
     harePtr - 12; 
     *harePtr = 'H';   
    } 


    if (2 <= i <= 3) { 
     return;   
    } 

    if (4 <= i <= 5){ 
     *harePtr = '_'; 
     harePtr + 9; 
     *harePtr = 'H'; 
    } 

    if (6 <= i <= 8) { 
     *harePtr = '_'; 
     harePtr + 1; 
     *harePtr = 'H'; 

    } 

    if (9 <= i <= 10) { 
     *harePtr = '_'; 
     harePtr - 2; 
     *harePtr = 'H'; 
    } 

} 

void moveTortoise (char *tortoisePtr, int i) { 

    if (1 <= i <= 5) { 
     *tortoisePtr = '_'; 
     tortoisePtr + 3; 
     *tortoisePtr = 'T'; 
    } 

    if (6 <= i <= 7){ 
     *tortoisePtr = '_'; 
     tortoisePtr - 6; 
     *tortoisePtr = 'T'; 
    } 

    if (8 <= i <= 1) { 
     *tortoisePtr = '_'; 
     tortoisePtr + 1; 
     *tortoisePtr = 'T';    
    }  
} 

То, что я пытаюсь сделать, это то сначала установить их текущее положение обратно в «_», то увеличиваем каждый указатель для перемещения вверх или вниз вдоль массива соответственно, в зависимости от того, что генератор случайных появляется и меняет это значение на «T» или «H». Первый указатель, указывающий на последний элемент в массиве, [69], выигрывает гонку.

Однако, когда я запускаю программу, она последовательно производит одинаковый результат каждый раз, без появления маркера зайца в любом месте массива. Я уверен, что это связано с тем, что мои указатели настроены неправильно, так как я все еще пытаюсь склонить голову вокруг всей концепции. Невозможно настроить указатели на один и тот же массив? Или я обращаюсь к массиву неправильно, используя неправильное использование * и &? Я честно потерял, когда дело доходило до использования этих операндов для правильной интеграции указателей с массивами, поэтому всякая помощь приветствуется. Спасибо!

+1

'1 <= i <= 5' -->' 1 <= i && i <= 5' – BLUEPIXY

+0

@ david-tamrazov 1 <= i <= 5 означает, что ПОЛНОСТЬЮ отличается от того, что, по вашему мнению, означает; Я также не понимаю, ПОЧЕМУ вы используете указатели на функции? –

+1

Я просто экспериментирую с указателями в кучу разных аспектов, чтобы обернуть вокруг себя голову в процессе обучения. Я решил, что буду использовать указатели функций здесь, чтобы сделать программу более масштабируемой, может конденсировать «racerunner», так что не нужно включать весь код в moveHare/Tortoise –

ответ

2

В вашем коде есть много проблем.

  • Во-первых,

    harePtr - 12; 
    ... 
    harePtr + 9; 
    ... 
    tortoisePtr + 3; 
    

    и т.д. заявления по существу бесполезны. Они не влияют на harePtr или tortoisePtr, как вы могли подумать. Результат отпрыска - утерян, если вы не собираете то же самое в некоторой переменной.

    В этом отношении вы можете использовать += или -=, чтобы изменить значение операнда LHS.

  • Второй

    относительно цепочки реляционных операторов, как

    if (1 <= i <= 5) 
    

    см this answer, чтобы выяснить, почему это вас удивляет. логически ошибочно.

  • Третий

    В коде

    if (harePtr = tortoisePtr) – 
    

    не сравнить значения, а не присваивает его. Для сравнения вам нужно использовать ==.

  • Четвертого

    srand() используются для семян генератора случайных чисел. Вы должны позвонить по номеру srand() только один раз из main(). Вы можете обратиться к related answer.

+0

, вам нужно сказать ПОЧЕМУ: p try harePtr - = 12 ; harePtr + = 12; –

+0

@ ЭндиНьюман, да, извините, написал. :-) –

+0

Просьба также прокомментировать строку 'if (harePtr = tortoisePtr)' – Daniel

0

Прежде всего, вычитание числа из указателя вернет новое значение, а не изменяет существующее. Используйте операторы -= и +=, чтобы фактически что-то изменить.

Во-вторых, случайное изменение указателя, а затем его использование без предварительной проверки, находится ли оно в пределах допустимого диапазона, означает, что операционная система будет укусить вашу программу задолго до того, как животное сумеет укусить другого.

Смежные вопросы