Язык C - я хочу подсчитать и вернуть количество определенного числа в массиве

Я новичок в написании тестов. Я работаю над проблемой, которая включает подсчет и возврат числа 7 в массиве. Но я продолжаю получать сообщение об ошибке, пожалуйста, помогите мне понять, почему я получаю сообщение об ошибке

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>


int solution(int array[], size_t array_len) {
int answer = 0;
for(int j=0; j<=array_len; j++){
    
    for(int i=0; array[i]<10; i++) {
        if (array[i] < 10) { 
            if (array[i] == 7) 
                answer++;
            break;
        }
        if (array[i]%10 == 7){ 
        answer++;
        }
        array[i] = array[i]/10;
        
    }
  }
return answer;
}

Код выглядит следующим образом, и он отлично возвращает 4 при задании массива [7, 77, 17] и 0 при задании массива [10, 29].

Однако код вообще не работает для массивов типа [777, 67].

test case
[7, 77, 17] return 4  - correct
[10, 29]  return 0  - correct
[777, 67] return 0  - incorrect

Поскольку ваш массив содержит (подпаленные) целые числа... считается ли -7 за 7?

Allan Wind 02.04.2023 09:21
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
1
101
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Используйте более описательное имя. Поменяйте порядок ваших аргументов, чтобы вы могли задокументировать, как связаны array_len и array. Ваш segfault, скорее всего, связан с вызовом кода, которым вы не поделились с нами. Кроме того, логика неверна, поэтому я переписал алгоритм для вас.

#include <stdio.h>

size_t count(size_t array_len, int array[array_len]) {
    size_t answer = 0;
    for(size_t i = 0; i < array_len; i++)
        for(int v = array[i]; v; v /= 10)
            if (v % 10 == 7) answer++;
    return answer;
}

int main(void) {
    struct test {
        size_t array_len;
        int *array;
        size_t expected;
    } tests[] = {
        {3, (int []) {7, 77, 17}, 4},
        {2, (int []) {10, 29}, 0},
        {2, (int []) {777, 67}, 4}
    };
    for(struct test *t = tests; t < tests + sizeof tests / sizeof *tests; t++)
        printf("%s\n", count(t->array_len, t->array) == t->expected ? "ok" : "fail");
}

и вывод:

ok
ok
ok

вы получаете доступ к массиву за пределами с помощью j<=array_len В коде OP нет массива за пределами доступа, потому что j никогда не используется в качестве индекса входного массива. Но, конечно, в коде OP есть дополнительная итерация.

H.S. 02.04.2023 11:56

Также основная подпись недействительна в соответствии со стандартом C.

Fredrik 02.04.2023 13:13

@Х.С. Мне нельзя разрешать писать в Интернете после 2 часов ночи :-). Пересмотренный ответ.

Allan Wind 02.04.2023 18:51

@Fredrik Вы правы, и я пересмотрел ответ, однако используемый мной компилятор даже не выдает предупреждение об использовании main() вместо main(void).

Allan Wind 02.04.2023 18:52
Ответ принят как подходящий

он отлично возвращает 4, когда ему дан массив [7, 77, 17]....

Он возвращает 4, когда входной массив равен [7, 77, 17], но это просто совпадение. Попробуйте добавить в этот массив еще один элемент, скажем 7777, что сделает количество цифр 7 в элементах массива - 8, но на выходе вы получите 5.

Ваша логика по поиску количества цифр 7 в элементах массива неверна и имеет множество проблем.

Давайте обсудим их один за другим:

Проблема - я:

Ваш внешний цикл for имеет дополнительную итерацию из-за его условия - j<=array_len. Предположим размер массива, если 3, цикл начинается с j=0 и повторяется до j<=3, т.е. 4 раз.
Условие цикла должно быть j<array_len.

Задача - II:

Посмотрите на состояние внутреннего цикла for

array[i]<10

это позволит выполнить тело цикла только тогда, когда элемент массива меньше 10. Если элемент массива больше 10, тело цикла никогда не выполняется.

Проблема III:

В каждой итерации внешнего цикла for внутренний цикл for начинает перебирать массив с его первого элемента, и его поведение выглядит следующим образом:

  • Если первый элемент входного массива больше или равен 10, тело вложенного for цикла не будет выполнено.
  • Если первым элементом входного массива является 7, то вложенный цикл for будет считать его и break.
  • Если первый элемент входного массива меньше 10 и не равен 7, то он не будет учитываться и цикл будет break.

Задача - IV:

Условие внешнего цикла for сравнивает int с size_t.

Выше перечислены проблемы, теперь поговорим о решении -

Во-первых, вам не нужно перебирать весь массив во вложенном for цикле для каждой итерации внешнего for цикла. Вместо этого цикл for перебирает количество элементов в массиве и в теле цикла проверяет количество цифр 7 в текущем элементе обрабатываемого массива.

Ты можешь сделать:

#include <stdio.h>

int solution (int array[], size_t array_len) {
    int answer = 0;
    for(size_t j = 0; j < array_len; j++){
        int x = array[j];
        while (x) {
            int r = x % 10;
            if (r == 7) {
                answer++;
            }
            x = x / 10;
        }
    }
    return answer;
}

int main (void) {

    printf ("array [7, 77, 17], result : %d\n", solution ((int []) {7, 77, 17}, 3));
    printf ("array [10, 29], result : %d\n", solution ((int []) {10, 29}, 2));
    printf ("array [777, 67], result : %d\n", solution ((int []) {777, 67}, 2));
    printf ("array [7, 77, 17, 7777], result : %d\n", solution ((int []) {7, 77, 17, 7777}, 4));
    
    return 0;
}

Выход:

array [7, 77, 17], result : 4
array [10, 29], result : 0
array [777, 67], result : 4
array [7, 77, 17, 7777], result : 8

Обратите внимание, что это решение не учитывает отрицательное число как элемент входного массива, содержащий цифру 7. Оставляя вам возможность внести необходимые изменения в код, если в массиве могут быть отрицательные числа.

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