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