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

Помогите с задачками по Многомерные динамические массивы - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Как правильно воспользоваться шаблоном http://www.cyberforum.ru/cpp-beginners/thread383384.html
Начал изучать C++ Вот есть два файла 1) #include "stdafx.h" #include <iostream>
C++ дебаг Как дебажить написаный код? Спасибо компилятору хоть тыкает носом на очевидные ошибки, но когда код компилируется и сразу после запуска программа вылетает, что делать в таком случае? Как узнать по какой причине она вылетает? Использую code blocks с minGW, там вроде и дебагер какойто есть но не могу понять как им пользоватся. http://www.cyberforum.ru/cpp-beginners/thread383381.html
Вызов функции динамического выделение памяти C++
Здравствуйте! Нужна помощь! Написал функцию выделение памяти под двумерный динамический массив, которая возвращает масив размером n на m! int Matrix(int **matr, int n, int m) { int **mass = new int *;
C++ спасите нубку. установка quick C
Надо поставить microsoft quick c, вроде установила, вроде работает, НО выдает ошибку в первой строчке. т.е. не может открыть библиотеку stdio.h пыталась заменить, все тоже. кто-нибудь киньте рабочую библиотеку, или подскажите что делать. мб дело в том, что у меня винда 7ка? короче help мне кучу программ надо сдавать)
C++ double rand() http://www.cyberforum.ru/cpp-beginners/thread383355.html
как записать случайное double число? точнее как в диапазоне записать, например от -100.0 до 100.0??
C++ vector<int>* v; обращение к конкретному элементу vector<int> *v; v = new vector<int>(); v->push_back(6); v->push_back(6); v->push_back(6); v->push_back(6); v->push_back(6); int t=v; // компилятор ругается подробнее

Показать сообщение отдельно
Nursik77
273 / 233 / 21
Регистрация: 05.04.2011
Сообщений: 645
15.11.2011, 12:01     Помогите с задачками по Многомерные динамические массивы
Цитата Сообщение от FRATER1234 Посмотреть сообщение
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
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
#include <iostream> 
#include <clocale> 
#include <conio.h> 
#include <time.h> 
using namespace std; 
 
template <typename type>void Create_Array (type ***pArr, const int m, const int n); 
 
template <typename type>void Fill_Array (type **pArr, const int m, const int n); 
 
template <typename type>void Add_Line (type **Destination, type **Source, const int m, const int n, const int b); 
 
template <typename type>void Add_Field (type **Destination, type **Source, const int m, const int n, const int b); 
 
template <typename type>void Print_Array (type **pArr, const int m, const int n); 
 
template <typename type>void Delete_Array (type **pArr, const int m, const int n); 
void Menu (int &a, int &b, int &m, int &n, const int select = 0); 
 
void main() 
{ 
    setlocale (LC_CTYPE, "Russian"); 
    srand (time (NULL)); 
    cout << "Добавление строки или столбца в матрицу.\n"; 
 
    char Exit = 'y'; 
    while (Exit == 'y' || Exit == 'Y') 
    { 
        int m = 0, n = 0, a = 0, b = 0; 
        char **pArr, **pAdd; 
 
        Menu (a, b, m, n, 1); 
 
            //pArr = new char *[m]; 
            Create_Array (&pArr, m, n); 
            Fill_Array (&*pArr, m, n); 
            Print_Array (&*pArr, m, n); 
 
        Menu (a, b, m, n, 2); 
 
            //pAdd = new char *[m]; 
            Create_Array (&pAdd, m, n); 
            a == 1? Add_Line (&*pAdd, &*pArr, m, n, b): Add_Field (&*pAdd, &*pArr, m, 
n, b); 
            Print_Array (&*pAdd, m, n); 
 
        Delete_Array (&*pAdd, m, n); 
        a == 1? Delete_Array (&*pArr, m-1, n): Delete_Array (&*pArr, m, n-1); 
 
        cout << "\n\n\t\tTo continue press \"Y\".\n\t\tFor exit press any key.\t"; 
        Exit = getch(); cout << "\n"; 
    } 
} 
/*    Создание двумерного массива. 
    Принимает указатель на указатель массивов, размеры матрицы. */ 
 
template <typename type> 
void Create_Array (type ***pArr, const int m, const int n) 
{ 
    *pArr = new type *[m]; 
 
    for (int i = 0; i < m; ++i) 
    { 
        (*pArr)[i] = new type [n]; 
    } 
} 
/*    Заполнение массива значениями. 
    Принимает указатель на указатель массивов, размеры матрицы. */ 
 
template <typename type> 
void Fill_Array (type **pArr, const int m, const int n) 
{ 
    for (int i = 0; i < m; ++i) 
    { 
        for (int j = 0; j < n; ++j) 
        { 
            pArr [i][j] = rand() % 28 + 97; 
        } 
    } 
} 
/*    Добавление строки. 
    Принимает указатель на указатель массивов для исходного и целевого массивов,  
    размеры матрицы, номер строки. */ 
 
template <typename type> 
void Add_Line (type **Destination, type **Source, const int m, const int n, const int b) 
{ 
    int k = 0; 
 
    for (int i = 0; i < m; ++i) 
    { 
        if (i + 1 == b) 
        { 
            for (int j = 0; j < n; ++j) 
            { 
                Destination [i][j] = 0; 
            } 
            ++i; 
        } 
 
        for (int j = 0; j < n; ++j) 
        { 
            Destination [i][j] = Source [k][j]; 
        } 
        ++k; 
    } 
} 
/*    Добавление столбца. 
    Принимает указатель на указатель массивов для исходного и целевого массивов,  
    размеры матрицы, номер поля. */ 
 
template <typename type> 
void Add_Field (type **Destination, type **Source, const int m, const int n, const int b) 
{ 
    int k = 0; 
    for (int i = 0; i < m; ++i) 
    { 
        k = 0; 
        for (int j = 0; j < n; ++j) 
        { 
            if (j + 1 == b) 
            { 
                Destination [i][j] = 0; 
            } 
            else 
            { 
                Destination [i][j] = Source [i][k]; 
                ++k; 
            } 
        } 
    } 
} 
/*    Выводит двумерный массив на экран. 
    Принимает указатель на указатель массивов, размеры матрицы. */ 
 
template <typename type> 
void Print_Array (type **pArr, const int m, const int n) 
{ 
    cout << "\n\n\t"; 
    int k = 192; 
    for (int i = 0; i < n; ++i, ++k) 
    { 
        cout << (char) k << "  "; 
    } 
 
    cout << "\n\t"; 
    k = 1; 
    for (int i = 0; i < m; ++i, ++k) 
    { 
        cout << "\n\n   " << k << ".\t"; 
        for (int j = 0; j < n; ++j) 
        { 
            cout << pArr [i][j] << "  "; 
        } 
    } 
} 
/*    Удаляет массив. 
    Принимает указатель на указатель массивов, размеры матрицы. */ 
 
template <typename type> 
void Delete_Array (type **pArr, const int m, const int n) 
{ 
    for (int i = 0; i < m; ++i) 
    { 
        delete [] pArr [i]; 
    } 
    delete [] pArr; 
} 
/*    Меню оператора. 
    Принимает ссылки на изменяемые переменные и аргумент для выбора меню. */ 
 
void Menu (int &a, int &b, int &m, int &n, const int select) 
{ 
    switch (select) 
    { 
    case 1: 
        { 
            cout << "\n\tКоличество строк:\t"; 
            cin >> m; 
            cout << "\tКоличество столбцов:\t"; 
            cin >> n; 
            return; 
        } 
    case 2: 
        { 
            cout << "\n\n\t1. Добавить строку.\n\t2. Добавить столбец.\t"; 
            cin >> a; 
 
            if (a == 1) 
            { 
                cout << "\n\tНомер строки:\t"; 
                while (b < 1 || b > m) 
                { 
                    cin >> b; 
                } 
                ++m; 
            } 
            else 
            { 
                cout << "\n\t2. Номер столбца:\t"; 
                while (b < 1 || b > n) 
                { 
                    cin >> b; 
                } 
                ++n; 
            } 
            return; 
        } 
    default: 
        { 
            cout << "Неправильный аргумент."; 
        } 
    } 
}

Еще какое-то решение:
нажми на меня!

Решение с использованием класса std::vector
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
#include <vector>
using std::vector;
 
#include <iostream>
#include <iomanip>
 
 
/////////********** Реализация
template <class T>
class matrix : virtual public vector<vector<T> >
{
public:
 matrix() 
  : vector()
 {}
 
 matrix(const matrix& MyT)
  :vector()
 {
  for (vector<T>::size_type i=0; i<MyT.size(); ++i)
   push_back(MyT[i]);
 }
   
 
 matrix(unsigned int M,unsigned int N)
  :vector(M)
 {
  for (unsigned int i=0; i<M; ++i)
   (*this)[i].resize(N);
 }
};
 
//вставка строки
template <class T> void
 ins_row(matrix<T>& m,const vector<T>& v, unsigned int pos)
{
 if ((m.size() == 0 && pos ==0) || (pos <= m.size() && m[0].size() == v.size()) )
 {
  m.insert(m.begin() + pos,v);
 }
}
 
//вставка столбца
template <class T> void
 ins_col(matrix<T>& m,const vector<T>& v,unsigned int pos)
{
 if ((m.size() == 0 && pos == 0) || (pos <= m[0].size() && v.size() == m.size()))
 {
  if (m.size() == 0) m.resize(v.size());
 
  for (vector<T>::size_type i=0; i<v.size(); ++i)
   m[i].insert(m[i].begin()+pos,v[i]);
 }
}
 
//циклический сдвиг вектора
template <class T> void
 shift(vector<T>& v,int count)
{
 int newpos,size = (int)v.size();  vector<T> newv(size);
 for (int i=0; i<size; ++i)
 {
  newpos = i+ (count% size);
  if (newpos<0) newpos+= size;
  else
   if (newpos >=size) newpos-=size;
 
  newv[newpos] = v[i];
 }
 
 v = newv;
}
 
//сдвиг матрицы вниз(вверх)
template <class T> void
 shift_down(matrix<T>& m,int count)
{
 shift(m,count);
}
 
//сдвиг матрицы вправо(влево)
template <class T> void
 shift_right(matrix<T>& m,int count)
{
 for (vector<T>::size_type i=0; i<m.size(); ++i)
  shift(m[i],count);
}
 
//вывод на экран
template <class T> void
 view(const matrix<T>& m)
{
 vector<T>::size_type i,j;
 for (i=0; i< m.size(); ++i)
 {
  for (j=0; j< m[i].size(); ++j)
   std::cout <<std::setw(6) << m[i][j];
  std::cout << std::endl;
 }
 std::cout << std::endl;
}
 
///////************ Демонстрация
#include <stdlib.h>
#include <time.h>
 
void main()
{
///1.вставка строк и столбцов
 matrix<double> m_double;
 
 double arrs[][3] = 
 {
  {1,2,3},
  {4,5,6},
  {7,8,9}, };
 
 ins_row(m_double,vector<double>(arrs[0],arrs[0]+3),0);
 ins_row(m_double,vector<double>(arrs[1],arrs[1]+3),1);
 ins_row(m_double,vector<double>(arrs[2],arrs[2]+3),2);
 view(m_double);
 
 ins_col(m_double,vector<double>(arrs[0],arrs[0]+3),3);
 ins_col(m_double,vector<double>(arrs[1],arrs[1]+3),4);
 view(m_double);
 
///2.Заполнение числами и сдвиг
 matrix<int> m_int(3,3); unsigned int i,j;
 
 srand((unsigned)time(0));
 for (i=0; i<3; ++i)
  for (j=0; j<3; ++j)
   m_int[i][j] = rand()%20;
 
 view(m_int);
 
 shift_down(m_int,1);
 view(m_int);
 
 shift_right(m_int,1);
 view(m_int);
 
 shift_down(m_int,-2);
 view(m_int);
 
 shift_right(m_int,-1);
 view(m_int);
}

