Получить все числа, которые входят в последовательность по одному разу - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д