что не так с этим модулем, содержащим код? - PullRequest
0 голосов
/ 12 января 2019

Проблема здесь в том, что я хотел бы, чтобы код правильно произносил число (1-е, 2-е, 3-е, 21-е, 22-е, 23-е и т. Д.), Оставил в покое проблему с 11,12,13 (это можно легко исправить) , но почему этот простой модуль по модулю [(i + 1% 10) == 1/2/3] работает только с 1, 2 и 3, а не после, так что он производит «th» из else {}? Это должно быть прямо, но если вы возьмете любое число, например, расположение 22 массива (22 + 1% 10) явно 3! поэтому он должен соответствовать условию (обратите внимание, +1 соответствует 0 индексации)

for (int i = 0; i < arrLenght; i++)
{
    if (array[i] == key)
    {
        if ((i+1 % 10) == 1)
        {
            printf("bravo! %i is the %ist number of the array! it's address is %p\n", key, i+1, &array[i]);
        }
        else if ((i+1 % 10) == 2)
        {
            printf("bravo! %i is the %ind number of the array! it's address is %p\n", key, i+1, &array[i]);
        }
        else if ((i+1 % 10) == 3)
        {
            printf("bravo! %i is the %ird number of the array! it's address is %p\n", key, i+1, &array[i]);
        }
        else
        {
            printf("bravo! %i is the %ith number of the array! it's address is %p\n", key, i+1, &array[i]);
        }
        return 1;
    }
}

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Помимо ошибки, из-за того, что оператор % имеет более высокий приоритет (такой же, как * или /), чем +, существует некоторое дублирование кода, которого можно избежать:

// Use an array to store the superscripts
const char *sup[] = {
 "th", "st", "nd", "rd"
};

for (int i = 0; i < arrLenght; i++)
{
    if (array[i] == key)
    {
        // Evaluate the index, remembering operator precedence
        int idx = (i + 1) % 10;
        if (idx > 3)
        {
            idx = 0;   // Default to 'th'
        }

        printf("bravo! %i is the %i%s number of the array! it's address is %p\n"
              , key, i + 1
              , sup[idx]        // ^^ print the superscript       
              , (void *)&array[i]);  // the format specifier %p requires a (void *) pointer

        return 1;
    }
}
0 голосов
/ 12 января 2019

Это полностью связано с приоритетом оператора . Чтобы распознать это просто, попробуйте следующее,

printf("%d", 20+1 % 10);   // 21
printf("%d", (20+1) % 10); // 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...