浙大版《C语言程序设计(第4版)》题目集保姆级讲解(第三章)

目录

练习3-2 计算符号函数的值

练习3-3 统计学生平均成绩与及格人数

练习3-4 统计字符

练习3-5 输出闰年

练习3-7 成绩转换

练习3-8 查询水果价格

习题3-1 比较大小

习题3-2 高速公路超速处罚

习题3-3 出租车计价

 习题3-4 统计学生成绩

习题3-5 三角形判断


练习3-2 计算符号函数的值

对于任一整数n,符号函数sign(n)的定义如下:

请编写程序计算该函数对任一输入整数的值。

输入格式:

输入在一行中给出整数n。

输出格式:

在一行中按照格式“sign(n) = 函数值”输出该整数n对应的函数值。

#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    if(n<0)
    {printf("sign(%d) = -1",n);}
    else if(n>0)
    {printf("sign(%d) = 1",n);}
    else
    {printf("sign(0) = 0");}
    return 0;
}

考点:分段函数,可以用if-else来给出不同分支
注意:0不是整数
如果if条件框中想表示n=0,要写成n==0

练习3-3 统计学生平均成绩与及格人数

本题要求编写程序,计算学生们的平均成绩,并统计及格(成绩不低于60分)的人数。题目保证输入与输出均在整型范围内。

输入格式:

输入在第一行中给出非负整数N,即学生人数。第二行给出N个非负整数,即这N位学生的成绩,其间以空格分隔。

输出格式:

按照以下格式输出:

average = 成绩均值
count = 及格人数

其中平均值精确到小数点后一位。

#include<stdio.h>
int main()
{
    int n,s=0,grade,c=0;
    float avg=0;
    scanf("%d",&n);
    if(n<=0){
        avg=0;
        c=0;
    }
    else{
        for(int i=0;i<n;i++)
        {
            scanf("%d",&grade);
            s=s+grade;
            if(grade>=60)
            c++;
        }
    avg=s*1.0/n;
    }
    printf("average = %.1f\n",avg);
    printf("count = %d\n",c);
    return 0;
}

考点:循环输入
因为只要求计算成绩均值,求得累加值除以总人数就可以了
计算及格人数需要在循环中嵌套选择
注意非负整数这个条件需要加上选择建立分支

练习3-4 统计字符

本题要求编写程序,输入10个字符,统计其中的英文字母、空格或回车、数字字符和其他字符的个数。

输入格式:

输入为10个字符。最后一个回车表示输入结束,不算在内。

输出格式:

在一行内按照

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

的格式输出。

考点:循环嵌套选择

首先是用循环+scanf控制输入10个字符
然后输入的字符存放在

  1. 数组里,遍历判断种类
  2. 变量里,直接判断其种类

退出条件是已经输入10个字符,以及一个回车

  • 对于英文字母,条件是(ch>='a' && ch<='z')||(ch>='A' && ch<='Z')
  • 对于数字字符,条件是ch>='0' && ch<='9'
  • 对于空格,条件是ch==' '
#include<stdio.h>
int main()
{
    int i, letter = 0, blank = 0, digit = 0, other = 0;
    letter=digit=blank=other=0;
        char ch;
    for(i=0;i<10;i++)
    {
        ch=getchar();
        if((ch>='a' && ch<='z')||(ch>='A' && ch<='Z'))
            letter++;
        else if(ch>='0' && ch<='9')
            digit++;
        else if(ch==' ' || ch=='\n')
            blank++;
        else
            other++;
    }
    printf("letter = %d, blank = %d, digit = %d, other = %d", 
    letter, blank, digit, other);
    return 0;
}

练习3-5 输出闰年

输出21世纪中截止某个年份以来的所有闰年年份。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。

输入格式:

输入在一行中给出21世纪的某个截止年份。

输出格式:

逐行输出满足条件的所有闰年年份,即每个年份占一行。输入若非21世纪的年份则输出"Invalid year!"。若不存在任何闰年,则输出“None”。

考点:选择嵌套循环

21世纪是2001年~2100年,年份条件就是year>2100||year<2001(作为不成立条件)
判断闰年条件:year%400 == 0 || ((year%4 == 0) && (year%100 != 0))
输入的年份是截止条件,当输入的年份也是闰年也需要输出,因此是i<=year


