第3章 基本流程控制结构测试题

第3章 基本流程控制结构

1-1

  • 题干:if(a=5) 是允许的。
  • 选项:T F
  • 答案:T

1-2

  • 题干:循环体如包括有一个以上的语句,则必须用一对大括号{}括起来,组成复合语句,复合语句在语法上被认为是一条语句。
  • 选项:T F
  • 答案:T

1-3

  • 题干:在switch语句中,每一个的case常量表达式的值可以相同。
  • 选项:T F
  • 答案:F

1-4

  • 题干:在switch语句中,可以根据需要使用或不使用break语句。
  • 选项:T F
  • 答案:T

1-5

  • 题干:在switch语句中必须使用default。
  • 选项:T F
  • 答案:F

1-6

  • 题干:在if语句的三种形式中,如果要想在满足条件时执行一组(多个)语句,则必须把这一组语句用{}括起来组成一个复合语句。
  • 选项:T F
  • 答案:T

1-7

  • 题干:执行以下程序段,将输出10。
    int i = 10;
    while (i < 10){
        printf("%d\n", i);
    }
    
  • 选项:T F
  • 答案:F

1-8

  • 题干:以下程序段计算级数s= 1+1/3+1/5+... 的前若干项之和,1/101 这项没有被加入。
    item = 1.0;
    denominator = 1;
    sum = 0.0;
    while( item > 0.01)
    {
            item = 1.0/denominator;
        sum += item;
        denominator += 2;
    }
    
  • 选项:T F
  • 答案:F

1-9

  • 题干:下面这段程序,若scanf输入k 的值为50 ,则程序将循环有限次,在打印输出有限行之后,程序将正常结束。
    #include <stdio.h>
    int main(){
        int k;
        scanf("%d", &k);
        int i=100;
        while(i > k){
            printf("%d ", i);
            i++;
        }
        return 0;
    }
    
  • 选项:T F
  • 答案:F

1-10

  • 题干:for循环的三个表达式都必须要明确的写出来。
  • 选项:T F
  • 答案:F

1-11

  • 题干:若变量已正确定义,执行以下while语句循环10次。i = 1;while (i <= 10) ;i++;
  • 选项:T F
  • 答案:F

1-12

  • 题干:在C语言的嵌套循环结构中,任何一层循环中的break语句都可以结束整个嵌套循环的执行。
  • 选项:T F
  • 答案:F

第1题

题干:若i,j已定义为int类型,则以下程序段中内循环体的总的执行次数是

for (i = 5; i; i--)
    for (j = 0; j < 4; j++) {...}

选项

  • A. 20
  • B. 25
  • C. 24
  • D. 30

答案:A

解析:C语言中“非0即真”,外循环for(i=5; i; i--)i取值为5、4、3、2、1(共5次,i=0时循环终止);内循环for(j=0; j<4; j++)j取值为0、1、2、3(共4次)。内循环体总执行次数=外循环次数×内循环次数=5×4=20。

第2题

题干:下列程序段的输出结果是()。

int main(void){   
    int x=100, a = 10, b=20,  ok1=5, ok2 =0;
    if(a<b)
        if(b!=15)
            if(! ok1)
                x= 1;
            else if(ok2)
                x=10;
    x=-1;
    printf("%d\n", x);
    return 0;    
}

选项

  • A. -1
  • B. 0
  • C. 1
  • D. 不确定的值

答案:A

解析:C语言中if无大括号时,仅控制紧跟的下一条语句。1. a=10 < b=20为真,进入第一层if;2. b=20 !=15为真,进入第二层if;3. !ok1 = !5为假(5非0,取反后为0),不执行x=1;4. else if(ok2) = else if(0)为假,不执行x=10;5. 最终执行独立语句x=-1,输出x的值为-1。

第3题

题干:在C语言语句中,用作选择结构的条件的表达式是__________。

选项

  • A. 可用任意表达式
  • B. 只能用逻辑或关系表达式
  • C. 只能用逻辑表达式
  • D. 只能用关系表达式

答案:A

解析:C语言选择结构(if/switch)的条件可使用任意表达式,核心判断规则为“表达式值非0为真,0为假”。例如if(5)(5非0为真)、if(a=3)(赋值后a=3非0为真)均合法,无需局限于逻辑或关系表达式,故B、C、D错误。

第4题

题干:执行以下代码,输出的结果是:

#include <stdio.h>
int main(){
    int choice = 2;
    int score = 70;
    switch(choice){
    case 0:
        score--;
    case 1:
        score += 2;
    case 2:
        score -= 2;
    case 3:
        score++;
    }
    printf("%d\n", score);
    return 0;
}

选项

  • A. 68
  • B. 69
  • C. 71
  • D. 72

答案:B

解析switch语句无break时,会从匹配的case开始“贯穿执行所有后续case”。1. choice=2匹配case 2score=70-2=68;2. 无break,继续执行case 3score=68+1=69;3. 循环结束,输出score的值为69。

第5题

题干:下列程序段的输出结果是:

#include <stdio.h>
void main(void){
    int x=1,a=0,b=0;
    switch(x){
    case 0: b++;
    case 1: a++;
    case 2:a++;b++;
    }
    printf("a=%d,b=%d\n",a,b);
}

选项

  • A. a=2,b=1
  • B. a=1,b=1
  • C. a=1,b=0
  • D. a=2,b=2

答案:A

解析switchbreak时触发“贯穿特性”。1. x=1匹配case 1,执行a++a=1);2. 贯穿执行case 2a++a=2)、b++b=1);3. 输出a=2,b=1

第6题

题干:以下程序的功能是计算s=1+1/2+1/3+…+1/10,但运行后输出结果错误,导致错误结果的程序行是:

int main(){
    int n;
    float s;
    s=1.0;
    for(n=10;n>1;n--)
        s=s+1/n;
    printf("%6.4f\n",s);
    return 0;
}

选项

  • A. int n;float s;
  • B. for(n=10;n>1;n–);
  • C. s=s+1/n;
  • D. s=1.0;

答案:C

解析:程序错误源于“整数除法”。nint类型,1n均为整数时,1/n会触发整数除法(如1/10=01/2=0),导致累加结果始终为1.0。正确写法应为s=s+1.0/n(浮点数除法),故错误行是s=s+1/n;

第7题

题干:设有变量声明“char c;”,执行“for (; c=(getchar()!=‘\n’) ; )printf(“%c”, c); ”时,从键盘上输入“ABCDEFG↙”之后,输出的结果是________。

选项

  • A. ABCDEFG
  • B. AABBCCDDEEFFGG
  • C. 非字母数字字符
  • D. 语句不能执行

答案:C

解析:C语言中!=优先级高于=,循环条件c=(getchar()!='\n')的执行逻辑为:1. getchar()读取输入字符(如A),先判断“字符是否≠’\n’”,结果为1(真,非0即真);2. 将1赋值给cc=1);3. printf("%c",c)输出1对应的ASCII字符(控制字符,非字母数字)。

第8题

题干:在C语言语句中,用作选择结构的条件的表达式是__________。

选项

  • A. 可用任意表达式
  • B. 只能用逻辑或关系表达式
  • C. 只能用逻辑表达式
  • D. 只能用关系表达式

答案:A

解析:与第3题考点一致,C语言选择结构的条件可使用任意表达式(算术、赋值、逻辑等),判断规则为“非0为真,0为假”,无需局限于逻辑或关系表达式,故B、C、D错误。

第9题

题干:以下程序的运行结果为

int main(){
    int x = 10;
    int y = 5;
    if(y=x){
        printf("%d",x);
    }else{
        printf("%d",y);
    }
    printf("%d",y);
    return 0;
}

选项

  • A. 105
  • B. 1010
  • C. 55
  • D. 510

答案:B

解析:C语言中“赋值表达式的值等于赋值后变量的值”。1. if(y=x)中,x=10赋值给yy=10(非0为真),执行printf("%d",x)(输出10);2. 后续执行printf("%d",y)(输出10);3. 总输出结果为1010。

第10题

题干:有if结构程序如下:

#include <stdio.h>
int main()
{    
    float x,y;
    scanf("%f",&x);
    if(x<0.0) y=0.0;
    else if((x<5.0)&&(x!=2.0))
        y=1.0/(x+2.0);
    else if (x<10.0) y=1.0/x;
    else y=10.0;
    printf("%f\n",y);
    return 0;
}

若运行时从键盘上输入2.0 (回车),则上面程序的输出结果是( )

选项

  • A. 0.000000
  • B. 0.250000
  • C. 0.500000
  • D. 1.00000

答案:C

解析:输入x=2.0后逐步匹配条件:1. x<0.0为假,跳过;2. (x<5.0)&&(x!=2.0)x!=2.0为假,整体为假,跳过;3. x<10.0为真,执行y=1.0/2.0=0.5;4. 输出y=0.500000

第11题

题干:有如下程序段:

int x=2;
while (x=0) {printf("%d",x);x--;}

则下列描述中,正确的是

选项

  • A. while 循环执行2次
  • B. 循环是无限循环
  • C. 循环体一次也不执行
  • D. 循环体语句执行一次

答案:C

解析while(x=0)是赋值表达式,而非判断“x是否等于0”。赋值后x=0(0为假),循环条件不满足,循环体一次也不执行。

第12题

题干:以下程序段的循环次数是

for (i=2; i==0; ) printf("%d",i--)

选项

  • A. 无限次
  • B. 1次
  • C. 0次
  • D. 2次

答案:C

解析for循环执行逻辑为“表达式1→表达式2(条件)→循环体→表达式3”。1. 表达式1:i=2;2. 表达式2:i==02==0为假),循环直接终止,循环次数为0。

第13题

题干:在执行以下程序时,为使输出结果为:t=4,则给a和b输入的值应满足的条件是。

int main(void){
    int  a,b,s,t;
    scanf("%d,%d",&a,&b);
    s = 1; t = 1;
    if(a > 0) s = s + 1;
    if(a > b) t = s + t;
    else if(a == b) t = 5;
    else t = 2 * s;
    printf("t=%d\n",t);
    return 0;
}

选项

  • A. a>b
  • B. a<b<0
  • C. 0<a<b
  • D. 0>a>b

答案:C

