Проверка, все ли слова в строке имеют чередующуюся четную и нечетную длину - C (СИ)
Формулировка задачи:
Нужно разработать функцию, выполняющую заданную ниже операцию над данными типа char.
Проверка, все ли слова в строке имеют чередующуюся четную и нечетную длину.
Решение задачи: «Проверка, все ли слова в строке имеют чередующуюся четную и нечетную длину»
textual
Листинг программы
#include <stdio.h>
#include <ctype.h>
#define is_delim(c) (isspace((c)) || ispunct((c)))
#define N_EVEN 1
#define N_ODD 2
int is_altern(const char* s){
const char* p;
int j, n = 0, i = 0, r = (*s != '\0');
for(; *s; s = p){
while(is_delim(*s))
++s;
for(p = s; *p && !is_delim(*p); ++p)
;
if((j = (int)(p - s)) > 0){
if(j & 1)
i = N_ODD;
else
i = N_EVEN;
if(i != n)
n = i;
else {
r = 0;
break;
}
}
}
return r;
}
int main(void){
puts( is_altern("lisp, apl, pascal.") ? "yes" : "no");
puts( is_altern("titan moon (venus)") ? "yes" : "no");
puts( is_altern("Forth Java Prolog") ? "yes" : "no");
return 0;
}
Объяснение кода листинга программы
В этом коде проверка на чётное и нечётное количество букв в каждом слове строки. Если все слова удовлетворяют этому условию, выводится yes, иначе — no. Каждое вводимое слово принимается за начало нового слова, пока не встретится новое слово или конец строки. Для этого используется функция is_altern, которая принимает два аргумента: первое — это указатель на начало строки, а второе — указатель на текущий символ в строке. Функция is_delim используется для определения, является ли текущий символ разделителем. Она возвращает ненулевой результат, если текущий символ является пробелом, знаками препинания или цифрой. Используются также две константы: N_EVEN — «чётное», N_ODD — «нечётное».