首先判断是否非21世纪,如果是,循环输出到这个年份的闰年并计数;如果不是,输出Invalid。
没有闰年,也就是计数为0,输出Invalid year

#include<stdio.h>
int main()
{
    int i,year,cnt=0;
    scanf("%d",&year);
    if(year<2001 || year>2100){
        printf("Invalid year!");
    }else{
        for(i=2001;i<=year;i++){
            if(i%400 == 0 || (i%4 == 0 && i%100 != 0)){
                printf("%d\n",i);
                cnt++;
            }
        }if(cnt==0){
            printf("None\n");
        }
        
    }
    return 0;
}

练习3-7 成绩转换

本题要求编写程序将一个百分制成绩转换为五分制成绩。转换规则:

  • 大于等于90分为A;
  • 小于90且大于等于80为B;
  • 小于80且大于等于70为C;
  • 小于70且大于等于60为D;
  • 小于60为E。

输入格式:

输入在一行中给出一个整数的百分制成绩。

输出格式:

在一行中输出对应的五分制成绩。

考点:选择语句中的switch

switch不常用,要记清语法,和if语句差不多

百分转等级制需要注意数字要除以10,这样得到的数字就能用字符代替,switch只能用字符(单字节数字),100分和90分一样,50多分和更低的一样,所以10和5这两种情况直接用下一种情况的语句就行

#include<stdio.h>
int main()
{
    int score;
    scanf("%d",&score);
    switch(score/10)
    {
        case 10:
        case 9:printf("A");break;
        case 8:printf("B");break;
        case 7:printf("C");break;
        case 6:printf("D");break;
        case 5:
        default:printf("E");
    }
    return 0;
}

练习3-8 查询水果价格

给定四种水果,分别是苹果(apple)、梨(pear)、桔子(orange)、葡萄(grape),单价分别对应为3.00元/公斤、2.50元/公斤、4.10元/公斤、10.20元/公斤。

首先在屏幕上显示以下菜单:

[1] apple
[2] pear
[3] orange
[4] grape
[0] exit

用户可以输入编号1~4查询对应水果的单价。当连续查询次数超过5次时,程序应自动退出查询;不到5次而用户输入0即退出;输入其他编号,显示价格为0。

输入格式:

输入在一行中给出用户连续输入的若干个编号。

输出格式:

首先在屏幕上显示菜单。然后对应用户的每个输入,在一行中按格式“price = 价格”输出查询结果,其中价格保留两位小数。当用户连续查询次数超过5次、或主动输入0时,程序结束。

考点:循环嵌套选择

循环控制输入次数为5
输入1~4,输出对应的价格值。当输入0时直接退出for循环

#include<stdio.h>
int main()
{
    int i,choice;
    printf("[1] apple\n");
    printf("[2] pear\n");
    printf("[3] orange\n");
    printf("[4] grape\n");
    printf("[0] exit\n");
    for(i=0;i<5;i++)
    {
        scanf("%d",&choice);
        if(choice==0)
            break;
        switch(choice)
        {
            case 0:break;
            case 1:printf("price = 3.00\n");break;
            case 2:printf("price = 2.50\n");break;
            case 3:printf("price = 4.10\n");break;
            case 4:printf("price = 10.20\n");break;
            default:printf("price = 0.00\n");break;
        }
    }
    return 0;
}

习题3-1 比较大小

本题要求将输入的任意3个整数从小到大输出。

输入格式:

输入在一行中给出3个整数,其间以空格分隔。

输出格式:

在一行中将3个整数从小到大输出,其间以“->”相连。

考点:分支结构

首先输入三个整数,存放在变量里,用if语句判断大小调整顺序然后输出

  • 首先调整ab大小顺序,让a为最小,所以当a>b时交换
  • 让后调整bc大小顺序,让c为最大,当b>c时交换
  • 最后,由于bc交换,不清楚此时ab的大小关系,所以再调整一次ab

那么ac要不要再判断呢?因为前两次已经确定了大小关系为a<b,c>b,b作为中间值已经确定了ac的关系即a<c,a和c已经是极值,所以只需要判断更改后的ab关系

#include<stdio.h>
int main()
{
    int a,b,c,t;
    scanf("%d %d %d",&a,&b,&c);
    if(a>b){
        t=b;
        b=a;
        a=t;
    }if(b>c){
        t=b;
        b=c;
        c=t;
    }if(a>b){
        t=b;
        b=a;
        a=t;
    }
    printf("%d->%d->%d",a,b,c);
    return 0;
}

习题3-2 高速公路超速处罚

按照规定,在高速公路上行使的机动车,达到或超出本车道限速的10%则处200元罚款;若达到或超出50%,就要吊销驾驶证。请编写程序根据车速和限速自动判别对该机动车的处理。

输入格式:

输入在一行中给出2个正整数,分别对应车速和限速,其间以空格分隔。

输出格式:

在一行中输出处理意见:若属于正常行驶,则输出“OK”;若应处罚款,则输出“Exceed x%. Ticket 200”;若应吊销驾驶证,则输出“Exceed x%. License Revoked”。其中x是超速的百分比,精确到整数。

考点:分支结构,整数转浮点数

如果没有超速,输出OK,超速>=10罚款200,超速>=50吊销驾驶证。三种限速分别为60,100,120

先求超速比例,以此作为判据,注意比例是浮点数,所以要把速度等整数在表达式里乘以一个浮点数来转换。

#include<stdio.h>
int main()
{
    int speed,Limited_speed;
    double per;
    scanf("%d %d",&speed,&Limited_speed);
    per = (speed - Limited_speed)*100*1.0/Limited_speed;
    if(per<10){
        printf("OK");
    }else if(per >= 10&&per<50){
        printf("Exceed %.f%%. Ticket 200",per);
    }else{
        printf("Exceed %.f%%. License Revoked",per);
    }
    return 0;
}

习题3-3 出租车计价

本题要求根据某城市普通出租车收费标准编写程序进行车费计算。具体标准如下:

  • 起步里程为3公里,起步费10元;
  • 超起步里程后10公里内,每公里2元;
  • 超过10公里以上的部分加收50%的回空补贴费,即每公里3元;
  • 营运过程中,因路阻及乘客要求临时停车的,按每5分钟2元计收(不足5分钟则不收费)。

输入格式:

输入在一行中给出输入行驶里程(单位为公里,精确到小数点后1位)与等待时间(整数,单位为分钟),其间以空格分隔。

输出格式:

在一行中输出乘客应支付的车费(单位为元),结果四舍五入,保留到元。

考点:分支结构,四舍五入,整转浮

路阻停车和正常计费是分开的
小于等于三公里为10元,3到10每公里+2,10公里就是24元。超过10公里是24+3*公里
(等待时间/5)*2则是路阻停车的费用
其中的四个变量,由题得等待时间wtime是整型,公里数是浮点型。而计算总价格和行驶价格时,因为与浮点型的公里数相关,也设定成浮点型。

值得一提的是,题目中要求给出的最终结果需要四舍五入,此时要用到格式控制符%.0f

#include<stdio.h>
int main()
{
    int wtime;
    double kilo,fee=0,price=0;
    scanf("%lf %d",&kilo,&wtime);
    if(kilo<=3)
    {
        price = 10;
    }else if(kilo<=10){
        price = 10+(kilo-3)*2.0;
    }else{
        price = 24+(kilo-10)*3.0;
    }
    fee=(wtime/5)*2 + price;
    printf("%.0f",fee);
    return 0;
}

 习题3-4 统计学生成绩

本题要求编写程序读入N个学生的百分制成绩,统计五分制成绩的分布。百分制成绩到五分制成绩的转换规则:

  • 大于等于90分为A;
  • 小于90且大于等于80为B;
  • 小于80且大于等于70为C;
  • 小于70且大于等于60为D;
  • 小于60为E。

输入格式:

输入在第一行中给出一个正整数N(≤1000),即学生人数;第二行中给出N个学生的百分制成绩,其间以空格分隔。

输出格式:

在一行中输出A、B、C、D、E对应的五分制成绩的人数分布,数字间以空格分隔,行末不得有多余空格。

