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=2sin(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)