【问题标题】:Shuffle character array in CC中的随机字符数组
【发布时间】: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 &lt;string.h&gt; 并使用 memcpystrncpy)。要解决 (2),请研究 Fisher-Yates shuffle 算法。

标签: c arrays sorting shuffle


【解决方案1】:

拥有

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

【讨论】:

  • 谢谢。 strcpy 可能是这样吗?
  • tnx 这是一个有用的提示
  • 使用您拥有的代码都可以,向量 ([]) 使用的内存比数组 ([][]) 少,因为字符串仍然是唯一的而不是重复的,毕竟取决于您是否想要修改或存储在 randomnames 但不是 names 中的字符串,如果是,则需要数组和 strcpy
  • @denederlander 查看您首先给出的链接不是预期的,我编辑了我的答案
  • @denederlander no 你重做最初的错误,temp = names[j]; 错了,按照我的代码来
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-24
相关资源
最近更新 更多