В массиве N найти количество чередований знака - C (СИ)
Формулировка задачи:
В массиве N (m) найти количество чередований знака, то есть количество переходов с минуса на плюс и наоборот. Например, в последовательности 0 - 2, 0 - 10, 2 - 1, 0, 0, 3, 2 - 3 четыре чередования (ноль знака не имеет)
Пробовал. Не понимаю...
Решение задачи: «В массиве N найти количество чередований знака»
textual
Листинг программы
#include <stdio.h>
int doCnt(const int arr[], int size) {
int cnt = 0;
const int* p = arr;
for (; (0 < size) && (*arr == 0); --size, ++arr) { ; }
for (p = arr; (0 < size); --size, ++p) {
if (*p) {
cnt += (*arr < 0) ^ (*p < 0);
arr = p;
}
}
return cnt;
}
int main() {
int arr[] = {0, -2, 0, -10, 2, -1, 0, 0, 3, 2, -3};
printf("cnt = %d\n", doCnt(arr, sizeof(arr) / sizeof(*arr)));
return 0;
}
Объяснение кода листинга программы
В данном коде определена функция doCnt(), которая принимает два аргумента: массив arr и его размер size. Функция занимается подсчётом количества чередований знака в массиве. Внутри функции сначала определены две переменные: cnt для подсчёта количества чередований и p для указания на текущий элемент массива. Далее в цикле происходит следующее:
- Если размер массива больше 0 и текущий элемент массива равен 0, то происходит инкремент cnt и переход к следующему элементу массива.
- Если текущий элемент массива не равен 0, то проверяется его знак и, в зависимости от него, к cnt прибавляется 1 или -1. Затем происходит переход к следующему элементу массива. После прохода по всем элементам массива, функция возвращает значение cnt. В функции main() определён массив arr, содержащий 11 элементов. Далее вызывается функция doCnt(), передавая в неё этот массив и его размер. Результат подсчёта выводится на экран. В данном случае на экран будет выведено число 5, так как в массиве имеются 5 чередований знака (0 < -2 < 0 < -10 < 2).