Я строю программу, которая имитирует черепаху и расу зайца. Как я это делаю, я создаю массив 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 <= i <= 5' -->' 1 <= i && i <= 5' – BLUEPIXY
@ david-tamrazov 1 <= i <= 5 означает, что ПОЛНОСТЬЮ отличается от того, что, по вашему мнению, означает; Я также не понимаю, ПОЧЕМУ вы используете указатели на функции? –
Я просто экспериментирую с указателями в кучу разных аспектов, чтобы обернуть вокруг себя голову в процессе обучения. Я решил, что буду использовать указатели функций здесь, чтобы сделать программу более масштабируемой, может конденсировать «racerunner», так что не нужно включать весь код в moveHare/Tortoise –