第二次测试习题解析

题目列表

  • 判断两数的大小
    • 题目
    • 解答
    • 分析
  • 公历闰年
    • 题目
    • 解答
    • 分析
  • 表达式求值一
    • 题目
    • 解答
    • 分析
  • 网购一
    • 题目
    • 解答
    • 分析
  • 求三角形的面积
    • 题目
    • 解答
    • 分析
  • 三对三篮球赛
    • 题目
    • 解答
    • 分析

判断两数的大小

题目

已知有两个整数,请使用if-else选择结构将它们中的较大数选择出来,存到max变量中;将较小数选择出来,存到min变量中,并将选择结果输出。

输入格式:
只有一行,为用空格分隔的两个整数。测试用例保证这两个数可以用int类型存储。

输出格式:
如果输入的两个整数相等,则输出“The two numbers are equal.”,如果不等则按如下格式输出:“The larger number is 100, the smaller number is 25.”(假设输入的两个数分别为100和25)。

解答

#include 
int main(void){int num1,num2,max,min;scanf("%d %d",&num1,&num2);if(num1>num2){max = num1;min = num2;printf("The larger number is %d, the smaller number is %d.",max,min);}else if(num1<num2){max = num2;min = num1;printf("The larger number is %d, the smaller number is %d.",max,min);}else{printf("The two numbers are equal.");}
}

分析

本题考查c中的判断基本语法。首先获取用户输入的两个数字,再根据数字的大小进行输出。不做更详细解析。

公历闰年

题目

地球绕太阳运行周期为365天5小时48分46秒(合365.24219天),即一回归年(tropical year)。公历的平年只有365日,比回归年短约0.2422 日,每四年累积约一天,把这一天加于2月末(即2月29日),使当年时间长度变为366日(1-12月分别为31天,29天,31天,30天,31天,30天,31天,31天,30天,31天,30天,31天),这一年就为闰年。需要注意的是,公历是根据罗马人的"儒略历"改编而得。由于当时没有了解到每年要多算出0.0078天的问题,从公元前46年,到16世纪,一共累计多出了10天。为此,当时的教皇格列高利十三世,将1582年10月5日人为规定为10月15日。并开始了新闰年规定。即规定公历年份是整百数的,必须是400的倍数才是闰年,不是400的倍数的就是平年。比如,1700年、1800年和1900年为平年,2000年为闰年。此后,平均每年长度为365.2425天,约4年出现1天的偏差。按照每四年一个闰年计算,平均每年就要多算出0.0078天,经过四百年就会多出大约3天来,因此,每四百年中要减少三个闰年。闰年的计算,归结起来就是通常说的:四年一闰;百年不闰,四百年再闰。。

输入格式:
只有一个整数y(1900<=y<=2500),代表年份。

输出格式:
只有一行,如果输入的年份为闰年,则输出"Yes",否则输出"No"。

解答

#include 
int main(void){int input_year;scanf("%d",&input_year);if(input_year%4 == 0 && input_year%100 != 0){printf("Yes");}else if(input_year%400 == 0){printf("Yes");}else{printf("No");}return 0;
}

分析

同样是语言方面较为简单的if判断题目,题目最大的困难是读懂题目所给出的判断闰年的方法,题干长、理解略有难度。但是代码编写方面并不会遇到太大的困难。

表达式求值一

题目

有表达式如下:

a / ( b * c - d )

请按要求计算 。

输入格式:
只有一行,为4个用空格分隔的浮点数,依次代表a,b,c,d(请用double 类型存储)。

输出格式:
如果除数为0,则输出error,否则输出该表达式的值(保留1位小数)。

解答

#include 
int main(void){double a,b,c,d;scanf("%lf %lf %lf %lf",&a,&b,&c,&d);if(b*c-d < 0.000001 && b*c-d > -0.000001){printf("error\n");}else{printf("%.1lf\n",a/(b*c-d));}return 0;
}

分析

题目看起来简单,而且理解与代码编写方面并没有太大的困难。但是,当你兴致冲冲地将b*c-d的结果判断是否为0并提交时,你会发现并不是满分。让我们仔细回忆一下double的存储方式,他并不会准确地存储一个小数,而是存储近似值。因此,我们应当判断结果的绝对值小于一定的小值。
起初我想使用中的abs()方法进行处理绝对值,但是会无情报错。通过翻阅c的源文件,我发现了以下代码: int __cdecl abs(int _X);。这就说明abs函数可以传入的参数只能是int类型,而不能是double!

网购一

题目

某电商规定,如果订单商品总价小于20元,则付快递费10元;如果订单商品总价大于等于20元且小于30元,则付快递费8元;如果订单商品总价大于等于30元且小于40元,则付快递费5元;如果某订单商品总价大于等于40元,则包邮。现某订单共4件商品,请你算一下该订单实付多少。

输入格式:
只有一行,为四个用空格分隔的正整数,代表4件商品的价格。

