(头歌)C语言程序设计---------C选择结构程序设计
第1关:排序
任务描述
从键盘输入3个数,要求按从大到小的顺序输出这3个数。
本关知识
if语句的一般形式
if语句的一般形式如下:
if (表达式) 语句1[else 语句2]
if语句“表达式”可以是关系表达式、逻辑表达式、甚至是数值表达式。如果表达式的值为真,则执行语句1,否则执行语句2。语句1和语句2可以是一个简单的语句,也可以是一个复合语句,还可以是另一个if语句(即在一个if语句中又包括另一个或多个内嵌的if语句)
例如,输出a,b中的最大值,可以用以下语句表示:
int a = 3, b = 5;if (a > b) //a>b,则执行if语句printf("%d",a);else //a<=b,则执行else语句printf("%d",b);
如何交换两个变量的值
在C语言中,实现交换两个变量的值方法有多种,如设置中间变量,用加减或乘除运算来交换,用异或运算来交换,用位运算来交换等,这里介绍一种最简单最常用的方法,即中间变量法。
下面程序段用于将两个数按由小到大的顺序输出。
#include <stdio.h>int main(){//t为中间变量float a,b,t;scanf("%f,%f",&a,&b);if (a > b){ //将a和b的值互换t = a;a = b;b = t;}printf(“%5.2f,%5.2fn”,a,b);return 0;}
编程要求
本关的编程任务是补全Sort.c文件中main函数,以实现基本输入输出的功能。具体要求如下: 从键盘输入3个数,数与数直接用空格隔开,然后按由大到小的顺序输出这三个数。 实际的测试样例参见下文。 本关涉及的代码文件Sort.c的代码框架如下:
//包含标准输入输出函数#include <stdio.h>//定义main函数int main(){//定义三个数float a,b,c;//请在此添加‘输入三个数,按由大到小顺序输出这三个数’的代码/*****************Begin******************//***************** End ******************/return 0;}
其中: #include <stdio.h>的意思是包含stdio函数库,使得当前程序可以调用标准输入输出函数库中的函数。 int main()是定义main函数,每个C程序都必须有且只有一个main函数。该函数是整个程序的入口,程序执行会从main函数的第一条语句开始。 int表示main函数的返回值类型。函数结束时需要返回一个整数。 return 0; 是函数返回,这里是从main函数返回,0是返回的整数值。return语句会结束一个函数的运行。
测试说明
本关的测试过程如下:
- 平台编译
Sort.c,然后链接相关程序库并生成Sort.exe; - 平台运行
Sort.exe,并以标准方式提供测试输入; - 平台获取
Sort.exe的输出,然后将其与预测输出对比,如果一致则测试通过;否则测试失败。 以下是平台对Sort.c的测试样例:
测试输入: 55.2 62 22 预期输出: 62 55.2 22
测试输入: 11 22 33 预期输出: 33 22 11

代码如下
#include <stdio.h>
//定义main函数
int main()
{
//定义三个数
float a,b,c;
float temp;
scanf("%f %f %f",&a,&b,&c);
if (a<b)
{temp=a;
a=b;
b=temp;}
if (a<c)
{temp=a;
a=c;
c=temp;}
if (b<c)
{temp=b;
b=c;
c=temp;}
printf("%g %g %g",a,b,c);
/***************** End ******************/
return 0;
}
第2关:求分段函数的值
任务描述
有一个函数如下:

请编写程序,要求输入浮点型x的值,输出y相应的值。 #####解题思路 用if语句检查x的值,根据x的值决定赋予y的值,由于y的可能值不是两个而是三个,因此不可能只用一个简单的(无内嵌if)的if语句来实现。可以有两种方法: (1)先后用3个独立的if语句处理。 (2)用一个嵌套的if语句处理。 本题要求采用第二种方法。
本关知识
选择结构的嵌套
在if语句中又包含一个或多个if语句称为if语句的嵌套。其一般形式为:
if()if() 语句1else 语句2elseif() 语句1else 语句2
应当注意if与else的配对关系,else总是与它上面的最近的为配对的if配对。如果if与else的数目不一致,为实现程序设计者的思想,可以加花括号来确定配对关系。例如
if(){if() 语句1}else 语句2
这是“{}”限定了内嵌if语句的范围,因此else与第一个if配对。
例如用if语句表示阶跃函数:

