1 / 1 / 1
Регистрация: 15.09.2013
Сообщений: 17
1

Разбить прямоугольный массив на 2 по четности строк с использованием тройного указателя

16.05.2014, 21:29. Показов 831. Ответов 2
Метки нет (Все метки)

Описание задачи: На базе заданной прямоугольной матрицы сделать 2, одна из которых содержит элементы, принадлежащие строкам с четными номерами, а вторая - с нечетными. Операцию реализовать как функцию, принимающую на вход двойной указатель на матрицу и ее размеры по каждому измерению. На выходе функция должна вернуть тройной указатель.

C
1
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
/* признак аварийного завершения программы при сбое вызова scanf() или при
   вылете значений из требуемого диапазона
 */
#define EXIT_INPUT_ERROR -1
// признак аварийного завершения программы при сбое вызова printf()
#define EXIT_OUTPUT_ERROR -2
// признак аварийного завершения программы при невозможности выделить память
#define EXIT_MEMORY_ERROR -3
// функция формирования матриц из четных и нечетных строк
int ***Translation(int ** matrix, size_t row, size_t col);
// функция освобождения ранее выделенной памяти тройного указателя
void freeall(int ***Translation);
 
int main(void) {
    size_t row,
           col;
    int ***Result;
    // консольный ввод с проверкой успешности результата
    if(!scanf("%d%d", &row, &col))
        return EXIT_INPUT_ERROR;
    // проверка на неравенство значений числа строк и столбцов матрицы нулю
    if (row != 0 && col != 0) {
        int matrix[row][col];
        // консольный ввод с проверкой успешности результата
        for (size_t i = 0; i < sizeof(matrix)/sizeof(matrix[0][0]); ++i)
            if(!scanf("%d", *matrix + i))
                return EXIT_INPUT_ERROR;
        int *pmatrix = matrix[0];
        int **ppmatrix = &pmatrix;
        Result = Translation(ppmatrix, row, col);
        if (Result != NULL) {
            // массив количества строк
            size_t matrixrow[2];
            // для матрицы из четных строк
            matrixrow[0] = row / 2;
            // для матрицы из нечетных строк
            matrixrow[1] = matrixrow[0] + row % 2;
            // консольный вывод с проверкой успешности результата
            for (size_t k = 0; k < 2; ++k)
                for (size_t i = 0; i < matrixrow[k]; ++i)
                    for (size_t j = 0; j < col; ++j)
                        if (!printf("%d ", *(*Result[k]) + i + j * col)) {
                            freeall(Result);
                            return EXIT_OUTPUT_ERROR;
                        }
        }
        else
            return EXIT_MEMORY_ERROR;
    }
    else
        return EXIT_INPUT_ERROR;
    freeall(Result);
    return EXIT_SUCCESS;
}
 
// функция формирования матриц из четных и нечетных строк
int ***Translation(int **matrix, size_t row, size_t col) {
    // выделение памяти под указатель на двухэлементный массив указателей на
    // результирующие матрицы
    int*** restrict Result;
    Result = (int***) malloc(sizeof(int**));
    if (Result == NULL)
        return NULL;
    // выделение памяти под двухэлементный массив указателей на результирую-
    // щие матрицы
    if ((*Result = (int**) malloc(2 * sizeof(int*))) == NULL)
        return NULL;
    // вычисление количества необходимых строк для результирующих матриц
    size_t evenrow = row / 2,
           oddrow = evenrow + row % 2;
    // выделение памяти под матрицу для четных строк
    if ((*Result[0] = (int*) malloc(evenrow * col * sizeof(int))) == NULL)
        return NULL;
    // выделение памяти под матрицу для нечетных строк
    if ((*Result[1] = (int*) malloc(oddrow * col * sizeof(int))) == NULL)
        return NULL;
    for (size_t i = 0; i < row; ++i)
        memmove(*(Result[1 - (i % 2)] + ((i + 1) / 2 + (i + 1) % 2 - 1) * col), *(matrix + i), col * sizeof(int));
    return Result;
}
 
// функция освобождения ранее выделенной памяти тройного указателя
void freeall(int ***ptr) {
    free(**ptr);
    free(**(ptr + 1));
    free(*ptr);
    free(ptr);
}
Программа компилится, но не работает SIGSEGV, а почему понять не могу. Помогите плс.

Добавлено через 53 минуты
Надо было в си запостить... Перепутал.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.05.2014, 21:29
Ответы с готовыми решениями:

Разбить массив на две части по четности индекса
Задан массив с количество элементов N. Сформировать два массива: в первый включить элементы...

Обработка строк с использованием указателей: вывести слова в два столбика, по четности их длины
Дана строка. Распечатать слова в два столбика. 1 столбик — слова, имеющие четное количество букв, а...

Элементы нечетных строк матрицы А заменить на Х (с использованием указателя)
Задание: Дана матрица A челых чисел и переменная Х. Элементы нечетных строк матрицы А заменить на Х...

Преобразование кода без указателя в код с использованием указателя
Правильно ли выполнил? Исходный код без указателя #include &lt;iostream&gt; #include &lt;cstdlib&gt;...

2
54 / 54 / 47
Регистрация: 16.03.2014
Сообщений: 110
Записей в блоге: 2
17.05.2014, 10:26 2
Вы должны возвращать указатель на матрицу, состоящую из двух матриц.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// функция формирования матриц из четных и нечетных строк
int ***Translation(int **matrix, size_t row, size_t col) {
 
    // выделение памяти под не под указатель на двухэлементный массив указателей на
    // результирующие матрицы, а выделение памяти под двухэлементный массив
    // указателей на результирующие матрицы
 
    int*** restrict Result;
    Result = (int ***) malloc(2 * sizeof(int*));
    if (Result == NULL)
        return NULL;
 
    // ...
}
1
1 / 1 / 1
Регистрация: 15.09.2013
Сообщений: 17
17.05.2014, 23:40  [ТС] 3
Да тут 2 ошибки, еще вчера нашел: 1 - неверно передается двумерный массив и 2 - не то выдаю
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.05.2014, 23:40
Помогаю со студенческими работами здесь

Передача указателя на динамический массив строк в функцию
Доброе утро! Динамически выделяю память под массив строк. char **f = (char**)malloc(LEN *...

Разбить строку на массив строк
Доброго времени суток всем кто обратил внимание на данную тему. Помогите пожалуйста. Есть строка:...

Разбить строку на массив строк
Как реализовать задачу: дана строка, необходимо ее разбить на слова по разделителю

Разбить строку на массив строк (с сохранением разделителя)
Можно ли при помощи Split(' ') разбить строку &quot;Hello, world!&quot; в результативный массив при этом не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru