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

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

Войти
Регистрация
Восстановить пароль
 
_Loader_
 Аватар для _Loader_
6 / 6 / 0
Регистрация: 18.04.2012
Сообщений: 92
#1

Функция разбиения матрицы на две - C++

21.05.2012, 21:57. Просмотров 752. Ответов 13
Метки нет (Все метки)

Доброго времени суток уважаемые форумчане. Столкнулся с проблемой. Необходимо написать функцию разбиения матрицы на две матрицы, в качестве входных параметров должна быть матрица, а в качестве выходных две матрицы.
Сделал программу, но преподаватель забраковал. В общем надо сделать с помощью функции.
Вот что у меня получилось:
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
#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    cout<<"Input number of rows: "<<endl;
    int k;
    cin>>k;
    cout<<"Input number of cols: "<<endl;
    int m;
    cin>>m;
    typedef vector<vector<int> > Matrix;
 
    Matrix A(k);
    cout<<"Input matrix: "<<endl;
    int temp;
 
    // Заполнение исходной матрицы
    for (int i = 0; i < k; ++i)
        for (int j = 0; j < m; ++j)
        {
            cin>>temp;
            A[i].push_back(temp);
        }
 
        cout<<"Input number of rows of first matrix: "<<endl;
        int k1;
        cin>>k1;
        // Проверка допустимости числа строк
        if (k1 == k)
        {
            while (k1 == k)
            {
                cout<<"Wrong number of rows!"<<endl;
                cout<<"Input number of rows: "<<endl;
                cin>>k1;
            }
        }
 
        // Заполнение первой матрицы    
        Matrix B(k1);
        for (int i = 0; i < k1; ++i)
            for (int j = 0; j < m; ++j)
            {
                B[i].push_back(A[i][j]);            }
// Заполнение второй матрицы    
            int k2 = k - k1;    
            Matrix C(k2);
            for (int i = k1, i1 = 0; i < k; ++i, ++i1)
                for (int j = 0; j < m; ++j)
                {
                    C[i1].push_back(A[i][j]);
                }
 
                // Вывод исходной матрицы
                cout<<"Matrix A: "<<endl;
                for (int i = 0; i < k; ++i)   
                {
                    for (int j = 0; j < m; ++j)
                        cout<<A[i][j]<<" ";
                    cout<<endl;
                }
 
                // Вывод первой матрицы
                cout<<"Matrix A1: "<<endl;
                for (int i = 0; i < k1; ++i)   
                {
                    for (int j = 0; j < m; ++j)
                        cout<<B[i][j]<<" ";
                    cout<<endl;
                }
 
                // Вывод второй матрицы
                cout<<"Matrix A2: "<<endl;
                for (int i = 0; i < k2; ++i)   
                {
                    for (int j = 0; j < m; ++j)
                        cout<<C[i][j]<<" ";
                    cout<<endl;
                }
                system("PAUSE");
 
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.05.2012, 21:57     Функция разбиения матрицы на две
Посмотрите здесь:

Две матрицы C++
C++ Функция: получить две матрицы и вернуть номер матрицы, среднее арифметическое элементов которой максимально
Поменять местами две строки матрицы C++
C++ Функция сравнивает две строки, игнорируя различия в регистрах
C++ Функция разбиения строки в части [C++]
Функция разбиения строки на отдельные слова C++
C++ Функция разбивает строку на две части: до первого вхождения заданного символа и после него
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
21.05.2012, 23:26     Функция разбиения матрицы на две #2
Вы уж тогда напишите, как именно вам нужно разбивать матрицу... Т.е., матрица у вас должна разбиться на произведение двух? Как именно? Это ведь я могу написать A=A*E, где E -- единичная...
_Loader_
 Аватар для _Loader_
6 / 6 / 0
Регистрация: 18.04.2012
Сообщений: 92
21.05.2012, 23:32  [ТС]     Функция разбиения матрицы на две #3
Нужно просто "разделить" ее физически допустим пополам например:

1 2 3 4
5 6 7 8
9 0 1 2
и разделить ее на
1 2
5 6
9 0

3 4
7 8
1 2
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
21.05.2012, 23:49     Функция разбиения матрицы на две #4
Ну, сложностей не вижу. Тут даже 3 варианта.
Первый:
Строки 42-82 выносим в функцию, у нее будет 3 аргумента (кол-во строк, стлобцов и сама исходная матрица), и она будет иметь тип void и ничего возвращать не будет.
Второй:
Строки 42-55 выносим в функцию, аргументы такие же, только теперь у нас будут не матрицы B и C, а обьявим массив матриц Matrix* M=new Matrix[2]; , и это у нас будут матрицы M[0] и M[1]. Возвращаем массив M.
Третий:
Строки 42-55 выносим в функцию, к аргументам добавляем Matrix &B, Matrix &C, которые создаем в основной программе (пустыми) и передаем в функцию. Функция имеет тип void.
_Loader_
 Аватар для _Loader_
6 / 6 / 0
Регистрация: 18.04.2012
Сообщений: 92
22.05.2012, 00:16  [ТС]     Функция разбиения матрицы на две #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        double Funk(int k, int m, Matrix A);
        {
            Matrix* M=new Matrix[2];
            
            // Заполнение первой матрицы    
            Matrix M[1];
            for (int i = 0; i < k1; ++i)
                for (int j = 0; j < m; ++j)
                {
                // M[0].push_back(A[i][j]);         }
                // Заполнение второй матрицы    
                int k2 = k - k1;    
                Matrix M[2];
                for (int i = k1, i1 = 0; i < k; ++i, ++i1)
                    for (int j = 0; j < m; ++j)
                    {
                    //  M[1][i1].push_back(A[i][j]);
                    }
        }
Вот так надо сделать как я понял? это по второму способу.
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
22.05.2012, 00:24     Функция разбиения матрицы на две #6
Только тип функции не double, а Matrix*, и в конце функции дописать return M.
И в основной программе к ним, соответственно, тоже обращаться как к M[0] и M[1].
_Loader_
 Аватар для _Loader_
6 / 6 / 0
Регистрация: 18.04.2012
Сообщений: 92
22.05.2012, 00:34  [ТС]     Функция разбиения матрицы на две #7
C++
1
Matrix M[0];
тут пишет ошибку что массив должен быть больше нуля.
C++
1
M[0].push_back(A[i][j]);
тут не дает доступ.
C++
1
    return (M);
не работает, выдает ошибку.
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
22.05.2012, 00:40     Функция разбиения матрицы на две #8
Ага... У вас ошибки в строках 6 и 13. В Си массивы номеруются с 0, потому там не M[1] и M[2], а M[0] и M[1]...
Киньте ваш класс Matrix, пожалуйста...
Цитата Сообщение от _Loader_ Посмотреть сообщение
не работает, выдает ошибку
Какую именно?
_Loader_
 Аватар для _Loader_
6 / 6 / 0
Регистрация: 18.04.2012
Сообщений: 92
22.05.2012, 00:46  [ТС]     Функция разбиения матрицы на две #9
Это полный код программы, больше я ни чего не подключал. Matrix находится в Vector.
Ошибок куча, попробуйте его скомпилировать если не затруднит.
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
22.05.2012, 00:59     Функция разбиения матрицы на две #10
Тогда можете кинуть полный код, со всеми исправлениями?
_Loader_
 Аватар для _Loader_
6 / 6 / 0
Регистрация: 18.04.2012
Сообщений: 92
22.05.2012, 01:03  [ТС]     Функция разбиения матрицы на две #11
Вот полный код:
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
#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    cout<<"Input number of rows: "<<endl;
    int k;
    cin>>k;
    cout<<"Input number of cols: "<<endl;
    int m;
    cin>>m;
    typedef vector<vector<int> > Matrix;
 
    Matrix A(k);
    cout<<"Input matrix: "<<endl;
    int temp;
 
    // Заполнение исходной матрицы
    for (int i = 0; i < k; ++i)
        for (int j = 0; j < m; ++j)
        {
            cin>>temp;
            A[i].push_back(temp);
        }
 
        cout<<"Input number of rows of first matrix: "<<endl;
        int k1;
        cin>>k1;
        // Проверка допустимости числа строк
        if (k1 == k)
        {
            while (k1 == k)
            {
                cout<<"Wrong number of rows!"<<endl;
                cout<<"Input number of rows: "<<endl;
                cin>>k1;
            }
        }
 
        Matrix* Funk(int k, int m, Matrix A);
        {
            Matrix* M=new Matrix[2];
            
            // Заполнение первой матрицы    
            Matrix M[0];
            for (int i = 0; i < k1; ++i)
                for (int j = 0; j < m; ++j)
                {
                 M[0].push_back(A[i][j]);           }
                // Заполнение второй матрицы    
                int k2 = k - k1;    
                Matrix M[2];
                for (int i = k1, i1 = 0; i < k; ++i, ++i1)
                    for (int j = 0; j < m; ++j)
                    {
                    M[1][i1].push_back(A[i][j]);
                    }
                    return (M);
        }
                // Вывод исходной матрицы
                cout<<"Matrix A: "<<endl;
                for (int i = 0; i < k; ++i)   
                {
                    for (int j = 0; j < m; ++j)
                        cout<<A[i][j]<<" ";
                    cout<<endl;
                }
 
                // Вывод первой матрицы
                cout<<"Matrix A1: "<<endl;
                for (int i = 0; i < k1; ++i)   
                {
                    for (int j = 0; j < m; ++j)
                        cout<<M[0][i][j]<<" ";
                    cout<<endl;
                }
 
                // Вывод второй матрицы
                cout<<"Matrix A2: "<<endl;
                for (int i = 0; i < k2; ++i)   
                {
                    for (int j = 0; j < m; ++j)
                        cout<<M[1][i][j]<<" ";
                    cout<<endl;
                }
                system("PAUSE");
 
                return 0;
}
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
22.05.2012, 01:55     Функция разбиения матрицы на две #12
Кинь мне stdafx, что-то его у меня нет...
MrGluck
Ворчун
Эксперт CЭксперт С++
 Аватар для MrGluck
6227 / 3472 / 424
Регистрация: 29.11.2010
Сообщений: 9,178
22.05.2012, 02:36     Функция разбиения матрицы на две #13
Цитата Сообщение от UFO94 Посмотреть сообщение
Кинь мне stdafx, что-то его у меня нет...
Ты уверен, что тебе так нужен этот предкомпилированный заголовок? Фактически, это просто перечень тех же инклюдов. Пока что не существует ни одной программы, которая не смогла бы обойтись без этого файла. Хочешь - можешь создать свой такой.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.05.2012, 10:12     Функция разбиения матрицы на две
Еще ссылки по теме:

C++ Написать программу разбиения строки на две части: до первого вхождения заданного символа и после него
Считать с файла две матрицы и перемножить их C++
C++ Функция, сравнивающая две строки, игнорируя количество пробелов между словами
C++ Перемножить две матрицы
C++ Как сложить две матрицы ?

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

Или воспользуйтесь поиском по форуму:
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
22.05.2012, 10:12     Функция разбиения матрицы на две #14
Просто я не знаю, какие именно инклуды там. Если я пытаюсь подключить stdafx, то оно его не находит. Если не подключаю, то программа ругается дальше по тексту...
Yandex
Объявления
22.05.2012, 10:12     Функция разбиения матрицы на две
Ответ Создать тему
Опции темы

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