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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2014, 12:00   #1
East Undia Trading
Форумчанин
 
Регистрация: 02.10.2013
Сообщений: 231
По умолчанию Доработка программы.Классы.Язык С++.

Главная задача - научиться работать с классами.Разбил программу на три части 1)создание матрицы 2)работа с ней 3)вывод на экран.На данный момент самые острые ошибки: неправильная работа с приватными элементами, я конечно потыкал, но так и не нашел решения, Я не понимаТ как их правильно передать в функции main.И еще вопрос, мне обязательно использовать set и get функции, вроде, в С++ это не принципиально?
Задание:
Цитата:
Дана целочисленная матpица A[ij],i,j=1,.,., n. Характе-
ристикой строки целочисленной матрицы назовем среднее ариф-
метическое ее ненулевых элементов.
Получить целочисленную матpицу B[ij],i,j=1,...,n, поме-
щая в нее строки из матрицы А в порядке роста их характерис-
тик.
Мое решение:
Код:
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
class matr
{
private: 
	int j, i, A[5][5], B[5][5], n = 5, cmin, k = 0;
	double  min, buf;
	bool f[5];
public:
	int RandMatr(int j, int i, int A[5][5]) //Рандомные цифры до 9
	{
		for (j = 0; j<n; ++j)
		for (i = 0; i<n; ++i)
			A[j][i] = 1 + rand() % 9;
		for (j = 0; j<n; ++j)               //вывожу на экран  
		{
			for (i = 0; i<n; ++i)
				cout << "  " << A[j][i];
			cout << "\n";
		}
	}
	int search(int k, int n, int i, int j, int F[5]) /* не уверен правильно ли я передаю параметры, 
		на счет передачи массива точно не уверен*/
	{
		while (k<n)
		{
			for (i = 0; i < n; ++i)
			{
				if (i == 0)
				{
					for (j = 0; j < n; ++j)
					{
						min += A[i][j];
					}
					min = min / n;
					cmin = i;
				}
				if (i>0 && f[i] == false)
				{

					for (j = 0; j < n; ++j)
					{
						buf += A[i][j];
					}
					buf = buf / n;
					if (buf <= min)
					{
						min = buf;
						cmin = i;

					}

				}

			}
			if (k == n - 1)
			{
				for (i = 0; i<n; i++)
				{
					if (f[i] == false)
					{
						cmin = i;
					}
				}
			}
			f[cmin] = true;
			for (j = 0; j < n; j++)
			{
				B[k][j] = A[cmin][j];
			}
			k = k + 1;
		}
	}

	int show(int j, int i, int n, int B[5][5])
	{
		for (j = 0; j<n; ++j)
		{
			for (i = 0; i<n; ++i)
				cout << "  " << B[j][i];
			cout << "\n";
		}
	}


};
int main(void)
{
	setlocale(LC_ALL, "rus");
	matr NewMatr;                               // объявляю объект матрица
	NewMatr.RandMatr(j, i, A[5][5]);            /*должно создать матрицу с рандомными элементами, 
	плохо представляю что я должен передать*/
	NewMatr.search(A[j][i]);                   
	NewMatr.show();                             //вывожу на экран
	return 0;
}

Последний раз редактировалось Stilet; 31.03.2014 в 13:10.
East Undia Trading вне форума Ответить с цитированием
Старый 31.03.2014, 13:27   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Поправил свой пост. Предлагаю такую стратегию.
Код:
// rrr.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
class matr
{
private: 
	int j, i, **A, **B, n, cmin, k,*idx;
	double  *avg;
public:
	matr(int nn){
		n = nn; k = 0;
		RandMatr();
		show(A);
	};
	~matr(){
		for(i=0;i<n;i++) delete A[i]; delete A;delete avg;delete idx;
	}
	void RandMatr() //Рандомные цифры до 9
	{
		A=new int*[n];
		avg=new double[n];
		idx=new int[n];
		for (j = 0; j<n; ++j){
			A[j]=new int[n];
			int cnt=0;
			for (i = 0; i<n; ++i){
				A[j][i] = 1 + rand() % 9;
				if(A[j][i]){cnt++;avg[j]+=A[j][i];}
			}
			avg[j]/=cnt;
		}
	}
	
	void sort(){
		for(i=0;i<n;i++) idx[i]=i;
		for(i=0;i<n;i++) for(j=0;j<n;j++) if(avg[idx[i]]<avg[idx[j]]){k=idx[j]; idx[j]=idx[i]; idx[i]=k;};
		return;
	}

	void showSorted()
	{cout << "\n";
		for (j = 0; j<n; ++j)
		{
			for (i = 0; i<n; ++i)
				cout << "  " << A[idx[j]][i];
			cout << "\n";
		}
	}

