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

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

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

Копирование элементов из старой матрицы в новую. Динамическое распределение памяти - C++

08.06.2014, 22:19. Просмотров 225. Ответов 2
Метки нет (Все метки)

Столкнулся с такой задачей : Вводится матрица. Если в матрице наибольший элемент находится над главной диагональю, то программа формирует новую матрицу, удалив из исходной столбец и строку, на пересечении которых находится наибольший элемент.
Распределение памяти - динамическое.

Вот мой код (MVS 2008):
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
// vvod.cpp   ФУНКЦИЯ ВВОДА
 
#include <iostream>
using namespace std;
 
float* vvod(int n)
{   
    float* mas = new float [n];
    for (int i =0 ; i<n; i++)
    {   
        cout<<"Vvedite "<<i+1<<" element"<<endl;
        cin>>*(mas+i);
    }
    return mas;
}
 
float** vvod(int m, int n)
{   
    float** mas = new float* [m];
    for (int i=0;i<m;i++)
    {   
        cout<<i+1<<"stroka"<<endl;
        mas[i]=vvod(n);
    }
    return mas;
}
 
 
//vivod.cpp    ФУНКЦИЯ ВЫВОДА
 
#include <iostream>
using namespace std;
void vivod (float**newMatr, int m, int n)
{
    cout<<endl;
    for (int i=0; i<m; i++)
    {
        for (int j=0; j<n; j++)
            cout<<newMatr[i][j]<<" ";
        cout<<endl;
    }
}
 
// func.cpp ФУНКЦИИ АНАЛИЗА И СОЗДАНИЯ
 
int analizMatr (float**matr,int m,int n,int&x,int&y)
{
    float max=0; 
    for (int i=0; i<m; i++)
    {
        for (int j=0; j<n; j++)
          if (matr[i][j]>max) 
          { max=matr[i][j];
            x=i; y=j;
          }
    }
    if (x>=y) return 0;
    return 1;
}
 
float**formMatr (float**matr, int m, int n,int&a, int&b)
{   int x,y;
    if (analizMatr(matr, m, n, x, y)==0)
        return 0;
    float**newMatr=new float*[n]; 
    a=0;
    for (int i=0; i<m; i++)
    {   b=0; 
        if (i!=x)
        { for (int j=0; j<n; j++)
          { if (j!=y)
            {   newMatr[b]=new float[n];
                newMatr[a][b]=matr[i][j];
              b++;
            }
          } 
        a++;
    
        }
    }
    return newMatr;
}
 
void del(float**matr,int m)
{
    for(int i=0;i<m;i++)
        delete [] matr[i];
    delete [] matr;
}
 
 
// main.cpp 
 
#include <iostream>
#include <conio.h>
using namespace std;
float**vvod(int m,int n);
void vivod (float**newMatr, int m, int n);
int analizMatr (float**matr,int m,int n,int&x,int&y);
float**formMatr (float**matr, int m, int n,int&a, int&b);
void del(float**matr,int m);
int main()
{
 int m,n,z,x,y,b,a;
 do 
 {
  do
  {
   cout<<"Vvedite kol-vo strok m="; cin>>m;
   cout<<endl;
  }while (m<0 || m==0 || m>10);
   do
  {
   cout<<"Vvedite kol-vo stolbcov n="; cin>>n;
   cout<<endl;
  }while (n<0 || n==0 || n>10);
 
  float**matr=vvod(m,n);
  float**newMatr=formMatr(matr,m,n,a,b);
  int q=analizMatr(matr,m,n,x,y);
  cout<<endl<<"q="<<q<<endl<<"x="<<x<<" , y="<<y<<endl
      <<"a="<<a<<" , b="<<b<<endl;
  
  if (newMatr)
     {
         cout<<endl<<"Matrica:"<<endl;
         vivod (matr,m,n);
         cout<<"Novaya matrica:"<<endl;
         vivod (newMatr,a,b);
         del(matr,m);
         del(newMatr,a);
     }
  else {
        cout<<"Matrica ne sozdavalas"<<endl;
        del(matr,m);
       }
 
  cout<<endl<<"Repeat? (0-for exit) "; cin>>z;
 }while (z!=0);
return (0);
}
В общем, сама проблема заключается в формировании новой матрицы (функция formMatr), не понимаю, как сделать правильный код..

Добавлено через 16 минут
UP
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.06.2014, 22:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Копирование элементов из старой матрицы в новую. Динамическое распределение памяти (C++):

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

Динамическое распределение памяти: реализовать транспонирование заданной квадратной матрицы - C++
Выполнить задание двумя способами: с использованием функций и операторов языка С++ для работы с динамически распределяемой памятью. При...

Распределение памяти. Динамическое выделение памяти - C++
an-1 an-2 ... a2

Динамическое распределение памяти - C++
Прошу помощи! Даны действительные числа a1...an2 . Получить действительную квадратную матрицу порядка n&lt;8, элементами которой являются...

Динамическое распределение памяти - C++
Ни разу не работал с динамическим распределением. Объясните пжл, что я сделал не так. Цель - получить большую область памяти (состоящей из...

Динамическое распределение памяти. - C++
#include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; int bespor(int *ptr); void main(void){ int *ptr,kolvo,b=0,i,z=1; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Tuma
60 / 41 / 18
Регистрация: 28.09.2013
Сообщений: 193
08.06.2014, 22:45 #2
Вам наверное лучше создать 2 переменные типа bool(при объявлении инициализировать их как false),и вот идет у вас цикл,как только встретил нашу строку или столбец(я надеюсь вы их уже нашли), переменной присваиваем значение true,а теле цикла мы делаем проверку является ли наша переменная true,если да,то мы будем обращаться не к a[i],а к a[i-1].
Quest10n
0 / 0 / 0
Регистрация: 08.06.2014
Сообщений: 2
09.06.2014, 02:33  [ТС] #3
Я не очень Вас понимаю, но мне кажется, что это более относится к статическому распределению памяти. Мне бы исправить этот цикл..
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 float**newMatr=new float*[n]; 
    a=0;
    for (int i=0; i<m; i++)
    {   b=0; 
        if (i!=x)
        { for (int j=0; j<n; j++)
          { if (j!=y)
            {   newMatr[b]=new float[n];
                newMatr[a][b]=matr[i][j];
              b++;
            }
          } 
        a++;
    
        }

Для матриц, допустим, {1 3}{1 1} и {1 3 1}{1 1 1} он работает , а вот уже для {1 3}{1 1}{1 1} нет - выдаёт ошибку "Необработанное исключение"
и показывает на строку "newMatr[a][b] = matr[i][j]"

Добавлено через 17 минут
UP

Добавлено через 45 минут
Неужели никто не знает

Добавлено через 2 часа 13 минут
UP!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2014, 02:33
Привет! Вот еще темы с ответами:

Динамическое распределение памяти - C++
Добрый вечер, помогите пожалуйста разобраться с задачкой!!! Дана действительная квадратная матрица порядка 2n. Получить новую матрицу,...

Динамическое распределение памяти - C++
Динамическое распределение памяти Ребят выручайте уж совсем плохо с ним:

Динамическое распределение памяти - C++
помогите пожалуйста поправить код!в массиве по заданному индексу удалить элемент (не работает !)...

Динамическое распределение памяти - C++
Столкнулся со следующей задачей: Создать список, элементами которого являются целые числа. Данные формируются случайным образом. Данные...


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

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

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