2023-2024-1-高级语言程序设计-第2次月考函数题
6-1-1 调用函数求分段函数
编写函数fun计算下列分段函数的值:
。
函数接口定义:
float fun(float x);
其中 x
是用户传入的参数。 函数须返回分段函数的计算结果。
裁判测试程序样例:
#include <stdio.h> #include <math.h> float fun(float x); int main() { float x,y; scanf("%f",&x); y=fun(x); printf("y=%f",y); return 0; } /* 请在这里填写答案 */
输入样例:
1.5
输出样例:
y=0.250000
float fun(float x){
float y;
if(x<0)y=fabs(1-x);
else if(x>=0&&x<=1)y=1-x;
else y=pow(1-x,2);
return y;
}
6-1-2 倒数函数
请编写函数,求倒数。
函数原型
double Rec(double x);
说明:参数 x 为任意实数。若 x 为非零实数,则函数值 x 的倒数,否则报告错误,调用 exit 函数使程序强行结束,并将出口代码置为 1。
裁判程序
#include <stdio.h> #include <stdlib.h> double Rec(double x); int main() { double a, b; scanf("%lg", &a); b = Rec(a); printf("%g\n", b); return 0; } /* 你的提交代码将被嵌在这里 */
输入样例1
2
输出样例1
0.5
注:程序的出口代码为 0。
输入样例2
0
输出样例2
Divided by zero!
注:程序的出口代码为 1。
Divided by zero!
Exit code: 1
double Rec(double x){
if(x)return 1/x;
else{printf("Divided by zero!\nExit code: 1");exit(x);}
}
6-1-3 两整数最小值
请编写函数,求两个整数的最小值。
函数原型
int IntMin(int x, int y);
说明:参数 x 和 y 为两个整数,函数值为两者中的较小者。
裁判程序
#include <stdio.h> int IntMin(int x, int y); int main() { int a, b, c; scanf("%d%d", &a, &b); c = IntMin(a, b); printf("%d\n", c); return 0; } /* 你提交的代码将被嵌在这里 */
输入样例1
15 36
输出样例1
15
输入样例2
-18 -47
输出样例2
-47
int IntMin(int x, int y){
if(x>y)return y;
else return x;
}
6-1-4 两整数最大值
请编写函数,求两个整数的最大值。
函数原型
int IntMax(int x, int y);
说明:参数 x 和 y 为两个整数,函数值为两者中的较大者。
裁判程序
#include <stdio.h> int IntMax(int x, int y); int main() { int a, b, c; scanf("%d%d", &a, &b); c = IntMax(a, b); printf("%d\n", c); return 0; } /* 你提交的代码将被嵌在这里 */
输入样例1
15 36
输出样例1
36
输入样例2
-18 -47
输出样例2
-18
int IntMax(int x, int y){
if(x>y)return x;
else return y;
}
6-1-5 判断倍数
请编写函数,判断一个整数是另一个整数的倍数。
函数原型
int IsMultiple(int x, int y);
说明:参数 x 和 y 为两个任意整数。若 x 是 y 的倍数,则函数值为 1 (真),否则为 0 (假)。
裁判程序
#include <stdio.h> int IsMultiple(int x, int y); int main() { int a, b; scanf("%d%d", &a, &b); if (IsMultiple(a, b)) { puts("Yes"); } else { puts("No"); } return 0; } /* 你提交的代码将被嵌在这里 */
输入样例1
36 -18
输出样例1
Yes
输入样例2
-27 12
输出样例2
No
输入样例3
0 0
输出样例3
Yes
int IsMultiple(int x, int y){
if(x==0)return 1;
if(y==0)return 0;
if(x%y==0||y%x==0)return 1;
else return 0;
}
6-1-6 三个数求最大值
本题要求实现一个函数,求三个数的最大值。
函数接口定义:
double Max ( double x,double y,double z );
其中 x
,y
和 z
都是用户传入的参数。 值不超过double
的范围,函数须返回x
,y
和 z
的最大值。
裁判测试程序样例:
#include <stdio.h> double Max(double x,double y,double z); int main() { double a,b,c; scanf("%lf%lf%lf",&a,&b,&c); printf("%.2lf\n",Max(a,b,c)); } /* 请在这里填写答案 */
输入样例:
3.14 8.76 -6.23
输出样例:
8.76
double Max ( double x,double y,double z ){
if(x>y&&x>z)return x;
if(y>x&&y>z)return y;
if(z>x&&z>y)return z;
}
6-1-7 分段函数1(函数)
定义一个名为Fen1的函数,完成如下分段函数的计算功能,并将结果返回。
f(x)=⎩⎨⎧5∗x2∗xx/2x>1−1<=x<=1x<−1⎭⎬⎫
函数接口定义:
double Fen1(double x);
该函数完成上述分段函数并将计算结果返回。
裁判测试程序样例:
#include <stdio.h> double Fen1(double x); int main() { double a, b; scanf("%lf", &a); b = Fen1(a); printf("%.2f", b); return 0; } /* 请在这里填写答案 */
输入样例:
2
输出样例:
10.00
double Fen1(double x){
if(x>1)return 5*x;
if(x>=-1&&x<=1)return x*2;
if(x<-1)return x/2;
}
6-1-8 分段函数2(函数)
定义一个名为Fen2的函数,完成如下分段函数的计算功能,并将结果返回。
f(x)=⎩⎨⎧x/2+11−2∗x−1x>0x=0x<0⎭⎬⎫
函数接口定义:
double Fen2(int x);
该函数完成上述分段函数并将计算结果返回。
裁判测试程序样例:
#include <stdio.h> double Fen2(int x); int main() { int a; double b; scanf("%d", &a); b = Fen2(a); printf("%.2f", b); return 0; } /* 请在这里填写答案 */
输入样例:
2
输出样例:
2.00
double Fen2(int x){
double y;
if(x>0)y=x*1.0/2+1;
if(x==0)y=1;
if(x<0)y=-2*x-1;
return y;
}
6-2-1 使用递归函数计算1到n之和
本题要求实现一个用递归计算1+2+3+…+n的和的简单函数。
函数接口定义:
int sum( int n );
该函数对于传入的正整数n
返回1+2+3+…+n
的和;若n
不是正整数则返回0。题目保证输入输出在长整型范围内。建议尝试写成递归函数。
裁判测试程序样例:
#include <stdio.h> int sum( int n ); int main() { int n; scanf("%d", &n); printf ("%d\n", sum(n)); return 0; } /* 你的代码将被嵌在这里 */
输入样例1:
10
输出样例1:
55
输入样例2:
0
输出样例2:
0
int sum( int n ){//非递归
int s=0;
for(int i=1;i<=n;i++)s+=i;
return s;
}
int sum( int n ){//递归
int s;
if(n<=0)s=0;
else if(n==1)s=1;
else s=sum(n-1)+n;
return s;
}
6-2-2 递归实现指数函数
本题要求实现一个计算xn(n≥1)的函数。
函数接口定义:
double calc_pow( double x, int n );
函数calc_pow
应返回x
的n
次幂的值。建议用递归实现。题目保证结果在双精度范围内。
裁判测试程序样例:
#include <stdio.h> double calc_pow( double x, int n ); int main() { double x; int n; scanf("%lf %d", &x, &n); printf("%.0f\n", calc_pow(x, n)); return 0; } /* 你的代码将被嵌在这里 */
输入样例:
2 3
输出样例:
8
double calc_pow( double x, int n ){
int s=1;
for(int i=1;i<=n;i++)
s*=x;
return s;
}
double calc_pow( double x, int n ){
int s;
if(n==1)s=x;
else s=x*calc_pow(x,n-1);
return s;
}
6-2-3 递归计算Ackermenn函数
题要求实现Ackermenn函数的计算,其函数定义如下:
函数接口定义:
int Ack( int m, int n );
其中m
和n
是用户传入的非负整数。函数Ack
返回Ackermenn函数的相应值。题目保证输入输出都在长整型
范围内。
裁判测试程序样例:
#include <stdio.h> int Ack( int m, int n ); int main() { int m, n; scanf("%d %d", &m, &n); printf("%d\n", Ack(m, n)); return 0; } /* 你的代码将被嵌在这里 */
输入样例:
2 3
输出样例:
9
int Ack( int m, int n ){
if(m==0)return n+1;
else if(n==0&&m>0)return Ack(m-1,1);
else if(m>0&&n>0)return Ack(m-1,Ack(m,n-1));
}
6-2-4 递归求Fabonacci数列
本题要求实现求Fabonacci数列项的函数。Fabonacci数列的定义如下:
f(n)=f(n−2)+f(n−1) (n≥2),其中f(0)=0,f(1)=1。
函数接口定义:
int f( int n );
函数f
应返回第n
个Fabonacci数。题目保证输入输出在长整型范围内。建议用递归实现。
裁判测试程序样例:
#include <stdio.h> int f( int n ); int main() { int n; scanf("%d", &n); printf("%d\n", f(n)); return 0; } /* 你的代码将被嵌在这里 */
输入样例:
6
输出样例:
8
int f( int n ){
if(n==0)return 0;
else if(n==1)return 1;
else return f(n-2)+f(n-1);
}
6-2-5 递归实现顺序输出整数
本题要求实现一个函数,对一个整数进行按位顺序输出。
函数接口定义:
void printdigits( int n );
函数printdigits
应将n
的每一位数字从高位到低位顺序打印出来,每位数字占一行。
裁判测试程序样例:
#include <stdio.h> void printdigits( int n ); int main() { int n; scanf("%d", &n); printdigits(n); return 0; } /* 你的代码将被嵌在这里 */
输入样例:
12345
输出样例:
1
2
3
4
5
void printdigits( int n ){
if(n<10)printf("%d",n);
else{printdigits(n/10);printf("\n%d",n%10);}
}
6-2-6 递归计算P函数
本题要求实现下列函数P(n,x)的计算,其函数定义如下:
函数接口定义:
double P( int n, double x );
其中n
是用户传入的非负整数,x
是双精度浮点数。函数P
返回P(n,x)函数的相应值。题目保证输入输出都在双精度范围内。
裁判测试程序样例:
#include <stdio.h> double P( int n, double x ); int main() { int n; double x; scanf("%d %lf", &n, &x); printf("%.2f\n", P(n,x)); return 0; } /* 你的代码将被嵌在这里 */
输入样例:
10 1.7
输出样例:
3.05
double P( int n, double x ){
if(n==0)return 1;
else if(n==1)return x;
else if(n>1)return ((2*n-1)*P(n-1,x)-((n-1)*P(n-2,x)))/n;
}
6-3-1 菲波那切数列(循环版)
请编写函数,用循环的方法求菲波那切(Fibonacci)数列某一项的值。
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...
函数原型
double Fib(int index);
说明:参数 index 为数列项的索引号,从 0 开始计数。函数值为 Fibonacci 数列第 index 项的值。
裁判程序
#include <stdio.h> double Fib(int index); int main() { int n; scanf("%d", &n); printf("%.10g\n", Fib(n)); return 0; } /* 你提交的代码将被嵌在这里 */
要求:试试看,不使用选择语句,只用循环语句完成函数的设计,
输入样例
8
输出样例
21
double Fib(int index)
{
double f1 = 1, f2 = 0, f = 0;
int k = 1;
while (k <= index)
{
f = f1 + f2;
f1 = f2;
f2 = f;
++k;
}
return f;
}
6-3-2 自然数的任意位数字(循环版)
请编写函数,用循环方法求自然数的任意一位数字。
函数原型
int Digit(int number, int index);
说明:参数 number、index 均为非负整数。index 为数位的索引号。个位、十位、百位、……依次编号为 0, 1, 2, ...。函数值为 number 的第 index 位数字。
裁判程序
#include <stdio.h> int Digit(int number, int index); int main() { int n, i; scanf("%d%d", &n, &i); printf("%d\n", Digit(n, i)); return 0; } /* 你提交的代码将被嵌在这里 */
要求:不用选择语句,用循环方法完成函数设计。
输入样例
25173 2
输出样例
1
while(index > 0 && number > 0)
{
number = number / 10;
index--;
}
return number % 10;
6-3-3 自然数的位数(循环版)
请编写函数,用循环方法求自然数的位数。
函数原型
int NumDigit(int number);
说明:参数 number 为非负整数。函数值为 number 的位数。若 number 为零,则函数值为零。
裁判程序
#include <stdio.h> int NumDigit(int number); int main() { int n; scanf("%d", &n); printf("%d\n", NumDigit(n)); return 0; } /* 你提交的代码将被嵌在这里 */
要求:不使用选择语句,用循环方法完成函数的设计。
输入样例
25173
输出样例
5
int NumDigit(int number){
int n=number,x=0;
while(n){
n/=10;
x++;
}return x;
}
6-3-4 自然数各位数字之和(循环版)
请编写函数,求自然数各位数字之和。
函数原型
int SumDigit(int number);
说明:参数 number 为非负整数。函数值为 number 的各位数字之和。若 number 为零,则函数值为零。
裁判程序:
#include <stdio.h> int SumDigit(int number); int main() { int n; scanf("%d", &n); printf("%d\n", SumDigit(n)); return 0; } /* 你提交的代码将被嵌在这里 */
输入样例
35184
输出样例
21
要求:不得使用选择语句。
int SumDigit(int number){
int n=number,x=0;
while(n){
x+=n%10;
n/=10;
}return x;
}
6-3-5 求阶乘之和(高效循环版)
请编写函数,用循环方法求阶乘之和。
SumFac(n)=0!+1!+2!+3+⋯+n!
函数原型
double SumFac(int x);
说明:参数 x 为非负整数,函数值为 0 到 x 的阶乘之和。
要求:直接通过循环求得结果。
裁判程序
#include <stdio.h> double SumFac(int x); int main() { int n; scanf("%d", &n); printf("%.10g\n", SumFac(n)); return 0; } /* 你提交的代码将被嵌在这里 */
输入样例1
4
输出样例1
34
输入样例2
70
输出样例2
1.215221118e+100
double SumFac(int x){
double y=1,s=1;
for(int i=1;i<=x;i++){
y*=i;
s+=y;
}
return s;
}
6-3-6 求整数区间[a,b]中偶数之和
编写函数,求给定整数区间[a,b]中偶数之和。
函数接口定义:
在这里描述函数接口。例如: int sumEven(int begin, int end);
参数begin
是整数区间的左边界, end
是整数区间的右边界,函数的值是该区间所有偶数之和。
裁判测试程序样例:
在这里给出函数被调用进行测试的例子。例如: #include <stdio.h> /* 你编写的函数将嵌入在这里 */ int main() { int a,b; scanf("%d%d",&a,&b); printf("SumEven = %d\n",sumEven(a,b)); return 0; }
输入样例:
在这里给出一组输入。例如:
1 10
输出样例:
在这里给出相应的输出。例如:
SumEven = 30
int sumEven(int begin, int end){
int s=0;
for(int i=begin;i<=end;i++){
if(i%2==0)
s+=i;
}
return s;
}
6-3-7 自守数
谓自守数(也称守形数),是指其平方数的低位部分恰为该数本身的自然数。
例如:52 =25,而25 的低一位是5,因此 5 是自守数,还有762 =5776,而5776 的低二位是76,因此 76 是自守数,
注:0 和 1 也算自守数。
从键盘上输入正整数n的值(这里确保n的平方不超过int范围),请编写函数,计算[2,n]区间自守数的个数。
函数接口定义:
int IsAutomorphic(int x);
若 x 为自守数,则函数值为 1(真),否则为 0(假)。
裁判测试程序:
#include <stdio.h> int IsAutomorphic(int x); int main() { int n,i,num=0; scanf("%d", &n); for(i=2;i<=n;i++) if(IsAutomorphic( i)) num++; printf("自守数个数为:%d",num); return 0; } /* 你提交的代码将被嵌在这里 */
输入样例:
25
输出样例:
自守数个数为:3
//题外话,我记得之前不能直接改变函数内的值,比如x/=10,这里其实是可以的,不可以的那种是因为传入的值在主体函数部分的其它地方有使用到。
int IsAutomorphic(int x)
{
int y = x * x;
while (x)
{
if (x % 10 != y % 10)
return 0;
x /= 10;
y /= 10;
}
return 1;
}