Напечатать только те слова, буквы в которых упорядоченны по алфавиту - C (СИ)
Формулировка задачи:
Добрый вечер.
Сижу и пытаюсь разобраться с заданием. "Дана последовательность, содержащая до 5 слов, в каждом из которых до 5 строчных латинских букв; между соседними словами — не менее одного пробела, за последним словом — точка. Напечатать те слова последовательности, которые отличны от последнего слова и удовлетворяют следующему свойству: буквы слова упорядочены по алфавиту"
Если не будет трудно объяснить алгоритм работы, или дать код, для тщательного разбора.
Решение задачи: «Напечатать только те слова, буквы в которых упорядоченны по алфавиту»
textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <ctype.h>
//проверка букв-слова на упорядоченость
static int is_sorted(const char* s){
for(;*s && *(s + 1); ++s){
if(*s > *(s + 1))
return 0;
}
return 1;
}
//получить последнее слово
static char* word_end(char* s){
char* i, *p = s + (strlen(s) - 1);
while((p >= s) && ! isalpha(*p))
--p;
if(isalpha(*p)){
for(i = p; (i >= s) && isalpha(*i); --i)
;
*i++ = '\0';
(*++p) = '\0';
p = i;
}
return p;
}
int main(void){
char* p, *w;
char s[] = "app, abc, app, xyz, wolf, app.";
w = word_end(s);
p = strtok(s, "., ");
do {
if(strcmp(p, w) != 0 && is_sorted(p))
puts(p);
} while((p = strtok(NULL, "., ")) != NULL);
return 0;
}
Объяснение кода листинга программы
- В начале определяются три функции: is_sorted, word_end и main.
- Функция is_sorted проверяет упорядоченность букв в строке. Она проходит по всем символам строки, начиная с первого, и сравнивает текущий символ с последующим. Если текущий символ больше следующего, функция возвращает 0, иначе возвращает 1.
- Функция word_end находит последнее слово в строке. Она начинает с последнего символа строки и двигается назад до тех пор, пока не встретит не букву или не достигнет начала строки. После этого она возвращает указатель на первое непропущенный символ слова.
- В функции main создается строка s, содержащая список слов. Затем функция word_end вызывается для получения указателя на последнее слово в строке.
- Затем функция strtok вызывается для разделения строки на слова. Она ищет слова, разделенные запятыми и пробелами, и сохраняет их в переменной p.
- Затем проверяется, является ли текущее слово (p) последним словом в строке (w). Если это не так и слово (p) упорядочено (is_sorted), оно выводится на экран с помощью функции puts.
- Затем цикл продолжается, пока не будут обработаны все слова в строке.
- В конце программы функция main возвращает 0, указывая на успешное выполнение.