Программа поиска слов на C

В настоящее время я пытаюсь написать программу поиска слов на C, программа предназначена для создания двумерного поиска слов и использования слов из 5 различных предустановленных категорий, а также дает пользователю возможность выбрать, какую категорию они хотят выбрать, поэтому пока это код, который у меня есть, но я ударился о стену и не знаю, куда идти отсюда, может ли кто-нибудь дать мне какие-либо идеи?

это мой код:

/* ICP-1029 - Assignment 1 */
/* WordSearch Puzzle Porgram */
/* Callum Fawcett */
/* Version 1 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

int main() {
    const char *animalArray[20]; 

    animalArray[0] = "lynx";
    animalArray[1] = "kitten";
    animalArray[2] = "cheetah";
    animalArray[3] = "ape";
    animalArray[4] = "doe";
    animalArray[5] = "reindeer";
    animalArray[6] = "whale";
    animalArray[7] = "baboon";
    animalArray[8] = "skunk";
    animalArray[9] = "dugong";
    animalArray[10] = "elephant";
    animalArray[11] = "anteater";
    animalArray[12] = "chameleon";
    animalArray[13] = "lizaed";
    animalArray[14] = "horse";

    const char *colourArray[20];

    colourArray[0] = "red";
    colourArray[1] = "green";
    colourArray[2] = "blue";
    colourArray[3] = "black";
    colourArray[4] = "pink";
    colourArray[5] = "yellow";
    colourArray[6] = "brown";
    colourArray[7] = "orange";
    colourArray[8] = "purple";
    colourArray[9] = "black";
    colourArray[10] = "white";
    colourArray[11] = "cyan";
    colourArray[12] = "maroon";
    colourArray[13] = "magenta";
    colourArray[14] = "grey";

    const char *videogameArray[20];

    videogameArray[0] = "fortnite";
    videogameArray[1] = "fifa";
    videogameArray[2] = "hytale";
    videogameArray[3] = "soma";
    videogameArray[4] = "prey";
    videogameArray[5] = "destiny";
    videogameArray[6] = "titanfall";
    videogameArray[7] = "woldenstein";
    videogameArray[8] = "battlefield";
    videogameArray[9] = "fallout";
    videogameArray[10] = "tekken";
    videogameArray[11] = "skyrim";
    videogameArray[12] = "dishonored";
    videogameArray[13] = "uncharted";
    videogameArray[14] = "anthem";

    const char *sportsArray[20];

    sportsArray[0] = "basketball";
    sportsArray[1] = "football";
    sportsArray[2] = "cricket";
    sportsArray[3] = "wrestling";
    sportsArray[4] = "fencing";
    sportsArray[5] = "rowing";
    sportsArray[6] = "volleyball";
    sportsArray[7] = "baseball";
    sportsArray[8] = "hockey";
    sportsArray[9] = "racing";
    sportsArray[10] = "golf";
    sportsArray[11] = "bobsleigh";
    sportsArray[12] = "curling";
    sportsArray[13] = "snowboarding";
    sportsArray[14] = "bowling";

    const char *countryArray[20];

    countryArray[0] = "england";
    countryArray[1] = "ireland";
    countryArray[2] = "china";
    countryArray[3] = "wales";
    countryArray[4] = "bangladesh";
    countryArray[5] = "maldives";
    countryArray[6] = "slovenia";
    countryArray[7] = "uruguay";
    countryArray[8] = "colombia";
    countryArray[9] = "samoa";
    countryArray[10] = "jamaica";
    countryArray[11] = "malta";
    countryArray[12] = "bulgaria";
    countryArray[13] = "armenia";
    countryArray[14] = "gamnbia";
}


char **create2DArray(); //function prototype

#define WIDTH 16
#define HEIGHT 16

char **myArray; //global array

int main() {
    myArray = create2DArray();
}

//Creates a 2D array of WIDTH * HEIGHT and returns a pointer to it
char **create2DArray() {
     int i, j;
     char **array = (char **)malloc(sizeof(char *) * WIDTH);

     for (i = 0; i < WIDTH; i++)
         array[i] = (char *)malloc(sizeof(char) * HEIGHT);

     for (i = 0; i < WIDTH; i++)
        for (j = 0; j < HEIGHT; j++)
            // array[i][j] = 65 + rand() % 25;
            array[i][j] = '.';

    return array;
}

В настоящее время создать2DArray заполняет массив символов 16x16 символами '.' (или случайный символ от A до Y в комментарии), но, вероятно, это была не цель, а какая ожидаемая цель? Иметь случайные существующие слова? Обратите внимание, что если WIDTH и HEIGHT являются постоянными, вам не нужно динамическое распределение и может быть char myArray[HEIGHT][WIDTH];

bruno 07.04.2019 17:40

@bruno Раздел кода, который заполняет 2D-массив, был передан мне моим наставником, цель состоит в том, чтобы заполнить поиск слов случайными буквами вместе со словами из 5 категорий, которые я уже установил, однако я не думаю, что я сделал это правильно, так как когда я компилирую свою программу, я получаю ошибки о наличии двух основных методов, и когда я пытаюсь запустить ее, ничего не происходит.

user11325008 07.04.2019 17:57

Все это 2D-массивы, поэтому их трудно разделить ;-) Вы хотите, чтобы мой массив заполнялся словами, случайно поступающими из других массивов?

bruno 07.04.2019 18:05

@bruno да, я так и хотел

user11325008 07.04.2019 18:06

Я поставил ответ, но я не уверен, что это то, что вы хотите, очень трудно понять, что вы хотите

bruno 07.04.2019 18:40

что я пытаюсь сделать, так это создать программу поиска слов, которая позволяет пользователю выбирать из 5 разных тем, затем программа создает 2D-массив, заполненный случайными буквами и 6 случайными словами из выбранной категории.

user11325008 07.04.2019 18:43
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
6
445
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В вашей первой функции main есть небольшая проблема:

Вы определяете массивы из 20 указателей на строки и инициализируете в них только первые 15 записей. Остальные записи не инициализируются, у них нет нулевого указателя. Вместо этого вы, вероятно, должны написать это:

    const char *animalArray[20] = {
        "lynx", "kitten", "cheetah", "ape", "doe",
        "reindeer", "whale", "baboon", "skunk", "dugong",
        "elephant", "anteater", "chameleon", "lizaed", "horse",
    };

Относительно вас функция create2DArray:

  • вам, вероятно, следует поменять местами HEIGHT и WIDTH: было бы более последовательно иметь массив из HEIGHT строк из WITDH символов.

  • вы можете выделить настоящий 2D-массив следующим образом:

    int main() {
        // local array
        char (*myArray)[WIDTH] = malloc(sizeof(*array) * HEIGHT);
        for (int i = 0; i < HEIGHT; i++)
            for (int j = 0; j < WIDTH; j++)
                myArray[i][j] = "abcdefghijklmnopqrstuvwxyz"[rand() % 26];
        }
    }
    

    Или вы можете просто определить массив как char myArray[HEIGHT][WIDTH];

Помимо этих замечаний, ваш вопрос неясен. Возможно, вы захотите уточнить свою цель и свои ограничения.

Спасибо за эту помощь, моя главная проблема в том, что мой код не генерирует поиск слов, и я также не знаю, как поместить 5 массивов в поиск слов.

user11325008 07.04.2019 18:14
Ответ принят как подходящий

В предложении слова можно располагать горизонтально (слева направо), вертикально (сверху вниз), по диагонали всегда слева направо, но сверху вниз или снизу вверх

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define WIDTH 16
#define HEIGHT 16
#define NWORDS 6

char wordsearch[HEIGHT][WIDTH];

/* horizontaly */

