又见面咯!
这次带来《C Primer Plus》第6版 编程练习 第十二章 第五,六题
如果可以的话,麻烦各位大佬们用 PC端 查看,拜托了,美感真的很重要!!!
第五题题目:
/* 12-5 ---编写一个程序,生成100个 1~10 范围内的随机数,并以降序排列 */
分析题目:
- 生成100个 1~10 范围内的随机数
- 降序排列 这里我使用冒泡算法排序
需要包含的头文件:
#include <stdio.h>
#include <time.h> //time()函数
#include <stdlib.h> //提供随机数函数
#include <Windows.h> //sleep()函数
<Windows.h>过会解释......
源代码如下:
/* 12-5 ---编写一个程序,生成100个 1~10 范围内的随机数,并以降序排列 */
//main.c
#include <stdio.h>
#include <time.h> //time()函数
#include <stdlib.h> //提供随机数函数
#include <Windows.h> //sleep()函数
#define SIZE 100
int main(void)
{
int arrnum[SIZE];
int times, count; //循环计数变量
printf("等待10秒钟呦!\n");
//随机生成100个 1~10 内的随机数
for (times = 0; times < SIZE; times++)
{
srand((unsigned int)time(NULL)); //生成随机数种子
arrnum[times] = rand() % 10 + 1; //生成范围 1~10
Sleep(100); //避免生成的随机数一样
}
//冒泡算法降序排序数组
for (times = 0; times < SIZE - 1; times++)
{ //因为是从0开始归位,所以n - 1循环
for (count = 0; count < SIZE - times; count++)
{
if (arrnum[count] < arrnum[count + 1])
{
int temp = arrnum[count];
arrnum[count] = arrnum[count + 1];
arrnum[count + 1] = temp;
}
}
}
//打印结果
system("cls"); //清屏
printf("我们随机生成了100个 1~10的数字:\n");
for (times = 0; times < SIZE; times++)
{
printf("%d) ", times);
if (times < 10) //保持数字对其
putchar(' ');
printf("%d\n", arrnum[times]);
}
return 0;
}
看一下程序的运行效果哈:
扫描二维码关注公众号,回复:
2764556 查看本文章
解释一些 Windows.h
在测试的时候发现,通常电脑的运算速度会很快,100个随机数甚至0.1秒都不要就计算完成了
这会导致出现的随机数完全相同,所以使用Sleep()函数让它停留一会。
继续
第六题题目:
/* 12-6.c -----编写一个程序,生成1000个 1~10范围内的随机数。
不用保存或打印这些数组,仅打印每个数出现的次数。
用10个不同的种子值运行,生成的数字出现的次数是否相同?
这是一个测试特定随机数生成器随机性的方法
*/
分析题目:
- 循环10次,分别获取不同的随机数种子
- 生成并打印这些随机数在1~10范围内出现的次数
(这里我使用桶排序 自行百度)
包含的头文件:
#include <stdio.h>
#include <stdlib.h> //srand()和rand()函数
#include <Windows.h> //Sleep()函数
咳咳,这次的Sleep()函数过会你们就知道用在哪里了。。。。
<stdlib.h>更包含了 system()函数
源代码:
/* 12-6.c -----编写一个程序,生成1000个 1~10范围内的随机数。
不用保存或打印这些数组,仅打印每个数出现的次数。
用10个不同的种子值运行,生成的数字出现的次数是否相同?
这是一个测试特定随机数生成器随机性的方法
*/
#include <stdio.h>
#include <stdlib.h> //srand()和rand()函数
#include <Windows.h>
void B_P_seed(int num, unsigned int seed); //传入随机数种子,打印出每个数出现的次数
int main(void)
{
int times = 0;
int seed = 0;
while (times <= 10)
{
printf("输入 10 个种子值,我会告诉你生成的 1-10 内的随机数\n");
//检查非法输入
while (scanf_s("%d", &seed) != 1)
{
printf("那不是一个有意义的输入,再试一次:\n");
continue;
}
//生成并打印 1000 个随机数出现1~10的次数
B_P_seed(1000, seed);
times++;
}
return 0;
}
//传入随机数种子,打印出每个数出现的次数
void B_P_seed(int num, unsigned int seed)
{ //num 生成随机数的数量
//seed 随机数种子种子
int numarr[11] = { 0 };
int number = 0;
//使用桶排序算法
for (int times = 1; times <= num; times++)
{
srand(seed); //设置随机数种子
number = rand() % 10 + 1; //生成随机数 1~10
switch (number) //根据生成的随机数记录出现的次数
{
case 1:
numarr[number]++;
break;
case 2:
numarr[number]++;
break;
case 3:
numarr[number]++;
break;
case 4:
numarr[number]++;
break;
case 5:
numarr[number]++;
break;
case 6:
numarr[number]++;
break;
case 7:
numarr[number]++;
break;
case 8:
numarr[number]++;
break;
case 9:
numarr[number]++;
break;
case 10:
numarr[number]++;
break;
default:
printf("Program error!\n");
break;
}
}
//打印结果
for (int times = 1; times <= 10; times++)
{
printf("%d 出现了 %d 次\n", times, numarr[times]);
}
printf("数据只能保存5秒\n");
Sleep(5000);
system("cls"); //清屏
return;
}
还是看看运行效果:
好了,一切搞定!
Alex Mercer(boy) 鸣谢