Перемешать массив символов в C - PullRequest
0 голосов
/ 05 февраля 2019

Мне нужно решить следующую проблему:

Следующий неполный код иллюстрирует программу, которая состоит из массива, содержащего 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;

}

1 Ответ

0 голосов
/ 05 февраля 2019

Имея

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]);

Предупреждение, когдаЯ вижу вашу первую версию вопроса, которую вы должны напечатать имена , а не случайные имена , это означает, что вам нужно изменить случайные имена , а char temp[20] ясно указывает на васнужно поменять местами имена внутри случайных имен

Так что-то вроде этого:

#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
...