Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
5 / 5 / 0
Регистрация: 20.11.2010
Сообщений: 51

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

17.09.2012, 20:40. Показов 1117. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Никак не могу разобраться с этой программой. Вот код:
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 минуты
Ссылка обновленная
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.09.2012, 20:40
Ответы с готовыми решениями:

Динамическое выделение памяти для матрицы
Программа выглядит так. #include &lt;stdio.h&gt; #include &lt;conio.h&gt; typedef int *pInt; int main() { int N, M, i, j; pInt *A; ...

Динамическое выделение памяти под одномерный массив
В общем, вопрос такой. Пусть нам нужно задать массив, используя динамическое выделение памяти. Как это сделать? Расскажу свой ход...

Для заданной квадратной матрицы сформировать одномерный массив из ее диагональных элементов. Найти след матрицы
Препод задал такую задачу, но так как я не силен в C#, то у меня есть решение на Паскале, может кто-нибудь поможет. Код приложу ниже,...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.09.2012, 20:40
Помогаю со студенческими работами здесь

Перевод положительных чисел матрицы в одномерный массив
вроде должно быть так но не работает For i = 1 To n For j = 1 To m If mas(i, j) &gt; 0 Then ...

Выделение динамической памяти для матрицы
Здравствуйте! Подскажите, пожалуйста, что делаю не так..написала программу, которая считывает двумерный массив...с помощью операторов...

Указатели, выделение памяти для матрицы
Ребята , nомогите nожалуйста , что означают эти заnиси, nросто не могу ни где найти обьяснения. Знаю что 1-е это выделяет nамять для...

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

Динамическое распределение памяти для хранения матрицы
Привет, друзья! Вот задача: Сформировать целочисленную прямоугольную матрицу A(m,n) следующего вида 1 2 ....n 1 2 ....n ..............


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru