c/c++从入门到入土(4)

开始时间2023-04-18 22:43:56

结束时间2023-04-19 00:20:49

前言:前面的章节,我们编写的程序都涉及三个基本操作,输入数据、对数据进行计算和处理、输出运算结果,这是最常见的IPO形式程序结构,即顺序结构。在顺序结构中只能自顶向下、按照代码书写的先后顺序来执行程序。若程序中存在逻辑推理便不是顺序结构能够解决的了。接下来,我们引入选择结构,解决更多生活中的实际问题。以下是自制思维导图参考于苏小红C语言程序设计(第四版):

 作业四 选择结构

【C0094】if语句的选择条件是_______。
A.只能用关系表达式

B.只能用关系表达式或逻辑表达式

C.只能用逻辑表达式

D.可以用任何表达式

 

答案:D

体会:用关系运算符将两个操作数连接起来组成的关系式称为关系表达式,用逻辑运算符连接操作数组成的表达式称为逻辑表达式,由条件运算符及其相应的操作数构成的表达式称为条件表达式。

【C0095】已知int x = 2 , y = -1 , z = 3 ;,执行下面语句后,z的值是_______。

if( x < y )  if( y < 0 )  z = 1 ;  else z++ ;
A.1

B.2

C.3

D.4

 

答案:C

体会:该程序为嵌套选择结构,根据双分支控制条件语句的就近原则,else与第二个配对,不符合第一个if之后结束分支控制结构,z值仍为3.

【C0096】以下程序段的输出结果是_______。
int a = 2 , b = 1 , c = 2 ;
if( a < b )  if( b < 0 )  c = 0 ;  else c += 1 ;
printf( "%d\n" , c ) ;
A.0

B.1

C.2

D.3

 

答案:C

体会:该程序为嵌套选择结构,根据双分支控制条件语句的就近原则,else与第二个配对,不符合第一个if之后结束分支控制结构,最后输出z的基本整型,z值仍为2。

【C0097】当a = 1,b = 3,c = 5,d = 4时,执行下面一段程序后,x的值为_______。
if( a < b )
     if( c < d )    x = 1 ;
     else
if( a < c )
if( b < d ) x = 2 ;
             else x = 3 ;
          else x = 6 ;
else x = 7 ;
A.1

B.2

C.3

D.6

 

答案:B

体会:多分支控制条件语句中,编译器只认为if后面的第一条语句是其分支中的语句,第二个if是第一个if的语句序列,第三个if跟着第一个else,第四个if是第三个if的语句序列,第二个else跟着第四个if,第三个else跟着第三个if,第四个else跟着第一个if,a<b进入第一个if的语句序列,有c>d进入第一个else的语句序列,有a<c进入第三个if的语句序列,有b<d则2被赋给x,结束分支控制结构。

【C0098】为了避免嵌套的if-else的二义性,C语言规定,else与_______配对。

A.与最外层的if

B.其之前最近的不带else的if

C.其之后最近的if

D.与最近的{ }之前的if

 

答案:B

体会:考查分支控制语句ifelse之间的就近原则。

【C0099】若有定义:float w ; int a , b ; 则合法的switch语句是_______。
A.
switch( w )
{
  case 1.0 : printf( "*\n" ) ;
  case 2.0 : printf( "**\n" ) ;
}

B.
switch( a )
{
  case 1 printf( "*\n" ) ;
  case 2 printf( "**\n" ) ;
}

C.
switch( b )
{
  case 1 : printf( "*\n" ) ;
  default : printf( "\n" ) ;
  case 1 + 2 : printf( "**\n" ) ;
}

D.
switch(a+b);
{
  case 1 : printf( "*\n" ) ;
  case 2 : printf( "**\n" ) ;
  default : printf( "\n" ) ;
}

 

答案:C

【C0100】下面程序的运行结果是10。

运行时从键盘输入:9↙。

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

 

分析:n++语句先用后加,进入if的语句序列,输出n的基本整型为10.

【C0101】下面程序的运行结果是2,2,2。

#include<stdio.h>
int  main( ){
  int  i = 1 , j = 1 , k = 2 ;
  if( ( j++ || k++ ) && i++ )  printf( "%d,%d,%d\n" , i , j , k ) ; 
  return 0 ;
}

 

分析:if内为逻辑表达式,双目运算符逻辑与(&&)优先级高于逻辑或(||),且都具有短路特性,可由先计算的左操作数单独推导出来,将不再计算右操作数的值。j=1不再计算k++运算,前式满足进行i++运算最后i=2,j=2,k=2.

【C0102】下面程序的运行结果是6。
#include<stdio.h>
int  main( ){
  int  m = 5 ;
  if(m++ > 5)  printf( "%d\n" , m ) ;
  else  printf( "%d\n" , m-- ) ;
  return  0 ;
}

 

分析:m=5,进入else语句序列,经过m++运算此时m=6,进行m--运算先用后减,输出m减之前的基本整型为6.

【C0103】下面程序的运行结果是97,b。
#include<stdio.h>
int  main( ){
  char  c1 = 97 ;
  if(c1 >= 'a' && c1 <= 'z' )
    printf( "%d,%c" , c1 , c1 + 1 ) ;
  else
    printf( "%c" , c1 ) ;
  return 0 ;
}

 

分析:c1是a,为小写字母进入if语句序列,分别输出c1基本整型,和c1+1的字符型。

【C0104】下面程序的运行结果是c=-1。
#include<stdio.h>
int  main( ){
  int  a = 1 , b = 2 , c = 3 ;
  if( a > b )  c = 1 ;
  else
    if( a == b )  c = 0 ;
    else    c = -1 ;
    printf( "c=%d" , c ) ;
    return  0 ;
}

 

分析:第二个if为第一个else的语句序列,第二个else为第二个if的语句序列,a<b进入第一个else语句序列,同时进入第二个else语句序列,执行c=-1.

【C0105】下面程序的运行结果是8888。
运行时从键盘输入:88↙
#include<stdio.h>
int  main( ){
  int  a ;
  scanf( "%d" , &a ) ;
  if( a > 90 )  printf( "%d" , a ) ;
  if( a > 80 )  printf( "%d" , a ) ;
  if( a > 70 )  printf( "%d" , a ) ;
  return  0 ;
}

 

分析:输入a=88,符合第二个和第三个if条件,分别进行各自语句序列,输出两遍a的基本整型。

【C0106】下面程序的运行结果是20,0。
#include<stdio.h>
  int  main( ){
  int  x = 10 , y = 20 , t = 0 ;
  if( x == y )    t = x ; x = y ; y = t ;
  printf( "%d,%d\n" , x , y ) ;
  return 0 ;
}

 

分析:编译器只认为if后面的第一条语句是其分支中的语句,所以t = x为if( x == y )的语句序列,因为不满足if条件跳出分支控制结构,进行x = y ; y = t;运算,最后输出xy的基本整型。

【C0107】下面程序的运行结果是2,1。
#include<stdio.h>
int  main( ){
  int  x = 1 , a = 0 , b = 0 ;
  switch( x ){
    case 0 : b++ ;
    case 1 : a++ ;
    case 2 : a++ ; b++ ;
  }
  printf( "%d,%d" , a , b ) ;
  return 0 ;
}

 

分析:Switch语句的执行过程首先计算Switch后表达式的值,然后将该值依次与case后的常量值比较,当他们相等时,执行相应case后面的代码段,代码执行完毕后,可使用break语句跳出Switch语句,如果没有break语句,程序将依次执行下面的case后的语句,直到遇到Switch的右花括号}为止。

【C0108】下面程序的运行结果是a=1,b=3。
#include<stdio.h>
int  main( ){
  int  x = 1 , y = 1 , a = 0 , b = 0 ;
  switch( x ){
    case 1: switch( y ){
      case 0: a++ ;
      case 1: b++ ;
      case 2: b++ ; break ;
    }
    case 2: a++ ; b++ ; break ;
    case 3: a++ ; b++ ;
  }
  printf( "a=%d,b=%d\n" , a , b ) ;
  return  0 ;
}

 

【C0109】下面程序用于将输入的三个数从小到大排序输出,请完善程序。

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

编程题!!

第一题

7-1 【C0110】从键盘上输入4个整数,输出其中的最小值
分数 10
作者 C语言程序设计,沈国荣,浙江大学出版社
单位 石家庄铁道大学
编写一个程序,从键盘上输入4个整数,输出其中的最小值。

输入格式:
在一行内以空格为间隔输入4个整数。

输出格式:
将输入的4个整数中最小值输出。