Да и еще что-то есть!
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
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
//Задача 1
#include <iostream>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
using namespace std;
void line(int pos);
void column(int pos);
void main()
{
 int col=7, row=7, pos;
 char line;
 //Создаём матрицу
 int **matrix=new int*[col];
 for(int i=0;i<col;i++)
 {
  matrix[i]=new int[row];
 }
 srand((unsigned)time(NULL));
 //Заполняем матрицу случайными значениями
 for(int i=0; i<col; i++)
 {
  for(int j=0; j<row; j++)
  {
   matrix[i][j]=rand()%100;
   cout<<matrix[i][j]<<" ";
  }
  cout<<"
";
 }
 //Просим пользователя определить что вставлять и куда вставлять
 do
 {
  cout<<"Define a place of an insert : ";
  cin>>pos;
 }while((pos<0)||(pos>8));
 //Просим пользователя определиться с вставкой в столбец или в строку
 do
 {
  cout<<"Where to insert
";
  cout<<"line = l"<<" "<<"column = c
";
  cin>>line;
 }while((line!='l')&&(line!='c'));
 //В зависимости от произведённого выбора вызываем соответствующую функцию
 int N=col+1, x=pos-1, z=0, M=row+1, q, y=pos-1;
 switch(line)
 {
  case 'l':
   //Если нужно вставить линию
   {int **ins_line=new int*[N];
   for(int i=0; i<N; i++)
   {
    ins_line[i]=new int[row];
   }
   for(int j=0; j<N; j++)
   {
    for(int s=0; s<row; s++)
    {
     if(x!=j)
     {
       ins_line[j][s]=matrix[z][s];
      cout<<ins_line[j][s]<<" ";
     }
     else
     {
      ins_line[j][s]=-1;
      cout<<ins_line[j][s]<<" ";
     }
    }
    if(x!=j)
    {
     z++;
    }
    cout<<"
";
   }
   for(int i=0; i<N; i++)
   {
    delete[] ins_line[i];
   }
   delete[] ins_line;}
   break;
  case 'c':
   //Если пользователь выбрал столбец
   {int **rower=new int*[col];
   for(int i=0; i<col; i++)
   {
    rower[i]=new int[M];
   }
   for(int j=0; j<col; j++)
   {
    q=0;
    for(int s=0; s<M; s++)
    {
     if(y!=s)
     {
       rower[j][s]=matrix[j][q];
      q++;
      cout<<rower[j][s]<<" ";
     }
     else
     {
      rower[j][s]=-1;
      cout<<rower[j][s]<<" ";
     }
    }
    cout<<"
";
   }
   for(int i=0; i<col; i++)
   {
    delete[] rower[i];
   }
   delete[] rower;}
   break;
 }
 for(int a=0; a<col; a++)
 {
  delete[] matrix[a];
 }
 delete[] matrix;
 getch();
}
//Задача 2
#include <iostream>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
using namespace std;
void main()
{
 /*Дана матрица порядка M*N (M строк, N столбцов).Необходимо заполнить её значениями и 
написать функцию, осуществляющую циклический сдвиг строк и/или столбцов массива указанное
колличество раз и в указанную сторону*/
 int col, row, displacement, temp,lin, str;
 char line,column,direction;
 cout<<"Enter the size of a matrix : ";
 cin>>col;
 row=col;
 srand((unsigned)time(NULL));
 int **matrix=new int*[col];
 for(int i=0; i<col; i++)
 {
  matrix[i]=new int[row];
 }
 //Заполняем матрицу значениями
 for(int j=0; j<col; j++)
 {
  for(int a=0; a<row; a++)
  {
   matrix[j][a]=rand()%100;
   cout<<matrix[j][a]<<" ";
  }
  cout<<"
";
 }
 //Выбираем по чём будет происходить сдвиг
 do{
  cout<<"Choose after what to make shift
";
  cout<<"1-line
";
  cout<<"2-column
";
  cout<<"3-line and column
";
  cin>>displacement;
 }while((displacement!=1)&&(displacement!=2)&&(displacement!=3));
 switch(displacement)
 {
  case 1:
   {
      //определяем на сколько будет произведено смещение
      cout<<"Choose on how many to make displacement
";
      cin>>str;
      //Определяем направление смещения
      do{
      cout<<"We determine a direction of displacement
";
      cout<<"left - l "<<"right - r
";
      cin>>direction;
      }while((direction!='l')&&(direction!='r'));
      switch(direction)
      {
      case 'l':
       {
        for(int e=0; e<str; e++)
        {
         for(int j=0; j<col; j++)
         {
          for(int w=0; w<row-1; w++)
          {
           temp=matrix[j][w];
           matrix[j][w]=matrix[j][w+1];
           matrix[j][w+1]=temp;
          }
         }
        }
       }
       break;
      case 'r':
       {
        for(int i=0; i<str; i++)
        {
         for(int j=0; j<col; j++)
         {
          for(int w=row-1; w>0; w--)
          {
           temp=matrix[j][w];
           matrix[j][w]=matrix[j][w-1];
           matrix[j][w-1]=temp;
          }
         }
        }
       }
       break;
      }
     }
   break;
  case 2:
   {
    //определяем на сколько будет произведено смещение
      cout<<"Choose on how many to make displacement
";
      cin>>lin;
      //Определяем направление смещения
      do{
      cout<<"We determine a direction of displacement
";
      cout<<"top - t "<<"bottom - b
";
      cin>>direction;
      }while((direction!='t')&&(direction!='b'));
      switch(direction)
      {
      case 'b':
       {
        for(int i=0; i<lin; i++)
        {
         for(int j=0; j<row; j++)
         {
          for(int w=0; w<col-1; w++)
          {
           temp=matrix[w][j];
           matrix[w][j]=matrix[w+1][j];
           matrix[w+1][j]=temp;
          }
         }
        }
       }
       break;
      case 't':
       {
        for(int i=0; i<lin; i++)
        {
         for(int j=0; j<row; j++)
         {
          for(int w=col-1; w>0; w--)
          {
           temp=matrix[w][j];
           matrix[w][j]=matrix[w-1][j];
           matrix[w-1][j]=temp;
          }
         }
        }
       }
       break;
      }
   }
   break;
  case 3:
   {
    //определяем на сколько будет произведено смещение
      cout<<"Choose on how many to make displacement on lines
";
      cin>>str;
      //Определяем направление смещения
      do{
      cout<<"We determine a direction of displacement
";
      cout<<"left - l "<<"right - r
";
      cin>>direction;
      }while((direction!='l')&&(direction!='r'));
      switch(direction)
      {
      case 'l':
       {
        for(int i=0; i<str; i++)
        {
         for(int j=0; j<col; j++)
         {
          for(int w=0; w<row-1; w++)
          {
           temp=matrix[j][w];
           matrix[j][w]=matrix[j][w+1];
           matrix[j][w+1]=temp;
          }
         }
        }
       }
       break;
      case 'r':
       {
        for(int i=0; i<str; i++)
        {
         for(int j=0; j<col; j++)
         {
          for(int w=col-1; w>0; w--)
          {
           temp=matrix[j][w];
           matrix[j][w]=matrix[j][w-1];
           matrix[j][w-1]=temp;
          }
         }
        }
       }
       break;
      }
      //определяем на сколько будет произведено смещение
      cout<<"Choose on how many to make displacement on column
";
      cin>>lin;
      //Определяем направление смещения
      do{
      cout<<"We determine a direction of displacement
";
      cout<<"top - t "<<"bottom - b
";
      cin>>direction;
      }while((direction!='t')&&(direction!='b'));
      switch(direction)
      {
      case 't':
       {
        for(int i=0; i<lin; i++)
        {
         for(int j=0; j<row; j++)
         {
          for(int w=0; w<col-1; w++)
          {
           temp=matrix[w][j];
           matrix[w][j]=matrix[w+1][j];
           matrix[w+1][j]=temp;
          }
         }
        }
       }
       break;
      case 'b':
       {
        for(int i=0; i<lin; i++)
        {
         for(int j=0; j<row; j++)
         {
          for(int w=col-1; w>0; w--)
          {
           temp=matrix[w][j];
           matrix[w][j]=matrix[w-1][j];
           matrix[w-1][j]=temp;
          }
         }
        }
       }
       break;
      }
   }
   break;
 }
 for(int i=0; i<col; i++)
 {
  for(int j=0; j<row; j++)
  {
   cout<<matrix[i][j]<<" ";
  }
  cout<<"
";
 }
 for(int i=0; i<row; i++)
 {
  delete[] matrix[i];
 }
 delete[] matrix;
 getch();
}


