Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

Что-то в шаблоне не так - C++

25.12.2012, 07:49. Просмотров 276. Ответов 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
#include <iostream>
#include <conio.h>
#include <numeric>
#include <cstdlib>
 
using namespace std;
 
template <int n, typename T> class MAS{
    private:
        T *mas;
    public:
        MAS(T *mas1){
            mas=new T[n];
            for(int i=0; i<n; i++)
                mas[i]=mas1[i];
        }
        MAS create();
        T max_zna();
        int zero1();
        int zero2();
        T Mul_inter_zer();
        void inversion();
        void print();
};
 
int main(int argc, char *argv[]){
    setlocale(LC_ALL, "Russian");
    int n=15;
    int  mas1[]={-1, 2, 0, -3, 4, 5, -6, 7, 8, -9, 0, -5, 13, 4, -15};
    float mas[]={-1.2, 2.7, 0, -3.4, 0.4, 5.5, -6.1, 7, 8, -9.9, 0, -5.4, 13.2, 4.8, -15.6};
 
    cout << endl << "*** Пример для вещественных значений ***" << endl;
    MAS <15, float> m(mas);
    m.print();
    cout << "Максимальный элемент: "                    << m.max_zna()     << endl;
    cout << "Произведение эл-ов между двумя нулевыми: " << m.Mul_inter_zer() << endl;
    m.inversion();
    m.print();
 
    cout << endl << "*** Пример для целых значений ***"<<endl;
    MAS <15, int> m1(mas1);
    m1.print();
    cout << "Максимальный элемент: "                    << m1.max_zna()     << endl;
    cout << "Произведение эл-ов между двумя нулевыми: " << m1.Mul_inter_zer() << endl;
    m1.inversion();
    m1.print();
 
    system("PAUSE");
    return EXIT_SUCCESS;
}
 
template <int n, typename T> MAS<n,T> MAS<n,T>::create(){
    int nn;
    T *mas1;
    cout << "Input demention" << endl;
    do{
        cin >> nn;
    }
    while(nn<0);
 
    mas1=new T [nn];
    cout << "Input " << nn << " elements" << endl;
    for(int i=0; i<nn; i++)
        cin >> mas1[i];
    MAS m(mas1, nn);
    *this = m;
    return m;
}
 
template <int n, typename T> T MAS<n,T>::max_zna(){
    T max=0;
    for (int i=0; i<n; i++)
        if (mas[i]>max)
            max=mas[i];
    return max;
}
 
template <int n, typename T> int MAS<n,T>::zero1(){
    int zero1=0;
    for(int i=0; i<n; i++){
        if(mas[i]==0){
            zero1=i;
            break;
        }
    }
    return zero1;
}
 
template <int n, typename T> int MAS<n,T>::zero2(){
    int zero2;
   for(int i=0; i<n; i++){
        if(mas[i]==0){
            zero2=i;
        }
    }
    return zero2;
}
 
template <int n, typename T> T MAS<n,T>::Mul_inter_zer(){
    T p=1;
    for(int i=zero1()+1; i<zero2(); i++)
        p=p*mas[i];
    return p;
}
 
template <int n, typename T> void MAS<n,T>::inversion(){
    T c;
    for (int i=0; i<n/2;i++){
        c=mas[i];
        mas[i]=mas[n-i-1];
        mas[n-i-1]=c;
    }
}
 
template <int n, typename T> void MAS<n,T>::print(){
    int i;
    for(int i=0; i<n; i++)
        cout << "Эл-нт ["<< i << "] = " << mas[i] << endl;
    cout << '\n';
}


...делаю все так же для двумерного массива (матрицы), и Code::Blocks не распознает функцию MATR, говорит нет мол её. А я уже чувствую себя сумасшедшим. В чем ошибка? Далее второй код(неправильный). P.S. До того как я начал зашаблонивать, в лоб и через функции она работала.

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
#include <iostream>
#include <stdlib.h>
#include <numeric>
#include <conio.h>
 
using namespace std;
 
template <int n, typename T> class MATR{
    private:
        T **mat;
    public:
        MATR(T **mat1, int nn){
            mat=new T *[nn];
            for(int i=0; i<nn; i++)
                mat[i]=new T[n];
            for(int i=0; i<nn; i++)
                for(int j=0; j<nn; j++)
                    mat[i][j]=mat1[i][j];
        }
        MATR create();
        void sum_negative();
        T rows_and_colums();
        void print();
};
 
int main(int argc, char **argv[]){
    setlocale(LC_ALL, "Russian");
    int n = 8;
    int mat1[8][8]={{-1 ,  2 ,  3 , -4 ,  5 ,  6 ,  7 ,   8},
                    { 2 ,  3 ,  3 ,  5 ,  9 ,  8 ,  5 ,   9},
                    { 3 ,  4 ,  5 ,  6 ,  6 ,  7 ,  4 ,  10},
                    {-4 ,  5 ,  6 ,  7 ,  8 ,  9 , 10 ,  11},
                    { 5 ,  3 ,  4 ,  8 , 10 ,  9 ,  4 ,  12},
                    { 6 ,  5 ,  2 ,  9 ,  3 ,  1 , 11 ,  13},
                    { 7 , 14 , 15 , 10 , 11 ,  3 ,  2 ,  14},
                    { 8 ,  9 , 10 , 11 , 12 , 13 , 14 , -15}};
 
    float mat[8][8]={{-1.1 , 2.1 ,  3.1 , -4.1 ,  5.1 ,  6.1 ,  7.1 ,   8.1},
                     { 2.1 , 3.2 ,  3.3 ,  5.2 ,  9.8 ,  8.5 ,  5.9 ,   9.3},
                     { 3.1 , 4.3 ,  5.4 ,  6.3 ,  6.4 ,  7.4 ,  4.1 ,  10.4},
                     {-4.1 , 5.2 ,  6.3 ,  7.4 ,  8.5 ,  9.6 , 10.7 ,  11.8},
                     { 5.1 ,   3 ,    4 ,  8.5 , 10.2 ,  9.4 ,  4.9 ,  12.5},
                     { 6.1 ,   5 ,    2 ,  9.6 ,  3.2 ,  1.2 , 11.5 ,  13.6},
                     { 7.1 ,  14 ,   15 , 10.7 , 11.2 ,  3.2 ,  2.3 ,  14.7},
                     { 8.1 , 9.3 , 10.4 , 11.8 , 12.5 , 13.6 , 14.7 , -15.8}};
 
    cout << endl << "*** Пример для вещественных значений ***"<<endl;
    MATR <8, float> m(mat);
    m.print();
    m.rows_and_colums();
    m.sum_negative();
 
    cout << endl << "*** Пример для целых значений ***"<<endl;
    MATR <8, int> m1(mat1);
    m1.print();
    m1.rows_and_colums();
    m1.sum_negative();
 
    system("PAUSE");
    return EXIT_SUCCESS;
}
 
template <int n, typename T> MATR<n,T> MATR<n,T>::create(){
    int i,j;
    cout << "Input demtntion" << endl;
    do
        cin >> n;
    while(n<0);
 
    mat=new T *[n];
    for(i=0; i<n; i++)
        mat[i]=new T [n];
    cout << "Input " << n*n << " elements" << endl;
    for(i=0; i<n; i++)
        for(j=0; j<n; j++)
            cin >> mat[i][j];
    MATR m(mat);
    *this=m;
    return m;
}
 
template <int n, typename T> void MATR<n,T>::sum_negative(){
    int i,j;
    T *sum;
    sum=new T [n];
    for(i=0; i<n; i++){
        sum[i]=0;
        for(j=0; j<n; j++){
            if(mat[i][j]<0){
                sum[i]+=mat[i][j];
            }
        }
    }
    cout << "Сумма эл-ов строки с отрицательными эл-ми" << endl;
    for(i=0; i<n; i++)
        cout << sum[i] << ' ';
    cout << endl;
}
 
template <int n, typename T> T MATR<n,T>::rows_and_colums(){
    bool matches[n];
    int flag;
    int mat1[8][8];
    for(int i=0; i<=n; i++){
        matches[i] = 0;
        flag = 0;
        for(int j=0; j<=n; j++){
            if (mat1[i][j] == mat1[j][i])
                flag++;
        }
        if (flag == n)
            matches[i] = 1;
        cout << endl;
    }
    cout << endl;
    for (int i=0; i<=n; i++){
        if (matches[i])
            cout << "\nСовпадают строка и столбец под номером: " << i;
    }
    return 0;
}
 
