Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
FantazerMasha
0 / 0 / 0
Регистрация: 05.06.2016
Сообщений: 64
1

Удалить из квадратной матрицы главную диагональ, при этом элементы верхнего треугольника сместить влево

19.06.2016, 09:54. Просмотров 259. Ответов 13
Метки нет (Все метки)

void removeDiagT (Matrix *a);
Удаляет из квадратной матрицы a главную диагональ, при этом элементы верхнего треугольника смещаются влево.

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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <stdio.h>
#include <stdlib.h>
 
void* myrealloc(void *ptr, size_t size);
void* mymalloc(size_t size);
 
typedef struct Matrix {
int *data;
int m, n;
} Matrix;
 
Matrix* newMatrix(int m, int n);
Matrix* copyMatrix(const Matrix *matrix);
void destroyMatrix(Matrix *matrix);
void removeDiagT(Matrix *a);
void printMatrix(const Matrix *matrix);
int main() {
printf("Введите размер матрицы:\n");
printf("n = ");
int n;
if (scanf("%d", &n) != 1) {
printf("Ошибка ввода");
exit(EXIT_FAILURE);
}
 
printf("m = ");
int m;
if (scanf("%d", &m) != 1) {
printf("Ошибка ввода");
exit(EXIT_FAILURE);
}
 
printf("Введите элементы матрицы:\n");
Matrix * matrix = newMatrix(n, m);
for (int i = 0; i < (matrix -> m * matrix -> n); i++) {
if (scanf("%d", &matrix -> data[i]) != 1) {
printf("Ошибка ввода");
exit(EXIT_FAILURE);
}
}
printMatrix(matrix);
printf("\n");
removeDiagT(matrix);
printMatrix(matrix);
printf("\n");
destroyMatrix(matrix);
system("pause");
return 0;
}
 
void removeDiagT(Matrix *a) {
if (a -> m != a -> n) {
printf("Ошибка ввода");
exit(EXIT_FAILURE);
}
 
Matrix * temp = newMatrix(a -> m, a -> n-1);
int index = 0; 
for (int i = 0; i < a -> m; i++) {
for (int j = 0; j < a -> n; j++) {
if (i != j) {
temp -> data[index] = a -> data[i * a -> m + j];
int b = a -> data[i * a -> m + j];
++index;
}
}
}
myrealloc(a -> data, sizeof(int)*a -> m * (a -> n - 1));
a -> n = a -> n - 1;
index = 0;
for (int i = 0; i < a -> n; i++) {
for (int j = 0; j < a -> n; j++) {
a -> data[i * a -> n + j] = temp -> data[index];
int a = temp -> data[index];
++index;
}
}
destroyMatrix(temp);
}
 
void *mymalloc(size_t size) {
void *result = malloc(size);
if (result == NULL) {
fprintf(stderr, "mymalloc: не удалось выделить %zd байт\n", size);
exit(EXIT_FAILURE);
 
}
return result;
}
 
void* myrealloc(void *ptr, size_t size) {
void *res = realloc(ptr, size);
if (res == NULL && size != 0) {
fprintf(stderr, "myrealloc: не удалось выделить %zd байт\n", size);
exit(EXIT_FAILURE);
}
return res;
}
 
Matrix* newMatrix(int m, int n) {
Matrix * new_matrix = (Matrix *)mymalloc(sizeof(Matrix));
new_matrix -> m = m;
new_matrix -> n = n;
new_matrix -> data = (int *)mymalloc(n*m*sizeof(int));
return new_matrix;
}
 
Matrix* copyMatrix(const Matrix *matrix) {
Matrix* copy = newMatrix(matrix -> m, matrix -> n);
for (int i = 0; i < matrix -> m * matrix -> n; i++) {
copy -> data[i] = matrix -> data[i];
}
return copy;
}
 
void destroyMatrix(Matrix *matrix) {
free[] matrix -> data;
free matrix;
}
 
void printMatrix(const Matrix *matrix) {
int m = matrix -> m, n = matrix -> n;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
printf("%d", matrix -> data[i * n + j]);
}
printf("\n");
}
}

Пример. Исходная матрица:
1 2 3
4 5 6
7 8 9
Вызов:
2 3
4 6
7 8

Не работает. Что не так с free?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.06.2016, 09:54
Ответы с готовыми решениями:

Найти наименьшие элементы каждой строки квадратной матрицы и поместить их на главную диагональ
где ошибка ? нужно найти малейшие элементы каждой строки квадратной матрицы и поместить их на...

Удалить элемент k и сместить правые от него элементы влево
Дан массив из n элементов и индекс элемента в списке k. Удалите из списка элемент с индексом k,...

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

Создать функцию нахождения минимального элемента квадратной матрицы и сортировать её главную диагональ.
Как задается квадратная матрица и как сделать сортировку?

Найти сумму чисел нижнего треугольника матрицы, включая главную диагональ
Дана матрица A(n,n). Найти сумму чисел нижнего треугольника, включая главную диагональ,...

13
Геомеханик
798 / 602 / 939
Регистрация: 26.06.2015
Сообщений: 1,409
20.06.2016, 00:52 2
Цитата Сообщение от FantazerMasha Посмотреть сообщение
Удаляет из квадратной матрицы a главную диагональ, при этом элементы верхнего треугольника смещаются влево.
Вот пример написал на фиксированном массиве.
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
#include <stdio.h>
 
int main(void){
    int i, j, p, k, n = 3, m = 3;
    int mat[] = {
        1, 2, 3,
        4, 5, 6,
        7, 8, 9
    };
 
    k = n*m;
    for(p = i = j = 0; i < k; ++i){
        if(i != p)
            mat[j++] = mat[i];
        else
            p += m + 1;
    }
    --m;
 
    //j-будет содержать новый размер массива
    printf("new size array: %d\n", j);
 
    for(i = 0; i < n; ++i){
        for(j = 0; j < m; ++j)
            printf("%d ", mat[i*m + j]);
        putchar('\n');
    }
    return 0;
}
0
FantazerMasha
0 / 0 / 0
Регистрация: 05.06.2016
Сообщений: 64
20.06.2016, 05:29  [ТС] 3
Геомеханик
Ваш пример до боли примитивен и ясен. В данном случае мне нужно написать функцию "void removeDiagT (Matrix *a)", которая будет выполнять данное задание.
0
HighPredator
5693 / 2014 / 723
Регистрация: 10.12.2010
Сообщений: 5,787
Записей в блоге: 3
20.06.2016, 08:59 4
Цитата Сообщение от FantazerMasha Посмотреть сообщение
Ваш пример до боли примитивен и ясен. В данном случае мне нужно написать функцию "void removeDiagT (Matrix *a)", которая будет выполнять данное задание.
Вопрос в чем?
0
FantazerMasha
0 / 0 / 0
Регистрация: 05.06.2016
Сообщений: 64
20.06.2016, 09:02  [ТС] 5
Цитата Сообщение от HighPredator Посмотреть сообщение
Вопрос в чем?
Моя программа не компилируется, и я не могу понять причину этого недуга.
0
HighPredator
5693 / 2014 / 723
Регистрация: 10.12.2010
Сообщений: 5,787
Записей в блоге: 3
20.06.2016, 10:39 6
Цитата Сообщение от FantazerMasha Посмотреть сообщение
Моя программа не компилируется
Возьмите за правило подкреплять такие утверждения текстом ошибки компилятора. Иначе мы тоже причину не поймем.
0
FantazerMasha
0 / 0 / 0
Регистрация: 05.06.2016
Сообщений: 64
20.06.2016, 10:46  [ТС] 7
Я вас понял, за правило взял. Скриншот прикладываю.
0
Миниатюры
Удалить из квадратной матрицы главную диагональ, при этом элементы верхнего треугольника сместить влево  
HighPredator
5693 / 2014 / 723
Регистрация: 10.12.2010
Сообщений: 5,787
Записей в блоге: 3
20.06.2016, 11:14 8
Вы неправильно освобождаете память. Почитайте как это делается. http://www.cplusplus.com/reference/cstdlib/free/ Вот тут пример есть.
0
FantazerMasha
0 / 0 / 0
Регистрация: 05.06.2016
Сообщений: 64
20.06.2016, 11:46  [ТС] 9
Цитата Сообщение от HighPredator Посмотреть сообщение
Вы неправильно освобождаете память. Почитайте как это делается. http://www.cplusplus.com/reference/cstdlib/free/ Вот тут пример есть.
теперь вот такая проблема, что не так? ничего не происходит
0
Миниатюры
Удалить из квадратной матрицы главную диагональ, при этом элементы верхнего треугольника сместить влево  
HighPredator
5693 / 2014 / 723
Регистрация: 10.12.2010
Сообщений: 5,787
Записей в блоге: 3
20.06.2016, 11:50 10
Обновленный код в студию.
0
FantazerMasha
0 / 0 / 0
Регистрация: 05.06.2016
Сообщений: 64
20.06.2016, 11:51  [ТС] 11
Цитата Сообщение от HighPredator Посмотреть сообщение
Обновленный код в студию.
На сколько я понял, всё просто. Что не так?
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
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
void* mymalloc(size_t size) {
void *result = malloc(size);
if (result == NULL) {
fprintf(stderr, "mymalloc: не удалось выделить %zd байт\n", size);
exit(EXIT_FAILURE);
}
return result;
}
 
