继续开始《C Primer Plus》的编程练习,OK!
如果可以的话,麻烦各位大佬们用 PC端 查看,拜托了,美感真的很重要!!!
编译环境:VS2017 Community
运行平台:Win 10 ×64
第十二章 第七题 :
上题目:(粗体表示输入)
编写一个程序,按照程序清单12.13输出示例后面讨论内容,修改该程序。
使其输入类似于:
Enter the number of sets; enter q to stop : 18
How many sides and how many dice? 6 3
Here are 18 sets of 3 6-sided throws.
12 10 6 9 8 14 8 15 9 14 12 17 11 7 10
13 8 14
How many sets? Enter q to quit: q
这里我先介绍一下 程序清单12.13,其实这是一个模拟掷骰子的程序。
循环执行:(用户输入 0 退出)
- 提示用户输入骰子的面数(sides 至少为2) ,并获取正确输入
- 提示用户输入多少个骰子同时掷出(至少1个),同上
- 打印出总点数
那么,分析练习上要求我们的任务,以及输出示例:
- 变量 sets 表示掷骰子的次数
- sides 和 dice 需要同时输入(翻译 面数,骰子数)
- 打印出每次掷出的总点数(是每次掷出的)
- 输入 q 退出循环
这里我分别定义了几个函数,完成一些步骤(有些是直接修改程序清单的)
void roll_n_dice(int sets, int dice, int sides); //计算并打印点数
int rollem(int sides); //掷骰子函数
rollem()函数返回它每次掷出的点数
roll_n_dice()定义:
//计算并打印点数
void roll_n_dice(int sets, int dice, int sides)
{
int d, i; //循环计数变量
int total = 0; //每次掷骰子的总点数
if (sides < 2) //骰子至少需要两面1,2......
{
puts("Need at least 2 sides.\n");
return;
}
if (dice < 1) /* 每次掷骰子至少需要1个骰子 */
{
puts("Need at least 1 die.\n");
return;
}
//打印结果
printf("Here are %d setsof %d %d-sided throw.\n",
sets, dice, sides);
for (i = 0; i < sets; i++) //总共掷的次数
{
for (d = 0; d < dice; d++)
{
total += rollem(sides); //计算总点数
}
printf("%d ", total);
if (i == 14) //自动换行
{ //这里的14表示15
putchar('\n'); /* 因为i从0开始计数 */
}
total = 0; /* 清空点数 重新计算下一次的点数 */
}
putchar('\n');
return;
}
主函数main():
int main(void)
{
int dice; //骰子数
int sides; //骰子面数
int status; //输入 sets 的标记
int sets; //掷的总次数
srand((unsigned int)time(0)); /* 设置随机数种子 */
printf("Enter the number of sets; enrer q to stop: ");
while (status = scanf_s("%d", &sets) == 1 && sets > 0)
{
puts("How many sides and how many dice?");
while (status = scanf_s("%d %d", &sides, &dice) != 2)
{
if (status == EOF)
break; //退出循环
else
{
if (status == 1 || status == 0)
{
puts("You should have entered an integer.");
puts(" Let's begin again.\n");
}
while (getchar() != '\n') //处理单行剩下的输入
{
continue;
}
puts("How many sides and how many dice?");
}
}
roll_n_dice(sets, dice, sides); /* 计算并打印点数 */
printf("How many sets? Enter q to stop: ");
}
if (status == 0) //输入的 sets = 0时
{
puts("The sets entered error. Exit!");
}
return 0;
}
掷骰子rollem()函数:
//掷骰子函数
int rollem(int sides)
{
int roll;
roll = rand() % sides + 1; /* 获取点数 */
return roll;
}
头文件:
#include <stdio.h>
#include <stdlib.h> /* 提供rand()函数 */
#include <time.h> //提供time()函数
代码最后结合在一起,就是一个完整的掷骰子程序了!
效果图:(这里我们模拟了一次练习上的输入和个人的输入)
看来我们的手气不佳呢!
Alex Mercer(boy) 鸣谢!