Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

lab2_3_4 / prim_l4_Массив указ. матрица

.c
Скачиваний:
16
Добавлен:
03.03.2016
Размер:
4.18 Кб
Скачать
//Дана прямоугольная матрица типа double. Используются динамические матрицы с и d.  
//Матрица с создается на базе массива указателей *c[10].
//Матрица d создается на базе указателя на указатель **d. Обработка матриц выполняется
// в процедурах, куда матрицы передаются целиком или по строкам.
#include<stdio.h>
#include<math.h>
#include<conio.h> 
#include<windows.h>
void wait_press_key(char *msg);
void input_matr(double **x,int m,int n,char *msg);
void output_matr(double **x,int m,int n,char *msg);
double sum_str(double *x,int n);
void revers_colume(double **x,int m,int n);
int main()
{
	double a[10][10],(*b)[10], *c[10],**d,smaxc,smaxd,smaxa,smaxb,s;
	int i,j,k,ma,na,mb,nb,mc,nc,md,nd,imaxc,imaxd,imaxa,imaxb;
	//Подключение кирилицы в консольном окне
	SetConsoleOutputCP(1251);//Использует для вывода кодовую таблицу 1251
	SetConsoleCP(1251);      //Использует для ввода кодовую таблицу 1251
	//Ввод размеров матрицы
	printf("\t Введите размеры матрицы mc<=10 nc<=10\n");
	scanf("%d%d",&mc,&nc);
	printf("\t Введите размеры матрицы md<=10 nd<=10\n");
	scanf("%d%d",&md,&nd);
	//Создаем динамическую матрицу c с размерами mc*nc*sizeof(double)
	//на базе массива указателей *c[10].
	for(i=0;i<mc;i++)
		c[i]=(double *)malloc(nc*sizeof(double));
	//Создаем динамическую матрицу d с размерами md*nd*sizeof(double)
	//на базе указателя на указатель **d.
	d=(double **)malloc(md*sizeof(double*));//это массив указателей, в котором 
	//каждый элемент массива d[i] - это указатель на поле double или указатель
	//на одномерный массив double.
	for(i=0;i<md;i++)    //Это строки матрицы как одномерные массивы
		d[i]=(double *)malloc(nc*sizeof(double));
	input_matr(c,mc,nc,"Ввод элементов матрицы c\n");
	input_matr(d,md,nd,"Ввод элементов матрицы d\n");
	output_matr(c,mc,nc,"Исходная матрицы c\n");
	output_matr(d,md,nd,"Исходная матрицы d\n");
	wait_press_key("\nДля продолжения программы нажмите любую клавишу\n");
	//В процедуры input_matr и output_matr матрицы передаются как массив указателей (матрица с)
	//и как указатель на указатель (матрица d).
	//-------------------------------------------------------------------------
	//Далее используется процедура, которая обрабатывает строки матрицы как
	//одномерные массивы. Определяем строку с максимальной суммой элементов.
	for(i=0; i<mc;i++)
	{
		s=sum_str(c[i],nc);//Параметр c[i] является указателем на i-ую строку
		if(i==0)           //матрицы как на одномерный массив
			{smaxc=s;imaxc=i;}
		else
			if(s>smaxc)
				{smaxc=s;imaxc=i;}
	}
	printf("\nВ матрице c максимальная сумма элементов =%8.2lf в строке с номером %d\n",
	smaxc,imaxc);
	for(i=0; i<md;i++)
	{
		s=sum_str(*(d+i),nd);//Параметр *(d+i) является указателем на i-ую строку
		if(i==0)             //матрицы как на одномерный массив
			{smaxd=s;imaxd=i;}
		else
			if(s>smaxd)
				{smaxd=s;imaxd=i;}
	}
	printf("\nВ матрице b максимальная сумма элементов =%8.2lf в строке с номером %d\n",
	smaxd,imaxd);
	wait_press_key("\nДля продолжения программы нажмите любую клавишу\n");
	//-------------------------------------------------------------------------
	//Далее используется процедура, в которой выполняется реверс элементов столбцов матрицы.
	revers_colume(c,mc, nc);
	revers_colume(d,md, nd);
	output_matr(c,mc,nc,"Преобразованная матрицы c\n");
	output_matr(d,md,nd,"Преобразованная матрицы d\n");
	wait_press_key("\nДля завершения программы нажмите любую клавишу\n");
	return 0;
}
void input_matr(double **x,int m,int n,char *msg)
{
	int i,j;
	printf(msg);
	for(i=0; i<m;i++)
		for(j=0; j<n;j++)
			scanf("%lf",(*(x+i)+j));
}
void output_matr(double **x,int m,int n,char *msg)
{
	int i,j;
	printf(msg);
	for(i=0; i<m;i++)
		for(j=0; j<n;j++)
			 printf("%7.2lf%c",x[i][j],j==n-1?'\n':' '); 			
}
double sum_str(double *x,int n)
{
	double s=0, *p;
	for(p=x;p<x+n;p++)
		s+=*p;
	return s;
}
void revers_colume(double **x,int m,int n)
{
	int i,j,k;double buf;
	for(j=0; j<n;j++)
	{i=0;k=m-1;
	 while(i<k)
	 {buf=x[i][j];
	  x[i][j]=x[k][j];
	  x[k][j]=buf;
	  i++;k--;
	 }
	}
}
void wait_press_key(char *msg)
{
	printf(msg);
	getch();
}