Сортировка строк двухмерного динамического массива по возрастанию - C (СИ)

Узнай цену своей работы

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

Помогите,пожалуйста, написать программу так,чтобы программный код, выполняющий действия пунктов меню выполнялся в отдельных

функциях

. И

без использования глобальных функций

. А вот исходный код,если что, без функций.Вот этот
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <time.h>
 
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>

int main()
{
    setlocale(0, "");
 
    srand(time(NULL));
 
    int height = 0;
    int width = 0;
    int numb = 0;
    int numb2 = 0;
    int t = 0;
    int sort;
    int **a = NULL;
 
    a = new int * [height];
                
    for ( int i = 0; i < height; i ++ )
    {
        a[i] = new int [width];
    }
 
    printf("Программа сортировки строк двухмерного динамического массива по возрастанию\n\n");
 
    do
    {
        fflush(stdin);
        printf("1. Задать размерность двухмерного массива\n");
        printf("2. Выбор заполнения массива\n");
        printf("3. Вывод необработанного массива\n");
        printf("4. Обработка массива\n");
        printf("5. Вывод обработанного массива на экран\n");
        printf("0. Выход и программы\n");
        scanf_s("%d", &numb);
        system("cls");
 
        switch(numb)
        {
        case 1:
            {
                for ( int i = 0; i < height; i ++ )
                {
                    delete [] a[i];
                }
                delete [] a;
 
                height = 0;
                width = 0;
 
                do
                {       
                    fflush(stdin);
                    printf("Введите размерность массива: ");
                    printf("\nШирина:> ");
                    scanf_s("%d", &width);
                    printf("Высота:> ");
                    scanf_s("%d", &height);
                    system("cls");
                }
                while ( height <= 0 || width <= 0);
                
                a = new int * [height];
                
                for ( int i = 0; i < height; i ++ )
                {
                    a[i] = new int [width];
                }
 
                t = 1;
                break;
            }
        case 2:
            {
                if ( t > 0 )
                {
                    do
                    {
                        fflush(stdin);
                        printf("Выберите:\n 1. С клавиатуры\n 2. Рандомно\n");
                        scanf_s("%d", &numb2);
                        system("cls");
                    }
                    while ( numb2 != 1 && numb2 != 2 );
                    
                    switch (numb2)
                    {
                    case 1:
                        {
                            printf("Заполните массив:\n");
 
                            for ( int i = 0; i < height; i ++ )
                            {
                                for( int j = 0; j < width; j ++ )
                                {
                                    printf("Введите элемент %d-ой строчки %d-ого столбца: ", i + 1, j + 1);
                                    scanf_s("%d", &a[i][j]);
                                }
                                system("cls");
                            }
                            break;
                        }
                    case 2:
                        {
                            printf("Массив заполнен рандомно");
                            getchar();
                            getchar();
                            system("cls");
 
                            for ( int i = 0; i < height; i ++ )
                            {
                                for( int j = 0; j < width; j ++ )
                                {
                                    a[i][j] = rand() % 50 - 25;
                                }
                            }
                            break;
                        }
                    }
                    t = 2;
                }
                else
                {
                    printf("Задайте размерность массива\n");
                    getchar();
                    getchar();
                    system("cls");
                }
                break;
            }
        case 3:
            {
                if ( t == 2 )
                {
                    printf("Вот сам массив:\n");
 
                    for ( int i = 0; i < height; i ++ )
                    {
                        for( int j = 0; j < width; j ++ )
                        {
                            printf("%4d", a[i][j]);
                        }
                        printf("\n");
                    }
                    getchar();
                    getchar();
                    system("cls");
                    break;
                }
                else
                {
                    printf("Сделайте предыдущий шаг");
                    getchar();
                    getchar();
                    system("cls");
                    break;
                }
                break;
            }
        case 4:
            {
                if ( t == 2 )
                {
                    int * x = NULL;
                    
                    for( int i = 0; i < height; ++ i )
                    {
                        for( int j = i + 1; j < height; ++ j )
                        {
                            if( a[i][0] > a[j][0] )
                            {
                                x = a[i];
                                a[i] = a[j];
                                a[j] = x;
                            }
                        }
                    }
                    
                    printf("Массив обработан\n");
                    getchar();
                    getchar();
                    system("cls");
                    t = 4;
                }
                else
                {
                    printf("Сделайте предыдущий шаг");
                    getchar();
                    getchar();
                    system("cls");
                }
                break;
            }
        case 5:
            {
                if ( t == 4 )
                {
                    printf("Вот обработанный массив\n");
 
                    for ( int i = 0; i < height; i ++ )
                    {
                        for( int j = 0; j < width; j ++ )
                        {
                            printf("%4d", a[i][j]);
                        }
                        printf("\n");
                    }
                    getchar();
                    getchar();
                    system("cls");
 
                }
                else
                {
                    printf("Сделаете предыдущие шаги");
                    getchar();
                    getchar();
                    system("cls");
                }
                break;
            }
        }
 
    }
    while ( numb != 0 );
    
    for ( int i = 0; i < height; i ++ )
    {
        delete [] a[i];
    }
    
    delete [] a;
 
    _CrtDumpMemoryLeaks();
    return 0;
}
Я тут наколякал,но я не профи пока в программировании.Так что это не верно немного)))
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <time.h>
 
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
 
