Назад
Балтийский государственный технический университет
«Военмех» им. Д.Ф. Устинова
Кафедра И3
«Автоматизированные системы обработки информации и управления»
Лабораторная работа № 7
«Функции»
Вариант № 1
Выполнил:
Студент Козятинский Н.В.
Группа И383
Преподаватель:
Панова Т.В.
Санкт-Петербург
2008
Цель работы научиться использовать функции для выполнения однотипных действий над
различными данными, правильно задавать параметры функций, передавать указатели на функции
в качестве параметров.
Задание 1
В массивах А (57) и В (7х5) найти максимумы, затем поменять их местами.
2
1
2
1x
dx
,
3
2
5cos xdx
,
20N
, метод трапеций.
121
0
...
2
n
n
b
a
yyy
yy
N
ab
dxxf
Блок-схема
Начало программы
Конец программы
inmas(a,L)
inmas(&b[0][0],M*N)
L=57
M=7
N=5
ma=mx(&a[0],L)
mb=mx(&b[0][0],M*N)
vsp=*ma
*ma=*mb
*mb=vsp
outmas(a,1,L)
outmas(&b[0][0],M,N)
outmas(a,1,L)
outmas(&b[0][0],M,N)
Начало *mx
i=1;n-1;1
Возврат m
вх.:a[],n
*m=a
*m<*(a+i)
m=a+i
Да
Нет
Начало outmas
i=0;m-1;1
Вывод a
i,j
j=0;n-1;1
Возврат
вх.:a[],m,n
вых.:a[]
Начало inmas
i=0;n-1;1
Ввод a
i
Возврат
вх.:a[],n
вых.:a[]
2
Листинг программы
#include <stdio.h>
#include <conio.h>
#define L 57
#define M 7
#define N 5
void inmas(float *, int);
float *mx(float *,int);
void outmas(float *, int, int);
int main (void)
{float a[L],b[M][N],*ma,*mb,vsp;
printf("Input massiv a[%d]\n",L);
inmas(&a[0],L);
printf("Input matritca b[%d][%d]\n",M,N);
inmas(&b[0][0],M*N);
outmas(a,1,L);
outmas(&b[0][0],M,N);
ma=mx(&a[0],L);
mb=mx(&b[0][0],M*N);
vsp=*ma;
*ma=*mb;
*mb=vsp;
outmas(&a[0],1,L);
outmas(&b[0][0],M,N);
getch();
return 0;}
void inmas(float *a, int n)
{int i;
for(i=0;i<n;i++)
scanf("%f",a++);}
float *mx(float *a,int n)
{int i;
float *m=a;
for(i=1;i<n;i++)
if (*m<*(a+i))
m=a+i;
return m;}
void outmas(float *a, int m, int n)
{int i,j;
for(i=0;i<m;i++)
{for(j=0;j<n;j++)
printf("%f\t",*a++);
printf("\n");}
printf("\n");}
Тестирование
Для удобства тестирования L=3, M=3, N=2
a[L] b[M][N]
Результат
Должно быть Получено
1 2 3 8 9
4 6
1 2 9 8 3
4 6
1 0
1 2 3 8 3
4 6
1 0
3
1 0
Вывод: программа работает правильно.
4
Задание 2
Вычислить
21
21
SS
SS
Z
, где S
1
сумма положительных элементов массива А (70), а S
2
сумма
отрицательных элементов матрицы В (7х9). Суммы вычислять в одной подпрограмме.
Блок-схема
Начало программы
Конец программы
inmas(a,L)
inmas(&b[0][0],M*N)
L=70
M=7
N=9
outmas(a,1,L)
outmas(&b[0][0],M,N)
z=(sum(&a[0],L,1)+sum(&b[0][0],M*N,-1))/
(sum(&a[0],L,1)-sum(&b[0][0],M*N,-1))
Начало sum
i=0;n-1;1
Возврат k
вх.:a[],n,p
k=0
a
i
*p>0
k=k+a
i
Да
Нет
Начало outmas
i=0;m-1;1
Вывод a
i,j
j=0;n-1;1
Возврат
вх.:a[],m,n
вых.:a[]
Начало inmas
i=0;n-1;1
Ввод a
i
Возврат
вх.:a[],n
вых.:a[]
5
Листинг программы
#include <stdio.h>
#include <conio.h>
#define L 70
#define M 7
#define N 9
void inmas(float *, int);
float sum(float *,int,int);
void outmas(float *, int, int);
int main (void)
{float a[L],b[M][N];
printf("\nInput massiv a[%d]\n",L);
inmas(&a[0],L);
printf("Input matritca b[%d][%d]\n",M,N);
inmas(&b[0][0],M*N);
outmas(a,1,L);
outmas(&b[0][0],M,N);
printf("z=%f",(sum(&a[0],L,1)+sum(&b[0][0],M*N,-1))/(sum(&a[0],L,1)-sum(&b[0][0],M*N,-1)));
getch();
return 0;}
void inmas(float *a, int n)
{int i=0;
for(;i<n;i++)
scanf("%f",a++);}
float sum(float *a, int n, int p)
{int i,k=0;
for(i=0;i<n;i++)
if(a[i]*p>0)
k+=a[i];
return k;}
void outmas(float *a, int m, int n)
{int i,j;
for(i=0;i<m;i++)
{for(j=0;j<n;j++)
printf("%f\t",*a++);
printf("\n");}
printf("\n");}
Тестирование
Для удобства тестирования L=3, M=3, N=2
a[L] b[M][N]
Результат
Должно быть Получено
1 6 3 8 9
4 6
1 0
Z=1 Z=1
5 -3 6 1 -8
4 -2
-7 0
Z=-0.214286 Z=-0.214286
9 2 7 3 -1
5 -3
-2 1
Z=0.500000 Z=0.500000
Вывод: программа работает правильно.
6
Задание 3
2
1
2
1x
dx
,
3
2
5cos xdx
,
20N
, метод трапеций
Блок-схема
Начало программы
Конец программы
Нет
Ввод
количества
функций k
k<1 или k>2Да
i=1;k;1
i
a=-2
b=3
p=f2
a=1
b=-2
p=f1
n=20
s=integ(p,a,b,n)
n=n*2
|s-integ(p,a,b,n)|>10
-5
Да
Вывод s,n
Начало integ
Возврат s*h
вх.:a,b,n,*f()
s=(f(a)+f(b))/2
h=(b-a)/n
i=a+h;b-h;h
s=s+f(i)
Начало f2
Возврат cos5x
вх.:x
7
Начало f1
вх.:x
Возврат
Листинг программы
#include <stdio.h>
#include <conio.h>
#include <math.h>
float integ(float(*f)(float),int,int,int);
float f1(float);
float f2(float);
int main (void)
{float s,a,b,(*p)(float);
int n,k,i;
do{printf("\nInput kolvo f\n");
scanf("%d",&k);}while(k>2||k<1);
for(i=1;i<=k;i++)
{switch (i)
{case 1: a=1;b=2;p=f1;break;
case 2: a=-2;b=3;p=f2;break;}
n=20;
do
{s=integ(p,a,b,n);
n*=2;
printf("integral=%f\tn=%d\n",s,n);}
while(fabs(s-integ(p,a,b,n))>1e-5);
printf("\n");}
getch();
return 0;}
float integ(float(*f)(float),int a,int b,int n)
{float h,s=(f(a)+f(b))/2;
float i;
h=(float)(b-a)/n;
for(i=a+h;i<=b-h;i+=h)
s+=f(i);
return s*=h;}
float f1(float x)
{return 1/(x*x+1);}
float f2(float x)
{return cos(5*x);}
Тестирование
f=
integral= n=
Должно быть Получено
1
0.321822 40
0.321768 80
0.319229 160
0.320495 320
0.321753 640
0.321822 40
0.321768 80
0.319229 160
0.320495 320
0.321753 640
2 0.321822 40
0.321768 80
0.319229 160
0.320495 320
0.321753 640
0.018411 40
0.020557 80
0.021080 160
0.021210 320
0.321822 40
0.321768 80
0.319229 160
0.320495 320
0.321753 640
0.018411 40
0.020557 80
0.021080 160
0.021210 320
8
0.021242 640 0.021242 640
Вывод: программа работает правильно.
9