6.5. Примеры выполнения заданий
Пример 1.Составить функцию, копирующую из матрицы A(m,n), m≤10, n≤14 положительные элементы в массив Pol и подсчитывающую их количество kPol, а отрицательные элементы – в массив Otr и подсчитывающую их количество kOtr. Использовать эту функцию для матрицы В в основной программе. Если окажется, что положительных и/или отрицательных элементов в матрице нет, то вывести соответствующие сообщения, иначе – скопированные в массивы данные.
// формирование массива положительных и массива отрицательных
// элементов матрицы
#include "stdafx.h"
#include "stdio.h"
#include "conio.h"
const int nmax=14;
void polotr(float a[][nmax],int m,int n,float pol[],float otr[],int *kpol,int *kotr);
int _tmain(int argc, _TCHAR* argv[])
{
const int mmax=10;
float b[mmax][nmax],pol[mmax*nmax],otr[mmax*nmax];
int i,j,m,n,kpol,kotr;
printf("wwedite kol-wo strok i stolbzow\n");
scanf("%d%d",&m,&n);
printf("\nwweditr matrizu\n");
for (i=0;i<m;i++)
for (j=0;j<n; j++)
scanf("%f",&b[i][j]);
printf("\nIsxodnaja matriza\n");
for (i=0;i<m;i++)
{
for (j=0;j<n; j++)
printf("%5.1f ",b[i][j]);
printf("\n");
}
polotr(b,m,n,pol,otr,&kpol,&kotr);
if (kpol>0)
{
printf("\nMassiw poloshitelnix\n");
for (i=0; i<kpol;i++)
printf("%5.1f ",pol[i]);
printf("\n");
}
else printf("\nPoloshitelnix elementow net\n");
if (kotr>0)
{printf("\nMassiw otrizatelnix\n");
for (i=0; i<kotr;i++)
printf("%5.1f ",otr[i]);
printf("\n");
}
else printf("\nOtrizatelnix elementow net\n");
getch();
return 0;
}
void polotr(float a[][nmax],int m,int n,float pol[],float otr[],int *kpol,int *kotr)
{int i,j;
*kpol=0;
*kotr=0;
for (i=0;i<m;i++)
for (j=0; j<n; j++)
if (a[i][j]>0)
{
pol[*kpol]=a[i][j];
(*kpol)++;
}
else if (a[i][j]<0)
{
otr[*kotr]=a[i][j];
(*kotr)++;
}
}
Пример 2. Составить и использовать функцию, возвращающую максимальный из первых N элементов массива X(N), N≤100.
// функция определения иаксимального элемента массива
#include "stdafx.h"
#include "stdio.h"
#include "conio.h"
float maxmas(int n, const float x[]);
int _tmain(int argc, _TCHAR* argv[])
{ const int mm=100;
float y[mm];
int n,i;
printf("\n wwedite kol-wo elementow\n");
scanf("%d",&n);
printf("wwedite elementi massiwa\n");
for (i=0;i<n;i++)
scanf("%f",&y[i]);
//Вызов функции в функции вывода
printf("\nMaksimalnij is n=%3d elementow rawen %5.1f",n,maxmas(n,y));
getch();
return 0;
}
float maxmas(int n, const float x[])
{int i;
float max;
max=x[0];
for (i=1; i<n;i++)
if (x[i]>max)
max=x[i];
return max;
}
Пример 3. Составить программу поиска приближенных значений корней уравнения
и их уточнённых значений методом половинного деления.
В данном примере использование функций позволяет не только сделать текст программы более удобным для понимания её алгоритма, но и уменьшить его при необходимости повторных вычислений в разных частях программы.
//уточнение корней уравнения
#include "stdafx.h"
#include "stdio.h"
#include "conio.h"
#include "math.h"
double f_px(double p,double x);
double koren_f(double p,double x0,double x1,double eps);
int _tmain(int argc, _TCHAR* argv[])
{ double p,x, a, b, dx, f0, f1,eps,koren;
printf("Wwedite granizi interwala i schag argumenta\n");
scanf("%lf%lf%lf",&a,&b,&dx);
printf("\nWwedite parametr p\n");
scanf("%lf",&p);
printf("\nWwedite tochnost\n");
scanf("%lf",&eps);
f0=f_px(p,a);
dx=0.01;
x=a+dx;
while (x<b+dx/2)
{
f1=f_px(p,x);
if (f0*f1<0)
{
//Найдены приближенные значения корня
//X-dX - приближение, меньшее корня
//X - приближение, большее корня
printf("\nx-dX = %8.4f - lewoe priblishenie kornja\n",x-dx);
//Поиск приближения с точностью Eps
koren = koren_f(p,x-dx,x,eps);
//Вывод результатов
printf("Koren=%8.4f s tochtostju=%8.4f\n",koren,eps);
printf("Snachenie funkcii w korne=%8.4f\n",f_px(p,koren));
}
f0=f1;
x+=dx;
}
getch();
return 0;
}
//Функция, вычисляющая выражение,
//входящее в уравнение
double f_px(double p,double x)
{double px,f;
px=p*x;
f=x*cos(3*px)/p/12-sin(3*px)/p/p/36
-3*x*cos(px)/p/4 +3*sin(px)/p/p/4;
return f;
}
//функция, уточняющая значение корня
double koren_f(double p,double x0,double x1,double eps)
{double f0,f,f1,x;
f0=f_px(p,x0);
do
{x=(x0+x1)/2;
f=f_px(p,x);
if (f0*f>0)
x0=x;
else
x1=x;
}
while(fabs(x1-x0)>eps);
return x;
}
Пример 4. Составить функцию для вычисления среднего арифметического элементов одномерного массива. Использовать эту функцию для формирования массива средних арифметических значений элементов каждой строки матрицы A(m,n), m≤12, n≤11.
В данном примере рассматривается два способа передачи строки матрицы в функцию. Можно переписать элементы очередной строки матрицы в одномерный массив и уже его передать в качестве фактического параметра в функцию. Можно решить эту задачу более изящно. Поскольку при работе с матрицей элемент a[i] представляет собой указатель (адрес) на i-ую строку матрицы, то в качестве фактического параметра в функцию удобнее передавать как раз этот адрес.
// функция вычисления среднего арифметического одномерного массива
// передача в функцию строки матрицы
#include "stdafx.h"
#include "stdio.h"
#include "conio.h"
#include "math.h"
float sred(const float b[],int n);
int _tmain(int argc, _TCHAR* argv[])
{
const int mmax=12, nmax=11;
float a[mmax][nmax], //Массив исходной матрицы
sredstrka[mmax], //Массив средних значений
//строк матрицы
b[nmax]; //массив элементов строки матрицы (первый вариант)
int m,n,i,j;
printf("wwedite kol-wo strok i stolbzow\n");
scanf("%d%d",&m,&n);
printf("\nwwedite matrizu\n");
for (i=0;i<m;i++)
for (j=0; j<n;j++)
scanf("%f",&a[i][j]);
//Вычисление средних арифметических
//значений в строках матрицы
for (i=0;i<mmax;i++)
//Обращение к функции
sredstrka[i]=sred(a[i],n);
/* первый вариант – перепись элементов строки в массив
for (i=0;i<m;i++)
{for (j=0;j<n;j++)
b[j]=a[i][j];
sredstrka[i]=sred(b,n);
*/
//Вывод матрицы по строкам и правее
//каждой строки - её среднего арифметического
printf("\nisxodnaja matriza i srednie arifmeticheskie\n");
for (i=0; i<m;i++)
{
for (j=0; j<n;j++)
printf("%6.1f ",a[i][j]);
printf(" %6.1f\n",sredstrka[i]);
}
getch();
return 0;
}
//Функция вычисления среднего арифметического
//элементов одномерного массива
float sred(const float b[],int n)
{
int i;
float s=0;
for (i=0;i<n;i++)
s+=b[i];
return s/n;
}
Можно поставленную задачу решить и по-другому, если функция должна работать непосредственно с матрицей. Функция в этом случае возвращает сразу сформированный массив средних арифметических.
// функция вычисления среднего арифметического одномерного массива
// передача в функцию всей матрицы и формирование массива средних
#include "stdafx.h"
#include "stdio.h"
#include "conio.h"
#include "math.h"
const int nmax=11;
void sred(const float b[][nmax], float sred[],int m,int n);
int _tmain(int argc, _TCHAR* argv[])
{
const int mmax=12;
float a[mmax][nmax], //Массив исходной матрицы
sredstrka[mmax]; //Массив средних значений
//строк матрицы
int m,n,i,j;
printf("wwedite kol-wo strok i stolbzow\n");
scanf("%d%d",&m,&n);
printf("\nwwedite matrizu\n");
for (i=0;i<m;i++)
for (j=0; j<n;j++)
scanf("%f",&a[i][j]);
//Вычисление средних арифметических
//значений в строках матрицы
//Обращение к функции
sred(a,sredstrka,m,n);
//Вывод матрицы по строкам и правее
//каждой строки - её среднего арифметического
printf("\nisxodnaja matriza i srednie arifmeticheskie\n");
for (i=0; i<m;i++)
{
for (j=0; j<n;j++)
printf("%6.1f ",a[i][j]);
printf(" %6.1f\n",sredstrka[i]);
}
getch();
return 0;
}
//Функция вычисления среднего арифметического
//элементов одномерного массива
void sred(const float b[][nmax], float sred[],int m,int n)
{
int i,j;
float s;
for (i=0;i<m;i++)
{ s=0;
for (j=0;j<n;j++)
s+=b[i][j];
sred[i]= s/n;
}
}