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

Объяснение кода листинга программы

  1. Включаются необходимые заголовочные файлы: stdio.h и glib.h.
  2. Определяется функция keycmp, которая будет использоваться для сравнения элементов в контейнере GTree по ключу. Эта функция возвращает разницу между двумя значениями, приведенными к типу int.
  3. Определяется функция print_unique, которая будет использоваться в качестве обработчика при проходе по GTree с помощью g_tree_foreach. Эта функция проверяет значение, связанное с ключом в контейнере, и если оно равно 1, выводит ключ и увеличивает счетчик уникальных значений на 1.
  4. В функции main считывается количество элементов в последовательности и создается GTree с функцией сравнения keycmp.
  5. В цикле считываются элементы последовательности и добавляются в GTree с помощью g_tree_insert. Если после цикла остаются элементы, выводится сообщение об ошибке и возвращается 1.
  6. Выводится разделительная строка и с помощью g_tree_foreach проходят по всем элементам GTree, вызывая функцию print_unique и передавая ей в качестве данных переменную n, которая будет изменяться в функции для отслеживания количества уникальных значений.
  7. Выводится количество уникальных значений и выводится сообщение об успешном завершении программы.
  8. Все выделенные памятью объекты уничтожаются с помощью g_tree_destroy.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4 из 5
Похожие ответы