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

Представление в памяти массивов и матриц - C++

Восстановить пароль Регистрация
 
MEHTAJlUCT
Сообщений: n/a
22.09.2011, 22:44     Представление в памяти массивов и матриц #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
[QUOTE]
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 );// Уничтожение матрицы 
 
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 *)new int(SIZE*sizeof(int)))==NULL)
      return L2_RESULT=1;
   else
      return L2_RESULT=0;
// Возвращает 0, если выделение прошло успешно, иначе -1 
}
 
//      Уничтожение матрицы (освобождение памяти)            
int close_matr(void) {
   if ( m_addr=NULL ) {
      delete(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)];
   
}
 
 
//      Запись элемента матрицы по заданным координатам      
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-мерних координат в линейную       
                        
static int lin(int x, int y) {
   int n;
    n=NN-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;
}
 
 
void main(){
  setlocale (LC_ALL, "Russian");
 int R;    // размерность 
 int i, j; // номера строки и столбца 
 int m=0;  // значения элемента 
 int op;   // операция 
  printf("Если число столбцов нечетное, тогда 0 будет на 1 строку больше!\n");
  printf("Введите размерность матрицы >"); 
  scanf("%d",&R);
  // создание матрицы 
  if ( creat_matr (R) ) {
     printf("Ошибка создания матрицы\n");
     exit(0);
     }
  // заполнение матрицы 
   
  for ( m=j=0; j<R; j++)
  for ( i=0; i<R; i++)
 
           write_matr(i,j,++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",&i);
          printf("Введите номер столбца >");
          scanf("%d",&j);
          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;
        }
      }
}
[/QUOTE]
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.09.2011, 22:44     Представление в памяти массивов и матриц
Посмотрите здесь:

Представление в памяти массивов и матриц C++
C++ Представление в памяти компьютера типа double
C++ Представление в памяти массивов и матриц
Представление в памяти массивов и матриц C++
Представление класса в памяти C++
C++ Представление памяти, указатели
C++ Представление чисел в памяти!
C++ Внутреннее представление числа в памяти
C++ Исправить n. Представление матриц векторами
C++ Представление и структура указателя в памяти
C++ Представление в памяти массивов и матриц
C++ Задача по представлению в памяти массивов и матриц. Системное программирование

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

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

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