考点:循环嵌套选择分支

用输入的N来控制循环,for循环读入并在内部判断,存入变量

注意要把人数分布的变量赋初值

#include<stdio.h>
int main()
{
    int N,A,B,C,D,E,i,score;
    A=B=C=D=E=0;
    scanf("%d",&N);
    for(i=0;i<N;i++)
    {
        scanf("%d",&score);
        if(score>=90)
			A++;
		else if(score>=80)
			B++;
		else if(score>=70)
			C++;
		else if(score>=60)
			D++;
		else
			E++;
	}
	printf("%d %d %d %d %d", A, B, C, D, E);
    return 0;
}

习题3-5 三角形判断

给定平面上任意三个点的坐标(x1​,y1​)、(x2​,y2​)、(x3​,y3​),检验它们能否构成三角形。

输入格式:

输入在一行中顺序给出六个[−100,100]范围内的数字,即三个点的坐标x1​、y1​、x2​、y2​、x3​、y3​。

输出格式:

若这3个点不能构成三角形,则在一行中输出“Impossible”;若可以,则在一行中输出该三角形的周长和面积,格式为“L = 周长, A = 面积”,输出到小数点后2位。

考点:分支结构,数学公式

要成为三角形,满足:两边之和大于第三边,两边之差小于第三边,用负判据更方便写。所以条件是(a+b)<=c||(a+c)<=b||(c+b)<=a

要用这个规律判断,首先要得到三边的边长,两个点的差值平方和得到边长,要用到pow,sqrt两个函数,所以要声明math.h。本次的运算可以全用浮点型

最后要得到长度和面积,长度累加,面积用海伦公式即可。注意结果要用两位小数

#include<stdio.h>
#include<math.h>
int main()
{
    double x1,x2,x3,y1,y2,y3;
    double lenth,area,a,b,c;
    scanf("%lf %lf %lf %lf %lf %lf",&x1,&y1,&x2,&y2,&x3,&y3);
    a=sqrt(pow((x1-x2),2)+pow((y1-y2),2) );
    b=sqrt(pow((x2-x3),2)+pow((y2-y3),2) );
    c=sqrt(pow((x1-x3),2)+pow((y1-y3),2) );
    //如果两边之和小于等于第三边
    if((a+b)<=c||(a+c)<=b||(c+b)<=a)
    {
        printf("Impossible");
    }
    else
    {
        lenth=a+b+c;
        area=sqrt(lenth/2*(lenth/2-a)*(lenth/2-b)*(lenth/2-c));//海伦公式
        printf("L = %.2f, A = %.2f",lenth,area);
    }
    return 0;
}

  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由谭浩强教授著、清华大学出社出的《C程序设计》是一本公认的学习C语言程序设计的经典教材。根据C语言的发展和计算机教学的需要,作者在《C程序设计(第三)》的基础上进行了修订。本书按照C语言的新标准C 99进行介绍,所有程序都符合C 99的规定,使编写程序更加规范;对C语言程序设计的基本概念和要点讲解透彻,全面而深入;按照作者提出的“提出问题—解决问题—归纳分析”三部曲进行教学、组织教材;本书的每个例题都按以下几个步骤展开:提出任务—解题思路—编写程序—运行程序—程序分析—有关说明。符合读者认知规律,容易入门与提高。   本书内容先进,体系合理,概念清晰,讲解详尽,降低台阶,分散难点,例题丰富,深入浅出,文字流畅,通俗易懂,是初学者学习C程序设计的理想教材,可作为高等学校各专业的正式教材,也是一本自学的好教材。本书还配有辅助教材《C程序设计(第四)学习辅导》。 《C程序设计》累计发行逾1100万册,不仅创同类书的全国最高纪录,在世界上也是罕见的。 《C程序设计(第四)》保持了前三的写作风格和概念清晰、通俗易懂的特点,并在以下几个方面作了修改: (1) 按照C99标准进行介绍,以适应C语言的发展,使编写程序更加规范 (2)采用编译系统 (3)加强算法,以程序设计为中心把算法与语言工具紧密结合 (4)通俗易懂,容易学习 (5)根据需要重新组织教材内容

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值