Вывод: Гугль - мой лучший помощник!

Добавлено через 4 минуты
Цитата Сообщение от FRATER1234 Посмотреть сообщение
2. Дана матрица порядка MxN (M строк, N столбцов). Необходимо заполнить ее значениями и написать функцию, осуществляющую циклический сдвиг строк и/или столбцов массива указанное количество раз и в указанную сторону.
Переходим по ссылке: Циклический сдвиг строк
Если ленимся разбирать что там происходит:
кликаем!
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
2.
//Дана матрица порядка MxN (M строк, N столбцов). 
//Необходимо заполнить ее значениями и написать функцию, 
//осуществляющую циклический сдвиг строк и/или столбцов массива указанное количество раз и в указанную сторону.
 
#include <iostream>
#include <conio.h>
#include <stdlib.h>
using namespace std;
 
int ** create(int,int);
void fill(int**,int,int);
void show(int**,int,int);
void rev(int**,int,int,int);
int main(){
int** mas;
int row,col;
 
 
cout<<"Kolichestvo strok dvumernogo massiva: ";
cin>>row;
cout<<"Kolichestvo stolbcov dvumernogo massiva: ";
cin>>col;
 
mas = create(row,col);
fill(mas,row,col);
cout << endl;
show(mas,row,col);
cout << "Vvedite K: ";
int k;
cin >> k;
rev(mas,row,col,k);
show(mas,row,col);
 
return 0;
}
//создание массива
int** create(int row,int col)
{
int**a=new int*[row];
for(int i=0;i<row;i++){
a[i]=new int[col];
}
return a;
}
//заполнение
void fill(int** p,int row,int col){
for(int i=0;i<row;i++){
for(int k=0;k<col;k++){
p[i][k]=rand()%9+1;
}
}
}
//отображение
void show(int**mas,int row,int col){
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
cout<<mas[i][j]<<" ";
}
cout<<endl;
}
}
//прокрутка
void rev(int**mas,int row,int col,int k){
int *tmpm=new int[k];
 
for(int i=0;i<k;i++){
for(int j=0;j<row-k;j++){
tmpm[j]=mas[i][j];
mas[i][j]=mas[i][j+k];
}
for(int j=row-k;j<col;j++){
mas[i][j]=tmpm[j-(row-k)];
}
}
}


