《C Primer Plus》第6版 编程练习 第十二章 第七题

版权声明:此文为博主原创文章,转载请注明出处 https://blog.csdn.net/Alex_mercer_boy/article/details/81702533

继续开始《C Primer Plus》的编程练习,OK!

如果可以,各位大佬请使用 PC端查看,拜托了.....如果可以的话,麻烦各位大佬们用 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个),同上
  • 打印出总点数

那么,分析练习上要求我们的任务,以及输出示例:

  1. 变量 sets 表示掷骰子的次数
  2. sides 和 dice 需要同时输入(翻译 面数,骰子数)
  3. 打印出每次掷出的总点数(是每次掷出的)
  4. 输入 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) 鸣谢!

猜你喜欢

转载自blog.csdn.net/Alex_mercer_boy/article/details/81702533