void case1(int **a,int height,int width);
void case1(int **a,int height,int width)
{
    for ( int i = 0; i < height; i ++ )
    {
        delete [] a[i];
    }
    delete [] a;
 
    height = 0;
    width = 0;
 
    do
    {       
        fflush(stdin);
        printf("Введите размерность массива: ");
        printf("\nШирина:> ");
        scanf_s("%d", &width);
        printf("Высота:> ");
        scanf_s("%d", &height);
        system("cls");
    }
    while ( height <= 0 || width <= 0);
                
    a = new int * [height];
                
    for ( int i = 0; i < height; i ++ )
    {
        a[i] = new int [width];
    }
}

void case2(int **a,int height,int width,int numb2);
void case2(int **a,int height,int width, int numb2)
{
    system("cls");
    do
    {
        fflush(stdin);
        printf("Выберите:\n 1. С клавиатуры\n 2. Рандомно\n");
        scanf_s("%d", &numb2);
        system("cls");
    }
    while ( numb2 != 1 && numb2 != 2 );
                    
    switch (numb2)
    {
    case 1:
        {
            printf("Заполните массив:\n");
 
            for ( int i = 0; i < height; i ++ )
            {
                for( int j = 0; j < width; j ++ )
                {
                    printf("Введите элемент %d-ой строчки %d-ого столбца: ", i + 1, j + 1);
                    scanf_s("%d", &a[i][j]);
                }
                system("cls");
            }
            break;
        }
    case 2:
        {
            printf("Массив заполнен рандомно");
            getchar();
            system("cls");
 
            for ( int i = 0; i < height; i ++ )
            {
                for( int j = 0; j < width; j ++ )
                {
                    a[i][j] = rand() % 50 - 25;
                }
            }
            break;
        }
    }
}

void case3(int **a,int height,int width);
void case3(int **a,int height,int width)
{
    system("cls");
    printf("Вот сам массив:\n");
 
    for ( int i = 0; i < height; i ++ )
    {
        for( int j = 0; j < width; j ++ )
        {
            printf("%4d", a[i][j]);
        }
        printf("\n");
    }
    getchar();
    system("cls");
}
 
void case4(int **a,int height,int width, int *x);
void case4(int **a,int height,int width, int *x)
{
    system("cls");
    for( int i = 0; i < height; ++ i )
    {
        for( int j = i + 1; j < height; ++ j )
        {
            if( a[i][0] > a[j][0] )
            {
                x = a[i];
                a[i] = a[j];
                a[j] = x;
            }
        }
    }
                    
    printf("Массив обработан\n");
    getchar();
    system("cls");
}
 
