浙大版《C语言程序设计(第3版)》题目集(函数题)

本文提供了浙江大学《C语言程序设计》第三版的习题解析和函数实现,涵盖求和、最大值、数字金字塔、符号函数、奇数和、两点距离、素数和、水仙花数等多个函数编程题目,旨在帮助读者深入理解C语言的函数应用和算法设计。
摘要由CSDN通过智能技术生成

所谓函数题,是指主函数main()题目中已给出,要求为程序写一个/两个函数,以实现某种功能,如为一组数据排序。


练习5-1 求m到n之和 (10分)

本题要求实现一个计算m~n(m<n)之间所有整数的和的简单函数。

函数接口定义:

int sum( int m, int n );

其中mn是用户传入的参数,保证有m<n。函数返回的是m~n之间所有整数的和。

裁判测试程序样例:

#include <stdio.h>

int sum(int m, int n);

int main()
{    
    int m, n;

    scanf("%d %d", &m, &n);
    printf("sum = %d\n", sum(m, n));

    return 0;
}

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

答案

int sum(int m,int n){
    int i;
    int sum = 0;
    for(i=m; i<=n; i++){
        sum += i;
    }
    return sum;
}

练习5-2 找两个数中最大者 (10分)

本题要求对两个整数a和b,输出其中较大的数。

函数接口定义:

int max( int a, int b );

其中ab是用户传入的参数,函数返回的是两者中较大的数。

裁判测试程序样例:

#include <stdio.h>

int max( int a, int b );

int main()
{    
    int a, b;

    scanf("%d %d", &a, &b);
    printf("max = %d\n", max(a, b));

    return 0;
}

答案

int max(int a,int b)
{
    if(a<=b)
      return b;
    else
      return a;
}

练习5-3 数字金字塔 (15分)

本题要求实现函数输出n行数字金字塔。

函数接口定义:

void pyramid( int n );

其中n是用户传入的参数,为[1, 9]的正整数。要求函数按照如样例所示的格式打印出n行数字金字塔。注

意每个数字后面跟一个空格。

裁判测试程序样例:

#include <stdio.h>

void pyramid( int n );

int main()
{    
    int n;

    scanf("%d", &n);
    pyramid(n);

    return 0;
}

答案

void pyramid( int n ){
	int i,j,k,m;
 
	m = n;
	for(i=1;i<=n;i++,m--){
		j=m;
		for(;j>0;j--)
			printf(" ");
		for(k=i;k>0;k--)
			printf("%d ", i);
		printf("\n");
	}
 
}

习题5-1 符号函数 (10分)

本题要求实现符号函数sign(x)。

函数接口定义

int sign( int x );

其中x是用户传入的整型参数。符号函数的定义为:若x大于0,sign(x) = 1;若x等于0,sign(x) = 0;否则,sign(x) = −1。

裁判测试程序样例:

#include <stdio.h>

int sign( int x );

int main()
{
    int x;

    scanf("%d", &x);
    printf("sign(%d) = %d\n", x, sign(x));

    return 0;
}

答案

int sign(int x)
{
   // int n;
  //  n=x;
    if(x>0)
        return 1;
    else if(x==0)
        return 0;
    else 
        return -1;
}

习题5-2 使用函数求奇数和 (15分)

本题要求实现一个函数,计算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;
}

答案

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

    }
    return sum;
}

习题5-3 使用函数计算两点间的距离 (10分)

本题要求实现一个函数,对给定平面任意两点坐标(x​1​​,y​1​​)和(x​2​​,y​2​​),求这两点之间的距离。

函数接口定义:

double dist( double x1, double y1, double x2, double y2 );

其中用户传入的参数为平面上两个点的坐标(x1y1)和(x2y2),函数dist应返回两点间的距离。

裁判测试程序样例:

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

double dist( double x1, double y1, double x2, double y2 );

int main()
{    
    double x1, y1, x2, y2;

    scanf("%lf %lf %lf %lf", &x1, &y1, &x2, &y2);
    printf("dist = %.2f\n", dist(x1, y1, x2, y2));

    return 0;
}

答案

double dist(double x1, double y1, double x2, double y2 )
{
    double x,y,sum;
  /* if(x1>x2)
       x=x1-x2;
   else 
       x=x2-x1;
    if(y1>y2)
        y=y1-y2;
    elsev
        y=y2-y1;  */
    x=fabs(x1-x2);   //fabs 求双精度浮点数的绝对值,abs 求整数的绝对值
    y=fabs(y1-y2);
    sum=sqrt(x*x+y*y);
    return sum;
}

习题5-4 使用函数求素数和 (20分)

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

素数就是只能被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;
}

答案

int prime( int p )
{
    if(p<=1)
       return 0;
    else
    {
        for(int i=2;i<p;i++)
        {
            if(p%i==0)
                return 0;
        }
        return 1;
        
    }
    
    
}
int PrimeSum( int m, int n )
{
    int sum=0;
    for(int i=m;i<=n;i++)
    {
        if(prime(i)==1)
            sum+=i;
    }
    return sum;
}

习题5-6 使用函数输出水仙花数 (20分)

水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=1​3​​+5​3​​+3​3​​。 本题要求编写两个函数,一个判断给定整数是否水仙花数,另一个按从小到大的顺序打印出给定区间(m,n)内所有的水仙花数。

函数接口定义:

int narcissistic( int number );
void PrintN( int m, int n );

函数narcissistic判断number是否为水仙花数,是则返回1,否则返回0。

函数PrintN则打印开区间(mn)内所有的水仙花数,每个数字占一行。题目保证100≤mn≤10000。

裁判测试程序样例:

#include <stdio.h>

int narcissistic( int number );
void PrintN( int m, int n );

int main()
{
    int m, n;

    scanf("%d %d", &m, &n);
    if ( narcissistic(m) ) printf("%d is a narcissistic number\n", m);
    PrintN(m, n);
    if ( narcissistic(n) ) printf("%d is a narcissistic number\n", n);

    return 0;
}

答案

int narcissistic( int number )
{
    int i,count=0,sum=0;   //此处count要加上赋值,没加上时结果错误,后面sum的赋值竟然对于count无效
    int test=number;
    while(number)
    {
        number/=10;
        count++;
    }
    number=test;
    while(number)
    {
        int j=number%10;
        int  mult=1;      //mult要记得赋值为1,则每次循环都是值为1
        for(int i=0;i<count;i++)
        {
            mult*=j;
        }
        sum+=mult;
        number/=10;        
    }
    if(sum==test)
        return 1;
    else
        return 0;
    
}
void PrintN( int m, int n )
{
    m=m+1;
    for(;m<n;m++)
    {
        if(narcissistic(m)==1)
            printf("%d\n",m);
    }
}

习题6-1 分类统计字符个数 (15分)

本题要求实现一个函数,统计给定字符串中英文字母、空格或回车、数字字符和其他字符的个数。

函数接口定义:

void StringCount( char s[] );

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

letter = 英文字母个数, blank = 空格或回车个数, digit = 数字字符个数, other = 其他字符个数

的格式输出。

裁判测试程序样例:

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

答案

void StringCount( char s[] )
{
    int letter,blank,digit,other;
    letter=blank=digit=other=0;

    int i=0;                  //或者使用strlen(s)得到字符串的长度
    for (;s[i]!='\0';i ++)
    {
        if((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z'))
            letter++;
        else if(s[i]==' ')
            blank++;
        else if(s[i]>='0'&&s[i]<='9'
  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值