p.s: ничего не проверял и не компилил.

Добавлено через 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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define ROWS 5
#define COLS 9
 
//--------------------------------------------------------------------------------------
int **create_mass()
{
    int i, j;
    int **ret = (int **) malloc(sizeof(int *) * ROWS);
    for (i = 0; i < ROWS; i++)
        ret[i] = (int *) malloc(sizeof(int) * COLS);
 
    for (i = 0; i < ROWS; i++)
        for (j = 0; j < COLS; j++)
            ret[i][j] = rand() % 100;
 
 
    return ret;
}
 
//--------------------------------------------------------------------------------------
void free_mass(int **mass)
{
    int i;
    for (i = 0; i < ROWS; i++)
        free(mass[i]);
    free(mass);
}
 
//--------------------------------------------------------------------------------------
void print_mass(int **mass)
{
    int i, j;
    for (i = 0; i < ROWS; i++) {
        for (j = 0; j < COLS; j++)
            printf("%d ", mass[i][j]);
        printf("\n");
    }
 
    printf("\n");
}
 
/* val - на сколько сдвинуть, to - куда сдвинуть (1 либо 0) */
//--------------------------------------------------------------------------------------
void shift_rows(int **mass, int val, int to)
{
    int i, *temp;
 
    if (to) {
        while (val-- > 0) {
            for (i = 0; i < ROWS - 1; i++) {
                temp = mass[i];
                mass[i] = mass[i + 1];
                mass[i + 1] = temp;
            }
        }
    } else {
        while (val-- > 0) {
            for (i = ROWS - 1; i > 0; i--) {
                temp = mass[i];
                mass[i] = mass[i - 1];
                mass[i - 1] = temp;
            }
        }
    }
}
 