template <int n, typename T> void MATR<n,T>::print(){
    int i,j;
    for(i=0; i<n; i++){
        for(j=0; j<n; j++){
            cout.width(5);
            cout << mat[i][j];
        }
        cout << endl;
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.12.2012, 07:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Что-то в шаблоне не так (C++):

Что означает using typename в шаблоне? - C++
template &lt; typename T &gt; class Class_name { public: using value_type = T; ... что произошло в этом месте?...

Как сделать так что я мог умножать не на два числа а на 3,4,5 и так далее? - C++
Вот код: #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int main(){ float a,c; char b; skip: ...

Что в коде ни так? while не работает так, как ожидаю - C++
Написанный код, как я думаю, должен выдавать цифры от 0 до 1000, столбиком. Но выдает начиная от 702 до 1000. Что ни так понимаю, где...

Что-то не то с Майкрсофт визуал студио 2010 или я что-то не так делаю - C++
Дело в том что при запуске вот этой программы: #include &lt;iostream&gt; using namespace std; int main () { for (int i=100; i&lt;=999;...

Что в программе делает так, что процессор грузится на 100%? - C++
Я не очень разбираюсь в С++, поэтому прошу вашей подсказки по поводу нагрузки на процессор. Вот код программы, на компьютере жрет всю...

Список: Что не так с выводом списка, потому что выводится какой-то мусор? - C++
#include &lt;iostream&gt; using namespace std; struct point { int data;//информационное поле-это даннные объявленного или используемого...

4
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
25.12.2012, 08:20 #2
В первом случае массив (mas/mas1) неявно приводится к указателю, но такое преобразование работает только один раз, т.е. двумерный массив может быть преобразован максимум к указателю на массив, но не к указателю на указатель.

Добавлено через 2 минуты
Можно попробовать добавить явное приведение к указателю на указатель при передаче аргумента, но я вообще не уверен, корректно ли это.

Добавлено через 10 минут
Или добавь конструктор из ссылки на двумерный массив, примерно так:
C++
1
2
3
explicit MATR(T const (&array)[n][n]) {
   // ...
}
1
Андрей0792
0 / 0 / 0
Регистрация: 10.04.2011
Сообщений: 16
25.12.2012, 22:03  [ТС] #3
Не получилось у меня. С преподом сегодня говорил по этому поводу - он тоже в ступор впал. Я Даже уже начал грешить может последовательности в функции и вызове путаю, но тоже всё норм.

Я понимаю, что через рандомные матрицы было бы проще вызывать, но у меня в условии задания пункт, в котором прога должна выводить совпадающие строки и столбцы. Поэтому пришлось вручную. Мне в универе предложили добавить нулевую рандомную матрицу, но я не знаю как её тут присобачить и вообще с какого бока начать. Может у кого-то есть идеи?
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
25.12.2012, 22:22 #4
Андрей0792, я ничего не понял) Поправил код из первого поста, чтобы он хотя бы компилировался:
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
#include <iostream>
#include <cstdlib>
#include <numeric>
//#include <conio.h>
#include <algorithm>
 
 
using namespace std;
 
template <int n, typename T> class MATR{
    private:
        T **mat;
    public:
        MATR(T **mat1, int nn){
            mat=new T *[nn];
            for(int i=0; i<nn; i++)
                mat[i]=new T[n];
            for(int i=0; i<nn; i++)
                for(int j=0; j<nn; j++)
                    mat[i][j]=mat1[i][j];
        }
        
        explicit MATR(T const (&array)[n][n]) {
           mat = new T *[n];
           for (int i = 0; i != n; ++i) {
              mat[i] = new T[n];
              std::copy(&array[i][0], &array[i][0] + n, &mat[i][0]);
           }
        }
 
        ~MATR() {
           for (int i = 0; i != n; ++i) {
              delete[] mat[i];
           }
           delete[] mat;
        }
        
        //MATR create();
        void sum_negative();
        T rows_and_colums();
        void print();
};
 
int main() {
    //setlocale(LC_ALL, "Russian");
    int n = 8;
    int mat1[8][8]={{-1 ,  2 ,  3 , -4 ,  5 ,  6 ,  7 ,   8},
                    { 2 ,  3 ,  3 ,  5 ,  9 ,  8 ,  5 ,   9},
                    { 3 ,  4 ,  5 ,  6 ,  6 ,  7 ,  4 ,  10},
                    {-4 ,  5 ,  6 ,  7 ,  8 ,  9 , 10 ,  11},
                    { 5 ,  3 ,  4 ,  8 , 10 ,  9 ,  4 ,  12},
                    { 6 ,  5 ,  2 ,  9 ,  3 ,  1 , 11 ,  13},
                    { 7 , 14 , 15 , 10 , 11 ,  3 ,  2 ,  14},
                    { 8 ,  9 , 10 , 11 , 12 , 13 , 14 , -15}};
 
    float mat[8][8]={{-1.1 , 2.1 ,  3.1 , -4.1 ,  5.1 ,  6.1 ,  7.1 ,   8.1},
                     { 2.1 , 3.2 ,  3.3 ,  5.2 ,  9.8 ,  8.5 ,  5.9 ,   9.3},
                     { 3.1 , 4.3 ,  5.4 ,  6.3 ,  6.4 ,  7.4 ,  4.1 ,  10.4},
                     {-4.1 , 5.2 ,  6.3 ,  7.4 ,  8.5 ,  9.6 , 10.7 ,  11.8},
                     { 5.1 ,   3 ,    4 ,  8.5 , 10.2 ,  9.4 ,  4.9 ,  12.5},
                     { 6.1 ,   5 ,    2 ,  9.6 ,  3.2 ,  1.2 , 11.5 ,  13.6},
                     { 7.1 ,  14 ,   15 , 10.7 , 11.2 ,  3.2 ,  2.3 ,  14.7},
                     { 8.1 , 9.3 , 10.4 , 11.8 , 12.5 , 13.6 , 14.7 , -15.8}};
 
    cout << endl << "*** Пример для вещественных значений ***"<<endl;
    MATR <8, float> m(mat);
    m.print();
    m.rows_and_colums();
    m.sum_negative();
 
    cout << endl << "*** Пример для целых значений ***"<<endl;
    MATR <8, int> m1(mat1);
    m1.print();
    m1.rows_and_colums();
    m1.sum_negative();
 
    system("PAUSE");
    return EXIT_SUCCESS;
}
 
//template <int n, typename T> MATR<n,T> MATR<n,T>::create(){
//    int i,j;
//   cout << "Input demtntion" << endl;
//    do
//        cin >> n;
//    while(n<0);
// 
//    mat=new T *[n];
//    for(i=0; i<n; i++)
//        mat[i]=new T [n];
//    cout << "Input " << n*n << " elements" << endl;
//    for(i=0; i<n; i++)
//       for(j=0; j<n; j++)
//            cin >> mat[i][j];
//    MATR m(mat);
//    *this=m;
//    return m;
//}
 
template <int n, typename T> void MATR<n,T>::sum_negative(){
    int i,j;
    T *sum;
    sum=new T [n];
    for(i=0; i<n; i++){
        sum[i]=0;
        for(j=0; j<n; j++){
            if(mat[i][j]<0){
                sum[i]+=mat[i][j];
            }
        }
    }
    cout << "Сумма эл-ов строки с отрицательными эл-ми" << endl;
    for(i=0; i<n; i++)
        cout << sum[i] << ' ';
    cout << endl;
}
 
template <int n, typename T> T MATR<n,T>::rows_and_colums(){
    bool matches[n];
    int flag;
    int mat1[8][8];
    for(int i=0; i<=n; i++){
        matches[i] = 0;
        flag = 0;
        for(int j=0; j<=n; j++){
            if (mat1[i][j] == mat1[j][i])
                flag++;
        }
        if (flag == n)
            matches[i] = 1;
        cout << endl;
    }
    cout << endl;
    for (int i=0; i<=n; i++){
        if (matches[i])
            cout << "\nСовпадают строка и столбец под номером: " << i;
    }
    return 0;
}
 
template <int n, typename T> void MATR<n,T>::print(){
    int i,j;
    for(i=0; i<n; i++){
        for(j=0; j<n; j++){
            cout.width(5);
            cout << mat[i][j];
        }
        cout << endl;
    }
}
http://liveworkspace.org/code/1HVJW9
1
Андрей0792
0 / 0 / 0
Регистрация: 10.04.2011
Сообщений: 16
25.12.2012, 23:18  [ТС] #5
Спасибо. Тебе хоть как-то удалось заставить её работать. Есть правда одно но. Он не видит функцию m.rows_and_colums(проверяет строки и столбцы на совпадения, а в каждой матрице у меня по три таких) =(
Но всё равно спасибо.
0
25.12.2012, 23:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.12.2012, 23:18
Привет! Вот еще темы с ответами:

Лучший интерактивный самоучитель с++, но так понравился, что думаю, а что если после python изучать с++? - C++
http://academy.cppstudio.com/courses/ 1.) поделитесь опытом после какого языка вы перешли на с++. 2.) Что вам нравится/не очень в языке...

Как сделать так,что бы при введение,например 0;0 выдавалось сообщение,что точка находится на границе? - C++
#include &lt;iostream&gt; using namespace std; int main(){ double x, y; int R=10 cout &lt;&lt; &quot;Введите x: &quot; &lt;&lt;...

Ребят Незнаю что делать при запуске на компилирование выдает ошибку.Кто понимает что не так скажите а если не затруднит исправьте ошибку - C++
Разговаривал с двумя преподами говорят что проект не правильно создавал,хотя все правильно из группы спрашивал у парней говорят что не...

Что не так? - C++
Помогите пожалуйста задание в документе вот код что в нём не так? #include&lt;iostream&gt; #include&lt;math.h&gt; #include&lt;iomanip&gt; ...


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

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

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