Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.12.2008, 12:04   #1
xsix
Пользователь
 
Аватар для xsix
 
Регистрация: 27.12.2008
Сообщений: 20
Лампочка [C++] Объектно-ориентированная среда. Двумерный массив.

Здраствуйте!

Помогите пожалуйста реализовать данную задачу в объектно-ориентированной среде:
Задана матрица А(m,n). Найти вектор B(n), каждый элемент которого равен среднему арифметическому элементов соответствующего столбца матрицы А.

Для задачки нужно также составить диаграмму UML. В которой будут описаны классы их методы и свойства. Если нет желания решать всю задачу, то помогите хотя-бы с диаграммой.

Задачу решил в императивной среде, а в объектной большие трудности у меня...
Вот пример решения в императивной:

Код:
int n,m;
    float sum;
    cout<<"Vvedite kol-vo stolbcov (zeloe chislo): ";
    cin>>m;
    if(m<=0){
        cout<<"Error! Chislo dolgni bit' pologitelnim i >0."<<"\n";
        system("PAUSE");
    return EXIT_SUCCESS;
    }
    cout<<"Vvedte kol-vo strok (zeloe chislo): ";
    cin>>n;
    if(n<=0){

        cout<<"Error! Chislo dolgno bit' pologitelnim i >0."<<"\n";
        system("Pause");
        return EXIT_SUCCESS;
    }
    cout<<"Vvedem elementi matrici:"<<"\n";
    int*matrix=new int[n*m];
    float*k=new float[m];
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cin>>matrix[i*m+j];
            }
        }
        cout<<"Matrica A:"<<"\n";
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cout<<matrix[i*m+j];
            }
        cout<<"\n";
        }
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            sum=sum+matrix[j*m+i];
            }
        k[i]=sum/n;
        sum=0;
        }
    cout<<"B=( ";
    for(int i=0;i<m;i++){
        cout<<k[i]<<" ";
        }
    cout<<")";
system("Pause");
return EXIT_SUCCESS;
}
xsix вне форума Ответить с цитированием
Старый 27.12.2008, 13:17   #2
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,601
По умолчанию

Код:
#include <windows.h>
#include <iostream.h>
#include <time.h>


template <class T>
class matrix
{
	public:	
		matrix(int rows, int columns);
		~matrix();
		manually_set();
		print();
		random();
		set_from_array(T* k);		
		T get_by_index(int y,int x);
		swap_values(int y1,int x1, int y2,int x2);
		set_value(int y1, int x1, T value);
		int getcol();
		int getrow();
		double* sr();

	private:
		T** m;
		int row;
		int col;
};

template <class T>
matrix<T>::matrix(int rows, int columns)
{
	int i;
	if (rows>0 && columns >0)
	{
		m=new T*[rows];
		for (i=0;i<rows;i++)
		{
			m[i]=new T[columns];
		}
	}
	row=rows;
	col=columns;
}

template <class T>
matrix<T>::~matrix()
{
	int i;
	for (i=0;i<row;i++)
		{
			delete[] m[i];
		}
	
	delete[] m;
}

template <class T>
matrix<T>::manually_set()
{
	int i,j;
	for (i=0;i<row;i++)
	{
		for (j=0;j<col;j++)
		{
			cin >> m[i][j];
		}
			
	}
}

template <class T>
matrix<T>::random()
{
	int i,j;
	srand (time(NULL));

	for (i=0 ; i<row; i++)	
		for (j=0; j<col;j++)		
			m[i][j]=rand()%10;

}

template <class T>
int matrix<T>::getcol()
{
	return(col);
}

template <class T>
int matrix<T>::getrow()
{
	return(row);
}

template <class T>
double* matrix<T>::sr()
{
	double* result;
	int i,j,l;
	double sum;

	result=new double[col];
	l=0;

	for(i=0;i<col;i++)
	{
		sum=0;
		for (j=0;j<row;j++)
		{
			sum+=m[j][i];
		}
		sum/=row;
		result[l]=sum;
		l++;
	}

	return(result);

}

template <class T>
matrix<T>::set_from_array( T* k)
{
	int i,j,l;

	for (i=0,l=0;i<row;i++)
	{
		for (j=0;j<col;j++)
		{
			m[i][j]=k[l];			
			l++;
		}
			
	}
}
template <class T>
matrix<T>::set_value(int y1, int x1, T value)
{
	m[y1][x1]=value;
}

template <class T>
T matrix<T>::get_by_index(int i,int j)
{
	if (i>=0 && j>=0 && i<row && j<col)
	{
		return(m[i][j]);
	}
	else
		return(-1);
}

template <class T>
matrix<T>::print()
{
	int i,j;
	for (i=0;i<row;i++)
	{
		for (j=0;j<col;j++)
		{
			cout << m[i][j] << "  ";
		}
		cout << "\n";
			
	}
}

template <class T>
matrix<T>::swap_values(int y1,int x1, int y2,int x2)
{
	T temp;
	temp=m[y1][x1];
	m[y1][x1]=m[y2][x2];
	m[y2][x2]=temp;
}

template <class V>
void print_vector(V m, int sz);


void main()
{
	int x,y;
	cin >> x; // строк
	cin >> y; // столбцов
	matrix<int> tr(x,y);
	double* res;
	tr.random();
	tr.print();
	res = tr.sr();
	cout<<"\n";
	print_vector(res,tr.getcol());
}
template <class V>
void print_vector(V m, int sz)
{
	int i;
	for (i=0 ; i<sz; i++)
	{
		cout << m[i] <<"  ";

	}
	cout <<"\n";
}
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"

