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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.12.2010, 20:35   #1
Santic
 
Регистрация: 15.12.2010
Сообщений: 7
Злость C++ и функции

Дана целочисленная квадратная матрица. Определить:
2) минимум среди сумм модулей элементов диагоналей, параллельных побочной диагонали матрицы.

Этот пункт задания надо оформить в виде функции.

Написал код без функций, всё пашет:
Код:
#include <iostream.h>
#include <stdlib.h>
#include <conio.h>

int x[50][50], y[50][50], i, j, k, n, sum, sum1 = 0, sum2 = 0, min = 0;

void main()
{
	randomize(); clrscr();

	cout<<"Enter size of matrix: "; cin>>k; cout<<"\n";

	for (i = 0; i < k; i++)
	{
		cout<<"\n"<<"  ";
		for (j = 0; j < k; j++)
			{
			x[i][j] = (random(15)-5.2)/2.;
			cout<<x[i][j]<<"    ";
			}
	}

	cout<<"\n"<<"\n";
	
	for (i = 0; i < k; i++)
		{
		for (j = 0; j < k - i; j++)
			{
			y[i][j] = x[k - j - 1][k - i - 1];
			}
		}

	cout<<"sum:"<<"\n"<<"\n";

	for (j = 0; j < k; j++)
	{ sum = 0;
		for (i = 0; i < k; i++)
		{
	if (x[i][j] < 0) {sum = 0; break;}
		else
		sum += x[i][j];
		}
		cout<<"   "<<sum;
	}

	cout<<"\n"<<"\n";

//__________________________________________________________
//transponirovanie
		cout<<"matrix y:"<<"\n";

		for (i = 0; i < k; i++)
       		{
       		cout<<"\n"<<"  ";
       		for (j = 0; j < k; j++)
			{
			cout<<y[i][j]<<"    ";
			}
		}

//___________________________________________________________

	cout<<"\n"<<"\n";
	for (n = k; n > 0; n--)
	{
		for (i = 0; i < k - 1; i++)
			{
			 sum1 += x[i][k - i - 2];
			 sum2 += y[i][k - i - 2];
			}
			k--;
	 }
		if (sum1 < sum2) min=sum1;
		else min=sum2;

	cout<<"up: "<<sum1<<"   "<<"down: "<<sum2<<"\n"<<"\n";
	cout<<"min sum: "<<abs(min);

	getch();
}
Оформил это же задание в виде функций:

Код:
#include <iostream.h>
#include <stdlib.h>
#include <conio.h>

/*void size(int k)
{
cout<<"Enter size of matrix: "; cin>>k; cout<<"\n";
}
*/

int  enter_matrix(int **x, const int k)
{
int i = 0, j = 0;
	for (i = 0; i < k; i++)
	{
		cout<<"\n"<<"  ";
		for (j = 0; j < k; j++)
			{
			x[i][j] = (random(15)-5.2)/2.;
			cout<<x[i][j]<<"    ";
			}
	}
return x[i][j];
}

int transponirovanie(int **x, int **y, const int k)	
{	
int i = 0, j = 0;
	for (i = 0; i < k; i++)
		{
		for (j = 0; j < k - i; j++)
			{
			y[i][j] = x[k - j - 1][k - i - 1];
			}
		}
return y[i][j];
}

int sum_i_vivod_stolbc(int **x, const int k)
{	

int sum = 0, i = 0, j = 0;

	for (j = 0; j < k; j++)
	{ sum = 0;
		for (i = 0; i < k; i++)
		{
	if (x[i][j] < 0) {sum = 0; break;}
		else
		sum += x[i][j];
		}
		cout<<"   "<<sum;
	}
return sum;
}
		
int sum_elements_diagonaley_deistvia(int **x, int **y, int k) 
{

int i = 0, n = 0, sum1 = 0, sum2 = 0, min = 0;

	for (n = k; n > 0; n--)
	{
		for (i = 0; i < k - 1; i++)
			{
			 sum1 += x[i][k - i - 2];
			 sum2 += y[i][k - i - 2];
			}
			k--;
	 }

	if (sum1 < sum2) min=sum1;
	else min=sum2;

	cout<<"up: "<<sum1<<"   "<<"down: "<<sum2<<"\n"<<"\n";
	cout<<"min sum: "<<abs(min);

return sum1, sum2, min;
}

int main()
{
int i = 0, j = 0, k = 0;
int **x;
int **y;

	randomize(); clrscr();

	cout<<"Enter size of matrix: "; cin>>k; cout<<"\n";

	enter_matrix(x, k);
	cout<<"\n"<<"\n";
	
	transponirovanie(x, y, k);

	cout<<"sum:"<<"\n"<<"\n";
	sum_i_vivod_stolbc(x, k);
	cout<<"\n"<<"\n";

	sum_elements_diagonaley_deistvia(x, y, k);

	cout<<"\n"<<"\n";

	getch();

return 0;
}
Проблема состоит в том, что функция sum_elements_diagonaley_deistvia выдаёт up и down не правильные если квадратная матрица имеет более 3 строк и столбцов(хотя без функций всё ок). Где искать корень этой ошибки? Заранее спасибо!
Santic вне форума Ответить с цитированием
Старый 16.12.2010, 20:58   #2
kaljan775
:D
Форумчанин
 
Аватар для kaljan775
 
Регистрация: 26.09.2010
Сообщений: 570
По умолчанию

а программа все ок обрабатывает, которая без функция?

какие у вас интересные функции, по 3 значения возвращают
Пишу ПО, создаю сайты, делаю курсовые работы, за деньги
C#, .NET, MS SQL, AngularJS, HTML, jQuery
kaljan775 вне форума Ответить с цитированием
Старый 16.12.2010, 21:00   #3
Santic
 