/* val - на сколько сдвинуть, to - куда сдвинуть (1 либо 0) */
//--------------------------------------------------------------------------------------
void shift_cols(int **mass, int val, int to)
{
    int i, j, temp;
 
    if (to) {
        while (val-- > 0) {
            for (i = 0; i < COLS - 1; i++) {
                for (j = 0; j < ROWS; j++) {
                    temp = mass[j][i];
                    mass[j][i] = mass[j][i + 1];
                    mass[j][i + 1] = temp;
                }
            }
        }
    } else {
        while (val-- > 0) {
            for (i = COLS - 1; i > 0; i--) {
                for (j = ROWS - 1; j >= 0; j--) {
                    temp = mass[j][i];
                    mass[j][i] = mass[j][i - 1];
                    mass[j][i - 1] = temp;
                }
            }
        }
    }
}
 
//--------------------------------------------------------------------------------------
int main()
{
    int **mass = create_mass();
    print_mass(mass);
    shift_rows(mass, 2, 1);
    print_mass(mass);
    shift_cols(mass, 2, 0);
    print_mass(mass);
    free_mass(mass);
    return (0);
}


Добавлено через 1 минуту
Комментарий автора последнего решения.
ну тут все просто, shift_rows двигает строки, shift_cols - колонки. принимают указатель на массив, на скока двигать, и куда двигать. куда двигать - 1 либо 0. для строк это вверх/вниз, для колонок - лево/право.
можно конечно функции сдвига было оптимизировать, но влом) так же кол во строк и столбцов у меня задается статически в дефайнах. на значения поменять не составит труда.