int canPlaceH(const char * word, int i, int j)
{
  if ((strlen(word) + j) > WIDTH)
    return 0;

  do {
    if ((wordsearch[i][j] != 0) && (wordsearch[i][j] != *word))
      return 0;
    j += 1;
  } while (*++word);

  return 1;
}

void placeH(const char * word, int i, int j)
{
  do {
    wordsearch[i][j++] = *word;
  }  while (*++word);
}

/* verticaly */

int canPlaceV(const char * word, int i, int j)
{
  if ((strlen(word) + i) > HEIGHT)
    return 0;

  do {
    if ((wordsearch[i][j] != 0) && (wordsearch[i][j] != *word))
      return 0;
    i += 1;
  } while (*++word);

  return 1;
}

void placeV(const char * word, int i, int j)
{
  do {
    wordsearch[i++][j] = *word;
  }  while (*++word);
}

/* diagonal up */

int canPlaceDU(const char * word, int i, int j)
{
  int ln = strlen(word);

  if (((ln + j) > WIDTH) || ((i - ln) < 0))
    return 0;

  do {
    if ((wordsearch[i][j] != 0) && (wordsearch[i][j] != *word))
      return 0;
    i -= 1;
    j += 1;
  } while (*++word);

  return 1;
}

void placeDU(const char * word, int i, int j)
{
  do {
    wordsearch[i--][j++] = *word;
  }  while (*++word);
}

/* diagonal down */