Регистрация: 15.12.2010
Сообщений: 7
По умолчанию

Цитата:
Сообщение от kaljan775 Посмотреть сообщение
а программа все ок обрабатывает, которая без функция?
Та что без функций - работает исправно, проверял много раз.

Цитата:
какие у вас интересные функции, по 3 значения возвращают
Разве не правильно возвращать так?
Santic вне форума Ответить с цитированием
Старый 16.12.2010, 21:41   #4
kaljan775
:D
Форумчанин
 
Аватар для kaljan775
 
Регистрация: 26.09.2010
Сообщений: 570
По умолчанию

ну, по идее так
int faunc(int x,int y,int z) {return x+y+z;}

и вызывается она вот так
x=faunc(1,2,3);

а чтобы менять значения в переменных обычно используется void-функция, которой сообщается адрес пересенной, которую требуется изменить
Пишу ПО, создаю сайты, делаю курсовые работы, за деньги
C#, .NET, MS SQL, AngularJS, HTML, jQuery
kaljan775 вне форума Ответить с цитированием
Старый 18.12.2010, 22:53   #5
Santic
 
Регистрация: 15.12.2010
Сообщений: 7
По умолчанию

Цитата:
Сообщение от kaljan775 Посмотреть сообщение
ну, по идее так
int faunc(int x,int y,int z) {return x+y+z;}

и вызывается она вот так
x=faunc(1,2,3);

а чтобы менять значения в переменных обычно используется void-функция, которой сообщается адрес пересенной, которую требуется изменить
Сути не меняет, баг не отловлен.

Как же быть??? Об клаву бьюсь, не считает правильно и всё!!!!

Последний раз редактировалось Stilet; 19.12.2010 в 11:59.
Santic вне форума Ответить с цитированием
Старый 19.12.2010, 00:12   #6
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

Дебаггером пользовались? Говорят, помогает
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 19.12.2010, 00:15   #7
Santic
 
Регистрация: 15.12.2010
Сообщений: 7
По умолчанию

Цитата:
Сообщение от ACE Valery Посмотреть сообщение
Дебаггером пользовались? Говорят, помогает
Если честно, то ни разу не пользовался Пишу на Borland C :D

Всё, проблема решена. Вот код:

Код:
#include <iostream.h>
#include <stdlib.h>
#include <conio.h>


int transponirovanie(int **x, int **y, const int k)	
{	
int i = 0, j = 0;
	for (i = 0; i < k; i++)
		{
		for (j = 0; j < k - i; j++)
			{
			y[i][j] = x[k - j - 1][k - i - 1];
			}
		}
return 0;
}

int sum_i_vivod_stolbc(int **x, const int k)
{	

int sum = 0, i = 0, j = 0;

	for (j = 0; j < k; j++)
	{ sum = 0;
		for (i = 0; i < k; i++)
		{
	if (x[i][j] < 0) {sum = 0; break;}
		else
		sum += x[i][j];
		}
		cout<<"   "<<sum;
	}
return sum;
}
		
int sum_elements_diagonaley_deistvia(int **x, int **y, const int k) 
{
int i = 0, n = 0, m = k, sum1 = 0, sum2 = 0, min = 0;

	for (n = m; n > 0; n--)
	{
		for (i = 0; i < m - 1; i++)
			{
			 sum1 += x[i][m - i - 2];
			 sum2 += y[i][m - i - 2];
			}
			m--;
	 }

	if (sum1 < sum2) min=sum1;
	else min=sum2;

	cout<<"up: "<<sum1<<"   "<<"down: "<<sum2<<"\n"<<"\n";
	cout<<"min sum: "<<abs(min);

return sum1+sum2+min;
}

int main()
{
int i = 0, j = 0, k = 0;
int **x;
int **y;

	randomize(); clrscr();

	cout<<"Enter size of matrix: "; cin>>k; cout<<"\n";
	

//new fuuuuu massive :D

	x = new int* [k];
	for (i = 0; i < k; i++)
		x[i] = new int [k];
	for (i = 0; i < k; i++)
		for (j = 0; j < k; j++)		
			x[i][j] = (random(15)-5.2)/2.;
			
//new fuuuuu2 massive :DDD
				
	y = new int* [k];
	for (i = 0; i < k; i++)
		y[i] = new int [k];
	for (i = 0; i < k; i++)
		for (j = 0; j < k; j++)		
			y[i][j] = x[i][j] ;

//vivod fuuuu massive

	for (i = 0; i < k; i++)
	{
		cout<<"\n"<<"  ";
		for (j = 0; j < k; j++)
			{
			cout<<x[i][j]<<"    ";
			}
	}
	
	cout<<"\n"<<"\n";
	
	transponirovanie(x, y, k);

	cout<<"sum:"<<"\n"<<"\n";
	sum_i_vivod_stolbc(x, k);
	cout<<"\n"<<"\n";
	
	sum_elements_diagonaley_deistvia(x, y, k);

	cout<<"\n"<<"\n";

	getch();

return 0;
}
Что было не так: Матрица не должным образом была сформирована; Функция не может возвращать матрицы :D

Последний раз редактировалось Stilet; 19.12.2010 в 12:03.
Santic вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мини бэйсик:объявление функции, вызов функции , возврат. AL_LORD Помощь студентам 2 14.10.2010 17:48
Программа на СИ++, используя функции работы с файлами и функции <string.h> Аня Popova Фриланс 9 13.09.2010 15:52
Функции в си. Вывод двумерного массива из функции. Evgen51 Общие вопросы C/C++ 9 13.05.2010 03:59
Чем отличается описание функции от определения функции в С++? Go6a Помощь студентам 4 18.07.2009 18:07
Функции. Передача массива в качестве параметра функции. Wia Помощь студентам 2 17.03.2009 14:57