Добавлено через 5 минут
Да эти ваши интернеты просто пестрят такими задачами,
клик.
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
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
//Задача 2
#include <iostream>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
using namespace std;
void main()
{
    /*Дана матрица порядка M*N (M строк, N столбцов).Необходимо заполнить
её значениями и 
написать функцию, осуществляющую циклический сдвиг строк и/или столбцов массива
указанное
колличество раз и в указанную сторону*/
    int col, row, displacement, temp,lin, str;
    char line,column,direction;
    cout<<"Enter the size of a matrix : ";
    cin>>col;
    row=col;
    srand((unsigned)time(NULL));
    int **matrix=new int*[col];
    for(int i=0; i<col; i++)
    {
        matrix[i]=new int[row];
    }
    //Заполняем матрицу значениями
    for(int j=0; j<col; j++)
    {
        for(int a=0; a<row; a++)
        {
            matrix[j][a]=rand()%100;
            cout<<matrix[j][a]<<"   ";
        }
        cout<<"
";
    }
    //Выбираем по чём будет происходить сдвиг
    do{
        cout<<"Choose after what to make shift
";
        cout<<"1-line
";
        cout<<"2-column
";
        cout<<"3-line and column
";
        cin>>displacement;
       
}while((displacement!=1)&&(displacement!=2)&&(displacement!=3));
    switch(displacement)
    {
        case 1:
            {
                 //определяем на сколько будет произведено
смещение
                 cout<<"Choose on how many to make
displacement
";
                 cin>>str;
                 //Определяем направление смещения
                 do{
                 cout<<"We determine a direction of
displacement
";
                 cout<<"left - l    
"<<"right - r
";
                 cin>>direction;
                
}while((direction!='l')&&(direction!='r'));
                 switch(direction)
                 {
                 case 'l':
                     {
                         for(int e=0; e<str; e++)
                         {
                             for(int j=0; j<col;
j++)
                             {
                                 for(int w=0;
w<row-1; w++)
                                 {
                                    
temp=matrix[j][w];
                                    
matrix[j][w]=matrix[j][w+1];
                                    
matrix[j][w+1]=temp;
                                 }
                             }
                         }
                     }
                     break;
                 case 'r':
                     {
                         for(int i=0; i<str; i++)
                         {
                             for(int j=0; j<col;
j++)
                             {
                                 for(int
w=row-1; w>0; w--)
                                 {
                                    
temp=matrix[j][w];
                                    
matrix[j][w]=matrix[j][w-1];
                                    
matrix[j][w-1]=temp;
                                 }
                             }
                         }
                     }
                     break;
                 }
             }
            break;
        case 2:
            {
                //определяем на сколько будет произведено
смещение
                 cout<<"Choose on how many to make
displacement
";
                 cin>>lin;
                 //Определяем направление смещения
                 do{
                 cout<<"We determine a direction of
displacement
";
                 cout<<"top - t     
"<<"bottom - b
";
                 cin>>direction;
                
}while((direction!='t')&&(direction!='b'));
                 switch(direction)
                 {
                 case 'b':
                     {
                         for(int i=0; i<lin; i++)
                         {
                             for(int j=0; j<row;
j++)
                             {
                                 for(int w=0;
w<col-1; w++)
                                 {
                                    
temp=matrix[w][j];
                                    
matrix[w][j]=matrix[w+1][j];
                                    
matrix[w+1][j]=temp;
                                 }
                             }
                         }
                     }
                     break;
                 case 't':
                     {
                         for(int i=0; i<lin; i++)
                         {
                             for(int j=0; j<row;
j++)
                             {
                                 for(int
w=col-1; w>0; w--)
                                 {
                                    
temp=matrix[w][j];
                                    
matrix[w][j]=matrix[w-1][j];
                                    
matrix[w-1][j]=temp;
                                 }
                             }
                         }
                     }
                     break;
                 }
            }
            break;
        case 3:
            {
                //определяем на сколько будет произведено
смещение
                 cout<<"Choose on how many to make
displacement on lines
";
                 cin>>str;
                 //Определяем направление смещения
                 do{
                 cout<<"We determine a direction of
displacement
";
                 cout<<"left - l    
"<<"right - r
";
                 cin>>direction;
                
}while((direction!='l')&&(direction!='r'));
                 switch(direction)
                 {
                 case 'l':
                     {
                         for(int i=0; i<str; i++)
                         {
                             for(int j=0; j<col;
j++)
                             {
                                 for(int w=0;
w<row-1; w++)
                                 {
                                    
temp=matrix[j][w];
                                    
matrix[j][w]=matrix[j][w+1];
                                    
matrix[j][w+1]=temp;
                                 }
                             }
                         }
                     }
                     break;
                 case 'r':
                     {
                         for(int i=0; i<str; i++)
                         {
                             for(int j=0; j<col;
j++)
                             {
                                 for(int
w=col-1; w>0; w--)
                                 {
                                    
temp=matrix[j][w];
                                    
matrix[j][w]=matrix[j][w-1];
                                    
matrix[j][w-1]=temp;
                                 }
                             }
                         }
                     }
                     break;
                 }
                 //определяем на сколько будет произведено
смещение
                 cout<<"Choose on how many to make
displacement on column
";
                 cin>>lin;
                 //Определяем направление смещения
                 do{
                 cout<<"We determine a direction of
displacement
";
                 cout<<"top - t     
"<<"bottom - b
";
                 cin>>direction;
                
}while((direction!='t')&&(direction!='b'));
                 switch(direction)
                 {
                 case 't':
                     {
                         for(int i=0; i<lin; i++)
                         {
                             for(int j=0; j<row;
j++)
                             {
                                 for(int w=0;
w<col-1; w++)
                                 {
                                    
temp=matrix[w][j];
                                    
matrix[w][j]=matrix[w+1][j];
                                    
matrix[w+1][j]=temp;
                                 }
                             }
                         }
                     }
                     break;
                 case 'b':
                     {
                         for(int i=0; i<lin; i++)
                         {
                             for(int j=0; j<row;
j++)
                             {
                                 for(int
w=col-1; w>0; w--)
                                 {
                                    
temp=matrix[w][j];
                                    
matrix[w][j]=matrix[w-1][j];
                                    
matrix[w-1][j]=temp;
                                 }
                             }
                         }
                     }
                     break;
                 }
            }
            break;
    }
    for(int i=0; i<col; i++)
    {
        for(int j=0; j<row; j++)
        {
            cout<<matrix[i][j]<<"   ";
        }
        cout<<"
";
    }
    for(int i=0; i<row; i++)
    {
        delete[] matrix[i];
    }
    delete[] matrix;
    getch();
}


Добавлено через 2 минуты
Теперь надеюсь, будете с гуглем советоваться!
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru