Получить все числа, которые входят в последовательность по одному разу - C (СИ)
Формулировка задачи:
ввести с клавиатуры целое число n , целые числа a0,,,,,,,,an-1 (в последовательности могут быть повторяющиеся символы).Получить все числа, которые входят в последовательность по одному разу.
Решение задачи: «Получить все числа, которые входят в последовательность по одному разу»
textual
Листинг программы
#include <stdio.h> #include <glib.h> int keycmp(const void * a, const void * b) { return GPOINTER_TO_INT(a) - GPOINTER_TO_INT(b); } gboolean print_unique(gpointer key, gpointer value, gpointer data) { if ( GPOINTER_TO_INT(value) == 1 ) { printf("%d\n", GPOINTER_TO_INT(key)); *(int*)data += 1; } return FALSE; } int main(void) { int n, v; while ( printf("Elements in sequence: ") && scanf("%d", &n) == 1 && n > 0 ) { GTree * tree = g_tree_new(keycmp); for ( ; n && scanf("%d", &v) == 1; --n ) g_tree_insert(tree, GINT_TO_POINTER(v), GINT_TO_POINTER(GPOINTER_TO_INT(g_tree_lookup(tree, GINT_TO_POINTER(v)) + 1))); if ( n ) { fprintf(stderr, "Input error!\n"); return 1; } printf("----------------------------------------\n"); g_tree_foreach(tree, print_unique, &n); printf("%d unique value(s).\n", n); g_tree_destroy(tree); } return 0; }
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы:
stdio.h
иglib.h
. - Определяется функция
keycmp
, которая будет использоваться для сравнения элементов в контейнереGTree
по ключу. Эта функция возвращает разницу между двумя значениями, приведенными к типуint
. - Определяется функция
print_unique
, которая будет использоваться в качестве обработчика при проходе поGTree
с помощьюg_tree_foreach
. Эта функция проверяет значение, связанное с ключом в контейнере, и если оно равно 1, выводит ключ и увеличивает счетчик уникальных значений на 1. - В функции
main
считывается количество элементов в последовательности и создаетсяGTree
с функцией сравненияkeycmp
. - В цикле считываются элементы последовательности и добавляются в
GTree
с помощьюg_tree_insert
. Если после цикла остаются элементы, выводится сообщение об ошибке и возвращается 1. - Выводится разделительная строка и с помощью
g_tree_foreach
проходят по всем элементамGTree
, вызывая функциюprint_unique
и передавая ей в качестве данных переменнуюn
, которая будет изменяться в функции для отслеживания количества уникальных значений. - Выводится количество уникальных значений и выводится сообщение об успешном завершении программы.
- Все выделенные памятью объекты уничтожаются с помощью
g_tree_destroy
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д