【发布时间】:2019-02-05 18:05:54
【问题描述】:
我必须解决以下问题:
以下不完整的代码说明了一个程序,该程序由一个包含 16 个排序名称的数组组成。程序的最后一部分在屏幕上显示这些名称。您需要在标有空矩形的部分中编写代码,以便名称将被打乱。输出名称时,不应按升序输出,而应按随机顺序输出。您只需在考试脚本中写入缺失的代码,而不是整个程序。
如何以最简单/直观的方式编写此代码?
#include <stdio.h>
#include <time.h>
int main(void)
{
int i, j, k;
char temp[20];
char names[16][20] = { "Anne" , "Carmen" , "David" , "Jesmond" ,
"John" , "Joseph" , "Karen" , "Kevin" ,
"Manuel" , "Maria" , "Matthew" , "Michaela" ,
"Paul" , "Sandra" , "William" , "Yilenia" };
//--------------------------- The Code between the dotted lines is the one I still need to write -----------------
char randomnames[16][20];
srand(time(NULL));
for (i = 0; i < 16; i++)
{
j = rand() % 17;
printf("%d\n", j);
randomnames[i] = names[j];
}
//---------------------------------------------------------------------------
for (i = 0; i < 16; i++)
{
puts(randomnames[i]);
}
getchar();
return 0;
}
【问题讨论】:
-
这听起来是一个非常有趣的问题。不过你有什么问题吗?
-
到目前为止你有什么尝试?
-
作为提示,读取时间并使用它来播种伪随机数生成器。由于您不能包含任何额外的头文件,并且使用 C 标准库函数的外部声明可能被认为是作弊,您可以使用线性同余生成器实现自己的 PRNG。这比听起来容易得多。
-
您的代码的一些问题是:(1)您不能分配本身就是数组的数组元素; (2) 它不会随机播放 - 您可能会在结果数组中获得重复值; (3) 您生成从 0 到 16 的随机数,但 16 超出了您的数组的范围。要解决 (1),请使用循环复制数组元素(假设您不能
#include <string.h>并使用memcpy或strncpy)。要解决 (2),请研究 Fisher-Yates shuffle 算法。