int canPlaceDD(const char * word, int i, int j)
{
  int ln = strlen(word);

  if (((ln + j) > WIDTH) || ((i + ln) > HEIGHT))
    return 0;

  do {
    if ((wordsearch[i][j] != 0) && (wordsearch[i][j] != *word))
      return 0;
    i += 1;
    j += 1;
  } while (*++word);

  return 1;
}

void placeDD(const char * word, int i, int j)
{
  do {
    wordsearch[i++][j++] = *word;
  }  while (*++word);
}

void fillWordsearch(const char ** a, int sz)
{
  /* first step add words from a */
  const char * used[NWORDS - 1] = { NULL }; /* to not get two times the same word */

  for (int w = 0; w != NWORDS; ++w) {
    /* random choice of a word not yet used */
    const char * word;

    for (;;) {
      word = a[rand() % sz];
      int i;

      /* check not yet used */
      for (i = 0; i != w; ++i)
        if (!strcmp(used[i], word))
          break;

      if (i == w) {
        /* not yet used */
        used[w] = word;
        break;
      }
    }

    /* random placement */

    int i, j, d;
    typedef int (*canFunc)(const char *, int, int);
    typedef void (*placeFunc)(const char *, int, int);
    const canFunc canPlace[] = { canPlaceH, canPlaceV, canPlaceDU, canPlaceDD };
    const placeFunc place[] = { placeH, placeV, placeDU, placeDD };

    do {
      i = rand() % HEIGHT;
      j = rand() % WIDTH;
      d = rand() % 4;
    } while (!(*canPlace[d])(word, i, j));
    (*place[d])(word, i, j);

#ifdef DEBUG
    printf("place %s on %d %d direction %d\n", word, i, j, d);
#endif
  }

#ifdef DEBUG
  for (int i = 0; i != HEIGHT; ++i) {
    for (int j = 0; j != WIDTH; ++j)
      putchar((wordsearch[i][j] == 0) ? '.' : wordsearch[i][j]);
    putchar('\n');
  }
  putchar('\n');
#endif

  /* second step fill not yet set characters with random lowercase letters */
  int i,j;

  for (i = 0; i < HEIGHT; i++)
    for (j = 0; j != WIDTH; ++j)
      if (wordsearch[i][j] == 0)
        wordsearch[i][j] = 'a' + rand() % ('z' - 'a' + 1);
}

int main()
{
  const char *animalArray[] = {
    "lynx",
    "kitten",
    "cheetah",
    "ape",
    "doe",
    "reindeer",
    "whale",
    "baboon",
    "skunk",
    "dugong",
    "elephant",
    "anteater",
    "chameleon",
    "lizaed",
    "horse"
  };

  const char *colourArray[] = {
    "red",
    "green",
    "blue",
    "black",
    "pink",
    "yellow",
    "brown",
    "orange",
    "purple",
    "black",
    "white",
    "cyan",
    "maroon",
    "magenta",
    "grey"
  };

  const char *videogameArray[] = {
    "fortnite",
    "fifa",
    "hytale",
    "soma",
    "prey",
    "destiny",
    "titanfall",
    "woldenstein",
    "battlefield",
    "fallout",
    "tekken",
    "skyrim",
    "dishonored",
    "uncharted",
    "anthem"
  };

  const char *sportsArray[] = {
    "basketball",
    "football",
    "cricket",
    "wrestling",
    "fencing",
    "rowing",
    "volleyball",
    "baseball",
    "hockey",
    "racing",
    "golf",
    "bobsleigh",
    "curling",
    "snowboarding",
    "bowling"
  };

  const char *countryArray[] = {
    "england",
    "ireland",
    "china",
    "wales",
    "bangladesh",
    "maldives",
    "slovenia",
    "uruguay",
    "colombia",
    "samoa",
    "jamaica",
    "malta",
    "bulgaria",
    "armenia",
    "gamnbia"
  };

  printf("choose category 1=animal 2=colour 3=video-game 4=sport 5=country : ");

  int i;

  if ((scanf("%d", &i) != 1) || (i < 1) || (i > 5))
    return -1;

  srand(time(NULL));

  switch (i) {
  case 1:
    fillWordsearch(animalArray, sizeof(animalArray)/sizeof(*animalArray));
    break;
  case 2:
    fillWordsearch(colourArray, sizeof(colourArray)/sizeof(*colourArray));
    break;
  case 3:
    fillWordsearch(videogameArray, sizeof(videogameArray)/sizeof(*videogameArray));
    break;
  case 4:
    fillWordsearch(sportsArray, sizeof(sportsArray)/sizeof(*sportsArray));
    break;
  default:
    fillWordsearch(countryArray, sizeof(countryArray)/sizeof(*countryArray));
    break;
  }

  /* print result */
  for (i = 0; i != HEIGHT; ++i) {
    for (int j = 0; j != WIDTH; ++j)
      putchar(wordsearch[i][j]);
    putchar('\n');
  }

  return 0;
}

При компиляции с DEBUG определено, что указывает, какое слово помещается и как, а также печатает поиск слов только с вставленными словами.

Компиляция и некоторые исполнения:

pi@raspberrypi:/tmp $ gcc -DDEBUG -g c.c
pi@raspberrypi:/tmp $ ./a.out
choose category 1=animal 2=colour 3=video-game 4=sport 5=country : 1
place skunk on 14 10 direction 0
place elephant on 0 15 direction 1
place lizaed on 6 11 direction 1
place cheetah on 13 2 direction 0
place chameleon on 4 3 direction 0
place horse on 12 3 direction 0
...............e
...............l
...............e
...............p
...chameleon...h
...............a
...........l...n
...........i...t
...........z....
...........a....
...........e....
...........d....
...horse........
..cheetah.......
..........skunk.
................

xjzcgwbnnxlmaaje
wgssltuqwsuozgjl
ldtmfzijoxizmkze
vgipavkvmhnixmpp
hzuchameleonalah
bvlpuvqggpdoztpa
vdkjmzrklirlmdrn
zfswqjqnzxtiqait
qvzlzjwlinvzvymj
bfigzgyiwlhatfyw
pqrodqzzejoezgmo
rnvbvvhtddfdnzmn
vbdhorsemrgfshjd
vkcheetahjkaczwd
vrkowptjofskunkw
jibybjdvqoyoyjyb
pi@raspberrypi:/tmp $ ./a.out
choose category 1=animal 2=colour 3=video-game 4=sport 5=country : 2
place brown on 6 0 direction 1
place magenta on 12 5 direction 2
place yellow on 8 4 direction 3
place grey on 13 12 direction 0
place pink on 6 8 direction 3
place black on 5 11 direction 2
................
...............k
..............c.
.............a..
............l...
...........b....
b.......p..a....
r........it.....
o...y....nn.....
w....e..e..k....
n.....lg........
......al........
.....m..o.......
.........w..grey
................
................

syxxaavuzbbvskbu
lcmcvehexwrvkylk
cyizyixuiyxfshcg
mtkaxfhelecdbamd
mqcuscfpzppyluhg
cvbmyathgflbikmx
bpantwfwpbwaxsnv
rmudosgcqitgwzod
okznyywcynnlwutu
wyrtqefoefbkuvta
nyljuklgxxwymwuo
uimrbialrsbjxsoz
mmuokmizoeuzdtxp
psfmasddawwvgrey
efvwwwiisysayyxx
dqusfoxrqrwtusry

помещает ли это их в мой поиск слов?

user11325008 07.04.2019 18:41
google.com/…: -- это поиск слов
user11325008 07.04.2019 18:45

Ах хорошо. @CallumFawcett, черт возьми, почему вы не указали эту ссылку в своем вопросе с самого начала, чтобы прояснить ситуацию? слова могут быть написаны горизонтально или вертикально, как я полагаю?

bruno 07.04.2019 18:46

@ извините, я думал, что поиск слов хорошо известен, и да, они могут быть горизонтальными, вертикальными или диагональными.

user11325008 07.04.2019 18:48

@CallumFawcett, что вы хотите, несколько советов, которые помогут вам это сделать, или код? ;-)

bruno 07.04.2019 19:08

У меня есть базовые знания C, однако мне нужно закончить это как можно скорее, я узнаю, читая ваш код.

user11325008 07.04.2019 19:17

У меня есть базовые знания C, однако мне нужно закончить это как можно скорее, я узнаю, читая ваш код.

user11325008 07.04.2019 19:27

@CallumFawcett Да, и я боюсь, что у вас есть только свое решение, но не уверен, что вы действительно чему-то научитесь :-( В основном я делал это для удовольствия ^^

bruno 07.04.2019 20:26

еще один вопрос, прежде чем вы уйдете, есть ли способ удалить часть, где говорится, где слова были размещены x

user11325008 07.04.2019 20:36

@CallumFawcett, честно говоря, если вы не можете найти, что вы не заслуживаете этого решения, это тривиальный Вы хотя бы прочитали мой ответ?

bruno 07.04.2019 20:38

не беспокойся об этом я найду

user11325008 07.04.2019 20:39

Другие вопросы по теме