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

Не складывается сумма - C++

Восстановить пароль Регистрация
 
0xDC
2 / 2 / 0
Регистрация: 15.09.2011
Сообщений: 104
22.02.2012, 00:20     Не складывается сумма #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
class Matrix
{
private:
        int **Matr;
        int m;
        int n;
        int **Matr1;
        int **Matr2;
 
        void Create()
        {
            Matr = new int*[m];
            Matr1 = new int*[m];
            Matr2 = new int*[m];
            for (int z=0; z<m; z++){
                Matr[z] = new int[n];
                Matr1[z] = new int[n];
                Matr2[z] = new int[n];
            }
        }
       
public:
     
        Matrix(int i,int j): m(i), n(j) { Create(); }
        ~Matrix()
        {
            for (int z=0; z<m; z++)
            {
               delete[] Matr[z];
            }
        }
 
 
void Fill()
{
    for (int i=0;i<m;i++){
        for (int j=0;j<n;j++){
            //int r=0+rand() % 9;
            Matr[i][j]=0;
            Matr1[i][j]=0+rand() % 9;
            Matr2[i][j]=0+rand() % 9;
            
        }
    }
}
 
 
 
    
        void sum()
        {
        for(int i=0;i<m;i++)
        {
        for(int j=0;j<n;j++)
        {
    Matr[i][j] = Matr1[i][j] + Matr2[i][j];
        }
        }
        }
 
 
 