void case5(int **a,int height,int width);
void case5(int **a,int height,int width)
{
    system("cls");
    printf("Вот обработанный массив\n");
 
    for ( int i = 0; i < height; i ++ )
        {
            for( int j = 0; j < width; j ++ )
            {
                printf("%4d", a[i][j]);
            }
            printf("\n");
        }
        getchar();
        system("cls");
}
 
void del(int **a,int height);
void del(int **a,int height)
{
    for ( int i = 0; i < height; i ++ )
    {
        delete [] a[i];
    }
    
    delete [] a;
}
 
int print( int n );
int print( int n )
{
    if ( 1 == n )
    {
        fflush(stdin);
        printf("1. Задать размерность двухмерного массива\n");
        printf("2. Выбор заполнения массива\n");
        printf("3. Вывод необработанного массива\n");
        printf("4. Обработка массива\n");
        printf("5. Вывод обработанного массива на экран\n");
        printf("0. Выход и программы\n");
    }
    int m;
    scanf_s("%d", &m);
    getchar();
 
    return m;
}
 
int main()
{
    setlocale(0, "");
 
    srand(time(NULL));
 
    int height = 0;
    int width = 0;
    int numb2 = 0;
    int t = 0;
    int sort;
    int **a = NULL;
    int *x = NULL;
 
    a = new int * [height];
                
    for ( int i = 0; i < height; i ++ )
    {
        a[i] = new int [width];
    }
 
    printf("Программа сортировки строк двухмерного динамического массива по возрастанию\n\n");
 
    int menu = 0;
 
    do
    {
        menu = print(1);
 
        switch(menu)
        {
        case 1:
            {
                case1(a,height,width);
 
                t = 1;
                break;
            }
        case 2:
            {
                if ( t > 0 )
                {
                    case2(a,height,width, numb2);
                    t = 2;
                }
                else
                {
                    printf("Задайте размерность массива\n");
                    getchar();
                    getchar();
                    system("cls");
                }
                break;
            }
        case 3:
            {
                if ( t == 2 )
                {
                    case3(a,height,width);
                    t = 3;
                    break;
                }
                else
                {
                    printf("Сделайте предыдущий шаг");
                    getchar();
                    getchar();
                    system("cls");
                    break;
                }
                break;
            }
        case 4:
            {
                if ( t == 3 )
                {
                    case4(a, height, width, x);
                    t = 4;
                }
                else
                {
                    printf("Сделайте предыдущий шаг");
                    getchar();
                    getchar();
                    system("cls");
                }
                break;
            }
        case 5:
            {
                if ( t == 4 )
                {
                    case5(a,height,width);
                }
                else
                {
                    printf("Сделаете предыдущие шаги");
                    getchar();
                    getchar();
                    system("cls");
                }
                break;
            }
        }
 
    }
    while ( menu != 0 );
    
    del(a,height);
 
    _CrtDumpMemoryLeaks();
    return 0;
}

Решение задачи: «Сортировка строк двухмерного динамического массива по возрастанию»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <time.h>
 
void init() {
    setlocale(0, "");
    srand(time(NULL));
    printf( "Программа сортировки строк двухмерного динамического массива по возрастанию\n\n");
 
}
 
int **alloc_array(int n_row, int n_col) {
    int **a =(int**)malloc (n_row*sizeof(int*));
    for (int i = 0; i < n_row; i++) {
        a[i] = (int*)malloc(n_col*sizeof(int));
    }
    return a;
}
// int ***a, чтобы вернуть из функции адрес массива
void case1(int ***a, int *n_col, int *n_row) {
    do {
        //1\fflush(stdin);
        printf("Введите размерность массива: ");
        printf("\nШирина:> ");
        scanf("%d", n_col);
        printf("Высота:> ");
        scanf("%d", n_row);
        //system("cls");
    } while (*n_row <= 0 || *n_col <= 0);
    //здесь отдаем адрес наружу
    *a = alloc_array(*n_row, *n_col);
}
 
void case2(int **a, int n_row, int n_col) {
    int vybor;
    if (a != NULL) {
        do {
            //fflush(stdin);
            printf("Выберите:\n 1. С клавиатуры\n 2. Рандомно\n");
            scanf("%d", &vybor);
            system("cls");
        } while (vybor != 1 && vybor != 2);
        switch (vybor) {
        case 1: {
            printf("Заполните массив:\n");
            for (int i = 0; i < n_row; i++) {
                for (int j = 0; j < n_col; j++) {
                    printf("Введите элемент %d-ой строчки %d-ого столбца: ",
                            i + 1, j + 1);
                    scanf("%d", &a[i][j]);
                }
                system("cls");
            }
            break;
        }
        case 2: {
            printf("Массив заполнен случайными числами");
            getchar();
            getchar();
            system("cls");
            for (int i = 0; i < n_row; i++) {
                for (int j = 0; j < n_col; j++) {
                    a[i][j] = rand() % 50 - 25;
                }
            }
            break;
        }
        }
    } else {
        printf("Сделайте предыдущий шаг");
        getchar();
        getchar();
        system("cls");
    }
}
 
void case3(int **a, int n_row, int n_col) {
    if (a != NULL) {
        printf("Вот сам массив:\n");
        for (int i = 0; i < n_row; i++) {
            for (int j = 0; j < n_col; j++) {
                printf("%4d", a[i][j]);
            }
            printf("\n");
        }
        getchar();
        getchar();
        system("cls");
    } else {
        printf("Сделайте предыдущий шаг");
        getchar();
        getchar();
        system("cls");
    }
}
 
void case4(int **a, int n_row, int n_col) {
    if (a != NULL) {
        int x = 0;
        for (int i = 0; i < n_row; ++i) {
            for (int j = 0; j < n_col; ++j) {
                {
                    // тут разобраться в вашем коде
                    a[i][i] = 0;
                }
            }
        }
        printf("Массив обработан\n");
        getchar();
        getchar();
        //system("cls");
    } else {
        printf("Сделайте предыдущий шаг");
        getchar();
        getchar();
        system("cls");
    }
}
 
void case5(int **a, int n_row, int n_col) {
    if (a != NULL) {
        printf("Вот обработанный массив\n");
        for (int i = 0; i < n_row; i++) {
            for (int j = 0; j < n_col; j++) {
                printf("%4d", a[i][j]);
            }
            printf("\n");
        }
        getchar();
        getchar();
        system("cls");
 
    } else {
        printf("Сделаете предыдущие шаги");
        getchar();
        getchar();
        system("cls");
    }
}
 
void destroy(int **a, int n_row) {
    for (int i = 0; i < n_row; i++) {
        free(a[i]);
    }
    free(a);
}
void menu() {
    int n_row = 0;
    int n_col = 0;
    int **a = NULL;
    init();
    int vybor = 0;
    do {
        //fflush(stdin);
        printf("1. Задать размерность двухмерного массива\n");
        printf("2. Выбор заполнения массива\n");
        printf("3. Вывод необработанного массива\n");
        printf("4. Обработка массива\n");
        printf("5. Вывод обработанного массива на экран\n");
        printf("0. Выход и программы\n");
        scanf("%d", &vybor);
        system("cls");
        switch (vybor) {
        case 1: {
            case1(&a, &n_row, &n_col);
            break;
        }
        case 2: {
            case2(a, n_row, n_col);
            break;
        }
        case 3: {
            case3(a, n_row, n_col);
            break;
        }
        case 4: {
            case4(a, n_row, n_col);
            break;
        }
        case 5: {
            case5(a, n_row, n_col);
            break;
        }
        }
    } while (vybor != 0);
    destroy(a, n_row);
}
 
int main() {
    menu();
    return 0;
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.9 из 5
Похожие ответы