Циклы со строкой и выводом в уникальные конфигурации на C?

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

Теперь я хочу использовать C для следующей проблемы: Я разрабатываю игру, и у меня есть юниты с 4 значениями. Каждая из 3-х сторон имеет значение x/y/z в любых возможных комбинациях, а 4-е значение — это мощность, равная наиболее повторяющемуся символу (если 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 или x/x / г)?

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

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

«Что у меня есть до сих пор:», как мы должны понимать «код» после ? это не C. Обратите внимание, что в C <= строки сравнивают указатели, а не их содержимое, используйте стркмп для сравнения их содержимого.

bruno 09.04.2019 19:44

Также while для петель. Возможно, вы думаете о if

stark 09.04.2019 19:49

@bruno я имею в виду сравнить значение строки, говоря, что хотя строка имеет значение, равное меньше 333, цикл продолжается. Думаю, мне придется это исправить.

YeYeeeeee 09.04.2019 19:53

@stark - я действительно ищу петлю, я думаю ....

YeYeeeeee 09.04.2019 19:53

@YeYeeeeee, так что мое замечание правильное, для этого usr стркмп

bruno 09.04.2019 19:54

Я пытался исправить ваш код, смотрите мой ответ

bruno 09.04.2019 20:00

предупреждение о том, что в вашем издании есть «strcmp (U, «333»))», неверно, потому что тело никогда не позволит вам получить строку 333, поэтому strcmp всегда будет возвращать 1 или -1, но никогда 0

bruno 09.04.2019 20:23
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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]++;
}

Значение, когда вы вернетесь из п, будет "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

Я пытаюсь исправить это в данный момент, основываясь на том, что вы сказали.

YeYeeeeee 09.04.2019 20:02

Но результат, которого я ожидаю, никогда не должен превышать 333, поскольку каждое число 1/2/3 просто предназначено для замены x/y/z. И я хочу вывести число всех 1/1/2; 1/1/3; 1/2/1.... а затем присвойте значение 1 2 или 3 общему числу с таким количеством повторений одной и той же буквы (x/y/z или в данном случае 1/2/3). Например, если бы мы взяли x/x/z, x/x/y и x/y/z, у нас была бы 1 единица со значением мощности 1 и 2 единицы со значением мощности 2... Я считаю, что мой английский за трудным объяснением всего этого....

YeYeeeeee 09.04.2019 20:07
while (char U[] <= "333") циклы, даже когда U равно «333», поэтому это несовместимо с «я ожидаю, что никогда не должно превышать 333», иначе должно быть <, а не <=
bruno 09.04.2019 20:11

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

bruno 09.04.2019 20:21

да. Я понимаю, что функция не нужна, но я просто хотел немного пошевелить своим мозгом.... Мы уверены, что 3 единицы значения равны только 3, потому что мы можем иметь только x/x/xy/y/y и z /z/z...... Просто хотел понять, как это сделать.....

YeYeeeeee 09.04.2019 20:26

Наконец-то мне удалось правильно сформулировать это в моем первоначальном вопросе (см. внизу). Большое спасибо за вашу помощь, и я надеюсь, что я не зря потратил ваше время!

YeYeeeeee 09.04.2019 20:44

Спасибо, точно так, как вы показали, но возможно ли вместо того, чтобы указывать, для какой строки символов вы хотите, чтобы она скомпилировалась, чтобы она циклически проходила по всем этим и имела тот же правильный вывод, что и ваш пример, приведенный выше?

YeYeeeeee 09.04.2019 20:51

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

YeYeeeeee 09.04.2019 21:16

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