Добавил:
Upload
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:lab2_3_4 / prim_l3_Статическая и дин. матрица
.c//Дана прямоугольная матрица типа 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--;
}
}
}
Соседние файлы в папке lab2_3_4