解析:目标输出t=4,初始s=1、t=1,推导条件:1. 若0<a<b,则a>0为真,s=1+1=2;2. a<b为真,t=2×s=2×2=4,符合要求。其他选项:A(t=3或2)、B(t=2)、D(t=2)均不满足。

第14题

题干:下列叙述中正确的是()。

选项

  • A. do-while语句构成的循环不能用其他语句构成的循环来代替
  • B. do-while语句构成的循环只能用break语句退出
  • C. 用do-while语句构成的循环,在while后的表达式为非零时结束循环
  • D. 用do-while语句构成的循环,在while后的表达式为零时结束循环

答案:D

解析:逐一排除错误选项:A错(do-while可被while替代);B错(do-while可通过条件为假、return等退出);C错(while表达式非零时继续循环);D对(while表达式为零时结束循环)。

第15题

题干:执行以下代码

#include <stdio.h>
int main(){
    for(int i=1; i<10; i++){
        if(i%3 == 0) continue;
        if(i%7 == 0) break;
        printf("%d", i);
    }
    return 0;
}

打印输出的内容是:

选项

  • A. 123456
  • B. 1245
  • C. 123456789
  • D. 12
  • E. 12345678910
  • F. 12457810
  • G. 124578

答案:B

解析i从1到9的循环逻辑:1. i=1(无continue/break,打印1);2. i=2(打印2);3. i=33%3==0continue,不打印);4. i=4(打印4);5. i=5(打印5);6. i=66%3==0continue,不打印);7. i=77%7==0break,循环终止);8. 最终打印内容为1245。

第16题

题干:对于语句“int s=0,i=1; while(i=1) s+=i;”,说法正确的是( )

选项

  • A. while循环执行0次
  • B. while循环执行1次
  • C. while循环执行无限次
  • D. 以上说法都错

答案:C

解析while(i=1)是赋值表达式,每次循环均将i赋值为1(非0为真),循环体s+=i持续执行,无终止条件,导致无限循环。

第17题

题干:在“for(表达式1; 表达式2; 表达式3) 循环体” 循环中,控制循环结束的是( )

选项

  • A. 初始化表达式(表达式1)
  • B. 条件表达式(表达式2)
  • C. 迭代表达式(表达式3)
  • D. 循环体

答案:B

解析for循环三大表达式功能:表达式1(初始化,仅执行1次)、表达式2(条件判断,每次循环前执行,值为0则终止循环,是控制结束的核心)、表达式3(迭代,每次循环后执行)。

第18题

题干:在switch语句中,关于default,说法正确的是( )

选项

  • A. switch语句须有default
  • B. default用于处理未与任何case标号匹配的情况
  • C. 每个switch语句中可以有多个default
  • D. default须放在在switch语句的最后

答案:B

解析:逐一排除错误选项:A错(default非必需);B对(default的核心作用是处理“无case匹配”的情况);C错(一个switch仅能有一个default);D错(default可放在任意位置,不强制在最后)。

第19题

题干:要求通过while循环不断读入字符,当读入字母N时结束循环。若变量已正确定义,下列正确的程序段是:

选项

  • A. while ((ch=getchar())!=‘N’) printf(“%c”,ch);
  • B. while (ch=getchar()!=‘N’) printf(“%c”,ch);
  • C. while (ch=getchar()==‘N’) printf(“%c”,ch);
  • D. while ((ch=getchar())==‘N’) printf(“%c”,ch);

答案:A

解析:核心是正确处理“赋值”与“判断”的优先级(!=优先级高于=):1. 需用括号确保ch先接收字符(ch=getchar()),再判断是否≠'N';2. 选项A逻辑正确(读入非N字符时打印,遇N终止);3. B(ch接收0/1,打印控制字符)、C/D(仅读入N时循环,与需求相反)均错误。

5-01 构成三角形的逻辑表达式

题干

已知在一个三角形中,任意两边之和大于第三边。若变量abc代表三角形的三条边,请写出表示abc能构成一个三角形的C表达式。

答案
(a > 0 && b > 0 && c > 0) && (a + b > c && a + c > b && b + c > a)
解析

构成三角形需满足两个核心条件:

  1. 三边均为正数(排除非正数边长的无效情况),即a > 0 && b > 0 && c > 0
  2. 任意两边之和大于第三边(三角形基本性质),即a + b > c && a + c > b && b + c > a
    两者需同时成立,故用&&连接两个条件表达式。

5-02 找出3个数中最大的数

题干

输入3个整数,输出其中最大的数。补全以下C语言代码:

#include <stdio.h>
int main()
{
    int a, b, c, max;

    scanf("%d %d %d", &a, &b, &c);
    max = 0;
    if ( a > b ) {
        if ( a > c ) {
            // 空1
        } else {
            max = c;
        }
    } else {
        if  (// 空2) {
            max = b;
        } else {
            // 空3
        }
    }
    printf("%d\n", max);

    return 0;
}
答案
#include <stdio.h>
int main()
{
    int a, b, c, max;

    scanf("%d %d %d", &a, &b, &c);
    max = 0;
    if ( a > b ) {
        if ( a > c ) {
            max = a;  // 空1
        } else {
            max = c;
        }
    } else {
        if  (b > c) {  // 空2
            max = b;
        } else {
            max = c;  // 空3
        }
    }
    printf("%d\n", max);

    return 0;
}
解析
  1. 空1逻辑:当a > ba > c时,a是三个数中的最大值,需将a赋值给max
  2. 空2逻辑:当a ≤ b时,需比较bc的大小,若b > c,则b是最大值,故条件为b > c
  3. 空3逻辑:当a ≤ bb ≤ c时,c是最大值,需将c赋值给max