输入样例:
41 32 23 24
输出样例:
23
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include<stdio.h>
int main ()
{
    int a,b,c,d,min;
    scanf("%d %d %d %d",&a,&b,&c,&d);
    if(a<b)min = a;
    else min =b;
    if(c<min)min=c;
    if(d<min)min=d;
    printf("%d\n",min);
    return 0;
    
    
    
}

----------分割线----------

第二题

7-2 【C0111】从键盘输入一个四位整数n,输出它的各位数字之和
分数 10
作者 C语言程序设计,沈国荣,浙江大学出版社
单位 石家庄铁道大学
编写一个程序,从键盘输入一个四位整数n,输出它的各位数字之和。

输入格式:
输入一个四位整数。

输出格式:
输出该四位整数的各位数字之和。

输入样例:
1308
输出样例:
12
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include<stdio.h>
int main()
{
    int q,b,s,g,sum,a;
    scanf("%d",&a);
    q=a/1000;
    b=a%1000/100;
    s=a%100/10;
    g=a%10;
    sum=q+b+s+g;
    printf("%d",sum);
    return 0;
}

 

----------分割线----------

第三题

7-3 【C0112】计算分段函数的值
分数 10
作者 C语言程序设计,沈国荣,浙江大学出版社
单位 石家庄铁道大学
有一函数:

编写一个程序,从键盘输入x的值,输出y的值。

输入格式:
输入自变量x的值。

输出格式:
输出函数y的值。

输入样例:
10
输出样例:
28
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

 

#include<stdio.h>
int main()
{
    int x;
    scanf("%d",&x);
    if(x<0)
        printf("%d\n",x);
    else if(x<50)
        printf("%d\n",3*x-2);
    else if(x<100)
        printf("%d\n",4*x+1);
    else if(x>=100)
        printf("%d\n",5*x);
    
    return 0;
}

 

----------分割线----------

第四题

7-4 【C0113】计算苹果等级、数量、应付款、实付款以及找给顾客的钱数
分数 10
作者 C语言程序设计,沈国荣,浙江大学出版社
单位 石家庄铁道大学
苹果店有4个等级的苹果,一级5.50元/kg、二级4.30元/kg、三级3.00元/kg、四级2.50元/kg。利用switch语句编写一个程序,输入苹果的等级、数量以及顾客的付款数,显示出苹果的等级、数量、应付款数以及找给顾客的钱数。当输入的苹果的等级、数量以及顾客的付款数不合要求时,通知用户“Data Error!”,结束程序。。

输入格式:
在一行中依次输入苹果的等级、数量以及顾客的付款数,各数据以空格为间隔。

输出格式:
以以下格式显示出苹果的等级、数量、应付款数、实付款数以及找给顾客的钱数。当输入的苹果等级、数量以及顾客的付款数不合要求时,显示“DataError!”。

您选择的苹果等级=<等级>级

您购买的苹果重量=<重量>公斤

您应付款=<应付款>元

您实付款=<实付款>元

应找您<找钱>元

输入样例:
1 2.0 20.0
输出样例:
您选择的苹果等级=1级
您购买的苹果重量=2.000000公斤
您应付款=11.000000元
您实付款=20.000000元
应找您9.000000元
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include<stdio.h>
int main()
{
    int dj;
    float zl,yfk,sfk;
    scanf("%d %f %f",&dj,&zl,&sfk);
    if(dj>4||dj<1)
    printf("DataError!\n");
    switch(dj)
    {
        case 1:yfk=zl*5.5;break;
        case 2:yfk=zl*4.3;break;
        case 3:yfk=zl*3;break;
        case 4:yfk=zl*2.5;break;
    }
    printf("您选择的苹果等级=%d级\n",dj);
    printf("您购买的苹果重量=%f公斤\n",zl);
    printf("您应付款=%f元\n",yfk);
    printf("您实付款=%f元\n",sfk);
    printf("应找您%f元\n",sfk-yfk);
    return 0;
}

总结:选择结构究竟是什么?它其实是一个判断的过程,相当于构建一个让计算机做选择的环境让它知道在不同情况下应该去做什么事情。在进行本章编程练习中,格式是一件很重要的事情,若格式很差劲,虽然可能程序最后能跑,但程序可读性直线下降。并且某些需要满足的功能,因为格式存在问题导致最后无法达成。在本章学习中,位运算也是很重要的知识点,我们在作业十一细说,加油加油!

每日一mo:情到深处自然无言,余低谷,不敢负小姐半生,若坚持,臣许您一世平安......