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

Критику в студию - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Виртуальная функция не хочет перекрываться http://www.cyberforum.ru/cpp-beginners/thread848848.html
Возникла следующая ситуация, имеется базовый класс с виртуальной функцией, и два производных один с ним в одном файле, другой в соседнем, в обоих перекрываю виртуальный метод, ( есть дефолтная реализация оного), в итоге при вызове данного метода от объектов производных классов, только один из них ( тот который в одном файле) перекрывает дефолтный метод, что я делаю не так ?
C++ Алгоритм сортировки Дан одномерный масив. мне в нем нужно отсортировать по возростанию только те числа масива которые простые, а остальные оставить на той же позиции как и были. вот так я смотрю простое число или не int isSimple (int x) { int retVal = 1; int i = 2; while (i<=sqrt((double)x) && retVal==1) http://www.cyberforum.ru/cpp-beginners/thread848840.html
C++ Класс домов и класс улиц для учета поступлений квартплаты. Массив
Задание: вырезано Файл StdAfx.h #pragma once #include "targetver.h" #include <stdio.h>
Решение головоломок C++
Скажи пожалуйста, как должна работать программа, решающая головомку: составить, например, функцию проверки окончания и прогонять все варианты или не знаю, пробывать составить какое-то дерево ходов или мыслить так же как решает человек Хочу написать решатель для головоломки Первые встречные http://www.cross-plus-a.ru/html/voc7abc.htm
C++ Изменение цвета текста http://www.cyberforum.ru/cpp-beginners/thread848819.html
Привет всем. Можно ли в консоле менять цвет ЧАСТИ текста? тоесть выделить одно слово другим цветом например Просто system(color ** ) изменяет всё целиком. В нэте не нашёл нормального ответа на мой вопрос
C++ Операции над натуральными числами Привет всем, я новенький как на форуме так и на в программировании. Начал изучать с++ 2 недели назад,самоучка, так что сильно не кричите)) Задача : Даны три натуральных числа K,L,M (K>=L>=M). Если хотя бы одно из них кратно любому другому, оставить числа без изменения. В противном случае умножить все числа на меньшее из них. #include "iostream" using namespace std; подробнее

Показать сообщение отдельно
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927

Критику в студию - C++

25.04.2013, 23:39. Просмотров 2317. Ответов 30
Метки (Все метки)

Доброго всем времени суток! Я вот написал такой себе класс матриц, прошу оценить его и посоветовать что можно улучшить или изменить, как повысить быстродействие или, возможно, что-то надо добавить.
Знаю,что надо сделать шаблон класса для разных типов данных, но дабы сейчас все было красиво и хорошо не загрязнял этим код! Любые дельные советы будут "лайкнуты"!

matrix.h
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
//класс матриц
//matrix.h
/*проверка от дураков не предусмотрена*/
#pragma once
#include <iostream>
#include <fstream>
 
class matrix
{
public:
    matrix();//конструктор по умолчанию
    matrix(const int& , const int&);//конструктор, создает еденичную матрицу
    matrix(const int& , const int& , const double *array);//конструктор, берет значения из массива
    matrix::matrix(matrix &);//конструктор копирования
    ~matrix();//деструктор
 
protected:
    double *array;//массив матрицы
    int rows, columns;//количество столбцов и строк
    int precision;//точность вывода матрицы
 
public:
//операции с матрицей
    matrix& set(const double* );//функция изминения значения всех элементов матрицы
    matrix& eye();//делает матрицу еденичной(возможно не квадратной)
    matrix& zero();//делает матрицу нулевой
    matrix  transpose();//функция траспонирования, возвращает матрицу
//операторы
    matrix  operator*(const matrix& );//оператор умножения матриц
    matrix  operator*(const double&);//оператор умножение на дабл
    matrix  operator+(const matrix& );//оператор сложения матриц
    matrix  operator-(const matrix& );//оператор вычитания матриц
    matrix& operator=(const matrix& );//оператор присваивания
    double&      operator()(const int&, const int&);//оператор получения элемента матрицы
//дополнительные функции
    void householderDecomposition(matrix& Q, matrix& R);//алгоритм Хаусхолдера, изменяет параметры-ссылки
//функции установок параметров матрицы
    void output();//вывод матрицы на экран
    void output(std::ofstream* );//вывод матрицы в файл
    void SetSize (const int&, const int&);//изменение размеров
    int& Columns (void);//вывод количества столбцов
    int& Rows (void);//вывод количества строк
    void SetPrecison (const int &);//установка точности вывода
};
matrix.cpp
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
//класс матриц
//matrix.cpp
/*проверка от дураков не предусмотрена*/
#include "StdAfx.h"
#include "matrix.h"
#include <iomanip>
#include <math.h>
 
