(头歌)C语言程序设计---------C选择结构程序设计

第1关:排序

任务描述

从键盘输入3个数,要求按从大到小的顺序输出这3个数。

本关知识

if语句的一般形式

if语句的一般形式如下:

  1. if (表达式) 语句1
  2. [else 语句2]

if语句“表达式”可以是关系表达式、逻辑表达式、甚至是数值表达式。如果表达式的值为真,则执行语句1,否则执行语句2。语句1和语句2可以是一个简单的语句,也可以是一个复合语句,还可以是另一个if语句(即在一个if语句中又包括另一个或多个内嵌的if语句)

例如,输出a,b中的最大值,可以用以下语句表示:

  1. int a = 3, b = 5;
  2. if (a > b) //a>b,则执行if语句
  3. printf("%d",a);
  4. else //a<=b,则执行else语句
  5. printf("%d",b);

如何交换两个变量的值

C语言中,实现交换两个变量的值方法有多种,如设置中间变量,用加减或乘除运算来交换,用异或运算来交换,用位运算来交换等,这里介绍一种最简单最常用的方法,即中间变量法。

下面程序段用于将两个数按由小到大的顺序输出。

  1. #include <stdio.h>
  2. int main()
  3. {
  4. //t为中间变量
  5. float a,b,t;
  6. scanf("%f,%f",&a,&b);
  7. if (a > b)
  8. { //将a和b的值互换
  9. t = a;
  10. a = b;
  11. b = t;
  12. }
  13. printf(“%5.2f,%5.2fn”,a,b);
  14. return 0;
  15. }

编程要求

本关的编程任务是补全Sort.c文件中main函数,以实现基本输入输出的功能。具体要求如下: 从键盘输入3个数,数与数直接用空格隔开,然后按由大到小的顺序输出这三个数。 实际的测试样例参见下文。 本关涉及的代码文件Sort.c的代码框架如下:

  1. //包含标准输入输出函数
  2. #include <stdio.h>
  3. //定义main函数
  4. int main()
  5. {
  6. //定义三个数
  7. float a,b,c;
  8. //请在此添加‘输入三个数,按由大到小顺序输出这三个数’的代码
  9. /*****************Begin******************/
  10. /***************** End ******************/
  11. return 0;
  12. }

其中: #include <stdio.h>的意思是包含stdio函数库,使得当前程序可以调用标准输入输出函数库中的函数。 int main()是定义main函数,每个C程序都必须有且只有一个main函数。该函数是整个程序的入口,程序执行会从main函数的第一条语句开始。 int表示main函数的返回值类型。函数结束时需要返回一个整数。 return 0; 是函数返回,这里是从main函数返回,0是返回的整数值。return语句会结束一个函数的运行。

测试说明

本关的测试过程如下:

  1. 平台编译Sort.c,然后链接相关程序库并生成Sort.exe;
  2. 平台运行Sort.exe,并以标准方式提供测试输入;
  3. 平台获取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语句的嵌套。其一般形式为:

  1. if()
  2. if() 语句1
  3. else 语句2
  4. else
  5. if() 语句1
  6. else 语句2

应当注意ifelse的配对关系,else总是与它上面的最近的为配对的if配对。如果ifelse的数目不一致,为实现程序设计者的思想,可以加花括号来确定配对关系。例如

  1. if()
  2. {
  3. if() 语句1
  4. }
  5. else 语句2

这是“{}”限定了内嵌if语句的范围,因此else与第一个if配对。

例如用if语句表示阶跃函数:

可以写成:

  1. if(x<0)
  2. y=-1;
  3. else //内嵌语句是一个if语句,它也包含else部分
  4. if(x==0) //注意:==表示数学上的等于,=表示赋值
  5. y=0;
  6. else
  7. 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的代码框架如下:

  1. //包含标准输入输出函数
  2. #include <stdio.h>
  3. //定义main函数
  4. int main()
  5. {
  6. //请在此添加‘求分段函数的值’的代码
  7. /*****************Begin******************/
  8. /***************** End ******************/
  9. return 0;
  10. }

其中: #include <stdio.h>的意思是包含stdio函数库,使得当前程序可以调用标准输入输出函数库中的函数。 int main()是定义main函数,每个C程序都必须有且只有一个main函数。该函数是整个程序的入口,程序执行会从main函数的第一条语句开始。 int表示main函数的返回值类型。函数结束时需要返回一个整数。 return 0; 是函数返回,这里是从main函数返回,0是返回的整数值。return语句会结束一个函数的运行。

测试说明

本关的测试过程如下:

  1. 平台编译Branch.c,然后链接相关程序库并生成Branch.exe

  2. 平台运行Branch.exe,并以标准方式提供测试输入;

  3. 平台获取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语句的一般形式如下:

  1. switch(表达式)
  2. {
  3. case 常量1: 语句1
  4. case 常量2: 语句2
  5. ……
  6. case 常量n: 语句n
  7. default: 语句n+1
  8. }

例如:按考试成绩的等级输出百分制分数段的代码段如下

  1. //定义考试成绩的等级变量
  2. char grade;
  3. scanf("%c",&grade);
  4. printf(“Your score:”);
  5. switch(grade)
  6. {
  7. case 'A':printf("85~100n");break;
  8. case 'B':printf("70~84n");break;
  9. case 'C':printf("60~69n");break;
  10. case 'D':printf("<60n");break;
  11. default: printf("enter data error!n");
  12. }

说明: (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,将连续输出:

  1. Your score:85~100
  2. 70~84
  3. 60~69
  4. <60
  5. enter data error!

(7)在case子句中虽然包含了一个以上的执行语句,但可以不必用花括号括起来,会自动顺序执行本case标号后面所有的语句。当然加上花括号也可以。 (8)多个case标号可以共用一组执行语句,例如:

  1. \表示输入A或B或C,则都输出`>60`
  2. case 'A':
  3. case 'B':
  4. case 'C': printf(">60");break;
  5. ……

编程要求

本关的编程任务是补全Bonuses.c文件中main函数,以实现从键盘输入当月利润I,求应发奖金总数的功能。 实际的测试样例参见下文。 本关涉及的代码文件Bonuses.c的代码框架如下:

  1. //包含标准输入输出函数
  2. #include <stdio.h>
  3. //定义main函数
  4. int main()
  5. {
  6. //请在此添加‘奖金发放’的代码,预期格式如下,可改动。
  7. /*****************Begin******************/
  8. double ...
  9. scanf(...);
  10. .
  11. .
  12. .
  13. switch (?){
  14. case ?:
  15. case ?:
  16. .
  17. .
  18. .
  19. case ?:
  20. case ?:
  21. default: ...
  22. }
  23. printf(...);
  24. /***************** End ******************/
  25. return 0;
  26. }

其中: #include <stdio.h>的意思是包含stdio函数库,使得当前程序可以调用标准输入输出函数库中的函数。 int main()是定义main函数,每个C程序都必须有且只有一个main函数。该函数是整个程序的入口,程序执行会从main函数的第一条语句开始。 int表示main函数的返回值类型。函数结束时需要返回一个整数。 return 0; 是函数返回,这里是从main函数返回,0是返回的整数值。return语句会结束一个函数的运行。

测试说明

本关的测试过程如下:

  1. 平台编译Bonuses.c,然后链接相关程序库并生成Bonuses.exe

  2. 平台运行Bonuses.exe,并以标准方式提供测试输入;

  3. 平台获取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;

}