【问题标题】:Tortoise and the Hare Pointers乌龟和野兔指针
【发布时间】:2015-06-18 13:51:41
【问题描述】:

我正在构建一个模拟龟兔赛跑的程序。我这样做的方式是创建一个大小为 70 的 '_' 数组来模拟赛道。然后我创建了 2 个指针,char *harePtrchar *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';               
    }    
}

我要做的是首先将它们的 CURRENT 位置设置回“_”,然后根据随机生成器提出的内容相应地增加每个指针以沿数组向上或向下移动,然后更改将该值设置为“T”或“H”。第一个指向数组中最后一个元素的指针 [69] 赢得了比赛。

但是,当我运行该程序时,它每次都始终产生相同的结果,而野兔标记不会出现在数组的任何位置。我很肯定这是因为我的指针设置不正确,因为我仍在试图围绕整个概念进行思考。不能设置指向同一个数组的指针吗?还是我通过错误使用 * 和 & 以错误的方式访问数组?当谈到使用这些操作数将指针与数组正确集成时,我真的迷失了方向,因此感谢所有帮助。谢谢!

【问题讨论】:

  • 1 &lt;= i &lt;= 5 --> 1 &lt;= i &amp;&amp; i &lt;= 5
  • @david-tamrazov 1
  • 我只是在一系列不同方面尝试指针,以便在学习过程中围绕它们展开思考。我想我会在这里使用函数指针来使程序更具可扩展性,可以压缩“racerunner”,这样它就不需要在 moveHare/Tortoise 中包含所有代码

标签: c arrays pointers


【解决方案1】:

在你的代码中,有很多问题。

  • 首先,

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

    等等。陈述本质上是无用的。正如您可能想的那样,它们不会影响harePtrtortoisePtr。操作的结果丢失,除非你在某个变量中收集到相同的结果。

    这方面可以使用+=-=来修改LHS操作数的值。

  • 第二

    关于关系运算符的链接,例如

     if (1 <= i <= 5)
    

    请参阅this answer 了解它让您感到惊讶的原因。 逻辑上是错误的。

  • 第三

    在您的代码中

    if (harePtr = tortoisePtr) –
    

    不比较值,而是分配它。您需要使用== 进行比较。

  • 第四个

    srand() 用于种子随机数生成器。您只需从main() 拨打srand() 一次。您可以参考related answer

【讨论】:

  • 你需要说为什么 :p try harePtr -= 12; harePtr += 12;
  • 也请评论if (harePtr = tortoisePtr)这一行
  • @Daniel 谢谢,从我这边又加了一分作为奖励。 :-)
  • 干杯伙计们,感谢所有的意见。 @SouravGhosh
【解决方案2】:

首先,从指针中减去一个数字将返回一个新值,而不是修改现有值。使用 -=+= 运算符来实际更改某些内容。

其次,随机更改指针然后使用它而不首先检查它是否仍在有效范围内,这意味着操作系统会在任何一只动物设法咬另一只之前很久就咬你的程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多