Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CИ-часть3студ.doc
Скачиваний:
12
Добавлен:
09.02.2015
Размер:
196.1 Кб
Скачать

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;

  1. }

Пример 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;

}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]