5-03 判断三角形类型

题干

从键盘上输入3个整数(用空格分隔),判断这3个数是否可以构成一个三角形(条件:三条边均大于0且任意两边之和均大于第三边);若可以,进一步判断是等边、等腰还是一般三角形(等边输出"1",等腰输出"2",一般输出"3");若无法构成三角形,输出"-1"。补全以下C语言代码:

#include <stdio.h>
int main(void)
{int x,y,z;
 // 空1
 if(// 空2)//能构成三角形
   {if(// 空3)  //等边三角形
     printf("1\n");
    else
      if(// 空4)//等腰三角形
        printf("2\n");
      else
        printf("3\n");//一般三角形
   }
 else//不能构成三角形
   // 空5
 return 0;
}
答案
#include <stdio.h>
int main(void)
{int x,y,z;
 scanf("%d %d %d", &x, &y, &z);  // 空1
 if((x > 0 && y > 0 && z > 0) && (x + y > z && x + z > y && y + z > x))//能构成三角形  // 空2
   {if(x == y && y == z)  //等边三角形  // 空3
     printf("1\n");
    else
      if(x == y || x == z || y == z)//等腰三角形  // 空4
        printf("2\n");
      else
        printf("3\n");//一般三角形
   }
 else//不能构成三角形
   printf("-1\n");  // 空5
 return 0;
}
解析
  1. 空1(输入语句):需读取3个整数,故用scanf("%d %d %d", &x, &y, &z)
  2. 空2(三角形判断):需同时满足“三边为正”和“任意两边之和大于第三边”,两个条件用&&连接;
  3. 空3(等边判断):等边三角形需三边完全相等,故条件为x == y && y == z
  4. 空4(等腰判断):等腰三角形需至少两边相等,故条件为x == y || x == z || y == z
  5. 空5(无法构成三角形输出):题目要求输出"-1",故用printf("-1\n")

5-04 体型判断

题干

体指数t = 体重w /(身高h * 身高h)w单位:千克,h单位:米),判断体重类型:

  • t < 18:低体重;
  • 18 ≤ t < 25:正常体重;
  • 25 ≤ t < 27:超重体重;
  • t ≥ 27:肥胖。

从键盘输入身高h和体重w,补全代码计算体指数并判断体重类型:

#include <stdio.h>
int main()
{
    float h, w, t;
    scanf("%f,%f", &h,&w);
    // 空1
    if(t<18)
        printf("t=%f,低体重!",t);
    else if(t<25)
        printf("t=%f,正常体重!",t);
    else if(// 空2)
        printf("t=%f,超重体重!",t);
    // 空3
        printf("t=%f,肥胖!",t);
    return 0;
}
答案
#include <stdio.h>
int main()
{
    float h, w, t;
    scanf("%f,%f", &h,&w);
    t = w / (h * h);  // 空1
    if(t<18)
        printf("t=%f,低体重!",t);
    else if(t<25)
        printf("t=%f,正常体重!",t);
    else if(t < 27)  // 空2
        printf("t=%f,超重体重!",t);
    else  // 空3
        printf("t=%f,肥胖!",t);
    return 0;
}
解析
  1. 空1(体指数计算):根据公式t = w/(h*h),需明确计算t的值;
  2. 空2(超重条件):前序条件t < 25已排除“低体重”和“正常体重”,故超重条件简化为t < 27(即25 ≤ t < 27);
  3. 空3(肥胖分支):排除前三种情况后,剩余t ≥ 27,故用else引导肥胖分支。

5-05 求方程的根

题干

从键盘输入abc三个双精度实数,求二次方程ax² + bx + c = 0的根并输出:

  • 若判别式d ≥ 0:输出两个实根(保留2位小数);
  • 若判别式d < 0:输出两个共轭复根(保留2位小数,格式如x1=a+bix2=a-bi)。

补全以下C语言代码:

#include <stdio.h>
#include <math.h>
int main(void)
{int i;for(i=1;i<=3;i++){ //自动阅卷循环,忽略
double a,b,c,d,x1,x2;
scanf("%lf%lf%lf",&a,&b,&c);
d=// 空1;
if(d>=0)//两个实根
  {x1=// 空2;
   x2=// 空3;
   printf("x1=%.2lf\nx2=%.2lf\n",x1,x2);
  }
else//输出两个共轭复根
  {printf(// 空4);//输出x1=a+bi并换行
   printf(// 空5);//输出x2=a-bi并换行
  }
    } //循环结束,忽略
 return 0;
} 
答案
#include <stdio.h>
#include <math.h>
int main(void)
{int i;for(i=1;i<=3;i++){ //自动阅卷循环,忽略
double a,b,c,d,x1,x2;
scanf("%lf%lf%lf",&a,&b,&c);
d= b*b - 4*a*c;  // 空1
if(d>=0)//两个实根
  {x1= (-b + sqrt(d))/(2*a);  // 空2
   x2= (-b - sqrt(d))/(2*a);  // 空3
   printf("x1=%.2lf\nx2=%.2lf\n",x1,x2);
  }
else//输出两个共轭复根
  {printf("x1=%.2lf+%.2lfi\n", -b/(2*a), sqrt(-d)/(2*a));  // 空4
   printf("x2=%.2lf-%.2lfi\n", -b/(2*a), sqrt(-d)/(2*a));  // 空5
  }
    } //循环结束,忽略
 return 0;
} 
解析
  1. 空1(判别式计算):二次方程判别式公式为d = b² - 4ac,需准确实现;
  2. 空2/空3(实根计算):实根公式为x = [-b ± √d]/(2a)sqrt(d)需调用math.h中的平方根函数;
  3. 空4/空5(复根输出):复根实部为-b/(2a),虚部为√(-d)/(2a)(因d < 0-d为正),输出格式需匹配x1=a+bix2=a-bi

5-06 显示扑克牌

题干

用数字1~13代表一组扑克牌,输入数字输出对应牌面:

  • 2~10:直接显示数字;
  • 1:显示"Ace";
  • 11:显示"Jack";
  • 12:显示"Queen";
  • 13:显示"King";
  • 输入不在1~13范围内:显示"Error"。

补全以下C语言代码:

#include <stdio.h>
int main()
{
    int n;

    scanf("%d", &n);
    if(n >= 1 && n <= 13){
        switch (// 空1 ){
            case 1: // 空2
            case 11: printf("Jack\n"); break; 
            case 12: printf("Queen\n"); break; 
            case 13: printf("King\n"); break; 
           default: // 空3
        }
    }else{
        printf("Error\n");
    }

    return 0;
}
答案
#include <stdio.h>
int main()
{
    int n;

    scanf("%d", &n);
    if(n >= 1 && n <= 13){
        switch (n) {  // 空1
            case 1: printf("Ace\n"); break;  // 空2
            case 11: printf("Jack\n"); break; 
            case 12: printf("Queen\n"); break; 
            case 13: printf("King\n"); break; 
           default: printf("%d\n", n);  // 空3
        }
    }else{
        printf("Error\n");
    }

    return 0;
}
解析
  1. 空1(switch表达式):需根据输入的数字n判断,故表达式为n
  2. 空2(case 1处理):数字1对应"Ace",需输出"Ace\n",且必须加break(否则会穿透到后续case);
  3. 空3(default处理):default对应2~10的情况,需直接输出数字n,故用printf("%d\n", n)

5-07 判断回文数

题干

回文数是指正读和反读都一样的数(如12321、67876)。编写程序:

  1. 从键盘读取一个5位正整数;
  2. 先输出该整数,再输出是否为回文数(是输出"Yes",否输出"No"),中间用空格分隔。

补全以下C语言代码(n:输入的5位整数,g:个位,s:十位,q:千位,w:万位):

#include <stdio.h>
int main(void)
{int i;for(i=1;i<=2;i++){ //自动阅卷循环,忽略
int n,g,s,q,w;
scanf("%d",&n);
g=// 空1;
s=// 空2;
q=// 空3;
w=// 空4;
if(// 空5)
  printf("%d Yes\n",n);
else
  printf("%d No\n",n);
     } //循环结束,忽略
 return 0;

}
答案
#include <stdio.h>
int main(void)
{int i;for(i=1;i<=2;i++){ //自动阅卷循环,忽略
int n,g,s,q,w;
scanf("%d",&n);
g= n % 10;  // 空1
s= n / 10 % 10;  // 空2
q= n / 1000 % 10;  // 空3
w= n / 10000;  // 空4
if(w == g && s == q)  // 空5
  printf("%d Yes\n",n);
else
  printf("%d No\n",n);
     } //循环结束,忽略
 return 0;

}
解析
  1. 空1(个位提取):整数对10取余得个位,故g = n % 10
  2. 空2(十位提取):先除以10去掉个位(整数除法),再对10取余得十位,故s = n / 10 % 10
  3. 空3(千位提取):先除以1000去掉后三位,再对10取余得千位,故q = n / 1000 % 10
  4. 空4(万位提取):5位整数除以10000(整数除法)得万位,故w = n / 10000
  5. 空5(回文判断):5位回文数需满足“万位=个位”且“十位=千位”,故条件为w == g && s == q

5-08 switch改写成if-else

题干

已知以下switch语句,写出与其等价的else-if语句:

switch (ch){
    case '-':
        minus++;
    case '+':
        plus++; break; 
    case '0' : case '1' : case '2' : case '3' : case '4' :
    case '5' : case '6' : case '7' : case '8' : case '9' : 
        digit ++;break;
    default: 
        other ++; break; 
} 

补全以下else-if语句:

if (ch=='-'){ 
    // 空1
}else if (// 空2){
    plus ++;
}else if (// 空3){
    digit ++;
}else{
    // 空4
}
答案
if (ch=='-'){ 
    minus++; plus++;  // 空1
}else if (ch == '+'){  // 空2
    plus ++;
}else if (ch >= '0' && ch <= '9'){  // 空3
    digit ++;
}else{
    other ++;  // 空4
}
解析
  1. 空1(case '-'处理):原switch中case '-'break,会穿透到case '+',故需同时执行minus++plus++
  2. 空2(case '+'处理):对应原switch的case '+',条件为ch == '+'
  3. 空3(数字字符处理):原switch中case '0'~'9'对应数字字符,条件可简化为ch >= '0' && ch <= '9'
  4. 空4(default处理):原switch的default对应“其他字符”,故执行other ++

5-10 统计数字字符和空格

题干

编写程序:

  1. 输入15个字符;
  2. 统计并输出“空格或回车”“数字字符”“其他字符”的个数;
  3. 要求使用switch语句;
  4. 输入15个字符后回车表示结束,该回车不统计。

补全以下C语言代码:

# include <stdio.h>
int main()
{
    int blank, digit, i, other; 
    char ch;
   
    blank = digit = other = 0; 
    for (i = 1; i <= 15; i++){ 
        ch = getchar();  
        switch (// 空1 ) {
            // 空2
        }     
    }
    printf("blank = %d, digit = %d, other = %d\n", blank, digit, other);

    return 0;
}
答案
# include <stdio.h>
int main()
{
    int blank, digit, i, other; 
    char ch;
   
    blank = digit = other = 0; 
    for (i = 1; i <= 15; i++){ 
        ch = getchar();  
        switch (ch) {  // 空1
            case ' ':
            case '\n':
                blank++;
                break;
            case '0': case '1': case '2': case '3': case '4':
            case '5': case '6': case '7': case '8': case '9':
                digit++;
                break;
            default:
                other++;
                break;
        }  // 空2
    }
    printf("blank = %d, digit = %d, other = %d\n", blank, digit, other);

    return 0;
}
解析
  1. 空1(switch表达式):需根据读取的字符ch分类,故表达式为ch
  2. 空2(switch分支)
    • 空格(' ')和回车('\n')属于同一类,用无break的case穿透,执行blank++
    • 数字字符('0'~'9')用多个case并列,执行digit++
    • 其他字符用default处理,执行other++
    • 所有分支需加break,避免穿透。

5-12 每位数字之和

题干

编写程序:

  1. 从键盘输入一个无符号整数;
  2. 输出它的各位数字之和(格式如输入1476,输出6+7+4+1=18)。

补全以下C语言代码:

#include<stdio.h>
int main()
{    
    unsigned  a;
    int sum=0;
    scanf("%u",&a);
    while(a)
    {
        int x;
        // 空1;  
        sum+=x;
        // 空2;
        if(a!=0)
            printf("%d+",x);
        else
            printf("%d",x);     
    }
    printf("=%d\n",sum);
    return 0;
}
答案
#include<stdio.h>
int main()
{    
    unsigned  a;
    int sum=0;
    scanf("%u",&a);
    while(a)
    {
        int x;
        x = a % 10;  // 空1
        sum+=x;
        a = a / 10;  // 空2
        if(a!=0)
            printf("%d+",x);
        else
            printf("%d",x);     
    }
    printf("=%d\n",sum);
    return 0;
}
解析
  1. 核心逻辑:用while(a)循环提取各位数字(a为0时循环结束),每次提取个位、累加后去掉个位;
  2. 空1(提取个位):用a % 10获取当前个位数字,赋值给x
  3. 空2(去掉个位):用整数除法a = a / 10去掉已处理的个位(如1476 → 147);
  4. 输出逻辑:若a != 0(还有未处理的数字),输出x+;若a == 0(最后一位数字),输出x,避免末尾多一个+

5-13 计算阶乘倒数之和

题干

计算s = 1/1! + 1/2! + 1/3! + … + 1/n!的值(n!表示n的阶乘),补全以下C语言代码:

#include <stdio.h>
int main()
{
    int i,n;
    double f=1;
    double s=0;
    scanf("%d",&n);
    for (i=1; // 空1 ;i++)
    {
        f=// 空2;
        s=s+// 空3;
    }
    printf("sum = %.5lf\n", s);
    return 0;
}
答案
#include <stdio.h>
int main()
{
    int i,n;
    double f=1;
    double s=0;
    scanf("%d",&n);
    for (i=1; i <= n ;i++)  // 空1
    {
        f= f * i;  // 空2
        s=s+ 1.0 / f;  // 空3
    }
    printf("sum = %.5lf\n", s);
    return 0;
}
解析
  1. 空1(循环条件):需计算1到n的阶乘倒数之和,故循环条件为i <= n
  2. 空2(阶乘计算)f初始值为1! = 1,每次循环更新为i! = (i-1)! * i,故f = f * i
  3. 空3(累加阶乘倒数):需累加1/i!,用1.0 / f确保浮点数除法(避免整数除法结果为0),故s = s + 1.0 / f

5-14 输出每个月的天数

题干

编写程序:

  1. 输入年份;
  2. 输出该年每个月的天数(格式:12个天数用空格分隔);
  3. 天数规则:
    • 1、3、5、7、8、10、12月:31天;
    • 4、6、9、11月:30天;
    • 2月:平年28天,闰年29天(闰年条件:能被4整除但不能被100整除,或能被400整除)。

补全以下C语言代码:

#include <stdio.h>

int main()
{
    int day, month, year;

    scanf("%d", &year);
    for(month = 1; month <= 12; month++){
        switch (// 空1 ){
            case 2: 
                if((year % 4 == 0 && year % 100 != 0)||year % 400 == 0 ) { 
                    day = 29; 
                }else{
                    day = 28;  
                }
               break;  
            // 空2: 
                day = 31; break;
            // 空3:  
                day = 30; break;
        }
        printf("%d ", day) ;
    }

    return 0;
}
答案
#include <stdio.h>

int main()
{
    int day, month, year;

    scanf("%d", &year);
    for(month = 1; month <= 12; month++){
        switch (month) {  // 空1
            case 2: 
                if((year % 4 == 0 && year % 100 != 0)||year % 400 == 0 ) { 
                    day = 29; 
                }else{
                    day = 28;  
                }
               break;  
            case 1: case 3: case 5: case 7: case 8: case 10: case 12:  // 空2
                day = 31; break;
            case 4: case 6: case 9: case 11:  // 空3
                day = 30; break;
        }
        printf("%d ", day) ;
    }

    return 0;
}
解析
  1. 空1(switch表达式):需根据月份month判断天数,故表达式为month
  2. 空2(31天月份):1、3、5、7、8、10、12月共7个月份,用多个case并列,执行day = 31
  3. 空3(30天月份):4、6、9、11月共4个月份,用多个case并列,执行day = 30
  4. 2月处理:原代码已实现闰年判断,无需修改,只需确保break避免穿透。

5-15 打印等腰三角形图案

题干

编写程序:

  1. 输入正整数n(1 ≤ n ≤ 9);
  2. 打印高度为n的“*”等腰三角形(如n=3时输出):
  *
 ***
*****

补全以下C语言代码:

int i, j, n; 
scanf("%d", &n);
for (i = 1; i <= n; i++){
    for (// 空1) {
        printf (" ");
    }     
    for (// 空2) {
        printf ("*");
    }     
    // 空3;
}
答案
#include <stdio.h>  // 补充头文件(原代码缺失)
int main() {  // 补充main函数框架(原代码缺失)
    int i, j, n; 
    scanf("%d", &n);
    for (i = 1; i <= n; i++){
        for (j = 1; j <= n - i; j++) {  // 空1
            printf (" ");
        }     
        for (j = 1; j <= 2 * i - 1; j++) {  // 空2
            printf ("*");
        }     
        printf("\n");  // 空3
    }
    return 0;
}

7-1 应缴电费

春节前后,电费大增。查询之后得知收费标准如下:

月用电量在230千瓦时及以下部分按每千瓦时0.4983元收费;
月用电量在231~420千瓦时的部分按每千瓦时0.5483元收费;
月用电量在421千瓦时及以上部分按每千瓦时0.7983元收费。
请根据月用电量(单位:千瓦时),按收费标准计算应缴的电费(单位:元)。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。对于每组测试,输入一个整数n(0≤n≤10000),表示月用电量。

输出格式:
对于每组测试,输出一行,包含一个实数,表示应缴的电费。结果保留2位小数。

输入样例:
2
270
416
输出样例:
136.54
216.59
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB


#include <stdio.h>
int main(){
    int t,n;double m;
    scanf("%d",&t)!=1;
    while(t--){
        scanf("%d",&n)!=1;
        if (n<=230){
            m=n*0.4983;
        }else if(n<=420){
            m=230*0.4983+(n-230)*0.5483;
        }else{
            m=230*0.4983+190*0.5483+(n-420)*0.7983;
        }
        printf("%.2f\n",m);
    }
    return 0;
}

7-2 输入今天判断后天为星期几

本题目要求输入今天星期数,进而判断后天为星期几。如果今天是星期三,后天就是星期五;如果今天是星期六,后天就是星期一。我们用数字1到7对应星期一到星期日,给定某一天,请你输出那天的“后天”是星期几。如果输入数据不符合要求,输出“Invalid Input!”。

输入格式:
输入第一行给出一个正整数D(1 ≤ D ≤ 7),代表星期里的某一天。

输出格式:
在一行中输出D天的后天是星期几。

输入样例:
1
输出样例:
3
输入样例:
-1
输出样例:
Invalid Input!
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB


int main(){
    int d;
    scanf("%d",&d);
    if(d<1||d>7)printf("Invalid Input!");
    else printf("%d",(d+1)%7+1);
    return 0;
}

7-3 直角三角形(左下)

请编写程序,显示直角三角形。

输入格式
n s

说明:n 为正整数,是直角三角形的高度和底边宽度。s 为符号,是组成图形的字符。

输出格式
n 行由 s 组成的直角三角形(参见输出样例)。

输入样例
5 *

输出样例

*****
 ****
  ***
   **
    *

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB

#include <stdio.h>
int main(){
    int n;
    char s;
    scanf("%d %c",&n,&s);
    for (int i=0;i<n;i++){
        for (int j=0;j<i;j++)
            printf(" ");
        for (int k=0;k<n-i;k++)
            printf("%c",s);
        printf("\n");}
    return 0;
}

7-4 最大公约数
求两个正整数m,n的最大公约数(Greatest Common Divisor,简称GCD)。要求定义一个函数求最大公约数。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试输入2个整数m,n(0<m,n<10
9
)。

输出格式:
对于每组测试,输出m,n的最大公约数。

输入样例:
2
63 36
20 15
输出样例:
9
5
提示:
为避免超时,宜用高效的算法,例如欧几里德算法(辗转相除法)。

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB

#include <stdio.h>
int g(int a,int b){
    while(b){
        int t=a%b;
        a=b;
        b=t;
    }
    return a;
}
int main(){
    int t,m,n;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&m,&n);
        printf("%d\n",g(m,n));
    }
    return 0;
}

7-5 输出正整数[a,b]间符合条件的数
编写程序,输入正整数a和b,输出[a,b]区间中能被3或7整除的数,不限a和b的大小关系。

输入格式:
在一行内输入a,b值。

输出格式:
在一行内连续输出符合条件的数,每个数后跟一个空格以示间隔。

输入样例1:
10 20
输出样例1:
12 14 15 18
输入样例2:
20 10
输出样例2:
12 14 15 18
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB

#include <stdio.h>
int main(){
    int a,b,t,s,e,i;
    scanf("%d%d",&a,&b);
    if(a>b){
        t=a;
        a=b;
        b=t;
    }
    s=a;
    e=b;
    for(i=s;i<=e;i++)
        if(i%3==0||i%7==0)
            printf("%d ",i);
    return 0;
}

7-6 7-1 输入一行字符,加密后输出(凯撒加密)

编程实现对键盘输入的一行英文句子进行加密。用加密方法为,当内容为英文字母时其在26字母中的其后第三个字母代替该字母,字母x,y,z分别以a,b,c代替,字母X,Y,Z分别以A,B,C代替。若为其它字符则不变。

若为其它字符则不变。

输入格式:
输入一行英文句子

输出格式:
输出加密后的句子

输入样例1:
在这里给出一组输入。例如:

This is a test string.

输出样例1:
在这里给出相应的输出。例如:

Wklv lv d whvw vwulqj.

输入样例2:
在这里给出一组输入。例如:

ABCabc xyzXYZ&123

输出样例2:
在这里给出相应的输出。例如:

DEFdef abcABC&123

代码长度限制
16 KB
时间限制
800 ms
内存限制
64 MB
栈限制
8192 KB

#include <stdio.h>
int main(){
    int c;
    while((c=getchar())!='\n'){
        if (c>='a'&&c<='z')
            c=(c-'a'+3)%26+'a';
        else if (c>='A'&&c<='Z')
            c=(c-'A'+3)%26+'A';
        putchar(c);
    }
    return 0;
}

7-7 C程序设计教程与实训-循环结构-求π的近似值。

用下面的公式求π的近似值。

在这里插入图片描述

输入格式:
输入一个整数n。

输出格式:
输出用公式求得的π的近似值,小数点后保留7位。

输入样例:
10000
输出样例:
3.1415141
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB

#include <stdio.h>

int main(){
    int n;
    double p=1.0;
    scanf("%d",&n);
    for (int k=1;k<=n;k++){
        p*=(2.0*k)*(2.0*k)/((2.0*k-1)*(2.0*k+1));
    }
    printf("%.7f",p*2);
    return 0;
}

7-8 输出a行b列字符阵列图。
本题目要求读入a和b,然后输出a行b列字符阵列图。

输入格式:
在一行中给出整数a和b。

输出格式:
输出a行b列规律图案。

输入样例:
3 4
输出样例:
ABCD
BCDE
CDEF
输入样例:
4 5
输出样例:
ABCDE
BCDEF
CDEFG
DEFGH
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB

#include <stdio.h>
int main(){
    int a,b,i,j;
    scanf("%d%d",&a,&b);
    for (i=0;i<a;i++){
        for (j=0;j<b;j++)
            printf("%c",'A'+i+j);
        printf("\n");
    }
    return 0;
}

7-9 反素数
反素数是指: 一个素数的逆序数也是素数,例如13是一个素数,13的逆序数31也是一个素数,则称13为反素数。若该素数是回文数(逆序数等于本身,例如11),则该素数不能称为反素数。现要求编程实现:输入两个正整数n,k,输出k个≥n的反素数。

输入格式:
在一行中输入两个不超过1000的正整数n和k。

输出格式:
分K行输出k个反素数。

输入样例:
11 5
输出样例:
13
17
31
37
71
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB

#include <stdio.h>
#include<math.h>
int is_p(int x){
    if(x<=1)return 0;
    if(x==2)return 1;
    if (x%2==0)return 0;
    for (int i=3;i<=sqrt(x);i+=2)
        if (x%i==0)return 0;
    return 1;
}
int rev(int x){
    int r=0;
    while (x)r=r*10+x%10,x/=10;
    return r;
}
int main(){
    int n,k,c=0,i;
    scanf("%d%d",&n,&k);
    for (i=n;c<k;i++){
        int r=rev(i);
        if (is_p(i)&&is_p(r)&&i!=r){
            printf("%d\n",i);
            c++;
        }
    }
    return 0;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值