//конструктор по умолчанию
matrix::matrix():rows(0),columns(0),precision(2)
{
    array=NULL;
}
//конструктор еденичной матрицы
matrix::matrix(const int& rows, const int& columns) :
    rows(rows), columns(columns), precision(2)
{
    array = new double[rows * columns];
    this->eye();
}
//конструктор из массива
matrix::matrix(const int& rows, const int& columns, const double *array) :
    rows(rows), columns(columns), precision(2)
{
    this->array = new double[rows * columns];
    for (int i = 0; i < rows * columns; i++) this->array[i] = array[i];
}
//конструктор копирования
matrix::matrix(matrix &copy) 
{
    rows=copy.rows;
    columns=copy.columns;
    precision=copy.precision;
    array = new double [rows*columns];
    for( int i =0; i < rows * columns; ++i)
        array[i]=copy.array[i];
}
//деструктор
matrix::~matrix() 
{
    delete [] array;
}
//ввод данных из массива
matrix& matrix::set(const double *array) 
{
    for (int i = 0; i < rows * columns; i++) this->array[i] = array[i];
    return *this;
}
//моздание единичной матрицы
matrix& matrix::eye() 
{
    for (int j = 0; j < rows; j++)
        for (int i = 0; i < columns; i++)
            array[j * columns + i] = i == j ? 1.0 : 0.0;
    return *this;
}
//создание нулевой матрицы
matrix& matrix::zero() 
{
    for (int j = 0; j < rows; j++)
        for (int i = 0; i < columns; i++)
            array[j * columns + i] = 0.0;
    return *this;
}
//транспонированная матрица 
matrix matrix::transpose() 
{
    matrix temp(columns, rows);
    for (int j = 0; j < rows; j++)
        for (int i = 0; i < columns; i++)
            temp.array[i * rows + j] = array[j * columns + i];
    return temp;
}
//оператор умножения матриц
matrix matrix::operator*(const matrix& right_arg) 
{
    matrix temp(rows, right_arg.columns);
    for (int j = 0; j < rows; j++)
        for (int i = 0; i < right_arg.columns; i++) {
            temp.array[j * right_arg.columns + i] = 0.0;
            for (int k = 0; k < columns; k++)
                temp.array[j * right_arg.columns + i] += array[j * columns + k] * right_arg.array[k * right_arg.columns + i];
        }
    return temp;
}
//оператор умножения матрицы на число
matrix matrix::operator*(const double &s) 
{
    matrix temp(rows, columns);
    for (int j = 0; j < rows; j++)
        for (int i = 0; i < columns; i++)
            temp.array[j * columns + i] = array[j * columns + i] * s;
    return temp;
}
//оператор сложения матриц
matrix matrix::operator+(const matrix& right_arg) 
{
    matrix temp(rows, columns);
    for (int j = 0; j < rows; j++)
        for (int i = 0; i < columns; i++)
            temp.array[j * columns + i] = array[j * columns + i] + right_arg.array[j * columns + i];
    return temp;
}
//оператор вычитания матриц
matrix matrix::operator-(const matrix& right_arg) 
{
    matrix temp(rows, columns);
    for (int j = 0; j < rows; j++)
        for (int i = 0; i < columns; i++)
            temp.array[j * columns + i] = array[j * columns + i] - right_arg.array[j * columns + i];
    return temp;
}
//оператор присваивания
matrix& matrix::operator=(const matrix& right_arg) 
{
    if (rows * columns != right_arg.rows * right_arg.columns) {
        delete [] array;
        array = new double[right_arg.rows * right_arg.columns];
    }
    rows = right_arg.rows;
    columns = right_arg.columns;
 
    for (int i = 0; i < rows * columns; i++) array[i] = right_arg.array[i];
    return *this;
}
//оператор возвращения элемента
double& matrix::operator()(const int& i, const int& j)
{
    return (array[i*columns+j]);
}
//преобразование Хаусхолдера
void matrix::householderDecomposition(matrix& Q, matrix& R) 
{
    double mag, alpha;
    matrix x(rows, 1), u(rows, 1);
    matrix P(rows, rows), E(rows, rows);
 
    Q = matrix(rows, rows);
    R = *this;
 
    for (int i = 0; i < columns; i++) {
        x.zero(); u.zero();
        
        mag = 0.0;
        for (int j = i; j < rows; j++) {
            x.array[j] = R.array[j * columns + i];
            mag += x.array[j] * x.array[j];
        }
        mag = sqrt(mag);
        alpha = x.array[i] > 0 ? mag : -mag;
 
        mag = 0.0;
        for (int j = i; j < rows; j++) {
            u.array[j] = j == i ? x.array[j] + alpha : x.array[j];
            mag += u.array[j] * u.array[j];
        }
        mag = sqrt(mag);
 
        for (int j = i; j < rows; j++) u.array[j] /= mag;
 
        P = E - (u * u.transpose()) * 2.0;
 
        R = P * R;
        Q = Q * P;
    }
}
//вывод матрицы на экран
void matrix::output() 
{
    for (int j = 0; j < rows; j++) {
        for (int i = 0; i < columns; i++) {
            std::cout << std::fixed << std::setprecision(precision) << 
                std::setw(16) << array[j * columns + i] << "   ";
        }
        std::cout << std::endl;
    }
    std::cout << std::endl;
}
//вывод матрицы в файл
void matrix::output(std::ofstream* file)
{
    for (int j = 0; j < rows; j++) {
        for (int i = 0; i < columns; i++) {
            *file << std::fixed << std::setprecision(precision) << 
                std::setw(16) << array[j * columns + i] << "   ";
        }
        *file << std::endl;
    }
    *file << std::endl;
}
//изменение размеров матрицы
void matrix::SetSize (const int& rows, const int& columns)
{
    if (array!=NULL)
        delete[] array;
    array=new double[rows * columns];
    this->zero();
}
//возвращаение количества стобцов
int& matrix::Columns (void)
{
    return columns;
}
//возвращает количество строк
int& matrix::Rows (void)
{
    return rows;
}
//установка точности вывода
void matrix::SetPrecison(const int& precision)
{
    matrix::precision=precision;
}
Спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru