Получить все числа, которые входят в последовательность по одному разу - 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.