第7周基础练习

1.两个数的排序(10分)

编写函数,对输入的两个参数排序,即在主函数中输入a,b两个整数,调用函数,若a>b交换a,b的值,使得在主函数a<=b。在主函数中输出a,b。
输入:两个整数,用空格隔开。
输出:两个整数,从小到大,用空格隔开。

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

样例1输入:

4 2

样例1输出:

2 4
时间限制:500ms内存限制:32000kb

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

2.三个数的排序(10分)

编写函数,对输入的三个参数a,b,c排序,使得a<=b<=c。在主函数中输入a,b,c;调用函数排序,在主函数中输出a,b,c.排序使得主函数中的a,b,c满足a<=b<=c。
输入:三个整数,用空格隔开。
输出:三个整数,从小到大,用空格隔开。
【注意】使用指针实现,不能用全局变量。可以使用前一题的两个数的排序函数。

样例1输入:

3 2 1

样例1输出:

1 2 3
时间限制:500ms内存限制:32000kb

#include <iostream>
using namespace std;
void swap(int *pa, int *pb);
void sort(int *a, int *b, int *c);
int main()
{
	int a, b, c;
	cin>>a>>b>>c;
	sort(&a, &b, &c);
	cout<<a<<" "<<b<<" "<<c<<endl;
	return 0;
}
void swap(int *pa, int *pb)
{
	int temp = *pa;
		*pa = *pb;
		*pb = temp;
}
void sort(int *a, int *b, int *c)
{
	if(*a>*c)//先把a,c排序
		swap(a,c);
	if(*b<*a)//如果b比a小,就交换b,a
		swap(b,a);
	if(*b>*c)//如果b比c大,就交换b,c
		swap(b,c);
}

3.返回数组的统计值(最大、最小、平均值、标准差)(10分)

编写函数,“返回”,数组元素的最大值、最小值、平均值和标准差
编写主函数,输入以-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[100], num;
	int len=0;
	while(cin>>num&&num!=-9999)
		a[len++] = num;
	double max, min, average, stdev;
	statistics(a,len,&max, &min, &average, &stdev);
	cout<<max<<" "<<min<<" "<<average<<" "<<stdev<<endl;
	return 0;
}
void statistics(double a[],int n,double *max,double *min,double *avg,double *stdev)
{
	*max = a[0];
	*min = a[0];
	double sum1 = 0.0;
	double sum2 = 0.0;
	for(int i=0; i<n; i++)
	{
		if(a[i]<*min)
			*min=a[i];
		if(a[i]>*max)
			*max=a[i];
		sum1 += a[i];
	}
	*avg = sum1/n;
	for(int i=0; i<n; i++)
		sum2 += (a[i]-*avg)*(a[i]-*avg);
	*stdev = sqrt(sum2/n);
}
//一个函数要返回多个变量时,一般要用指针

4.通过指向函数的指针调用函数(10分)

1)编写自定义函数y=x^2,即x的平方,自变量和函数值均为double。
(2)编写自定义函数y=2
sin(23.142x+3.14)

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

输入:一个实数
输出:两个函数值,用空格隔开。
【提示】本题只要定义两个函数x2和mysin,主函数照抄(但应理解)。sin(x)调用库函数,须包含。

样例1输入:

1

样例1输出:

1 0.0159264
时间限制:500ms内存限制:32000kb

#include <iostream>
#include <cmath>
using namespace std;
double x2(double x);
double mysin(double x);
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的函数值,

输入:一个实数
输出:两个函数值,用空格隔开。
【提示】sin(x)调用库函数,须包含。
【注意】本题与上题具有相同的计算结果,但调用函数的方式是不同的,这才是关键!!

样例1输入:

1

样例1输出:

1 0.0159264
时间限制:500ms内存限制:32000kb

#include <iostream>
#include <cmath>
using namespace std;
double x2(double x);
double mysin(double x);
double anyFun(double (*fp)(double), double x);
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 (*fp)(double), double x)
{
	return (*fp)(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]区间上的平均值,函数通过指向函数的指针为擦参数传入,

编写主函数,输区间端点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
时间限制:500ms内存限制:32000kb

#include <iostream>
#include <cmath>
using namespace std;
double funAvg(double (*fp)(double), double a, double b, int n);
int main()
{
	double a, b;
	cin>>a>>b;
	cout<<funAvg(exp, a, b, 1000)<<" ";
	cout<<funAvg(sin, a, b, 1000)<<" ";
	cout<<funAvg(cos, a, b, 1000)<<endl;
	return 0;
}
double funAvg(double (*fp)(double), double a, double b, int n)
{
	double sum = 0.0;
	double h = (b-a)/n;
	for(int i=0; i<=n; i++)
	{
		sum += (*fp)(a+i*h);
	}
	return sum/(n+1);
}
//注意函数里对公式的转化: f(a+i*h)
发布了28 篇原创文章 · 获赞 38 · 访问量 7181

猜你喜欢

转载自blog.csdn.net/weixin_45543556/article/details/105073794