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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ilizard
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 50
#1

Какой способ хранения матрицы выбрать, если требуется делать много перестановок элементов? - C++

02.03.2013, 18:26. Просмотров 399. Ответов 1
Метки нет (Все метки)

Здравствуйте! У меня было задание, написать такую программу, которой надо сделать циклический сдвиг в двумерном динамическом массиве по такой вот схеме (см. рис). http://www.cyberforum.ru/attachments/208514d1354547418

сделала. матрицу сохраняла в динамической памяти, с помощью new int.

Но преподаватель остался недоволен, сказал что есть способ хранения памяти, который будет эффективней при таких перестановках элемента. А я не могу догадаться как хранить ее! Помогите, пожалуйста.

И еще вопрос, чем отличается new int от malloc?

Вот сам код:
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
#include <stdlib.h>
#include <iostream>
#include <time.h>
#include <conio.h>
using namespace std;
//----------Функция выводящая матрицу-------------------------------------------
void print(int** arr, int n, int m)         
    {
            cout << "matriza:\n";
        for(int i = 0; i < n; i++)      {
            for(int j = 0; j < m; j++)  
                cout  << arr[i][j] << ' ';  
            cout << '\n';       }
        cout << '\n';
    }
//-----------Функция инициализирующая матрицу-----------------------------------
int** iniz(int** arr, int n, int m)     
    {
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++)              //инициализируем однозначными
                arr[i][j]=rand()%10;          //случайными числами
        }
        return arr;
}
//------------Функция сортировки------------------------------------------------
void sort(int** arr, int n, int m, int t){
     int j,i,p;
      
         for (int k=0; k<(t%(m*n)); k++) {
     int last;                     //запоминаем "последний" элемент
     if (n % 2 == 0){              //определяем, какой элемент "последний"
         last = arr[n-1][0];   //если строк чет. количество-первый в посл.строке
         }else{
         last = arr[n-1][m-1];  //если нечет - последний в последней строке
         }
        
         int One=arr[0][0];           //объявляем переменные которые будем менять
     int Two;                      //и инициализируем 1 элементом одну         
    
     for (int i = 0; i < n; i++){
         int way, step, finish;    
         if (i % 2 == 0){          
               way = 0;            
               step = 1;
               finish = (m - 1);      //для каждой строки(в зависимости от четности)
               }else{                //определяем начальный элемент,в какую сторону 
                     way = m - 1;    //движемся и конечный
                     step = -1;
                     finish = 0;
                    }
          
            if (m==2) p=0        //матрицу 2 на 2 рассматриваем как особый случай
            
            else {
               Two = arr[i][way + step];    //передвигаем элемент,
               arr[i][way + step] = One;    //запоминая первый
               One = Two;
          p=(way + step + step);}
    
        for (int j = (p); j != (finish + step); j += step){
             if (j == finish){                      //если элемент последний
                   int lastSwap = arr[i][finish];   //меняем его с нижним
                   arr[i][finish] = One;          
                   Two = arr[i + 1][finish];
                   arr[i + 1][finish] = lastSwap;
                   One = Two;
                   }else{
             Two = arr[i][j];                       //делаем перестановку,
             arr[i][j] = One;                       //пока не дойдем до последнего
             One = Two; 
                } 
         }}
     arr[0][0] = last;                      //ставим "последний" на первое место
    }
}
//------------------------------------------------------------------------------
 
int main(){
    int n,m,t;
    srand (time (NULL));
    cout << "n=" ; cin >> n;
    cout << "m=" ; cin >> m;
    cout << "t="; cin >> t;
    //--------объявляем матрицу,иницилизируем,выводим,изменяем,выводим----------
    int** arr = (int**)malloc(n*sizeof(int*));
    for(int i=0; i<=n;i++)  
        arr[i] = (int*)malloc(m*sizeof(int)); 
    iniz(arr,n,m);
    print(arr,n,m);
    sort(arr,n,m,t);
    print(arr,n,m);
    free(arr);
    getch();
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.03.2013, 18:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Какой способ хранения матрицы выбрать, если требуется делать много перестановок элементов? (C++):

string,switch, что делать, если требуется сравнение русского текста - C++
int main() { setlocale(LC_ALL, &quot;Russian&quot;); ofstream fout(FILENAME); string inner,math_count, rl = &quot;текст1&quot;; int ct = 19; ...

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

Какой способ хранения анимации эффективнее? - Программирование Android
Есть набор кадров с анимацией &quot;персонажа&quot;. Можно хранить каждый кадр в виде отдельной картинки и загружать их в массив, чтобы по номеру...

Какой лучший способ хранения большого объема данных? - C#
Доброй ночи :) Требуется простой совет, каким образом лучше всего хранить большой объем данных? Приложение генерирует большой объем...

Какой способ верстки выбрать? - HTML, CSS
Доброго времени суток!!! Делаю простенький сайт для салона красоты (html, Dreamweaver). Пробовала делать через фреймы, таблицы, просто...

Логи - какой способ лучше выбрать ? - Delphi
Доброго времени суток. Подскажите какой способ лучше выбрать для ведения логов, для такой задачи: есть приложение Клиент-сервер, на...

1
ITcrusader
Эксперт С++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
02.03.2013, 19:26 #2
Выбрала самый неудачный способ представления матрицы. Элементы располагаются в непрерв=ывной области памяти и чтобы сделать один шаг сдвига - нужно сдвигать каждый элемент матрицы. Для задачи хорошо подойдет массив списков. см. std:: list<int>.

New/delete отличается от malloc/free, в первую очередь тем, что взаимодействуют с конструкторами/деструкторами. И вообще, new - то, чему нужно отдавать предпочтение при выборе инструмента выделения динамической памяти
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2013, 19:26
Привет! Вот еще темы с ответами:

Какой вариант для хранения данных выбрать? - Базы данных
Есть прога. Работает с БД (не суть важно для вопроса с какой). Программа принимает различные данные от пользователя. Номер контракта, дом...

.NET 4.x Хранение настроек в файле: какой способ выбрать - C#
Пишу свою первую программу на C#. Встала проблема - хранение настроек. Как я понял, для C# популярен метод хранения в xml файле. Есть...

Какой способ работы с данными выбрать MySQL - C#
Я виже два варианта развития событий: 1. Использовать DataGried там DataSet-ми цепляться, и в этом Датагриде и добавлять данные. 2....

Какой способ выбрать для создания GUI? - .NET
Здравствуйте. Необходимо создать проект с графическим интерфейсом. После поиска в интернете информации о возможных способах, передо мной...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

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