Помощь - Поиск - Пользователи - Календарь
Полная версия: Работа с классами
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
Triplet
Скажите, пожалуйста, почему программа не компилируется?
Необходимо найти максимум в матрице.

// T02(01).cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
using namespace std;
#include <stdlib.h>
#include <math.h>

class MASS
{private:
int a[50][50];
public:
int n;int m;
int i,j;
MASS();
void getdata()
{cin >> n;
cin >> m;
};
void getmatrix()
{for (i=1;i<=n;i++)
{for (j=1;j<=m;j++)
{cin >> a[i][j];};};
};
void sort(int max, int i,int j,int n1,int m1)
{max=a[1][1];n1=n;m1=m;
for (i=1;i<=n1;i++)
{for (j=1;j<=m1;j++)
{if (a[i][j]>max){max=a[i][j];};
};
};
};
void putdata()
{cout << max;}
};

int _tmain(int argc, _TCHAR* argv[])
{MASS a;
MASS n;MASS m;MASS max;
cout << "Enter n,m" << "\n";
n.getdata();
m.getdata();
cout << "Enter matrix" << "\n";
a.getmatrix();
max.putdata();
return 0;
}
volvo
Цитата
почему программа не компилируется?
Потому, что написана неправильно...

Уточни, тебе надо создать свой класс "матрица", в котором найти максимум, или просто написать программу, находящую максимум в матрице, средствами С++ ?
Triplet
надо создать свой класс "матрица", в котором найти максимум
Вообще у меня задание: дать определение класса, определить все необходимые методы и получить решение задачи(поиск максимума в матрице) в соответствии с принципом инкапсуляции
volvo
Ну, вот ... А теперь посмотри, что ты делаешь... Вроде бы описан класс MASS, который и должен представлять эту самую матрицу, но почему-то m и n (которые уже есть внутри класса, и вроде бы задают размеры матрицы), в основной программе объявлены опять же как MASS... Не надо этого делать...

Ты уже определила их внутри класса, на этом и основан принцип инкапсуляции - класс MASS должен скрыть от пользователя детали реализации. В идеале - все, что пользователь должен сделать - это:

...
int main() {
MASS mx(3, 3); // <--- Ну, или ввести размерность с клавиатуры

cin >> mx;
cout << "Максимум = " << mx.get_max() << endl;
return 0;
}


Все остальное должно делаться внутри класса "матрица": и ввод значений элементов, и вычисление (при вызове get_max) максимума... Пользователю в основной программе совсем не обязательно знать, как это делается, и какие переменные (и каких типов) при этом используются...
Triplet
Спасибо большое!
Я ещё только начала изучать ООП, так что мне пока не всё понятно. Постараюсь переделать программу...
Ещё раз спасибо.
Triplet
Я переделала, но что-то всё равно не так:
// T02(01).cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
using namespace std;
#include <stdlib.h>
#include <math.h>

class MASS
{private:
int a[50][50];
public:
int i,j,max;
MASS();
void getmatrix()
{for (i=0;i<=3;i++)
{for (j=0;j<=3;j++)
{cin >> a[i][j];};};
};
void get_max()
{max=a[0][0];
for (i=0;i<=3;i++)
{for (j=0;j<=3;j++)
{if (a[i][j]>max){max=a[i][j];};
};
};
cout << max;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
MASS mx(3, 3);
cin >> mx.getmatrix();
cout << "Максимум = " << mx.get_max() << endl;
return 0;
}

volvo
Вот так определяем сам класс:
class Matrix {
friend istream& operator >> (istream&, Matrix&);
private:
int a[50][50];
int m, n;
public:
Matrix(int size_m, int size_n): m(size_m), n(size_n) {
}

int get_max() {
int max_val = a[0][0];
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
if(max_val < a[i][j]) max_val = a[i][j];
}
}
return max_val;
}

};

// Это - чтобы ввод осуществлялся, как и для любого встроенного типа, через >>
istream& operator >> (istream &is, Matrix &mx) {
for(int i = 0; i < mx.n; i++) {
for(int j = 0; j < mx.m; j++) {
cin >> mx.a[i][j];
}
}
return is;
}



А вот основная программа:
...
Matrix mx(3, 3);
cin >> mx;
cout << "max = " << mx.get_max() << endl;
return 0;
...

(MSVC не держу, проверял на другом компиляторе, поэтому не привожу код полностью...)
Triplet
Большое спасибо!
Triplet
А если надо построить иерархию классов и показать простое наследование для этой же задачи, то второй класс - это класс чего?
volvo
Цитата
второй класс - это класс чего?
Странный вопрос... Чего сделаешь - того и будет. Зачем "за уши" притягивать наследование? Просто чтобы было? Ну, к примеру, класс "Квадратная матрица" может наследоваться от "простой" (прямоугольной) матрицы. Поскольку квадратная матрица является матрицей специального вида - это будет правомерно с точки зрения ООП.

Ну, а в качестве примера того, чем же квадратная матрица настолько отличается от прямоугольной - обратная матрица может быть только у квадратной, но никак не у матрицы общего вида...
Triplet
Цитата(volvo @ 9.12.2007 19:15) *
Зачем "за уши" притягивать наследование? Просто чтобы было?
Это у меня такое второе задание rolleyes.gif
Triplet
У меня получилось вот так(т.е. я хотела показать иерархию классов и простое наследование) Я хоть в правильном направлении двигаюсь или это совсем бред написан?
//9_4.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
using namespace std;
#include <stdlib.h>
#include <math.h>

class Matrix {
friend istream& operator >> (istream&, Matrix&);
public:
int a[50][50];
int m, n;
Matrix(int size_m, int size_n): m(size_m), n(size_n) {
}
int get_max() {
int max_val = a[0][0];
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
if(max_val < a[i][j]) max_val = a[i][j];
}
}
return max_val;
}
};
class Matrix01:public Matrix
{int b[3][3];int m, n;
Matrix01(int size_m, int size_n): m(size_m), n(size_n) {}

istream& operator >> (istream &is, Matrix01 &mx) {
for(int i = 0; i < mx.n; i++) {
for(int j = 0; j < mx.m; j++) {
cin >> mx.a[i][j];}}
return is;
};
Matrix::get_max();
};
int _tmain(int argc, _TCHAR* argv[])
{
Matrix01 mx(3, 3);
cin >> mx;
cout << "max = " << mx.get_max() << endl;
return 0;
}
volvo
Цитата
Я хоть в правильном направлении двигаюсь
Не очень... Ты забываешь, что при наследовании тебе не надо переопределять члены класса. Они уже есть, и к ним у тебя есть доступ (поскольку public-наследование)... Вот этого вполне достаточно:

...
class Matrix01: public Matrix {
public:
Matrix01(int size_m, int size_n): Matrix(size_m, size_n) {
}
};
...


Переопределять операцию ввода тоже не имеет смысла - будет использоваться ">>" базового класса...
Triplet
Спасибо большое!
Мне ещё учиться и учиться...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.