Упорядочить строковый массив тремя способами - C (СИ)

Формулировка задачи:

Дан строковый массив .Размер и элементы вводятся пользователем.Упорядочить массив тремя способами :в порядке убывания длины строк;в обратном алфавитном порядке первых пяти символов элементов ;в порядке убывания количества согласных букв среди символов элементов.В функцию сортировки должен передаваться указатель на функцию сравнения двух элементов.Способ сортировки выбирает пользователь.


textual

Код к задаче: «Упорядочить строковый массив тремя способами - C (СИ)»

#ifdef _MSC_VER
    #define _CRT_SECURE_NO_WARNINGS
#endif
 
#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
char** create_array(size_t size)
{
    size_t i = 0;
    char** array = (char**)malloc(sizeof(char*) * size);
    for (i = 0; i < size; i++)
        array[i] = (char*)malloc(sizeof(char) * BUFSIZ);
    return array;
}
 
void free_array(char** arr, size_t size)
{
    size_t i = 0;
    for (i = 0; i < size; i++)
        free(arr[i]);
    free(arr);
}
 
#ifdef __STDC_VERSION && (__STDC_VERSION__ >= 201112L)
    #define GETS_S(str, size) gets_s(str, size)
#elif _MSC_VER
    #define GETS_S(str, size) gets_s(str, size)
#else
    #define STR_HELPER(x) #x
    #define STR(x) STR_HELPER(x)
    #define GETS_S(str, size) scanf("%" STR(size) "[^\n]%*c", str)
#endif
 
int by_string_length(const void* p1, const void* p2)
{
    return strlen((const char*)p1) - strlen((const char*)p2);
}
 
int ndesc_string(const void* p1, const void* p2)
{
    return strncpy((const char*)p2, (const char*)p1, 5);
}
 
void dump(const char** array, size_t size)
{
    while (size--)
        puts(*array++);
}
 
int main(void)
{
    size_t i = 0;
    size_t size;
    size_t sort_mode = 0;
    char **array;
    if (printf("Array size:") && 
        (scanf("%u", &size) == 1) && 
        ((array = create_array(size)) != NULL))
    {
        fflush(stdin);
        for (i = 0; i < size; i++)
        {
            if (!(printf(">") && GETS_S(array[i], BUFSIZ)))
            {
                fprintf(stderr, "Error string enter");
                return EXIT_FAILURE;
            }
        }
        puts("Sort mode:\n1. By length\n2. Descendant by first 5 characters");
        if (scanf("%u", &sort_mode) != 1 && sort_mode != 1 && sort_mode != 2)
        {
            fprintf(stderr, "Invalid sort mode");
            return EXIT_FAILURE;
        }
        switch (sort_mode)
        {
        case 1:
            qsort(array, size, sizeof(char*), by_string_length);
            dump(array, size);
            break;
        case 2:
            qsort(array, size, sizeof(char*), ndesc_string);
            dump(array, size);
            break;
        }
        free_array(array, size);
        return EXIT_SUCCESS;
    }
    else
    {
        fprintf(stderr, "Error array size");
        return EXIT_FAILURE;
    }
}
Эта работа вам не подошла?

Вы всегда можете заказать любую учебную работу у наших авторов от 20 руб.


СДЕЛАЙТЕ РЕПОСТ

10   голосов, оценка 3.800 из 5

Источник