Итак, я не использовал 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 раза.
Также while
для петель. Возможно, вы думаете о if
@bruno я имею в виду сравнить значение строки, говоря, что хотя строка имеет значение, равное меньше 333, цикл продолжается. Думаю, мне придется это исправить.
@stark - я действительно ищу петлю, я думаю ....
@YeYeeeeee, так что мое замечание правильное, для этого usr стркмп
Я пытался исправить ваш код, смотрите мой ответ
предупреждение о том, что в вашем издании есть «strcmp (U, «333»))», неверно, потому что тело никогда не позволит вам получить строку 333, поэтому strcmp всегда будет возвращать 1 или -1, но никогда 0
если я хорошо понимаю ваш код
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
Я пытаюсь исправить это в данный момент, основываясь на том, что вы сказали.
Но результат, которого я ожидаю, никогда не должен превышать 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... Я считаю, что мой английский за трудным объяснением всего этого....
while (char U[] <= "333")
циклы, даже когда U равно «333», поэтому это несовместимо с «я ожидаю, что никогда не должно превышать 333», иначе должно быть <
, а не <=
Итак, вы хотите, чтобы функция получала строку из 3 букв и возвращала максимальное количество раз, когда любая буква внутри повторяется? так что результат 3 или 2 или 1 ?
да. Я понимаю, что функция не нужна, но я просто хотел немного пошевелить своим мозгом.... Мы уверены, что 3 единицы значения равны только 3, потому что мы можем иметь только x/x/xy/y/y и z /z/z...... Просто хотел понять, как это сделать.....
Наконец-то мне удалось правильно сформулировать это в моем первоначальном вопросе (см. внизу). Большое спасибо за вашу помощь, и я надеюсь, что я не зря потратил ваше время!
Спасибо, точно так, как вы показали, но возможно ли вместо того, чтобы указывать, для какой строки символов вы хотите, чтобы она скомпилировалась, чтобы она циклически проходила по всем этим и имела тот же правильный вывод, что и ваш пример, приведенный выше?
Еще раз спасибо и спасибо за ваше время, глядя на ваш код, я действительно понимаю, что существует синтаксис, о котором я никогда раньше не слышал, чтобы иметь возможность сделать это так, как вы показали выше. Спасибо!
«Что у меня есть до сих пор:», как мы должны понимать «код» после ? это не C. Обратите внимание, что в C
<=
строки сравнивают указатели, а не их содержимое, используйте стркмп для сравнения их содержимого.