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/2​x>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−1​x>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应返回xn次幂的值。建议用递归实现。题目保证结果在双精度范围内。

裁判测试程序样例:

 

#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 );

其中mn是用户传入的非负整数。函数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;
}

 

  • 23
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星河欲转。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值