(头歌)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() 语句1
else 语句2
else
if() 语句1
else 语句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;
else
y=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: 语句1
case 常量2: 语句2
……
case 常量n: 语句n
default: 语句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~100
70~84
60~69
<60
enter 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;
}