Форум программистов, компьютерный форум CyberForum.ru

Перевод матрицы в одномерный массив, динамическое выделение памяти для матрицы - C++

Восстановить пароль Регистрация
 
Plazma
5 / 5 / 0
Регистрация: 20.11.2010
Сообщений: 51
17.09.2012, 20:40     Перевод матрицы в одномерный массив, динамическое выделение памяти для матрицы #1
Здравствуйте.
Никак не могу разобраться с этой программой. Вот код:
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
/********************** Файл LAB2.H   *************************/
/*     Описание функций и внешних переменных файла LAB2.C     */
extern int L2_RESULT;   /* Глобальна переменна - флаг ошибки */
/***** Выделение памяти под матрицу */
int creat_matr ( int N );
/***** Чтение элемента матрицы по заданным координатам */
int read_matr ( int x, int y );
/***** Запись элемент в матрицу по заданным координатам */
int write_matr ( int x, int y, int value );
/***** Уничтожение матрицы */
int close_matr ( void );
/***************** Конец файла LAB2.H   *************************/
 
/********************** Файл main.c   *************************/
#include "lab2.h"
#include <stdlib.h>
#include <locale.h>
#include <stdio.h>
#include <conio.h>
int main(){
    int R; /* размерность */
    int i, j; /* номера строки и столбца */
    int m; /* значения элемента */
    int op; /* операция */
 
    setlocale(LC_ALL,"Russian");
    printf("Введите размерность матрицы >");
    scanf("%d",&R);
    /* создание матрицы */
    if ( creat_matr (R) ) {
        printf("Ошибка создания матрицы\n");
        exit(0);
    }
 
    /* заполнение матрицы */
    for ( m=j=0; j<R; j++){
        for ( i=0; i<=j; i++){
            write_matr(j,i,++m);
        }
    }
    while(1) {
        /* вывод матрицы на экран */
        for (j=0; j<R; j++) {
            for (i=0; i<R; i++)
                printf("%3d ",read_matr(j,i));
                printf("\n");
    }
    printf("0 - выход\n1 - чтение\n2 - запись\n>");
    scanf("%d",&op);
    switch(op) {
        case 0:
            if (close_matr()) 
                printf("Ошибка при уничтожении\n");
            else 
                printf("Матрица уничтожена\n");
            exit(0);
        case 1: case 2:
            printf("Введите номер строки >");
            scanf("%d",&j);
            printf("Введите номер столбца >");
            scanf("%d",&i);
 
            if (op==2) {
                printf("Введите значение элемента >");
                scanf("%d",&m);
                write_matr(j,i,m);
                if (L2_RESULT<0) 
                    printf("Ошибка записи\n");
            }
            else {
                m=read_matr(j,i);
                if (L2_RESULT<0) 
                    printf("Ошибка считывания\n");
                else 
                    printf("Считано: %d\n",m);
            }
            printf("Нажмите клавишу\n"); 
            getch();
            break;
        }
    }
    return 0;
}
/********************** Конец файла main.c   *************************/
 
/********************** Файл lab2.c   *************************/
/*lab2.c*/
#include <stdlib.h>
static int NN;
static int SIZE;
static int *m_addr=NULL;
static int lin(int, int);
static char ch_coord(int, int);
int L2_RESULT;
 
/* Выделение памяти под сжатую матрицу */
int creat_matr ( int N ) {
    /* N - размер матрицы */
    NN=N;
    SIZE=N*(N-1)/2+N;
    if ((m_addr=(int *)malloc(SIZE*sizeof(int))) == NULL )
    return L2_RESULT=-1;
    else{
        printf("%d  ",(m_addr=(int *)malloc(SIZE*sizeof(int))));
        return L2_RESULT=0;}
    /* Возвращает 0, если выделение прошло успешно, иначе -1 */
}
 
/* Уничтожение матрицы (освобождение памяти) */
int close_matr(void) {
    if ( m_addr!=NULL ) {
        free(m_addr);
        m_addr=NULL;
        return L2_RESULT=0;
    }
    else return L2_RESULT=-1;
    /* Возвращает 0, если освобождение пршло успешно, иначе - -1 */
}
/*********************************** ************************/
/* Чтение элемента матрицы по заданным координатам */
int read_matr(int x, int y) {
/* x, y -координати (строка, столбец) */
if ( ch_coord(x,y) ) return 0;
/* Если координаты попадают в нулевой участок - возвращается
0, иначе - применяется функция линеаризации */
return (x < y) ? 0 : m_addr[lin(x,y)];
/* Проверка успешности чтения - по переменной
L2_RESULT: 0 - без ошибок, -1 - была ошибка */
}
 
/*********************************** **************************/
/* Запись элемента матрицы по заданным координатам */
int write_matr(int x, int y, int value) {
/* x, y -координати, value - записываемое значение */
if ( ch_coord(x,y) ) 
    return 0;
/* Если координаты попадают в нулевой участок - записи нет,
иначе - применяется функция линеаризации */
if ( x < y ) 
    return 0;
else {
    return m_addr[lin(x,y)]=value;}
/* Проверка успешности записи - по L2_RESULT */
}
 
/*********************************** *************************/
/* Преобразование 2-мерних координат в линейную */
/* (вариант 3) */
static int lin(int x, int y) {
    int n;
   n=NN-x;
    //printf("%d/n",SIZE-n*(n-1)/2-n+y-x);
   return SIZE-n*(n-1)/2-n+y-x;
}
 
/*********************************** ****************************/
/* Проверка корректности обращения */
static char ch_coord(int x, int y) {
    if ( ( m_addr==NULL ) ||
    ( x>=SIZE ) || ( y>=SIZE ) || ( x<0 ) || ( y<0 ) )
    /* Если матрица не размещена в памяти, или заданные
    координаты выходят за пределы матрицы */
    return L2_RESULT=-1;
    return L2_RESULT=0;
}
Описание задачи здесь

Объясните пожалуйста как все происходит здесь в функциях static int lin(int x, int y) и int creat_matr ( int N). Мне главное понять что к чему.

Добавлено через 44 минуты
Ссылка обновленная
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.09.2012, 20:40     Перевод матрицы в одномерный массив, динамическое выделение памяти для матрицы
Посмотрите здесь:

C++ динамическое выделение памяти для массива.
C++ Динамическое выделение памяти под двумерный массив
C++ Выделение динамической памяти для матрицы
Динамическое выделение памяти под двумерный массив C++
C++ выделение динамической памяти для матрицы
C++ Статический массив - динамическое выделение памяти!?
Динамическое выделение памяти под массив C++
Динамическое выделение памяти под двумерный массив C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 01:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru