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;
}