Вывести символы в порядке их встречаемости в строке - C (СИ)
Формулировка задачи:
Помогите пожалуйста.
Задание такое: Написать программу на Си ,которая выводит все символы строки в порядке их встречаемости в строке.
Решение задачи: «Вывести символы в порядке их встречаемости в строке»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define CHAR_VALUES ( UCHAR_MAX + 1 )
typedef unsigned char pair_t[2];
typedef char str_t[256];
#define get_string(s) ( scanf("%255[^\n]%*c", (s)) == 1 )
int cmp(const void * a, const void * b) {
return (*(pair_t*)b)[1] - (*(pair_t*)a)[1];
}
int main(void) {
str_t str;
while ( printf("String: ") && get_string(str) ) {
pair_t counters[CHAR_VALUES] = { 0 };
int i;
for ( i = 0; str[i]; ++i ) {
counters[(unsigned)(str[i])][0] = str[i];
counters[(unsigned)(str[i])][1] += 1;
}
qsort(counters, CHAR_VALUES, sizeof(pair_t), cmp);
printf("Ordered chars: ");
for ( i = 0; counters[i][1]; ++i )
printf("%c", (char)(counters[i][0]));
printf("\n");
}
return 0;
}
Объяснение кода листинга программы
В этом коде:
- Подключаются необходимые заголовочные файлы: stdio.h, stdlib.h и limits.h
- Определяются типы данных: pair_t - это массив из двух unsigned char, str_t - это строка символов длиной 256.
- Определяются функции: cmp - это функция сравнения, используемая в функции qsort, и get_string - это функция, которая считывает строку из стандартного ввода.
- Создаются и инициализируются переменные: str - это строка, в которой необходимо посчитать частоту появления символов, и counters - это массив, в котором будут храниться подсчеты для каждого символа.
- В цикле while происходит считывание строки и подсчет количества каждого символа.
- С помощью функции qsort сортируются массивы подсчетов по второму элементу (частоте появления символа).
- Выводится отсортированный список символов в порядке их встречаемости.
- Цикл while продолжается до тех пор, пока пользователь не введет строку и не нажмет Enter.
- В конце программы возвращается 0, что означает успешное выполнение.