Отсортировать слова в заданном тексте по алфавиту или наоборот - C (СИ)
Формулировка задачи:
Дан текст. Сортировать слова в тексте по алфавиту или наоборот (по желанию пользователя)
Решение задачи: «Отсортировать слова в заданном тексте по алфавиту или наоборот»
textual
Листинг программы
#include <stdio.h> #include <string.h> #include <glib.h> #define guess_the_users_desire() ( g_random_int() & 1 ) int asc_cmp(gconstpointer a, gconstpointer b) { return strcmp((const char*)a, (const char*)b); } int desc_cmp(gconstpointer a, gconstpointer b) { return strcmp((const char*)b, (const char*)a); } GCompareFunc COMPARE_FUNCTIONS[] = { asc_cmp, desc_cmp }; void dump(gconstpointer str) { printf("%s ", (const char*)str); } #define DELIM " \t\n" int main(void) { char buf[BUFSIZ]; while ( printf("Words: ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n' ) { GList * words = NULL; for ( char * wrd = strtok(buf, DELIM); wrd; wrd = strtok(NULL, DELIM) ) words = g_list_prepend(words, wrd); words = g_list_sort(words, COMPARE_FUNCTIONS[guess_the_users_desire()]); printf("Sorted: "); g_list_foreach(words, (GFunc)dump, NULL); printf("\n"); g_list_free(words); } return 0; }
Объяснение кода листинга программы
В этом коде используется библиотека GLib для работы со списками и сортировки.
- #include
, #include , #include - подключаются необходимые заголовочные файлы для работы с C. - #define guess_the_users_desire() ( g_random_int() & 1 ) - определяется функция, которая возвращает 0 или 1, т.е. выбирает случайный порядок сортировки (0 - по возрастанию, 1 - по убыванию).
- int asc_cmp(gconstpointer a, gconstpointer b) { return strcmp((const char)a, (const char)b); }, int desc_cmp(gconstpointer a, gconstpointer b) { return strcmp((const char)b, (const char)a); } - определяются две функции сравнения, которые используются для сортировки списка в нужном порядке.
- GCompareFunc COMPARE_FUNCTIONS[] = { asc_cmp, desc_cmp }; - создается массив функций сравнения, который будет использоваться при сортировке.
- *void dump(gconstpointer str) { printf(
%s
, (const char)str); }** - определяется функция, которая выводит элементы списка на экран. - #define DELIM
\t\n
- определяется строка-разделитель, которая будет использоваться при разбиении входной строки на слова. - int main(void) { - определяется функция main(), которая является точкой входа в программу.
- char buf[BUFSIZ]; - создается буфер для чтения строки из стандартного ввода.
- *while ( printf(
Words:
) && fgets(buf, BUFSIZ, stdin) && buf != '\n' ) {** - выполняется цикл, пока пользователь не введет пустую строку. - *GList words = NULL;** - создается указатель на список слов.
- *for ( char wrd = strtok(buf, DELIM); wrd; wrd = strtok(NULL, DELIM) )** - выполняется цикл по всем словам во входной строке.
- words = g_list_prepend(words, wrd); - каждое слово добавляется в список.
- words = g_list_sort(words, COMPARE_FUNCTIONS[guess_the_users_desire()]); - список сортируется с использованием выбранной функции сравнения.
- printf(
Sorted:
); - выводится сообщение о сортировке. - g_list_foreach(words, (GFunc)dump, NULL); - каждое слово из списка выводится на экран.
- printf(
\n
); - выводится символ новой строки. - g_list_free(words); - освобождается память, занятая списком.
- return 0; - функция main() возвращает 0, что означает успешное выполнение программы. Пользователю предлагается ввести строку со словами для сортировки. Введенные слова разделяются по пробелам, табуляции и переносам строк и добавляются в список. Затем список сортируется в зависимости от выбранного пользователем порядка (по возрастанию или по убыванию) и выводится на экран в отсортированном виде.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д