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

lab2_3_4 / prim_l3_Статическая и дин. матрица

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