【问题标题】:Expected Expression Error when Calling a Function in C在 C 中调用函数时的预期表达式错误
【发布时间】:2019-07-25 05:39:19
【问题描述】:

我第一次尝试在 C 语言中使用函数。我正在尝试编写一个经典的掷骰子游戏,该游戏掷骰子 10,000 次,然后使用函数打印出每个数字已经掷了多少次.

在下面的代码中,我在尝试设置 result= roll_die (int num_sides); 时不断收到错误代码“预期表达式”。它说它发生在int 上。当我删除int 时,我收到错误代码“使用未声明的标识符'num_sides'”。我该如何解决这个问题?

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

int roll_die(int num_sides){
num_sides = rand() % 6;
num_sides = num_sides + 1;
return num_sides;
}

int main(void)
{
srand((int)time(0));
unsigned int counter, result, num1=0, num2=0, num3=0, num4=0, num5=0, num6=0;
unsigned int num_rolls = 10000;
for(counter=0; counter<=num_rolls; counter++)
{
    result = roll_die (num_sides);
    if(result==1)
        num1++;
    else if(result==2)
        num2++;
    else if(result==3)
        num3++;
    else if(result==4)
        num4++;
    else if(result==5)
        num5++;
    else if(result==6)
        num6++;
    else{
        printf("Error occurred. \n"); return 0;
    }
}
printf("Number of 1s rolled: %d \n", num1);
printf("Number of 2s rolled: %d \n", num2);
printf("Number of 3s rolled: %d \n", num3);
printf("Number of 4s rolled: %d \n", num4);
printf("Number of 5s rolled: %d \n", num5);
printf("Number of 6s rolled: %d \n", num6);
}

【问题讨论】:

  • 您需要将main() 中的num_sides 替换为6,或者您需要定义一个变量并将其初始化为6。您还应该使用数组int num[7] = { 0 };,这样您就可以简化代码——我使用了 7,所以你仍然可以将数字 1-6 处理为数组的索引。
  • 此外,您的函数将 6 硬编码为边数并忽略传入的值(它只是将参数用作局部变量,忽略作为值提供的内容)。你应该使用更像int roll_die(int num_sides) { int result = rand() % num_sides + 1; return result; }的东西。
  • @JonathanLeffler 感谢您的帮助。为什么我无法使用num_sides?我认为它只需要 6 的值并将其传递给主函数
  • 错误的控制流——main() 调用roll_die(),反之亦然。在main() 中,您没有变量num_sidesroll_die() 中有一个,但它是函数本地的,不能从函数外部访问(当 roll_die() 不是当前函数时,它甚至不存在)。您只是偶尔(大约 6 次中的 1 次)将函数内部的 num_sides 设置为 6。但是,当值被分配给main() 中的result 时,变量num_sides 不再存在——因为roll_die() 不再是一个活动函数。
  • "我认为它只需要 6"。怎么做?魔法?

标签: c function random dice


【解决方案1】:

正如我在 cmets 中所指出的,您需要将 main() 中的 num_sides 替换为 6,或者您需要定义并初始化一个变量 (int num_sides = 6;)。您的函数将 6 硬编码为边数并忽略传入的值(它只是将参数用作局部变量,忽略它作为值提供的内容)。

解决这两个问题会产生如下代码:

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

static int roll_die(int num_sides)
{
    int result = rand() % num_sides + 1;
    return result;
}

int main(void)
{
    srand((int)time(0));
    unsigned int counter, result, num1 = 0, num2 = 0, num3 = 0, num4 = 0, num5 = 0, num6 = 0;
    unsigned int num_rolls = 10000;
    for (counter = 0; counter <= num_rolls; counter++)
    {
        result = roll_die(6);
        if (result == 1)
            num1++;
        else if (result == 2)
            num2++;
        else if (result == 3)
            num3++;
        else if (result == 4)
            num4++;
        else if (result == 5)
            num5++;
        else if (result == 6)
            num6++;
        else
        {
            printf("Error occurred. \n");
            return 0;
        }
    }
    printf("Number of 1s rolled: %d \n", num1);
    printf("Number of 2s rolled: %d \n", num2);
    printf("Number of 3s rolled: %d \n", num3);
    printf("Number of 4s rolled: %d \n", num4);
    printf("Number of 5s rolled: %d \n", num5);
    printf("Number of 6s rolled: %d \n", num6);
}

示例输出:

Number of 1s rolled: 1670 
Number of 2s rolled: 1653 
Number of 3s rolled: 1656 
Number of 4s rolled: 1687 
Number of 5s rolled: 1696 
Number of 6s rolled: 1639 

您还应该使用数组而不是 6 个numX 变量。例如,使用int num[7] = { 0 }; 将允许您使用roll_die() 返回的值作为数组的索引。像这样压缩代码:

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

static int roll_die(int num_sides)
{
    return rand() % num_sides + 1;
}

int main(void)
{
    srand(time(0));
    unsigned num[7] = { 0 };
    unsigned num_rolls = 10000;
    int num_sides = 6;
    for (unsigned counter = 0; counter <= num_rolls; counter++)
        num[roll_die(num_sides)]++;
    for (int i = 1; i <= num_sides; i++)
        printf("Number of %ds rolled: %d \n", i, num[i]);
    return 0;
}

样本输出——除了随机序列不同之外,你能发现与之前的输出有什么不同吗?应该没有!

Number of 1s rolled: 1705 
Number of 2s rolled: 1651 
Number of 3s rolled: 1653 
Number of 4s rolled: 1616 
Number of 5s rolled: 1631 
Number of 6s rolled: 1745 

这使得泛化 N 面骰子变得很容易,如下所示:

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

static int roll_die(int num_sides)
{
    return rand() % num_sides + 1;
}

int main(int argc, char **argv)
{
    int num_sides = 6;
    if (argc == 2)
    {
        num_sides = strtol(argv[1], 0, 0);
        if (num_sides < 2 || num_sides > 999)
        {
            fprintf(stderr, "Number of sides of %d is not in the range 2..999\n", num_sides);
            exit(EXIT_FAILURE);
        }
    }
    srand(time(0));

    unsigned num[num_sides + 1];
    for (int i = 1; i <= num_sides; i++)
        num[i] = 0;

    unsigned num_rolls = 10000;
    for (unsigned counter = 0; counter <= num_rolls; counter++)
        num[roll_die(num_sides)]++;

    for (int i = 1; i <= num_sides; i++)
        printf("Number of %ds rolled: %d \n", i, num[i]);

    return 0;
}

而且,如果这个程序被称为die83,那么示例运行可能如下所示:

$ ./die83 8
Number of 1s rolled: 1294 
Number of 2s rolled: 1197 
Number of 3s rolled: 1256 
Number of 4s rolled: 1228 
Number of 5s rolled: 1230 
Number of 6s rolled: 1222 
Number of 7s rolled: 1278 
Number of 8s rolled: 1296 
$

【讨论】:

    猜你喜欢
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 2020-12-15
    相关资源
    最近更新 更多