Я новичок в написании тестов. Я работаю над проблемой, которая включает подсчет и возврат числа 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
Используйте более описательное имя. Поменяйте порядок ваших аргументов, чтобы вы могли задокументировать, как связаны 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 есть дополнительная итерация.
Также основная подпись недействительна в соответствии со стандартом C.
@Х.С. Мне нельзя разрешать писать в Интернете после 2 часов ночи :-). Пересмотренный ответ.
@Fredrik Вы правы, и я пересмотрел ответ, однако используемый мной компилятор даже не выдает предупреждение об использовании main()
вместо main(void)
.
он отлично возвращает 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
. Оставляя вам возможность внести необходимые изменения в код, если в массиве могут быть отрицательные числа.
Поскольку ваш массив содержит (подпаленные) целые числа... считается ли -7 за 7?