数组与循环实现动态集合:骰子投掷统计程序调试求助
修正骰子程序的数组逻辑与统计问题
原代码的核心错误
- 变量与数组名冲突:同时将
diceFace定义为统计数组和存储输入面数的变量,diceThrows同理,导致编译器无法正确解析,完全破坏数组使用逻辑。 - 输入范围判断错误:题目要求面数范围是1-25、投掷次数1-500,但你的判断条件
>1 && <25漏掉了边界值1和25,投掷次数的判断也存在同样问题。 - 循环条件缺失:投掷循环的
for语句中i < ;未指定循环上限,无法控制投掷次数。 - 统计逻辑混乱:因命名冲突,统计次数时错误操作了面数变量,而非统计数组。
- 冗余数组定义:
diceThrows[500]完全不必要,无需存储所有投掷结果,直接统计即可。
修正后的完整代码
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int i; int numFaces; // 存储用户输入的骰子面数 int numThrows; // 存储用户输入的投掷次数 int count[25] = {0}; // 统计每个点数出现次数,下标0对应点数1 // 初始化随机数种子,确保每次运行结果不同 srand(time(NULL)); // 输入并验证骰子面数 printf("Number of faces: "); scanf("%d", &numFaces); if (numFaces >= 1 && numFaces <= 25) printf("Range is acceptable\n"); else { printf("Range is unacceptable\n"); return 1; // 范围错误直接退出,避免后续逻辑异常 } // 输入并验证投掷次数 printf("Number of throws: "); scanf("%d", &numThrows); if (numThrows >= 1 && numThrows <= 500) printf("Range is acceptable\n"); else { printf("Range is unacceptable\n"); return 1; } // 模拟投掷并统计次数 for (i = 0; i < numThrows; i++) { int roll = rand() % numFaces + 1; // 生成1~numFaces的随机点数 count[roll - 1]++; // 对应点数的计数+1 printf("%d ", roll); // 可选:打印每次投掷结果,不需要可注释 } printf("\n\n"); // 输出统计结果及百分比 for (i = 0; i < numFaces; i++) { double percentage = (double)count[i] / numThrows * 100; printf("The value [%d] was rolled %d times (%.2f%%)\n", i+1, count[i], percentage); } return 0; }
关键修正说明
- 命名分离:用
numFaces/numThrows存储输入值,count数组专门负责统计,彻底解决命名冲突问题。 - 范围校验优化:修正边界判断逻辑,同时在范围错误时直接退出程序,避免无效的后续执行。
- 简化统计流程:每次投掷后直接更新统计数组,无需存储所有投掷结果,节省内存且逻辑更清晰。
- 添加百分比计算:通过强制类型转换实现浮点数除法,输出符合要求的百分比结果。
内容的提问来源于stack exchange,提问作者AspiringCSStudent3
相关产品推荐
相关产品推荐