void* myrealloc(void *ptr, size_t size) {
void *res = realloc(ptr, size);
if (res == NULL && size != 0) {
fprintf(stderr, "myrealloc: не удалось выделить %zd байт\n", size);
exit(EXIT_FAILURE);
}
return res;
}
 
typedef struct Array {
int *data;
int n;
} Array;
 
Array* newArray(int n);
Array* copyArray(const Array *array);
void destroyArray(Array *array);
void slice(Array* array, int first, int n);
 
int main(void) {
Array * array = newArray(5);
for (int i = 0; i < array->n; i++) {
scanf("%d", &(array->data[i]));
}
 
slice(array, 1, 3);
for (int i = 0; i < array->n; i++)
{
printf("%d", array->data[i]);
}
printf("\n");
destroyArray(array);
system("pause");
return 0;
}
 
Array* newArray(int n) {
Array* new_array = (Array*)mymalloc(sizeof(Array));
new_array->n = n;
new_array->data = (int*)mymalloc(n * sizeof(int));
return new_array;
}
 
Array* copyArray(const Array *array) {
Array* new_array = (Array*)mymalloc(sizeof(Array));
new_array->n = array->n;
new_array->data = (int*)mymalloc(array->n * sizeof(int));
for (int i = 0; i < array->n; i++) {
new_array->data[i] = array->data[i];
}
return new_array;
}
 
void destroyArray(Array *array) {
free(array->data);
free(array);
}
 