Последний раз редактировалось challengerr; 27.12.2008 в 13:29.
challengerr вне форума Ответить с цитированием
Старый 27.12.2008, 16:47   #3
xsix
Пользователь
 
Аватар для xsix
 
Регистрация: 27.12.2008
Сообщений: 20
По умолчанию

Спасибо, но можно добавить небольшое разъяснение, а то не очень понятно... Что-то я не пойму, как мне этот код в Visual Studio запихнуть? Тут два класса присутствуют, я правильно понимаю?

Последний раз редактировалось xsix; 27.12.2008 в 16:54.
xsix вне форума Ответить с цитированием
Старый 27.12.2008, 16:58   #4
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Это же ответ на ваш вопрос, через объекты, их свойства и методы.
Я влез лишь из удивления: объектный подход оказался раза в 3 трудоёмче (чисто визуально)!
Sasha_Smirnov вне форума Ответить с цитированием
Старый 27.12.2008, 17:06   #5
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,601
По умолчанию

Цитата:
Сообщение от xsix Посмотреть сообщение
Спасибо, но можно добавить небольшое разъяснение, а то не очень понятно... Что-то я не пойму, как мне этот код в Visual Studio запихнуть? Тут два класса присутствуют, я правильно понимаю?
Тут только один класс матрицы. Класса вектора нет. Если создавать класс вектора, то нужно и класс матрицы переделывать.

Просто создаешь пустой проект. Вставляешь код в .cpp файл. В Visual Studio должно компилиться без проблем. В других компиляторах из-за использования заголовочного файла windows.h могут быть проблемы. Но сам код должен быть переносимым, никаких специфичных штук для visual studio я не использую.

Методы:
matrix(int rows, int columns); - конструктор
~matrix(); - деструктор
manually_set(); - установить вручную каждый элемент
print(); - напечатать матрицу
random(); - заполнить случайными числами от 0 до 9 (только для удобства печати)
set_from_array(T* k); - запихнуть одномерный массив в матрицу (количество элементов должно совпадать)
T get_by_index(int y,int x); - получить элемент матрицы по номеру столбца и строки
swap_values(int y1,int x1, int y2,int x2); - - поменять местами два элемента матрицы
set_value(int y1, int x1, T value); - установить элемент матрицы
int getcol(); - получить количество столбцов
int getrow(); - получить количество строк
double* sr(); - твоя задача: вычислить среднее арифметическое каждого столбца и записать в одномерный массив (вектор), возвращается указатель на созданный массив.
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 27.12.2008, 17:10   #6
xsix
Пользователь
 
Аватар для xsix
 
Регистрация: 27.12.2008
Сообщений: 20
По умолчанию

Хорошо, если будут проблему... Отпишусь...

Последний раз редактировалось xsix; 27.12.2008 в 17:14.
xsix вне форума Ответить с цитированием
Старый 27.12.2008, 17:13   #7
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,601
По умолчанию

Что значит правильно записать? Какая студия? Код компилиться должен в любой студии.
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 27.12.2008, 17:17   #8
xsix
Пользователь
 
Аватар для xsix
 
Регистрация: 27.12.2008
Сообщений: 20
По умолчанию

Цитата:
Сообщение от challengerr Посмотреть сообщение
Что значит правильно записать? Какая студия? Код компилиться должен в любой студии.
Я имел ввиду Microsoft Visual Studio 08

Последний раз редактировалось xsix; 27.12.2008 в 17:21.
xsix вне форума Ответить с цитированием
Старый 27.12.2008, 17:31   #9
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,601
По умолчанию

В чем конкретно проблема?
Свой код ты как компилишь?

Открываешь проект со своим кодом, который у тебя компилится. Свой код удаляешь, вставляешь вместо своего кода мой, сохраняешь, нажимаешь кнопку Compile. (если ты компилишь в IDE.

Если компилишь не через IDE, то создаешь текстовый файл, вставляешь туда мой код, ставишь расширение файла cpp. У тебя получится файл ИМЯ_ФАЙЛА.cpp

Создаешь bat файл, где пишешь

cl ИМЯ_ФАЙЛА.cpp /nologo /W3 /GX /O2 /D 'WIN32' /D 'NDEBUG' /D '_CONSOLE' /D '_MBCS' /YX /FD /c

link ИМЯ_ФАЙЛА.obj kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ws2_32.lib /nologo /subsystem:console /machine:I386

(Вместо ИМЯ_ФАЙЛА реальное имя файла)

cl и link должны быть прописаны в переменных среды
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 27.12.2008, 17:40   #10
xsix
Пользователь
 
Аватар для xsix
 
Регистрация: 27.12.2008
Сообщений: 20
По умолчанию

Цитата:
Сообщение от challengerr Посмотреть сообщение
В чем конкретно проблема?
Свой код ты как компилишь?
Проблема в том, что мы на занятиях в Визуал студио создавали проект. В нём создавали классы. Каждый класс описывали, писали его методы. Т.е не было единого кода, как в данном случае. Так же пробовал компилировать в DEV++... но пока никак.

Последний раз редактировалось xsix; 27.12.2008 в 17:44.
xsix вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двумерный массив Анжелика Помощь студентам 3 29.12.2008 21:23
Двумерный массив... Seriy8888 Паскаль, Turbo Pascal, PascalABC.NET 1 24.12.2008 21:26
Двумерный массив в С++ Draid Помощь студентам 2 07.03.2008 22:06
Двумерный массив help Imperceptible Паскаль, Turbo Pascal, PascalABC.NET 25 02.03.2007 20:00