第7周基础练习(wenufbewug)

1两个数的排序(10分)
编写函数,对输入的两个参数排序,即在主函数中输入a,b两个整数,调用函数,若a>b交换a,b的值,使得在主函数a<=b。在主函数中输出a,b。主函数如下:

int main()
{
	int a, b;
	cin >> a >> b;
	sort(&a , &b);
	cout << a << " " << b << endl;
	return 0;
}

输入:两个整数,用空格隔开。

输出:两个整数,从小到大,用空格隔开。

【注意】使用指针实现,不能用全局变量。排序不是问题,关键是用指针。

样例1输入:

4 2

样例1输出:

2 4

//两个数的排序
#include<iostream>
using namespace std;
void sort(int* a, int* b)
{
	int temp;
	if (*a > *b)
	{
		temp = *a;
		*a = *b;
		*b = temp;
	}
}
int main()
{
	int a, b;
	cin >> a >> b;
	sort(&a , &b);
	cout << a << " " << b << endl;
	return 0;
}

2三个数的排序(10分)
编写函数,对输入的三个参数a,b,c排序,使得a<=b<=c。在主函数中输入a,b,c;调用函数排序,在主函数中输出a,b,c.排序使得主函数中的a,b,c满足a<=b<=c。主函数如下:

int main()
{
	int a, b, c;
	cin >> a >> b >> c;
	sort(&a, &b, &c);
	cout << a << " " << b << " " << c << endl;
	return 0;
}

输入:三个整数,用空格隔开。

输出:三个整数,从小到大,用空格隔开。

【注意】使用指针实现,不能用全局变量。可以使用前一题的两个数的排序函数。

样例1输入:

3 2 1

样例1输出:

1 2 3

//三个数的排序(
#include<iostream>
using namespace std;
void sort(int *a, int *b, int *c);
void sort2(int* a, int* b);
int main()
{
	int a, b, c;
	cin >> a >> b >> c;
	sort(&a, &b, &c);
	cout << a << " " << b << " " << c << endl;
	return 0;
}
void sort(int* a, int* b, int* c)
{
	sort2(a, b);
	sort2(a, c);
	sort2(b, c);
}
void sort2(int* a, int* b)
{
	int temp;
	if (*a > * b)
	{
		temp = *a;
		*a = *b;
		*b = temp;
	}
}

3返回数组的统计值(最大、最小、平均值、标准差)(10分)
编写函数,“返回”,数组元素的最大值、最小值、平均值和标准差,函数的格式如下:

void statistics(double a[],int n,doube *max,double *min,double *avg,double *stdev);

编写主函数,输入以-9999为结束标志的一些列数据,调用函数计算其最大、最小、平均值和标准差,在主函数中依次输出。

标准差的计算公式:
输入:若干实数,空格隔开,以-9999为结束标志

输出:最大、最小、平均值和标准差,空格隔开。

【注意】使用指针实现,在主函数中输出,不能用全局变量。

样例1输入:

6 8 8 8 10 -9999

样例1输出:

10 6 8 1.26491

//返回数组的统计值(最大、最小、平均值、标准差)
#include<iostream>
#include<cmath>
using namespace std;
void statistics(double a[], int n, double* max, double* min, double* avg, double* stdev);
int main()
{
	double a[101];
	int n=0;
	double max = -9999;
	double min = 9999;
	double avg = 0;
	double stdev = 0;
	cin >> a[0];
	while (a[n] != -9999)
	{
		n++;
		cin >> a[n];
	}
	statistics(a,n,&max,&min,&avg,&stdev);
	cout << max << " " << min << " " << avg << " " << stdev << endl;
	return 0;
}
void statistics(double a[], int n, double* max, double* min, double* avg, double* stdev)
{
	for (int i = 0; i < n; i++)
	{
		if (a[i] > *max)
			*max = a[i];//最大值
		if (a[i] < *min)
			*min = a[i];//最小值
		*avg += double(a[i] / n);
	}
	for (int i = 0; i < n; i++)
	{
		*stdev += (a[i] - *avg) * (a[i] - *avg);
	}
	*stdev = sqrt(1.0 / n * *stdev);
}

4通过指向函数的指针调用函数(10分)
(1)编写自定义函数y=x^2,即x的平方,自变量和函数值均为double。

(2)编写自定义函数y=2sin(23.142x+3.14)

设第1个函数的名字为x2,第2个函数的名字为mysin。编写主函数,输入自变量x ,通过指向函数的指针调用它们求函数值。主函数如下:

int main()
{
	double (*f)(double);//定义指向函数的指针
	double x;
	cin >> x;
	f = x2;
	cout << f(x) << endl;
	return 0;
}

输入:一个实数

输出:两个函数值,用空格隔开。

【提示】本题只要定义两个函数x2和mysin,主函数照抄(但应理解)。sin(x)调用库函数,须包含。

样例1输入:

1

样例1输出:

1 0.0159264

//通过指向函数的指针调用函数
#include<iostream>
#include<cmath>
using namespace std;
double x2(double);
double mysin(double);
int main()
{
	double (*f)(double);//定义指向函数的指针
	double x;
	cin >> x;
	f = x2;
	cout << f(x) <<" ";
	f = mysin;
	cout << f(x) << endl;
	return 0;
}
double x2(double x)
{
	return x * x;
}
double mysin(double x)
{
	return 2 * sin(2 * 3.14 * 2 * x + 3.14);
}

5计算任意一元函数值的通用函数(10分)
(1)编写函数,可以计算任意一元函数的值,格式如下:

double anyfun(double (*f)(double),double x);

其中f是指向函数的指针,x是自变量。函数anyfun中只要返回f(x)即可。

(2)编写自定义函数计算y=x^2,即x的平方,自变量和函数值均为double,函数名x2。

(3)编写自定义函数计算y=2sin(23.142x+3.14),函数名为mysin。

编写主函数,输入自变量x ,通过anyfun计算x2和mysin在x的函数值,主函数如下:

int main()
{
	double x;
	cin >> x;
	cout << anyfun(x2, x) << " ";
	cout << anyfun(mysin, x) << endl;
	return 0;
}

输入:一个实数

输出:两个函数值,用空格隔开。

【提示】sin(x)调用库函数,须包含。

【注意】本题与上题具有相同的计算结果,但调用函数的方式是不同的,这才是关键!!

样例1输入:

1

样例1输出:

1 0.0159264

//计算任意一元函数值的通用函数
#include<iostream>
#include<cmath>
using namespace std;
double  anyfun(double (*f)(double), double x);//以指向函数的指针为参数
double x2(double);
double mysin(double);
int main()
{
	double x;
	cin >> x;
	cout << anyfun(x2, x) << " ";
	cout << anyfun(mysin, x) << endl;
	return 0;
}
double x2(double x)
{
	return x * x;
}
double mysin(double x)
{
	return 2 * sin(2 * 3.14 * 2 * x + 3.14);
}
double  anyfun(double (*f)(double), double x)
{
	return (*f)(x);
}

6计算函数在指定区间的近似平均值(10分)
设函数为f(x), 区间[a,b],本题中,函数f(x)在区间[a,b]的近似平均值定义为

avg=(f(a)+f(a+h)+f(a+2h)+…+f(b))/(n+1)

其中n=1000, h=(b-a)/n;

编写函数,计算函数在[a,b]区间上的平均值,函数通过指向函数的指针为擦参数传入,函数的格式为:

double funavg(double (*f)(double x), double a,double b,int n);

编写主函数,输区间端点a,b,计算函数exp(x),sin(x),cos(x),[a,b]上的近似平均值。n取固定值1000。

输入:实数a,b,用空格隔开。

输出:三个函数在区间[a,b]上的近似平均值。用空格隔开。

【提示】exp(x),sin(x),cos(x)为数学库函数,须包含头文件

样例1输入:

0 1

样例1输出:

1.71842 0.459659 0.8414

//计算函数在指定区间的近似平均值
#include<iostream>
#include<cmath>
using namespace std;
double funavg(double (*f)(double x), double a, double b, int n);
int main()
{
	double(*f)(double);
	double a, b;
	int n=1000;
	cin >> a >> b;
	f = exp;
	cout << funavg(f, a, b, n) << " ";
	f = sin;
	cout << funavg(f, a, b, n) << " ";
	f = cos;
	cout << funavg(f, a, b, n) << endl;
}
double funavg(double (*f)(double x), double a, double b, int n)
{
	double avg=0;
	double h = (b - a) / n;
	for (int i = 0; i <= n; i++)
	{
		avg += (*f)(a + i * h) / (n + 1);
	}
	return avg;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值