void slice(Array* array, int first, int n) {
if ((first + n) > array-> n) {
printf("Ошибка ввода");
exit(EXIT_FAILURE);
}
 
Array * temp = newArray(n);
for (int i = 0; i < n; i++) {
temp->data[i] = array->data[i + first];
}
 
myrealloc(array->data, n);
for (int i = 0; i < n; i++) {
array->data[i] = temp->data[i];
}
array->n = n;
 
destroyArray(temp);
}
0
HighPredator
5693 / 2014 / 723
Регистрация: 10.12.2010
Сообщений: 5,787
Записей в блоге: 3
20.06.2016, 12:09 12
Цитата Сообщение от FantazerMasha Посмотреть сообщение
ничего не происходит
А вы ничего и не вводите.
C
1
2
3
4
5
int main(void) {
Array * array = newArray(5);
for (int i = 0; i < array->n; i++) {
scanf("%d", &(array->data[i])); /* <-- Here */
}
0
FantazerMasha
0 / 0 / 0
Регистрация: 05.06.2016
Сообщений: 64
20.06.2016, 12:31  [ТС] 13
Извиняюсь, я перепутал код.
Вот такая ошибка осталась.
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
п»ї#include <stdio.h>
#include <stdlib.h>
 
void* myrealloc(void *ptr, size_t size);
void* mymalloc(size_t size);
 
typedef struct Matrix {
int *data;
int m, n;
} Matrix;
 
Matrix* newMatrix(int m, int n);
Matrix* copyMatrix(const Matrix *matrix);
void destroyMatrix(Matrix *matrix);
void removeDiagT(Matrix *a);
void printMatrix(const Matrix *matrix);
int main() {
printf("Введите размер матрицы:\n");
printf("n = ");
int n;
if (scanf("%d", &n) != 1) {
printf("Ошибка ввода");
exit(EXIT_FAILURE);
}
 
printf("m = ");
int m;
if (scanf("%d", &m) != 1) {
printf("Ошибка ввода");
exit(EXIT_FAILURE);
}
 
printf("Введите элементы матрицы:\n");
Matrix * matrix = newMatrix(n, m);
for (int i = 0; i < (matrix -> m * matrix -> n); i++) {
if (scanf("%d", &matrix -> data[i]) != 1) {
printf("Ошибка ввода");
exit(EXIT_FAILURE);
}
}
printMatrix(matrix);
printf("\n");
removeDiagT(matrix);
printMatrix(matrix);
printf("\n");
destroyMatrix(matrix);
system("pause");
return 0;
}
 
void removeDiagT(Matrix *a) {
if (a -> m != a -> n) {
printf("Ошибка ввода");
exit(EXIT_FAILURE);
}
 
Matrix * temp = newMatrix(a -> m, a -> n-1);
int index = 0; 
for (int i = 0; i < a -> m; i++) {
for (int j = 0; j < a -> n; j++) {
if (i != j) {
temp -> data[index] = a -> data[i * a -> m + j];
int b = a -> data[i * a -> m + j];
++index;
}
}
}
myrealloc(a -> data, sizeof(int)*a -> m * (a -> n - 1));
a -> n = a -> n - 1;
index = 0;
for (int i = 0; i < a -> n; i++) {
for (int j = 0; j < a -> n; j++) {
a -> data[i * a -> n + j] = temp -> data[index];
int a = temp -> data[index];
++index;
}
}
destroyMatrix(temp);
}
 
void *mymalloc(size_t size) {
void *result = malloc(size);
if (result == NULL) {
fprintf(stderr, "mymalloc: не удалось выделить %zd байт\n", size);
exit(EXIT_FAILURE);
 
}
return result;
}
 
void* myrealloc(void *ptr, size_t size) {
void *res = realloc(ptr, size);
if (res == NULL && size != 0) {
fprintf(stderr, "myrealloc: не удалось выделить %zd байт\n", size);
exit(EXIT_FAILURE);
}
return res;
}
 
Matrix* newMatrix(int m, int n) {
Matrix * new_matrix = (Matrix *)mymalloc(sizeof(Matrix));
new_matrix -> m = m;
new_matrix -> n = n;
new_matrix -> data = (int *)mymalloc(n*m*sizeof(int));
return new_matrix;
}
 
Matrix* copyMatrix(const Matrix *matrix) {
Matrix* copy = newMatrix(matrix -> m, matrix -> n);
for (int i = 0; i < matrix -> m * matrix -> n; i++) {
copy -> data[i] = matrix -> data[i];
}
return copy;
}
 
void destroyMatrix(Matrix *matrix) {
free(matrix -> data);
free(matrix);
}
 
void printMatrix(const Matrix *matrix) {
int m = matrix -> m, n = matrix -> n;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
printf("%d", matrix -> data[i * n + j]);
}
printf("\n");
}
}
0
Миниатюры
Удалить из квадратной матрицы главную диагональ, при этом элементы верхнего треугольника сместить влево  
HighPredator
5693 / 2014 / 723
Регистрация: 10.12.2010
Сообщений: 5,787
Записей в блоге: 3
20.06.2016, 13:43 14
Это предупреждения о неиспользованных переменных.
0
20.06.2016, 13:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.06.2016, 13:43

Найти сумму элементов верхнего правого треугольника квадратной матрицы
Пользователь вводит с клавиатуры размерность и элементы. Найти сумму элементов верхнего правого...

Найти количество элементов верхнего правого треугольника квадратной матрицы порядка n
Найти количество элементов верхнего правого треугольника квадратной матрицы порядка n. Без понятия...

Функции (Составьте программу, обнуляющую главную диагональ квадратной матрицы, если в ней найдется хотя бы один отрицательный элемент)
Дан двумерный массив А(M, M) в виде квадратной матрицы. Составьте программу, обнуляющую главную...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru