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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Динамический массив http://www.cyberforum.ru/cpp-beginners/thread653490.html
Распечатать элементы динамического массива mas в одномерный динамический a. 1 по правым диагоналям, начиная с правого верхнего элемента 2 по спирали, начиная с центрального элемента Массив забила элементами, а с алгоритмом не могу разобраться( #include "stdafx.h" #include <stdio.h> #include <conio.h> #include <time.h>
C++ Объясните как работает _getch() со стрелками Я недавно начал учить С++ и я совершенно не понимаю как эта функция работает со стрелками. Например код вида char ch; ch=_getch(); cout<<ch; _getch(); Сразу же закроется при первом нажатии стрелки, но с другими кнопками клавиатуры всё нормально. Ещё, эта функция при таком коде char ch; http://www.cyberforum.ru/cpp-beginners/thread653437.html
Спецификаторы доступа и виртуальные функции C++
Сейчас почитал про виртуальные функции. Интересно конечно, но ответа на мою ситуацию я так и не нашел #include <iostream> #include <string> using namespace std; class A {
не ожидал такого от strlen C++
#include <iostream> #include <string> #include <fstream> #include <string.h> using namespace std; const int MAX = 256; int main()
C++ Копирование область памяти http://www.cyberforum.ru/cpp-beginners/thread653420.html
Здравствуйте, у меня не получается прочитать/скопировать память в переменную. Я делаю .dll, так вот записать значения в адрес я смог, а вот прочитать значения из памяти не могу. Это запись в адрес значения: memcpy((void*)0x8CD4D6, "\x00\x00\x00\x00", 4); мои попытки прочить в переменную не удавались: DWORD WeaponPlayer; memmove((void*)0x8CD4D6,&WeaponPlayer,4);
C++ Добавить в однонаправленный список элемент после элемента с заданным информационным полем Здравствуйте, помогите пожалуйста, с задачей. 1.Тип информационного поля char*. Добавить в однонаправленный список элемент после элемента с заданным информационным полем. 2.Тип информационного поля int. Удалить из двунаправленного списка все элементы с четными информационными полями. подробнее

Показать сообщение отдельно
Plazma
5 / 5 / 0
Регистрация: 20.11.2010
Сообщений: 51
17.09.2012, 20:40     Перевод матрицы в одномерный массив, динамическое выделение памяти для матрицы
Здравствуйте.
Никак не могу разобраться с этой программой. Вот код:
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 минуты
Ссылка обновленная
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 23:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru