Циклы со строкой и вывод на уникальные конфигурации в C? - PullRequest
0 голосов
/ 09 апреля 2019

Так что я не использовал C около года, и мой опыт начинался с 0, никаких знаний в области компьютерных наук или чего-то еще. Буквально началось с написания функций, таких как strlen и split whitespaces с нуля, в основном создавая свою собственную библиотеку на простом языке C.

Теперь я хочу использовать C для решения следующей проблемы: Я разрабатываю игру, и у меня есть юниты с 4 значениями. Каждая из трех сторон имеет значение x / y / z с любыми возможными комбинациями, а четвертое значение - это мощность, которая равна наиболее повторяющемуся символу (если x = 3; мощность = 3 /, если x / y / z (= 1) ) мощность = 1 ...). Что я хочу сделать, это вывести количество всех юнитов с соответствующей силой 1, 2 и 3 в уникальных счетчиках ... Как мне это сделать? То, что у меня пока есть:

char U[] = "111";  

int result;

void P()

   while (strcmp(U, "333") !=0);

        while (char U[0] <= "3");

   char U[0]++;

..... и т. Д. Для всех значений для перехода к 333.

Как мне сделать так, чтобы он учитывал различные единицы уровня мощности, а также можно ли, например, сказать, что общее количество единиц уровня мощности 2 равно 15, но также и в какой конфигурации (например, 1/1/3 или х / х / г)

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

Редактировать: Фактически, что я ищу, так это функцию (программу? Поскольку я не хочу иметь вход при компиляции), которая циклически перебирает каждое из 3-х значений в строке (1-3), независимо сохраняя и выводит общее количество уникальных конфигураций (1/1/2 2/1/1 1/2/1) в виде числа, а общее количество конфигураций, содержащих одинаковое значение, 1, 2 или 3 раза.

1 Ответ

0 голосов
/ 09 апреля 2019

если я хорошо понимаю ваш код

char U[] = "111";

void P()

  while (char U[] <= "333");

       while (char U[0] <= "3"

  char U[0]++;

вы хотите что-то вроде:

char U[] = "111";

void P()
{
  while (strcmp(U, "333") <= 0)
    while (U[0] <= '3')
       U[0]++;
}

В любом случае вложенный , пока бесполезен, и вы можете иметь только

char U[] = "111";

void P()
{
  while (strcmp(U, "333") <= 0)
    U[0]++;
}

Значение, когда вы вернетесь с P , будет "411", вы ожидаете?


Ввод всего в программу:

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

char U[] = "111";

void P()
{
  while (strcmp(U, "333") <= 0)
    U[0]++;
}

int main()
{
  P();

  puts(U);
  return 0;
}

Компиляция и исполнение:

pi@raspberrypi:/tmp $ gcc -pedantic -Wextra -Wall s.c
pi@raspberrypi:/tmp $ ./a.out
411

Издание из вашего замечания, если я хорошо понимаю, вы хотите, чтобы функция получала строку из 3 букв и возвращала максимальное количество раз, когда любая буква внутри повторяется

может быть:

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

int count(const char * s)
{
  if (s[0] == s[1])
    return (s[0] == s[2]) ? 3 : 2;

  return ((s[0] == s[2]) || (s[1] == s[2])) ? 2 : 1;
}

int main(int argc, char ** argv)
{
  if ((argc != 2) || (strlen(argv[1]) != 3))
    printf("usage: %s <string of 3 characters>", *argv);
  else
    printf("%d\n", count(argv[1]));

  return 0;
}

Компиляция и исполнение:

pi@raspberrypi:/tmp $ gcc -pedantic -Wall -Wextra s.c
pi@raspberrypi:/tmp $ ./a.out aze
1
pi@raspberrypi:/tmp $ ./a.out aaz
2
pi@raspberrypi:/tmp $ ./a.out aza
2
pi@raspberrypi:/tmp $ ./a.out azz
2
pi@raspberrypi:/tmp $ ./a.out aaa
3

Снова отредактируйте, чтобы сделать все варианты с 3 буквами из 3 (1, 2 или 3 в программе):

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

int count(const char * s)
{
  if (s[0] == s[1])
    return (s[0] == s[2]) ? 3 : 2;

  return ((s[0] == s[2]) || (s[1] == s[2])) ? 2 : 1;
}

int main()
{
  char cnt[4] = { 0 }; /* index 0 not used */
  char s[3];

  for (int i = '1'; i <= '3'; ++i) {
    s[0] = i;
    for (int j = '1'; j <= '3'; ++j) {
      s[1] = j;
      for (int k = '1'; k <= '3'; ++k) {
        s[2] = k;
        cnt[count(s)] += 1;
      }
    }
  }

  printf("number of possibilities to have no repetition (count == 1) : %d\n", cnt[1]);
  printf("number of possibilities to have 2 letters equals (count == 2) : %d\n", cnt[2]);
  printf("number of possibilities to have all letters equals (count == 3) : %d\n", cnt[3]);

  return 0;
}

Компиляция и исполнение:

pi@raspberrypi:/tmp $ gcc -pedantic -Wall -Wextra s.c
pi@raspberrypi:/tmp $ ./a.out
number of possibilities to have no repetition (count == 1) : 6
number of possibilities to have 2 letters equals (count == 2) : 18
number of possibilities to have all letters equals (count == 3) : 3
...