Отсортировать список в порядке их возрастания - 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в качестве критерия сортировки. Отсортированный массив выводится в консоль и записывается в выходной файл. В конце программа закрывает файлы и возвращает успешный код завершения.