	void show(int **m)
	{cout << "\n";
		for (j = 0; j<n; ++j)
		{
			for (i = 0; i<n; ++i)
				cout << "  " << m[j][i];
			cout << "\n";
		}
	}


};

int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "rus");
	matr *m=new matr(5);                               // объявляю объект матрица
	m->RandMatr();            /*должно создать матрицу с рандомными элементами, 
	плохо представляю что я должен передать*/
	//m->search();
	m->sort();
	m->showSorted();
    cin.get();
	delete m;
	return 0;
}
Внимание!: Это идея а не копипаста.
I'm learning to live...

Последний раз редактировалось Stilet; 31.03.2014 в 13:35.
Stilet вне форума Ответить с цитированием
Старый 31.03.2014, 15:05   #3
East Undia Trading
Форумчанин
 
Регистрация: 02.10.2013
Сообщений: 231
По умолчанию

Цитата:
Внимание!: Это идея а не копипаста.
Я сильный - я сдержусь.

Stilet, самые душераздирающий вопрос, зачем указатель на указатель, в чем главная идея?
Код:
~matr(){
		for (i = 0; i<n; i++) delete A[i]; delete A; delete avg; delete idx;
	}
Конструктор, верно?
Очень сложная сортировка.
Код:
matr *m = new matr(5);
Динамически выделяем память для указателя на объекта?

Последний раз редактировалось East Undia Trading; 31.03.2014 в 15:23.
East Undia Trading вне форума Ответить с цитированием
Старый 31.03.2014, 15:25   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
зачем указатель на указатель
Чтоб удобно было работать с двумерным массивом. Почитай как в Си многомерные массивы динамические создаются. Можно и просто указателем обойтись, но придется высчитывать координаты самостоятельно.
Цитата:
в чем главная идея?
Во-первых в отсутствии явных ошибок.
Во-вторых в методе сортировки.

Короче сравни свой код и мой. Посмотри внимательно как я работаю с классами и как это делаешь ты.
И опять повторяю в который раз: Школота любит телепатов. Имей это ввиду.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 31.03.2014, 15:28   #5
East Undia Trading
Форумчанин
 
Регистрация: 02.10.2013
Сообщений: 231
По умолчанию

Stilet, на первый взгляд все понятно кроме назначения указателя на указатель и сортировки.
East Undia Trading вне форума Ответить с цитированием
Старый 31.03.2014, 15:34   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

М.м.м... Насчет сортировки это метод индексации. Т.е. создается дополнительный массив, в котором указаны номера строк (сортируемых элементов системы), которые в данном массиве расставляются по определенному порядку по условию сортировки.
Потом проходя по этому индексному массиву от начала его и до конца можно получить номер строки в исходном массиве, как будто ты его сортировал.

Насчет указателя на указатель это ты читай про динамические массивы:http://kvodo.ru/urok-9-1-dinamicheskie-matritsyi.html
Тут общая схема описана.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 31.03.2014, 18:11   #7
East Undia Trading
Форумчанин
 
Регистрация: 02.10.2013
Сообщений: 231
По умолчанию

Я написал не в ту тему, прошу прощения.

Последний раз редактировалось East Undia Trading; 31.03.2014 в 18:15.
East Undia Trading вне форума Ответить с цитированием
Старый 03.04.2014, 00:13   #8
East Undia Trading
Форумчанин
 
Регистрация: 02.10.2013
Сообщений: 231
По умолчанию

Stilet, разнесли программу, даже учитывая что я знал как и что.Нужно через матрицу обобщенного класса(?!).В общем, нужно делать все через классы, работая с копией матрицы, удаляя оригинал, а не создавать новую(Память, детка, она не бесконечная).
East Undia Trading вне форума Ответить с цитированием
Старый 03.04.2014, 08:18   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А-а-а... Ну бывает )
Вопрос: про ООП читал? Про наследование читал?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.04.2014, 14:28   #10
East Undia Trading
Форумчанин
 
Регистрация: 02.10.2013
Сообщений: 231
По умолчанию

Stilet, сделать как просил преподаватель большой проблемы не будет, примеры есть.Я хотел как лучше, а получилось как всегда.
Нет, про ООП только поверхностное представление имею.
East Undia Trading вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Доработка программы. Nuclear_Razor Фриланс 1 15.08.2013 10:29
Доработка программы на C# iCaesy Фриланс 0 12.01.2013 15:51
Доработка программы. ddlovato Помощь студентам 2 28.12.2011 12:40
Доработка программы zhiva Фриланс 1 30.07.2011 15:56
Доработка программы akialex Помощь студентам 3 24.12.2009 21:09