0 / 0 / 0
Регистрация: 17.03.2015
Сообщений: 16
1

Шаблоны С++. Класс "Квадратная матрица"

02.04.2015, 12:40. Показов 4195. Ответов 5
Метки нет (Все метки)

Здравствуйте, уважаемые программисты. Искренне прощу вашей помощи в решении данной задачи.
Условие задачи:
Реализовать в виде модуля набор подпрограмм для выполнения следующих операций с квадратными матрицами:
1) сложения двух матриц;
2) умножения одной матрицы на другую;
3) нахождения транспонированной матрицы;
4) вычисления определителя матрицы.
Матрицу описать следующим образом:
Const NMax=10;
Type Matrica=Array[1..NMax,1..Nmax] Of Real;
Используя этот модуль, решить систему линейных уравнений N-го порядка
(2 < N< 10) методом Крамера.
Решить задачу нужно с помощью шаблонов.
Большое спасибо всем откликнувшимся.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.04.2015, 12:40
Ответы с готовыми решениями:

Реализовать шаблонный класс "Матрица" (шаблоны классов и функций)
Написать код программы на С++ Разработать шаблонные функции и классы. класс МАТРИЦА. Для класса...

Создать класс "Квадратная матрица"
Створити клас – квадратна матриця. У закритій частині описати поля: розмір матриці та двовимірний...

Разработать класс "Квадратная матрица"; создать массив матриц и найти в нём матрицу, удовлетворяющую условию
Доброго времени суток!Нужно разработать класс матриц размера 3x3.Переопределить операции сложения,...

Шаблоны класса:Матрица. Ошибка бинарный "=": не найден оператор, принимающий правый операнд типа "Matr<T>"
Выдает ошибку &quot;бинарный &quot;=&quot;: не найден оператор, принимающий правый операнд типа &quot;Matr&lt;T&gt;&quot; (или...

5
Эксперт С++
3064 / 1404 / 423
Регистрация: 19.01.2009
Сообщений: 3,807
02.04.2015, 13:23 2
Цитата Сообщение от stylingmousse20 Посмотреть сообщение
Матрицу описать следующим образом:
Const NMax=10;
Type Matrica=Array[1..NMax,1..Nmax] Of Real;
stylingmousse20, больше похоже на Pascal чем C++. Не напутали чего в задании?
0
0 / 0 / 0
Регистрация: 17.03.2015
Сообщений: 16
02.04.2015, 23:55  [ТС] 3
schdub, нет это С++,просто преподаватель сказал что это условие написано с помощью псевдокода.

Добавлено через 2 часа 36 минут
Вот есть готовое решение уравнений методом Крамера,но может кто-нибудь поможет его переделать так что бы было как сказано в условии(создать методы и решить с помощью шаблонов):
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
#include <iostream>
#include <math.h>
using namespace std;
//Функция возведения числа в нужную степень, для вычисления минора
int mypow(int x)
{
    int y = 1;
    for (int z = 1; z <= x; z++)
    {
        y *= -1;
    }
    return y;
}
//Функия получения новой матрицы из старой, путём вычёркивания первой (математически) нулевой(Си-шно) строки и х`овой колонки.
int GetNew(double m[100][100], int msize, double result[100][100], int st)
{
    int rsize;
    int z = 0;
    rsize = msize - 1;
    for (int x = 1; x <= msize; x++)
    {
        for (int y = 0; y <= msize; y++)
        {
            if (y != st)
            {
                result[x - 1][z] = m[x][y]; // z здесь затем, чтобы не попаст в у=st x-номер строки
                z++;
            }
        }
        z = 0;
    }
    return rsize;
}
//Рекурсивная функция вычисления определителя:
double GetDet(double m[100][100], int msize)
{
    double result = 0;
    if (msize == 1)
    {
        return result = (m[0][0] * m[1][1] - m[0][1] * m[1][0]);
    }
    else //Вычисляем определитель путём вычёркивания строк и столбцов. Берём элементы из первой строки.
    {
        double a[100][100];
        int asize;
        for (int x = 0; x <= msize; x++)
        {
            asize = GetNew(m, msize, a, x);
            result += mypow(x + 1)*a[0][x] * (GetDet(a, asize));
        }
        return result;
    }
}
//Функция присвоения матрицы
int EqlMatrix(double m[100][100], int msize, double s[100][100])
{
    for (int x = 0; x<msize; x++)
    {
        for (int y = 0; y<msize; y++)
        {
            m[x][y] = s[x][y];
        }
    }
    return msize;
}
//Функция замены колонки на матрицу-столбец
void SetColumn(double m[100][100], int msize, int column, double source[100][100])
{
    for (int x = 0; x <= msize; x++)
    {
        m[x][column] = source[x][0];
    }
}
int main(int argc, char* argv[])
{
    int flag, size, flag2;
    double  first[100][100], second[100][100], temp[100][100];
    int firstsize, secondsize, tempsize;
    double h, element1, element2, maindet;
    bool c = 1;
    cout << "Metod Kramera dlya resheniya sistem lineynih uravneniy.\n\n";
    while (c)
    {
        //Ввод размера
        cout << "Vvedite razmer matrici:";
        cin >> size;
        //Отсев размера
        do
        {
            if ((size >= 2) && (size <= 9))
            {
                cout << "\n";
                break;
                flag = 1;
            }
            else
            {
                cout << "Vvedite x ot 2 do 9\n";
                flag = 0;
                cin >> size;
            }
        } while (flag = 1);
 
        //Заполнение квадратной матрицы из коэффициентов при переменных
        firstsize = size;
        for (int x = 0; x <= size; x++)
        for (int y = 0; y <= size; y++)
        {
            cout << "\nVvedite [" << x << ";" << y << "] element pervoy matrici:";
            cin >> element1;
            first[x][y] = element1;
        }
        //Заполнение столбца свободных элементов
        secondsize = size;
        for (int x = 0; x <= size; x++)
        {
            cout << "\nVvedite " << x << " element vtotoy matrici:";
            cin >> element2;
            second[x][0] = element2;
        }
        //Вывод системы уравнений
        for (int x = 0; x <= size; x++)
        {
            for (int y = 0; y <= size; y++)
            {
                cout << first[x][y] << " ";
            }
            cout << " |" << second[x][0] << "\n";
        }
        //вычисляем основной определитель
        maindet = GetDet(first, firstsize);
        if (maindet != 0)
        {
            for (int x = 0; x <= size; x++)
            {
                //Заменяем колонку, вычисляем определитель , делим на главный определитель и выводим 
                tempsize = EqlMatrix(first, firstsize, temp);
                SetColumn(temp/*куда*/, tempsize, x/*какую*/, second/*откуда*/);
                h = GetDet(temp, tempsize) / maindet;
                cout << "\nElement " << x << " = " << GetDet(temp, tempsize) << "/" << maindet << "=" << h << "";
            }
        }
        else
        {
            cout << "\n \n Glavniy determenant osnovnoy matrici raven 0,\n Metod Kramera ne radotaet i mi moghem otvetit' lish na vopros: skolko resheniy.\n";
            for (int x = 0; x <= size; x++)
            {
                tempsize = EqlMatrix(first, firstsize, temp);
                SetColumn(temp, tempsize, x, second);
                GetDet(temp, tempsize);
                if ((GetDet(temp, tempsize)) != 0)
                {
                    flag2 = 0;
                    break;
                }
                else
                {
                    flag2 = 1;
                }
            }
            if (flag2 == 1)
            {
                cout << " Beskonechno mnogo resheniy";
            }
            else
            {
                cout << " Resheniy net";
            }
        }
        cout << "\n \n Hotite reshit' eshe 1 sistemu(1-yes. 0- no)?:";
        cin >> c;
    }
    return 0;
    cin.get();
    cin.get();
}
0
0 / 0 / 0
Регистрация: 17.03.2015
Сообщений: 16
04.04.2015, 00:05  [ТС] 4
Люди помогите пожалуйста кто чем может,задание очень важное(не для какой-нибудь оценки в школе).
0
Форумчанин
Эксперт CЭксперт С++
8190 / 5040 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
04.04.2015, 00:08 5
Цитата Сообщение от stylingmousse20 Посмотреть сообщение
задание очень важное(не для какой-нибудь оценки в школе).
Так посмотрели бы хотя бы на ссылки, которые вам при создании темы предлагались, а теперь внизу темы висят.
По одной из них, например, я нашёл готовое решение.
Определить класс «Квадратная матрица» – Matrix.
0
0 / 0 / 0
Регистрация: 17.03.2015
Сообщений: 16
05.04.2015, 11:45  [ТС] 6
Поверьте мне,все много раз уже проверил. Там все не то. Мне нужно просто решить систему линейных уравнений методом Крамера, но именно с помощью шаблонов. Без шаблонов я уже выложил решение,оно впринципе работает,но все таки нужны именно шаблоны.

Добавлено через 23 часа 37 минут
Ладно видимо никто не поможет мне. Спасибо и на этом.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.04.2015, 11:45
Помогаю со студенческими работами здесь

Определить базовый класс "Матрица" и класс-потомок "Треугольная матрица"
Нужно определить класс &quot;матрица&quot; с возможностью динамического выделения и освобождения памяти,...

Создать базовый класс "Массив" и класс-наследник "Матрица"
Добрый день! такой вопрос, как задать двумерный массив и заполнить его рандомными числами. и как...

Класс "Матрица". Перегрузка оператора "минус"
Помогите дописать программу или исправить ее. Нужно было написать программу, где создать класс...

является ли введенная с клавиатуры квадратная матрица "магическим" квадратом
Написать программу, которая проверяет, является ли введенная с клавиатуры квадратная матр...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru