在C中随机排列字符数组
Shuffle character array in C
我必须解决以下问题:
以下不完整的代码说明了一个程序,该程序由一个包含 16 个排序名称的数组组成。程序的最后一部分在屏幕上显示这些名称。您需要在用空矩形标记的部分编写代码,以便名称将被打乱。输出名称时,不应按升序输出,而应按随机顺序输出。您只需在考试脚本中写入缺失的代码,而不是整个程序。
如何以最simple/intuitive的方式编写这段代码?
#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;
}
有
char names[16][20] = ...;
char randomnames[16][20];
你做不到
randomnames[i] = names[j];
但是
char names[16][20] = ...;
char * randomnames[16];
...
randomnames[i] = names[j];
或
char names[16][20] = ...;
char randomnames[16][20];
...
strcpy(randomnames[i], names[j]);
当我看到你的问题的第一个版本时警告你必须打印 names 而不是 randomnames,这意味着你需要修改randomnames 和 char temp[20]
清楚地表明您必须交换 randomnames
中的名称
类似这样的事情:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.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 -----------------
srand(time(NULL));
for (i = 0; i < 16; i++) /* can be an other number of loop */
{
j = rand() % 17;
k = rand() % 17;
if (j != k) {
strcpy(temp, names[j]);
strcpy(names[j], names[k]);
strcpy(names[k], temp);
}
}
//---------------------------------------------------------------------------
for (i = 0; i < 16; i++)
{
puts(names[i]);
}
getchar();
return 0;
}
如您所见,我使用了所有变量,没有使用其他变量。
编译执行示例:
pi@raspberrypi:~ $ gcc -pedantic -Wall s.c
pi@raspberrypi:~ $ ./a.out
Sandra
John
William
Karen
Joseph
Kevin
Manuel
Carmen
Anne
Jesmond
Michaela
Maria
Paul
Matthew
David
Yilenia
我必须解决以下问题:
以下不完整的代码说明了一个程序,该程序由一个包含 16 个排序名称的数组组成。程序的最后一部分在屏幕上显示这些名称。您需要在用空矩形标记的部分编写代码,以便名称将被打乱。输出名称时,不应按升序输出,而应按随机顺序输出。您只需在考试脚本中写入缺失的代码,而不是整个程序。
如何以最simple/intuitive的方式编写这段代码?
#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;
}
有
char names[16][20] = ...;
char randomnames[16][20];
你做不到
randomnames[i] = names[j];
但是
char names[16][20] = ...;
char * randomnames[16];
...
randomnames[i] = names[j];
或
char names[16][20] = ...;
char randomnames[16][20];
...
strcpy(randomnames[i], names[j]);
当我看到你的问题的第一个版本时警告你必须打印 names 而不是 randomnames,这意味着你需要修改randomnames 和 char temp[20]
清楚地表明您必须交换 randomnames
类似这样的事情:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.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 -----------------
srand(time(NULL));
for (i = 0; i < 16; i++) /* can be an other number of loop */
{
j = rand() % 17;
k = rand() % 17;
if (j != k) {
strcpy(temp, names[j]);
strcpy(names[j], names[k]);
strcpy(names[k], temp);
}
}
//---------------------------------------------------------------------------
for (i = 0; i < 16; i++)
{
puts(names[i]);
}
getchar();
return 0;
}
如您所见,我使用了所有变量,没有使用其他变量。
编译执行示例:
pi@raspberrypi:~ $ gcc -pedantic -Wall s.c
pi@raspberrypi:~ $ ./a.out
Sandra
John
William
Karen
Joseph
Kevin
Manuel
Carmen
Anne
Jesmond
Michaela
Maria
Paul
Matthew
David
Yilenia