可以写成:
if(x<0)y=-1;else //内嵌语句是一个if语句,它也包含else部分if(x==0) //注意:==表示数学上的等于,=表示赋值y=0;elsey=1;
关系运算符和关系表达式
C语言提供6种关系运算符: (1)< (小于) (2)<= (小于或等于) (3)> (大于) (4)>= (大于或等于) (5)== (等于) (6)!= (不等于) 其中,前4种关系运算符的优先级别相同,后2种也相同。前4种高于后2种。
用关系运算符将两个数值或数值表达式连接起来的式子,称为关系表达式。例如,以下都是合法的关系表达式: a>b a+b>b+c (a=3)>(b=5) 'a'<'b' (a>b)>(b<c) 关系表达式的值是一个逻辑值,即“真”或“假”。例如,关系表达式“5==3”的值为假,“5>3”的值为真。
逻辑运算符和逻辑表达式
c语言中有3种逻辑运算符,如下表

例如:判别用year表示的某一年是否闰年,可以用一个逻辑表达式来表示。闰年的条件是符合下面二者之一:(1)能被4整除,但不能被100整除;(2)能被400整除。 可写出逻辑表达式: (year%4==0&&year%100!=0)||year%400==0
编程要求
本关的编程任务是补全Branch.c文件中main函数,以实现输入x,求对应的y的功能。 实际的测试样例参见下文。 本关涉及的代码文件Branch.c的代码框架如下:
//包含标准输入输出函数#include <stdio.h>//定义main函数int main(){//请在此添加‘求分段函数的值’的代码/*****************Begin******************//***************** End ******************/return 0;}
其中: #include <stdio.h>的意思是包含stdio函数库,使得当前程序可以调用标准输入输出函数库中的函数。 int main()是定义main函数,每个C程序都必须有且只有一个main函数。该函数是整个程序的入口,程序执行会从main函数的第一条语句开始。 int表示main函数的返回值类型。函数结束时需要返回一个整数。 return 0; 是函数返回,这里是从main函数返回,0是返回的整数值。return语句会结束一个函数的运行。
测试说明
本关的测试过程如下:
-
平台编译
Branch.c,然后链接相关程序库并生成Branch.exe; -
平台运行
Branch.exe,并以标准方式提供测试输入; -
平台获取
Branch.exe的输出,然后将其与预测输出对比,如果一致则测试通过;否则测试失败。 以下是平台对Branch.c的测试样例:
测试输入: 5 预期输出: 9
测试输入: 50.2 预期输出: 139.6

代码如下
#include <stdio.h>
//定义main函数
int main()
{
float x,y;//请在此添加‘求分段函数的值’的代码
scanf("%g",&x);
if(x>=10)
y=(3*x-11);
else
if(1<=x<10)
y=(2*x-1);
if(x<1)
y=x;
printf("%g",y);
return 0;
}
第3关:奖金发放
任务描述
企业发放的奖金根据利润提成。利润I低于或等于100000元的,奖金可提10%;利润高于100000元,低于200000元(100000<I<=200000)时,低于100000元的部分按10%提成,高于100000元的部分,可提成7.5%;200000<I<=400000时,低于200000元的部分仍按上述办法提成(下同)。高于200000元的部分按5%提成;400000<I<=600000元时,高于400000元的部分按3%提成;600000<I<=1000000元时,高于600000元的部分按1.5%提成;I>1000000时,超过1000000元的部分按1%提成。从键盘输入当月利润I,求应发奖金总数。要求:用switch语句编写程序。 (最后结果保留两位小数)
解题思路
此题的关键在于正确写出每一区间的奖金计算公式。例如利润在100000元至200000元时,奖金应由两部分组成。 (1)利润为100000元时应得的奖金,即100000元*0.1元; (2)100000元以上部分应得的奖金,即(num-100000)*0.075元。 同理,200000~400000元这个区间的奖金也应由两部分组成: (1)利润为200000元时应得的奖金,即100000*0.1+100000*0.075元; (2)200000元以上部分应得的奖金,即(num-200000)*0.05元。 因此,我们在程序中可以先把100000元,200000元,400000元,600000元,1000000元各关键点的奖金计算出来,分别存放在五个变量里,然后再加上各区间附加部分的奖金即可。
相关知识
switch语句
switch语句的作用是根据表达式的值,使流程跳转到不同的语句。 switch语句的一般形式如下:
switch(表达式){case 常量1: 语句1case 常量2: 语句2……case 常量n: 语句ndefault: 语句n+1}
例如:按考试成绩的等级输出百分制分数段的代码段如下
//定义考试成绩的等级变量char grade;scanf("%c",&grade);printf(“Your score:”);switch(grade){case 'A':printf("85~100n");break;case 'B':printf("70~84n");break;case 'C':printf("60~69n");break;case 'D':printf("<60n");break;default: printf("enter data error!n");}
说明: (1)switch后面括号内的“表达式”,其值的类型应为整数类型(包括字符串)。 (2)执行switch语句时,先计算swith后面的“表达式”的值,然后将它与各case标号比较,如果与某一个case标号中的常量相同,流程就转到此case标号后面的语句。如果没有与switch表达式相匹配的case常量,流程转去执行default标号后面的语句。 (3)可以没有default标号,此时,如果没有与switch表达式相匹配的case常量,则不执行任何语句,流程转到switch语句的下一个语句。 (4)各个case语句标号出现次序不影响执行结果。 (5)每一个case常量必须互不相同,否则就会出现互相矛盾的现象。 (6)case标号只起标记的作用。在执行switch语句时,根据switch表达式的值找到匹配的入口标号,并不在此进行条件检查,在执行完一个case标号后面的语句后,就从此标号开始执行下去,不再进行判断。例如在上例中,如果在个case自居中没有break语句,若输入A,将连续输出:
Your score:85~10070~8460~69<60enter data error!
(7)在case子句中虽然包含了一个以上的执行语句,但可以不必用花括号括起来,会自动顺序执行本case标号后面所有的语句。当然加上花括号也可以。 (8)多个case标号可以共用一组执行语句,例如:
\表示输入A或B或C,则都输出`>60`case 'A':case 'B':case 'C': printf(">60");break;……
编程要求
本关的编程任务是补全Bonuses.c文件中main函数,以实现从键盘输入当月利润I,求应发奖金总数的功能。 实际的测试样例参见下文。 本关涉及的代码文件Bonuses.c的代码框架如下:
//包含标准输入输出函数#include <stdio.h>//定义main函数int main(){//请在此添加‘奖金发放’的代码,预期格式如下,可改动。/*****************Begin******************/double ...scanf(...);...switch (?){case ?:case ?:...case ?:case ?:default: ...}printf(...);/***************** End ******************/return 0;}
其中: #include <stdio.h>的意思是包含stdio函数库,使得当前程序可以调用标准输入输出函数库中的函数。 int main()是定义main函数,每个C程序都必须有且只有一个main函数。该函数是整个程序的入口,程序执行会从main函数的第一条语句开始。 int表示main函数的返回值类型。函数结束时需要返回一个整数。 return 0; 是函数返回,这里是从main函数返回,0是返回的整数值。return语句会结束一个函数的运行。
测试说明
本关的测试过程如下:
-
平台编译
Bonuses.c,然后链接相关程序库并生成Bonuses.exe; -
平台运行
Bonuses.exe,并以标准方式提供测试输入; -
平台获取
Bonuses.exe的输出,然后将其与预测输出对比,如果一致则测试通过;否则测试失败。 以下是平台对Bonuses.c的测试样例:
测试输入: 156890 预期输出: 14266.75
测试输入: 456789 预期输出: 29203.67

代码如下
#include <stdio.h>
int main()
{
/*****************Begin******************/
int x;
double s,y;
scanf("%lf",&s);
x=s/100000;
if(x<10)
{
switch (x)
{
case 0:y=s*0.1;break;
case 1:y=100000*0.1+(s-100000)*0.075;break;
case 2:case 3:y=100000*0.1+100000*0.075+(s-200000)*0.05;break;
case 4:case 5:y=100000*0.1+100000*0.075+200000*0.05+(s-400000)*0.03;break;
case 6:case 7:case 8:case 9:
y=100000*0.1+100000*0.075+200000*0.05+200000*0.03+(s-600000)*0.015;break;
}
}
else if(x>10)
{
y=100000*0.1+100000*0.075+200000*0.05+200000*0.03+400000*0.015+(s-1000000)*0.01;
}
printf("%.2f",y);
/***************** End ******************/
return 0;
}