输出格式:
为一个整数,为客户实际需要支付的钱数。测试用例保证输入合法,且所有整数可以用int型存储。

解答

#include 
int main(void){int item1,item2,item3,item4;scanf("%d %d %d %d",&item1,&item2,&item3,&item4);int sum = item1+item2+item3+item4;int total;if(sub < 20){total = sum+10;}else if(sub < 30){total = sum+8;}else if(sub < 40){total = sum+5;}else{total = sum;}printf("%d",total);return 0;
}

分析

同样是非常简单的一道分支题目,通过计算用户输入的四个数字的总和,并计算出应当支付的费用并输出。不做解析。

求三角形的面积

题目

已知三角形的三条边长a、b、c,求三角形的面积。三角形的面积可以根据海伦公式来计算,这里S代表周长的一半,Area代表三角形的面积:

S= A + B + C 2 \frac{A+B+C}{2} 2A+B+C

Area= S ( S − a ) ( S − b ) ( S − c ) \sqrt{S(S−a)(S−b)(S−c)} S(Sa)(Sb)(Sc)

求一个数的平方根需要用库函数sqrt(x)。参数x可以是整数或者浮点数,函数返回值是一个浮点数。在处理浮点数的时候,建议使用双精度浮点型(double型)变量,

注意:为了使用该函数,需要在main函数之前加上预处理语句:

#include

%lf的默认输出为6位小数,如果想要输出3为小数,则应为%.3lf。

输入格式:
为三个用空格分隔的正整数a、b、c,代表三角形的三边长度。

输出格式:
只有一行。当输入的三条边a、b、c可以构成三角形时(即两条边的长度和大于第三条边的长度),输出三角形的面积,输出结果保留3位小数,假如a=5,b=12,c=13,则输出“30.000”;当a、b、c三条边无法构成三角形时,则输出“The edges cannot make up of a triangle.”。测试用例保证运算中用到的整数可以用int型存储,小数可以用double型存储。

解答

#include 
#include 
int main(void){int a,b,c;scanf("%d %d %d",&a,&b,&c);if(a+b>c && a+c>b && b+c>a){double S = (a+b+c)/2.0;double Area = sqrt(S*(S-a)*(S-b)*(S-c));printf("%.3lf",Area);}else{printf("The edges cannot make up of a triangle.");return 0;}
}

分析

题目很简单,了解了math.h库当中的sqrt函数。该题目的同样为练习分支语句。

三对三篮球赛

题目

三对三篮球赛规定

第4条:得分

4.1. 在圆弧线以内投篮命中得 1 分。

4.2. 在圆弧线以外投篮命中得 2 分

4.3. 罚篮命中得 1 分。

第5条:比赛时间/优胜者

5.1 一节 10 分钟(这个可以称为常规时间)。在死球状态下和罚球时应停表。再次开球时,当球权方与防守队一名球员完成一次传递球后(即一旦进攻队持球),计时器应继续计时。

5.2. 但是,在规定的比赛时间内(即在常规时间内),率先取得 21 分或以上的队伍获胜。

5.3. 如果在规定比赛时间(即在常规时间内)两队打平,则应进行加时赛。加时赛中率先取得 2 分的队伍获胜。

请你根据这些条款写一段程序来判断一场比赛的胜负。

注意:判断胜负的一个基本原则是得分高的队伍获胜(但规则里没有明确说明)。

输入格式:
为用空格分隔的两个整数,依次代表A队得分和B队得分。测试用例保证合法。

输出格式:
上述得分为常规时间结束(包括先得21分及以上直接获胜的情况)时的比分,如果A队获胜,则输出A win;如果B队获胜,则输出B win;如果两队打平,需要进行加时赛,则输出no result;如果出现不可能的比分(比如 29 30),则输出error。

解答

#include 
void a_win(){printf("A win");
}
void b_win(){printf("B win");
}
int main(void){int team1,team2;scanf("%d %d",&team1,&team2);if(team1 == team2 && team1<21){printf("no result");}else if((team1 == 21 && team2 < 21)||(team1>team2 && team1 < 21)){a_win();}else if((team2 == 21 && team1 < 21)||(team1<team2 && team2 < 21)){b_win();}else if(team1 == 22 && team2 < 21){a_win();}else if (team2 == 22 && team1 < 21){b_win();}else{printf("error");}
}

分析

这个题可以说恶心到极致。笔者在做这道题的时候。第一次提交只有70分,剩下的30分调试了整整一个多小时!!
分支结构的学习难度并不是很大,最大的难度在于能够处理所有可能的事件,要全!要全!要全!
相信很多小伙伴也能够理解题目,并且都有一个思路,但是笔者在测试的当晚忽视了两个球队能够在正常情况下得到22分!(真的忽视了有两分球的设定!)
打篮球的uu看到这应该很兴奋吧。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部