          void Display()
        {
            for(int i=0; i<m; i++)
            {
                for(int j=0; j<n; j++)
                {
                    cout.width(5);
                    cout << Matr[i][j]; 
                 }
                            
                cout << endl;
            }
            cout<<"\n";
        }
 
 
          void Display1()
        {
            for(int i=0; i<m; i++)
            {
                for(int j=0; j<n; j++)
                {
                    cout.width(5);
                    cout << Matr1[i][j]; 
                 }
                            
                cout << endl;
            }
            cout<<"\n";
        }
 
 
           void Display2()
        {
            for(int i=0; i<m; i++)
            {
                for(int j=0; j<n; j++)
                {
                    cout.width(5);
                    cout << Matr2[i][j]; 
                 }
                            
                cout << endl;
            }
            cout<<"\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
#include "clasMatr.h"
int main()
{
    
    Matrix M(1,1);
    Matrix A(1,1);
    Matrix B(1,1);
 
    M.Fill();
    A.Fill();
    B.Fill();
 
    M.Display();
    A.Display1();
    B.Display2();
        M.sum();
        //A.sum();
        //B.sum();
 
    cout << "\n After sum" << endl;
 
 
  
    M.Display();
 
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.02.2012, 00:20     Не складывается сумма
Посмотрите здесь:

Составить программу, в которой вычислить z=(s1+s2)/(k1*k2), где s1 и k1 - сумма и количество положительных элементов массива Х[N]; s1 u k2 - сумма C++
C++ Дан массив из 9 целых чисел. Найти сумму элементов массива и, если она четная, вывести сообщение "Сумма четная", в противном случае напечатать "Сумма
Определить можно ли в двумерном массиве найти такой столбец, который разбивает массив на два так, что сумма элементов в первом больше, чем сумма элеме C++
Найдите такие натуральные числа, чтобы сумма их цифр, а также сумма цифр следующего за ним числа делилась на 7 C++
C++ Найти простые числа, чтобы сумма их цифр, а также сумма цифр следующего за ним числа, делилась на 7
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
22.02.2012, 00:51     Не складывается сумма #2
подробности по поводу самого класса пропустим. там все печально. однако сумма вроде считается правильно. только main поправить нужно:

C++
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
  Matrix M(2,2);
  M.Fill();
  M.Display();
  M.Display1();
  M.Display2();
  M.sum();
  cout << "\n After sum" << endl;
  M.Display();
  return 0;
}
0xDC
2 / 2 / 0
Регистрация: 15.09.2011
Сообщений: 104
23.02.2012, 01:03  [ТС]     Не складывается сумма #3
а что с классом-то.Выслушаю все замечания
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
23.02.2012, 02:27     Не складывается сумма #4
В классе матрицы присутствуют три матрицы. Две из них заполняются, потом вызывается
функция для их суммирования ну и печатается результат этой суммы.
Должно быть так:
В один объект типа матрицы представляет одну матрицу.
В классе могут быть функции заполнения этой матрицы,
ее печати ну и возможно арифметические операции.
Арифметические операции наверно лучше оформить в виде свободных функций.
Есть также утечка памяти и нереализованные конструктор копирования и оператор =
Вот более менее корректное решение

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
#include <iostream>
#include <cassert>
 
using namespace std;
 
class Matrix
{
  int** Matr;
  unsigned Width;
  unsigned Height;
 
  Matrix(const Matrix&);
  Matrix& operator = (const Matrix&);
 
public:
  Matrix(unsigned width, unsigned height)
    : Width(width), Height(height)
  {
    // Тут не безопасно с точки зрения исключений, но пофиг.
    assert(Width > 0 && Height > 0);
    Matr = new int*[Height];
    for (unsigned i = 0; i < Height; ++i)
    {
      Matr[i] = new int[Width];
      // Тут возможно в каждую ячейку нули прописать надо.
    }
  }
 
  ~Matrix()
  {
    for (unsigned i = 0; i < Height; ++i)
    {
      delete[] Matr[i];
    }
    delete[] Matr;
  }
 
  void RandomFill()
  {
    for (unsigned y = 0; y < Height; ++y)
    {
      for (unsigned x = 0; x < Width; ++x)
      {
        Matr[y][x] = rand() % 9;
      }
    }
  }
 
  void Print() const
  {
    for (unsigned y = 0; y < Height; ++y)
    {
      for (unsigned x = 0; x < Width; ++x)
      {
        cout.width(5);
        cout << Matr[y][x]; 
      }
      cout << endl;
    }
    cout << endl;
  }
 
  bool Add(const Matrix& other)
  {
    if (Width != other.Width || Height != other.Height)
    {
      assert(!"Bad matrix size.");
      return false;
    }
 
    for (unsigned y = 0; y < Height; ++y)
    {
      for (unsigned x = 0; x < Width; ++x)
      {
        Matr[y][x] += other.Matr[y][x];
      }
    }
 
    return true;
  }
 
  bool Sub(const Matrix& other)
  {
    if (Width != other.Width || Height != other.Height)
    {
      assert(!"Bad matrix size.");
      return false;
    }
 
    for (unsigned y = 0; y < Height; ++y)
    {
      for (unsigned x = 0; x < Width; ++x)
      {
        Matr[y][x] -= other.Matr[y][x];
      }
    }
 
    return true;
  }
};
 
 
int main()
{
  Matrix m1(2, 3);
  m1.RandomFill();
 
  Matrix m2(2, 3);
  m2.RandomFill();
 
  cout << "M1:" << endl;
  m1.Print();
 
  cout << "M2:" << endl;
  m2.Print();
 
  m1.Add(m2);
  cout << "M1 after add:" << endl;
  m1.Print();
 
  m1.Sub(m2);
  cout << "M1 after sub:" << endl;
  m1.Print();
 
  m1.Sub(m1);
  cout << "M1 after self sub:" << endl;
  m1.Print();
 
  return 0;
}
0xDC
2 / 2 / 0
Регистрация: 15.09.2011
Сообщений: 104
24.02.2012, 00:54  [ТС]     Не складывается сумма #5
а что это за строчки ?

Matrix(const Matrix&);
Matrix& operator = (const Matrix&);
samdavydov
59 / 20 / 2
Регистрация: 23.02.2012
Сообщений: 36
24.02.2012, 00:58     Не складывается сумма #6
Это конструктор копирования и оператор присваивания.

Они объявлены в закрытой области класса, чтобы матрицу нельзя было копировать.

Т.е., чтобы код вида m2 = m1; не скомпилировался.

Но ведь копировать матрицы вполне естесвенно.
Просто код, копирующий матрицу, довольно громоздкий и DU решил оставить это тебе в качестве домашнего задания.

Если эти две строки просто убрать, то код m2 = m1 будет компилироваться, но программа будет работать неверно.
Yandex
Объявления
24.02.2012, 00:58     Не складывается сумма
Ответ Создать тему
Опции темы

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