2022秋 - C实验A类 –实验7 函数与指针

6-1 弹球距离

设有一个球从高度为h米的地方落下,碰到地面后又弹到高度为原来p倍的位置,然后又落下,再弹起,再落下…。请编写函数求初始高度为h的球下落后到基本停下来(高度小于给定阈值TOL)时在空中所经过的路程总和。

函数接口定义:

double dist( double h, double p );

其中h是球的初始高度,p是球弹起高度与弹起前落下高度的比值;函数dist要返回球下落后到基本停下来时在空中所经过的路程总和。注意:当弹起的高度小于裁判程序定义的常数TOL时,弹起的距离不计算在内。

裁判测试程序样例:

#include <stdio.h>
#define TOL 1E-3

double dist( double h, double p );

int main()
{
    double h, p, d;
    scanf("%lf %lf", &h, &p);
    d = dist(h, p);
    printf("%.6f\n", d);
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

1.0 0.4

输出样例:

2.331149

代码段:

 double dist( double h, double p )
{
    double s=0;
    while(1)
    {
        s=s+h;
        if(h*p>=TOL)
        {
            s=s+h*p;
            h=h*p;
        }
        else
            break;
    }
    return s;
}

6-2 使用函数输出一个整数的逆序数

本题要求实现一个求整数的逆序数的简单函数。

函数接口定义:

int reverse( int number );

其中函数reverse须返回用户传入的整型number的逆序数。

裁判测试程序样例:

#include <stdio.h>

int reverse( int number );
    
int main()
{
    int n;

    scanf("%d", &n);
    printf("%d\n", reverse(n));

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

-12340

输出样例:

-4321

代码段:

int reverse( int number )
{
    int sum=0;
    
    for(;number!=0;number/=10)
    {
        sum=sum*10+number%10;
    }
    
    return sum;
}

6-3 使用函数求最大公约数

本题要求实现一个计算两个数的最大公约数的简单函数。

函数接口定义:

int gcd( int x, int y );

其中xy是两个正整数,函数gcd应返回这两个数的最大公约数。

裁判测试程序样例:

#include <stdio.h>

int gcd( int x, int y );

int main()
{
    int x, y;
    
    scanf("%d %d", &x, &y);
    printf("%d\n", gcd(x, y));
    
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

32 72

输出样例:

8

代码段:

int gcd( int x, int y )
{
    int temp,i;
    for(i=x;i>1;i--)
    {
        if(x%i==0&&y%i==0)
        {
            break;
        }
    }
    return i;
}

6-4 使用函数求奇数和

本题要求实现一个函数,计算N个整数中所有奇数的和,同时实现一个判断奇偶性的函数。

函数接口定义:

int even( int n );
int OddSum( int List[], int N );

其中函数even将根据用户传入的参数n的奇偶性返回相应值:当n为偶数时返回1,否则返回0。函数OddSum负责计算并返回传入的N个整数List[]中所有奇数的和。

裁判测试程序样例:

#include <stdio.h>

#define MAXN 10

int even( int n );
int OddSum( int List[], int N );

int main()
{    
    int List[MAXN], N, i;

    scanf("%d", &N);
    printf("Sum of ( ");
    for ( i=0; i<N; i++ ) {
        scanf("%d", &List[i]);
        if ( even(List[i])==0 )
            printf("%d ", List[i]);
    }
    printf(") = %d\n", OddSum(List, N));
    
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

6
2 -3 7 88 0 15

输出样例:

Sum of ( -3 7 15 ) = 19

代码段:

int even( int n )
{
    if(n%2==0)
        return 1;
    else
        return 0;
}
int OddSum( int List[], int N )
{
    int sum=0;
    for(int i=0;i<N;i++)
    {
        if(even(List[i])==0)
            sum=sum+List[i];
    }
    return sum;
} 

6-5 使用函数求特殊a串数列和

给定两个均不超过9的正整数a和n,要求编写函数求a+aa+aaa++⋯+aa⋯a(n个a)之和。

函数接口定义:

int fn( int a, int n );
int SumA( int a, int n );

其中函数fn须返回的是na组成的数字;SumA返回要求的和。

裁判测试程序样例:

#include <stdio.h>

int fn( int a, int n );
int SumA( int a, int n );
    
int main()
{
    int a, n;

    scanf("%d %d", &a, &n);
    printf("fn(%d, %d) = %d\n", a, n, fn(a,n));        
    printf("s = %d\n", SumA(a,n));    
    
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

2 3

输出样例:

fn(2, 3) = 222
s = 246

代码段:

int fn( int a, int n )
{
    int sum=0;
    for(int i=1;i<=n;i++)
    {
        sum=sum*10;
        sum+=a;
    }
    return sum;
}

int SumA( int a, int n )
{
    int sum;
    for(int i=1;i<=n;i++)
        sum+=fn(a,i);
    return sum;
}

6-6 使用函数求素数和

本题要求实现一个判断素数的简单函数、以及利用该函数计算给定区间内素数和的函数。

素数就是只能被1和自身整除的正整数。注意:1不是素数,2是素数。

函数接口定义:

int prime( int p );
int PrimeSum( int m, int n );

其中函数prime当用户传入参数p为素数时返回1,否则返回0;函数PrimeSum返回区间[mn]内所有素数的和。题目保证用户传入的参数mn

裁判测试程序样例:

#include <stdio.h>
#include <math.h>

int prime( int p );
int PrimeSum( int m, int n );
    
int main()
{
    int m, n, p;

    scanf("%d %d", &m, &n);
    printf("Sum of ( ");
    for( p=m; p<=n; p++ ) {
        if( prime(p) != 0 )
            printf("%d ", p);
    }
    printf(") = %d\n", PrimeSum(m, n));

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

-1 10

输出样例:

Sum of ( 2 3 5 7 ) = 17

代码段:


int prime( int p )
{
    if(p<=1)
    {
        return 0;	
    }
    else
    {
        for(int i=2;i<=sqrt(p);i++)
        {
            if(p%i==0)return 0;        
        } 
    }
    return 1;
}



int PrimeSum( int m, int n )
{
    int s=0;
    for(int i=m;i<=n;i++)
    {
        if(prime(i))s+=i;
    }
    return s;
}

6-7 统计各位数字之和是5的数

本题要求实现两个函数:一个函数判断给定正整数的各位数字之和是否等于5;另一个函数统计给定区间内有多少个满足上述要求的整数,并计算这些整数的和。

函数接口定义:

int is( int number );
void count_sum( int a, int b );

函数is判断number的各位数字之和是否等于5,是则返回1,否则返回0。

函数count_sum利用函数is统计给定区间[ab]内有多少个满足上述要求(即令is返回1)的整数,并计算这些整数的和。最后按照格式

count = 满足条件的整数个数, sum = 这些整数的和

进行输出。题目保证0<ab≤10000。

裁判测试程序样例:

#include <stdio.h>

int is( int number );
void count_sum( int a, int b );

int main()
{
    int a, b;

    scanf("%d %d", &a, &b);
    if (is(a)) printf("%d is counted.\n", a);
    if (is(b)) printf("%d is counted.\n", b);
    count_sum(a, b);

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

104 999

输出样例:

104 is counted.
count = 15, sum = 3720

代码段:

int is( int number )
{
    int sum=0;
    while(number>0)
    {
        sum=number%10+sum;
        number=number/10;
    }
    if(sum==5)
        return 1;
    else
        return 0;
}

void count_sum( int a, int b )
{
    int sum=0,count=0;
    for(int i=a;i<=b;i++)
    {
        sum=sum+is(i)*i;
        count=count+is(i);
    }
    printf("count = %d, sum = %d",count,sum);
}

6-8 多项式求值

本题要求实现一个函数,计算阶数为n,系数为a[0] ... a[n]的多项式f(x)=∑ i=0 n ​(a[i]×x^i) 在x点的值。

函数接口定义:

double f( int n, double a[], double x );

其中n是多项式的阶数,a[]中存储系数,x是给定点。函数须返回多项式f(x)的值。

裁判测试程序样例:

#include <stdio.h>

#define MAXN 10

double f( int n, double a[], double x );

int main()
{
    int n, i;
    double a[MAXN], x;
    
    scanf("%d %lf", &n, &x);
    for ( i=0; i<=n; i++ )
        scanf("%lf", &a[i]);
    printf("%.1f\n", f(n, a, x));
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

2 1.1
1 2.5 -38.7

输出样例:

-43.1

代码段:

double f( int n, double a[], double x )
{
    double sum;
	int i;
    for(i=0;i<=n;i++)
    {
        sum=sum+a[i]*pow(x,i);
    }
    return sum;
}

6-9 移动字母

本题要求编写函数,将输入字符串的前3个字符移到最后。

函数接口定义:

void Shift( char s[] );

其中char s[]是用户传入的字符串,题目保证其长度不小于3;函数Shift须将按照要求变换后的字符串仍然存在s[]里。

裁判测试程序样例:

#include <stdio.h>
#include <string.h>

#define MAXS 10

void Shift( char s[] );

void GetString( char s[] ); /* 实现细节在此不表 */

int main()
{
    char s[MAXS];

    GetString(s);
    Shift(s);
    printf("%s\n", s);
    
    return 0; 
}

/* 你的代码将被嵌在这里 */

输入样例:

abcdef

输出样例:

defabc

代码段:

void Shift( char s[] )
{
    int i,j;
    for(i=0;i<3;i++)
    {
        char b=s[0];
        for(j=0;s[j+1]!='\0';j++)
            s[j]=s[j+1];
        s[j]=b;
    }
}

6-10 在数组中查找指定元素

本题要求实现一个在数组中查找指定元素的简单函数。

函数接口定义:

int search( int list[], int n, int x );

其中list[]是用户传入的数组;n(≥0)是list[]中元素的个数;x是待查找的元素。如果找到

则函数search返回相应元素的最小下标(下标从0开始),否则返回−1。

裁判测试程序样例:

#include <stdio.h>
#define MAXN 10

int search( int list[], int n, int x );
    
int main()
{
    int i, index, n, x;
    int a[MAXN];

    scanf("%d", &n);
    for( i = 0; i < n; i++ )
        scanf("%d", &a[i]);
    scanf("%d", &x);
    index = search( a, n, x );
    if( index != -1 )
        printf("index = %d\n", index);
    else
        printf("Not found\n");
            
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例1:

5
1 2 2 5 4
2

输出样例1:

index = 1

输入样例2:

5
1 2 2 5 4
0

输出样例2:

Not found

代码段:

int search( int list[], int n, int x )
{
    int i,flag=0;
    for(i=0;i<n;i++)
    {
        if(list[i]==x)
        {
            return i;
            flag++;
        }
    }
    if(flag==0)
        return -1;
}

6-11 删除字符

本题要求实现一个删除字符串中的指定字符的简单函数。

函数接口定义:

void delchar( char *str, char c );

其中char *str是传入的字符串,c是待删除的字符。函数delchar的功能是将字符串str中出现的所有c字符删除。

裁判测试程序样例:

#include <stdio.h>
#define MAXN 20

void delchar( char *str, char c );
void ReadString( char s[] ); /* 由裁判实现,略去不表 */

int main()
{
    char str[MAXN], c;

    scanf("%c\n", &c);
    ReadString(str);
    delchar(str, c);
    printf("%s\n", str);
    
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

a
happy new year

输出样例:

hppy new yer

代码段:

void delchar( char *str, char c ){
	int i = 0,j = 0;
	for (;str[i] != '\0';i++){
		if (str[i] != c){
			str[j] = str[i];
			j++;
		}
	}
	str[j] = '\0';
}

6-12 分类统计各类字符个数

本题要求实现一个函数,统计给定字符串中的大写字母、小写字母、空格、数字以及其它字符各有多少。

函数接口定义:

void StringCount( char *s );

其中 char *s 是用户传入的字符串。函数StringCount须在一行内按照

大写字母个数 小写字母个数 空格个数 数字个数 其它字符个数

的格式输出。

裁判测试程序样例:

#include <stdio.h>
#define MAXS 15

void StringCount( char *s );
void ReadString( char *s ); /* 由裁判实现,略去不表 */

int main()
{
    char s[MAXS];

    ReadString(s);
    StringCount(s);

    return 0;
}

/* Your function will be put here */

输入样例:

aZ&*?
093 Az

输出样例:

2 2 1 3 4

代码段:

void StringCount( char *s )
{
    int i=0,a=0,b=0,c,d,e;
    for(;s[i]!='\0';i++)
    {
        if(s[i]>='A'&&s[i]<='Z')
            a++;
        else if(s[i]>='a'&&s[i]<='z')
            b++;
        else if(s[i]==' ')
            c++;
        else if('0'<=s[i]&&s[i]<='9')
            d++;
        else e++;
    }
    printf("%d %d %d %d %d",a,b,c,d,e);
}

6-13 函数实现字符串逆序

本题要求实现一个字符串逆序的简单函数。

函数接口定义:

void f( char *p );

函数fp指向的字符串进行逆序操作。要求函数f中不能定义任何数组,不能调用任何字符串处理函数。

裁判测试程序样例:

#include <stdio.h>
#define MAXS 20

void f( char *p );
void ReadString( char *s ); /* 由裁判实现,略去不表 */

int main()
{
    char s[MAXS];
    
    ReadString(s);
    f(s);
    printf("%s\n", s);
    
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

Hello World!

输出样例:

!dlroW olleH

代码段:

void f( char *p )
{
    int i=0;
    while(p[i]!='\0')
    {
        i++;
    }
    int len=i;
    i=0;
    char temp;
    if(len%2==0)
    {
        for(i=0;i<len/2;i++)
        {
            temp=p[i];
		    p[i]=p[len-1-i];
            p[len-1-i]=temp;
        }
    }
    else
    {
        for(i=0;i<(len-1)/2;i++)
        {
            temp=p[i];
			p[i]=p[len-1-i];
		    p[len-1-i]=temp;
        }
    }
}

6-14 递归计算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 )
{
    int sum;
    if(m==0)
        return n+1;
    else if(n==0&&m>0)
        return Ack(m-1,1);
    else if(n>0&&m>0)
        return Ack(m-1,Ack(m,n-1));
}

6-15 递归计算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)
    {
        double sum;
        sum=((2*n-1)*P(n-1,x)-(n-1)*P(n-2,x))/n;
        return sum;
    }
}
  • 1
    点赞
  • 2
    收藏 更改收藏夹
  • 打赏
    打赏
  • 0
    评论
C语言参考答案汇总(浙江大学城市学院) 第2周(M2) 2 20011求华氏温度100°F对应的摄氏温度。 2 20012 求华氏温度 150°F 对应的摄氏温度。 3 20013求摄氏温度26°C对应的华氏温度。 3 20015当n为152时,分别求出n的个位数字(digit1)、十位数字(digit2)和百位数字(digit3)的值。 3 20026 输入2个整数 num1 和 num2,计算并输出它们的和、差、积、商与余数。 4 第3周(M3) 5 20031 求1+2+3+......+100(调试示例error02_5) 5 20032 求m+(m+1)+(m+2)+......+100 5 20033 求1/m+1/(m+1)+1/(m+2)+......+1/n 6 20034 求1 + 1/3 + 1/5 + ......的前n项和 7 20035 求1-1/4+1/7-1/10+……的前n项之和 7 20036 输出华氏-摄氏温度转换表(改错题error02_6) 8 20038 求x的n次幂 9 20041 生成 3 的乘方表 10 20044 求100^0.5+101^0.5+……+1000^0.5 10 20053 计算物体自由下落的距离 11 20056 计算分段函数 11 20061 阶梯电价 12 20062 求m*m+1/m+(m+1)*(m+1)+1/(m+1)+(m+2)*(m+2)+1/(m+2)+......+n*n+1/n 13 20063 求1-2/3+3/5-4/7+5/9-6/11+…… 14 20064 求2^1+2^2+2^3+……+2^n 15 第4周(M4) 15 10007 显示图案 (复习printf()的字符串输出) 15 20042 生成阶乘表 16 20043 使用函数求 n! /(m!* (n-m)!) 16 20054 求平均值 17 20057 求1+1/2+1/3+......+1/n 18 20065 求0!+1!+2!+……+n! 18 40015 求最小值 19 40018 求a+aa+aaa+aa…a 20 第5周(M5) 21 30001 求一元二次方程的根 21 30002 求分段函数的值 23 30003 分统计字符 23 30004 显示五级记分制成绩所对应的百分制成绩区间(使用switch) 24 30005 显示水果的价格(使用switch) 25 30007 求三角形的面积和周长 27 30008 计算个人所得税 28 30051 判断闰年 29 30052 统计学生平均成绩与及格人数 30 30053 分段计算水费(使用嵌套的if-else语句) 31 第6周(M6) 32 40011 求最小公倍数和最大公约数(调试示例error04_1) 32 40012 求1-1/4+1/7-1/10+1/13-1/16+…… 33 40014 求整数的位数 34 40023 换硬币 35 40024 找出各位数字的立方和等于它本身的数 36 40025 找完数(改错题error04_2) 38 40027 从高位开始逐位输出一个整数的各位数字(选作) 39 40052 判断素数 40 40053 逆序输出整数 41 40054 输出斐波那契序列 42 第7周(M7) 42 50002 使用函数判断数的符号 42 50003 使用函数求奇数和 43 50005 使用函数统计素数并求和 44 50006 使用函数统计一个整数中数字的个数 45 50007 使用函数找水仙花数 46 50009 使用函数求余弦函数的近似值 48 50052 使用函数找最大值 49 50062 使用函数输出指定范围内的 Fibonacci 数 50 50063 使用函数找出指定范围内的完数 51 第8周(M8) 52 40013 求奇数和 52 40062 求x+x*x/2!+x*x*x/3!+x*x*x*x/4!+……的值 53 50004 使用函数计算两点间的距离 54 50061 使用函数求a+aa+aaa+aa…a 55 60002 整数的十进制、八进制和十六进制表现形式 56 60003 分统计字符 57 60006 验证歌德巴赫猜想 58 60007 使用函数输出整数的逆序数 59 60009

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Snooker No. eight

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值