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

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


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;
    }
}

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

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



Похожие ответы
  1. Нужна программа, в которую вводишь текст и она расставляет буквы по алфавиту (обязательно с помощью пузырьковой сортировки) и выводит на экран с пробелами между группой букв. Пример: Ввод: Annulo cingitul tenui, plano, nusquam cohaerente, ad eclipticam inclinato. Вывод: aaaaaaa cccc d eeeee g h iiiiiii lllll mm nnnnnnnnn oooo pp q r s ttttt uuuuu

  1. Доброго времени суток, долго мучался с двумерным массивом и его упорядочиванием, в конце концов что то получилось, матрицу выводит, но считает не верно, ещё и после упорядочивания выводит матрицу не 8х8, а 7х10 с неполной последней строкой, подскажите, пожалуйста, в чём я ошибся?C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 #include #include #include   #define MIN_VALUE -100 #define MAX_VALUE 100   #define ROWS    8 #define COLS    8   int main(int argc, char **argv) {     setlocale(LC_ALL, "RUSSIAN");       int A[8][8];     int i, k, n,t;     n = 8;       printf("Матрица до сортировки\n");     for (i = 0; i < ROWS; ++i)     {         for (k = 0; k < COLS; ++k)         {             A[i][k] = rand() % 50-25;//заплнене случайным числами             printf("%d\t", A[i][k]);         }         printf("\n");   // каждую строку матрицы выводим на новой строке     }       for(i = 0; i

  1. Дано m точек в n-мерном пространстве. Упорядочить точки по неубыванию их расстояний до начала координат.C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 #include #include #include #define M 3 #define N 3 int main() {     int m=0,max,y,z,i,j,A[M][N],R[M]={0,0,0};     for (i=0; i=i; j--)     {         if (R[j]>R[j+1])         {             max=R[j];             R[j]=R[j+1];             R[j+1]=max;                 for (z=0; iR[i+1])             {                 for (z=0; i

  1. C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 #include "stdafx.h" #include "stdio.h" #include "conio.h"     int main()   { float d[8]; printf ("Input d[8]\n"); for (int i=0;i<8;i++)     scanf ("%f", &d[i]); int fl; do {     fl=0;     for (int i=0;i<7;i++)         if (d[i]>d[i+1])         {             float temp=d[i];             d[i]=d[i+1];     d[i+1]=temp;     fl=1; } } while (fl==0); printf ("Massive D:\n"); for (int i=0;i<8;i++)     printf ("%6.1f ", d[i]); getch ();     return 0; }надо чтоб он ставил в массив d[8] в порядке возрастания, где ошибка?

  1. Дана вещественная матрица размером 10х10. Упорядочить её строки по не убыванию суммы их элементов.

  1. Нужна вводить матриц char names[M][N] N,M константы(define) , Нужна писать в нем M имя и программа будет сортиравать имя по алфавитный форме , нужно использовать пузырьковый алгоритм и функции gets(), puts(), strcmp(), strcpy()

  1. 1)Вывести все элементы массива находящиеся в диапазоне между средним и наименьшим значением 2)Упорядочить выходной массив по возрастанию 3)При этом элементы из пункта 1) оставить на своих местах Буду благодарен за помощь Добавлено через 22 часа 6 минут Дан массив из 10 элементов 1)Вывести все элементы массива находящиеся в диапазоне между средним и наименьшим значением 2)Упорядочить выходной массив по возрастанию 3)При этом элементы из пункта 1) оставить на своих местах Помогите

  1. Упорядочить массив по возрастанию Подскажите, как реализовать

  1. Написать программу, которая позволяет упорядочить три целых числа по порядку возрастания. Использовать оператор if и логические операции.C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include #include #include   void main() {   int a, b, c;   printf("Vvedite chislo 1 - ");   scanf("%d",&a);   printf("Vvedite chislo 2 - ");   scanf("%d",&b);   printf("Vvedite chislo 3 - ");   scanf("%d",&c);       getch();   return 0;   }

  1. Почему символьный строковый массив мы можем передать в функцию без указания количества элементов?