Найти четыре цифровых символа, которые чаще всего встречаются в текстовом файле - C (СИ)
Формулировка задачи:
Задача: Написать программу языке СИ, которая находит четыре цифровых символы, которые
чаще всего встречаются в текстовом файле. Текстовый файл состоит из букв латинского
алфавита, цифровых символов, знаков препинания и пробельных символов. программа
выводит на экран найденные цифровые символы, а также сколько раз каждый из них
встречается в файле. Для создания текстового файла пользоваться редактором
Блокнот.
Решение задачи: «Найти четыре цифровых символа, которые чаще всего встречаются в текстовом файле»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
typedef struct _TInfo {
char digit;
int count;
} TInfo;
//-----------------------------------------------------------------------------
void beforeQuit() {
system("pause");
}
//-----------------------------------------------------------------------------
FILE* getFile(int argc, char* argv[]) {
FILE* f = NULL;
if (argc != 2) {
fprintf(stderr, "Usage: %s <FILE.txt>\n", argv[0]);
exit(EXIT_FAILURE);
}
if ((f = fopen(argv[1], "r")) == NULL) {
perror(argv[1]);
exit(EXIT_FAILURE);
}
return f;
}
//-----------------------------------------------------------------------------
TInfo* init(TInfo digit[]) {
char ch;
for (ch = '0'; ch <= '9'; ++ch) {
digit[ch - '0'].digit = ch;
digit[ch - '0'].count = 0;
}
return digit;
}
//-----------------------------------------------------------------------------
TInfo* getCountDigits(FILE* f, TInfo digit[]) {
char ch;
while ((ch = fgetc(f)) != EOF) {
if (isdigit(ch)) {
digit[ch - '0'].count++;
}
}
return digit;
}
//-----------------------------------------------------------------------------
void printCountDigits(TInfo digit[], unsigned len) {
unsigned i;
for (i = 0; i < len; ++i) {
printf("[%c]: %d\n", digit[i].digit, digit[i].count);
}
printf("\n");
}
//-----------------------------------------------------------------------------
int compare(const void* a, const void* b) {
return ((TInfo*)b)->count - ((TInfo*)a)->count;
}
//-----------------------------------------------------------------------------
int main(int argc, char* argv[]) {
FILE* f = getFile(argc, argv);
TInfo digit[10];
init(digit);
getCountDigits(f, digit);
qsort(digit, 10, sizeof(TInfo), compare);
printCountDigits(digit, 4);
fclose(f);
return EXIT_SUCCESS;
}
Объяснение кода листинга программы
- Код начинается с заголовка, который включает в себя необходимые заголовочные файлы и объявление структуры TInfo.
- Затем следуют функции:
- beforeQuit() - функция, которая приостанавливает выполнение программы до тех пор, пока пользователь не нажмет любую клавишу.
- getFile() - функция, которая открывает файл для чтения или выводит сообщение об ошибке, если файл не может быть открыт.
- init() - инициализирует массив TInfo с символами от '0' до '9' и устанавливает счетчик на 0 для каждого из них.
- getCountDigits() - проходит через каждый символ в файле и увеличивает счетчик для соответствующего символа в массиве TInfo, если символ является цифровым.
- printCountDigits() - выводит количество каждого цифрового символа в массиве TInfo.
- compare() - функция сортировки, которая сравнивает два элемента массива TInfo по их счетчику.
- В функции main() открывается файл с помощью функции getFile().
- Создается массив TInfo с 10 элементами.
- Инициализируется с помощью функции init().
- Получается количество каждого цифрового символа в файле с помощью функции getCountDigits().
- Массив TInfo сортируется по счетчику с помощью функции qsort().
- Выводятся 4 наиболее часто встречающихся цифровых символа с помощью функции printCountDigits().
- Файл закрывается с помощью функции fclose().
- Программа завершается с успехом (EXIT_SUCCESS).