Отсортировать список в порядке их возрастания - C (СИ)
Формулировка задачи:
Здравствуйте, хотелось бы попросить помочь с задачей.
Дан расположенный в файле список слов. Отсортировать список в порядке
их возрастания и записать результат в файл.
Входной файл - input.txt:
первая строка - количество слов (<=20),
вторая и далее строка - одно слово.
Выходной файл - output.txt: каждая срока - одно слово отсортированного списка.
Для подсчёта размера слова, используется эта функция:
Содержание входного файла - произвольное.
Спасибо.
int KE(char strF[]){ int i=-1; while (strF[++i]); return i; }
Решение задачи: «Отсортировать список в порядке их возрастания»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef char String[32]; //----------------------------------------------------------------------------- FILE* FileOpen(const char fname[], const char attr[]) { FILE* f = fopen(fname, attr); if (f == NULL) { perror(fname); exit(EXIT_FAILURE); } return f; } //----------------------------------------------------------------------------- unsigned GetLine(char* buff, unsigned size, FILE* f) { unsigned len = 0; char ch; for (; ((ch = fgetc(f)) != EOF) && (ch != '\n') && len < (size - 1); ++len) { *buff++ = ch; } *buff = 0; return len; } //----------------------------------------------------------------------------- unsigned Load(FILE* f, String** array) { String buff; fgets(buff, sizeof(String), f); int size = atoi(buff); if (size < 1) { fprintf(stderr, "size is null ..."); exit(EXIT_FAILURE); } *array = malloc(sizeof(String) * size); int i = 0; while ((GetLine(buff, sizeof(buff), f)) && (i < size)) { strcpy((*array)[i++], buff); } return i; } //----------------------------------------------------------------------------- int StrLenCmp(const void* first, const void* second) { return strlen((const char*) first) - strlen((const char*) second); } //----------------------------------------------------------------------------- void Print(FILE* f, String* array, unsigned size) { unsigned i; for (i = 0; i < size; ++i) { fprintf(f, "%s\n", array[i]); } } //----------------------------------------------------------------------------- int main() { FILE* finput = FileOpen("input.txt", "r"); FILE* foutput = FileOpen("output.txt", "w"); String* array; unsigned size = Load(finput, &array); qsort(array, size, sizeof(String), StrLenCmp); Print(stdout, array, size); Print(foutput, array, size); fclose(foutput); fclose(finput); return EXIT_SUCCESS; }
Объяснение кода листинга программы
В этом коде представлена сортировка массива строк в порядке возрастания их длины. Вот список действий, которые выполняет код:
- Включающие директивы:
Первый
#include <stdio.h>
подключает функции для работы с файлами и вывода в консоль. Второй#include <stdlib.h>
подключает функции для работы с памятью. Третий#include <string.h>
подключает функции для работы со строками. - Определение типа данных:
Строка
typedef char String[32];
объявляет тип данныхString
как массив символов размером 32. - Функции:
Функция
FileOpen
открывает файл с указанным именем и атрибутом. Если файл не может быть открыт, функция выводит сообщение об ошибке и завершает программу. ФункцияGetLine
считывает строку из файла, используя функциюfgetc
, и сохраняет ее в буфере. ФункцияLoad
считывает размер массива из файла, а затем заполняет массив строками, используя функциюGetLine
. ФункцияStrLenCmp
сравнивает два указателя на строки и возвращает разницу их длин. ФункцияPrint
выводит элементы массива в консоль. - Основная программа:
Программа открывает входной файл
input.txt
и выходной файлoutput.txt
. Затем она считывает размер массива из входного файла и заполняет массив строками. Массив сортируется с помощью функцииqsort
с использованием функцииStrLenCmp
в качестве критерия сортировки. Отсортированный массив выводится в консоль и записывается в выходной файл. В конце программа закрывает файлы и возвращает успешный код завершения.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д