【C语言必知必会 | 子系列第五篇】深入剖析循环结构(1)

简介: 【C语言必知必会 | 子系列第五篇】深入剖析循环结构(1)

引言

C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。它在编程语言中具有举足轻重的地位。

此文为【C语言必知必会】子系列第五篇,基于进行C语言循环结构的选择题专项练习,结合专题优质题目,带领读者从0开始,深度掌握知识点。



1️⃣ 前言

在【C语言你还没卷起来?】系列中,我们学习了顺序结构、选择结构、循环结构等,同时也通过专项练习进行了知识点的巩固和手敲代码的锻炼。

在子系列中,我们将基于PTA教学平台,向C语言学习者提供更优质的题目与更巧妙、精髓的解题思想与方法。

PTA是一个程序设计类实验辅助教学平台,由千名老师共同建设,里面包含了上万道高质量题目,用户量达百万。

在本讲中,将深入讲解循环结构的选择题,在思想上引领读者带领读者在理论结合实际的基础上更好地学习、吸收、掌握C语言。


2️⃣PTA专项练习

接下来,开始我们的循环结构选择题专篇练习。

第一题

下列程序段执行后s的值为( )。

int i=5, s=0;
   while(i--)
       if (i%2) continue;
       else s+=i;

A.15

B.10

C.9

D.6

解题详析:

i 的初始值为 5,s 的初始值为 0。

进入循环,并执行条件判断:i--i 递减为 4,然后判断 i%2 是否为真(非零)。

因为 4%2 的结果为 0,不满足条件,所以执行 else 语句块内的操作。

else 语句块中,将 i 的值加到 s 上:s += i,此时 s 的值变为 4。

按这样的流程走下去 最终s为6

选D


第二题

设有程序段

int m=20; while (m=0) m=m++;

则下面描述中正确的是( )。

A.while 循环执行 10 次

B.循环是无限循环

C.循环体语句一次也不执行

D.循环体语句执行一次

解题详析:

1.初始化变量:m 的初始值为 20。

2.进入循环,并执行条件判断:m = 0 是一个赋值表达式,将 m 的值设为 0,并返回赋值操作的结果(即 0)。

3.因为赋值表达式的结果为 0,作为条件判断时被解释为假,所以循环条件不满足。

4.循环体内的语句不会执行。

5.循环结束。

故选C


第三题

下面的这个循环的循环次数是( )。

for(int i=0,j=10; i=j=10; i++,j--)

A.语法错误,不能执行

B.无限次

C.10

D.1

解题详析:

int i=0,j=10;相当于被注释

程序无限次执行,答案为B


第四题

C语言中while和do-while循环的主要区别是()。

A.do-while的循环体至少无条件执行一次

B.while的循环控制条件比do-while的循环控制条件严格

C.do-while允许从外部转到循环体内

D.do-while的循环体不能是复合语句

解题详析:

主要区别:do-while的循环体至少无条件执行一次

故选A


第五题

执行以下循环语句时,下列说法正确的是()。

x = -1; 
do { 
      x = x * x; 
} while (x == 0);

A.循环体将执行一次

B.循环体将执行两次

C.循环体将执行无限次

D.系统将提示有语法错误

解题详析:

较简单,选A


第六题

运行以下程序后,如果从键盘上输入65 14<回车>,则输出结果为()。

int main(void)
{  
      int  m, n;
      printf("Enter m,n;");   
      scanf("%d%d", &m,&n);
      while (m != n)
      {   while (m > n)       m = m - n;
          while (n > m)       n = n - m;    
      }
      printf("m=%d\n",m);    
      return 0;
}

解题详析:

较简单的循环判断,选C


第七题

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

int main(void) 
{
      for(int i = 1; i < 6; i ++) {
            if( i % 2 != 0) { 
                  printf("#");
                  continue;  
            }
      printf("*");     
      }
      printf("\n");    
      return 0;
}

解题详析:

较为简单,判断i%2是否等于0,执行对应的操作。遇到continue则开始下一个循环


第八题

下列程序段执行后s值为__。

int i=5, s=0;
while(--i!=0){
        if (i%2==1)
            continue;
        s+=i;  

A.15

B.9

C.6

D.4

解题详析:

较为简单,4+2=6,选C


第九题

要求通过 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);

解题详析:

较为简单,选C


第十题

下列程序段中,非死循环的是( )。

A.

int i=100;
 while(1)
 { i=i%100+1;
   if(i>=100)
       break;    
}

B.

int k=0;
 do{
     ++k;
 }while(k>=0);

C.

int s=10;
 while(s) 
   s++;

D.

for(   ;   ;    )

解题详析:

B,C,D均为死循环,故选A


第十一题

下面程序段执行后的输出结果是( )。

char a[] = "language", *p;
p = a;
while ( *p != 'u' )
{
    printf( "%c", *p - 32 ); p++;
}

A.LANGUAGE

B.language

C.LANG

D.langUAGE

解题详析:

lang-32=LANG

答案选C


第十二题

当执行以下程序段时,以下答案正确的是?

x=-1;
do {
   x=x*x; 
} while(!x);

A.循环体将执行一次

B.循环体将执行两次

C.循环体将执行无限次

D.系统将提示有语法错误

解题详析:

do执行一次后x变为1,!1表示假,不执行循环体,故选A


第十三题

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

for (i=5;i;i--)
   for (j=0;j<4;j++) 
      {......} //内循环体

A.25

B.20

C.24

D.30

解题详析:

循环语句 for (i=5;i;i--) 中,i 的初始值是 5。该循环的条件是 i 不为 0,当 i 不为 0 时,循环会一直执行下去。每次执行完循环体后,i 会递减 1(即 i--),直到 i 的值为 0,循环终止。

对于每个 i 的值,内循环体都会执行 4 次。

所以总执行次数为 5 * 4 = 20。

故选B


第十四题

以下程序的功能是:按顺序读入10名学生4门课程的成绩,计算每位学生的平均分并输出,但运行后结果不正确,调试中发现有一条语句出现的位置不正确。这条语句是:

int main(void)
{ 
  int n,k;
  float score, sum, ave;
  sum=0.0;
  for(n=1; n<=10; n++)
  {   
        for(k=1; k<=4; k++)
        {   
            scanf("%f",&score);
            sum+=score;
        }
        ave=sum/4.0;
        printf("NO%d:%f\n",n,ave);
   }
   return 0;
}

A.sum=0.0;

B.sum+=score;

C.ave=sum/4.0;

D.printf(“NO%d:%f\n”,n,ave);

解题详析:

在给定的程序中,每个学生的成绩都会依次读入并累加到 sum 变量中。然而,计算平均分的语句 ave = sum/4.0; 在内层循环外部(第一个循环体的末尾)执行,这意味着在每个学生输入完成绩后,都会计算前面所有学生的平均分。

故选C


第十五题

阅读下面程序,从给出的4个选项中选出程序的运行结果。

#include <stdio.h>
int main()
{
    int k = 1, m = 0;
    do{
        k += 2;
        m += k;
        if (m > 50)
            break;
    } while (1);
    printf ("sum=%d\n", m);
    return 0;
}

A.m=48

B.sum=63

C.sum=48

D.m=63

解题详析:

3+5+7+9+11+13+15=63

答案选B


第十六题

当执行以下程序段时

x=-1;
do {
 x=x*x;
} while(!x);

A.系统将提示有语法错误

B.循环体将执行一次

C.循环体将执行无限次

D.循环体将执行两次

解题详析:

较为简单,执行一次,选B


第十七题

有以下程序

int k=5;
while(--k) 
printf("%d", k-=3);

程序执行后的输出结果是( )。

A.1

B.2

C.4

D.死循环

解题详析:

k=2的时候,–k变为1,执行printf语句,3-2=1

选A


第十八题

请问下面哪个选项与程序段中while(x)含义一样?

int x,sum=0;
scanf("%d",&x);
while(x)
 sum+=x;

A.while(x!=0)

B.while(x>0)

C.while(x<>0)

D.while(x==0)

解题详析:

较为简单,选A


第十九题

假设变量 x 数据类型为 int,且初始值为2,则执行下面代码段后

while(x–);

printf(“%d\n”,x);

程序的输出结果是:( )

A.2

1

0

B.-1

C.1

0

D.死循环

解题详析:

首先,x 的初始值为 2。在 while 循环中,条件表达式 x-- 会首先将 x 的值(2)用于表达式计算,然后再将 x 自减 1。因此,循环体会执行一次,此时 x 的值为 1。

接着,循环条件判断表达式 x-- 的结果为 1,由于结果为非零,因此继续执行循环体。在循环体中,再次执行 x-- 表达式,x 的值变为 0。

然后,循环条件判断表达式 x-- 的结果为 0,即为假,因此循环终止。

最后,执行 printf("%d\n",x); 语句,输出 x 的值,即 -1。

故选B


第二十题

以下程序段运行后,输出结果是:

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

A.5 2 1 0

B.5 2 1

C.5 2.5 1.25 0.625

D.5 2.5 1 0

解题详析:

较为简单,答案选A


第二十一题

若j为整型变量,则以下结构中,循环体语句执行的次数是( )。

for(j=2; j<=10; j+=2) 
      printf(“%d”, j);

A.0

B.2

C.5

D.10

解题详析:

2、4、6、8、10

执行五次,答案选C


第二十二题

假设变量s、a、b、c均已定义为整型变量,且a、c均已赋值(c大于0),则与以下程序段功能等价的赋值语句是()。

s = a;  
for(b = 1; b <= c; b++) 
      s = s + 1;

A.s = a + b;

B.s = a + c;

C.s = s + c;

D.s = b + c;

解题详析:

for(b = 1; b <= c; b++) s = s + 1; 等价于s+c

故选B


第二十三题

如下程序的执行结果是

#include <stdio.h>
int main (void)
{
    int i, sum = 0;
    for ( i = 1; i <= 3; sum ++ )
        sum += i ;
    printf ("%d\n", sum);
    return 0;
}

A.6

B.3

C.死循环

D.0

解题详析:

for中条件无限制,死循环,选C


第二十四题

下列程序段的功能是

#include <stdio.h>
int main (void)
{
    int i, s = 0;
    for (i = 1; i < 10; i += 2)
        s += i + 1;
    printf("%d\n", s);
    return 0;
}

A.自然数1~9的累加和

B.自然数1~10的累加和

C.自然数1~9中的奇数之和

D.自然数1~10中的偶数之和

解题详析:

较为简单,答案选D


第二十五题

以下程序段若要使输出值为2,则应该从键盘给n输入的值是

int s = 0, a = 1, n;
scanf("%d", &n);
do {
    s += 1; a = a - 2;
} while (a != n);
printf("%d\n", s);

A.-1

B.-3

C.-5

D.0

解题详析:

要使s为2,则执行两次循环,两次循环后a变为-3,所以n=-3

选B


第二十六题

以下程序段的输出结果是

int i, j;
for (i = 1; i < 4; i++) {
    for (j = i; j < 4; j++)
        printf("%d * %d = %d  ", i, j, i * j);
    printf("\n");
}

A.

1 * 1 = 1  1 * 2 = 2  1 * 3 = 3
2 * 1 = 2  2 * 2 = 4
3 * 1 = 3

B.

1 * 1 = 1  1 * 2 = 2  1 * 3 = 3
2 * 2 = 4  2 * 3 = 6
3 * 3 = 9

C.

1 * 1 = 1
1 * 2 = 2  2 * 2 = 4
1 * 3 = 3  2 * 3 = 6  3 * 3 = 9

D.

1 * 1 = 1
2 * 1 = 2  2 * 2 = 4
3 * 1 = 3  3 * 2 = 6  3 * 3 = 9

解题详析:

较为简单,选B


第二十七题

从键盘输入的整数中,找出最小值min,输入0时结束。请在 1 处填写正确语句。

#include"stdio.h"
main()
{  int min=0,a;
   do{
          scanf("%d",&a);
          if(min>a)min=a;
   }while(__1__);
  printf("%d",min);
}

A.a==0

B.a>0&&a<0

C.a !=0

D.a=0

解题详析:

只有当输入的整数不等于 0 时,循环才会继续执行。当输入的整数为 0 时,循环结束。

因此答案选C


第二十八题

请读程序:

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

则上面程序的输出结果是:

A.28

B.27

C.42

D.41

解题详析:

在给定的程序中,使用 for 循环从 1 到 50 遍历变量 i。在循环体内,将当前值赋给变量 x

然后,使用一系列嵌套的 if 条件语句对变量 x 进行多个条件判断。只有满足以下三个条件的整数才会输出:

  1. 当前数能被 2 整除(x%2 == 0);
  2. 当前数能被 3 整除(x%3 == 0);
  3. 当前数能被 7 整除(x%7 == 0)。

根据题目给定的条件,只有一个数符合以上三个条件,即 42。因此,程序的输出结果是 42。

所以,答案是 C. 42。


第二十九题

以下程序段的输出结果是:

#include<stdio.h>
int main()
{
      int  num = 0, s = 0;
      while(num <= 3){
            num ++;
            s += num;
      }
      printf("%d",s);
      return 0;
}

A.10

B.6

C.3

D.1

解题详析:

1+2+3+4=10

答案选A


第三十题

以下代码用于计算输入的正整数n的各位数字之和。请选择合适的循环结构填入选择题的空白处。

#include <stdio.h>
int main() {
    int n, sum = 0;
    printf("请输入一个正整数n:");
    scanf("%d", &n);
    // 选择题开始
    ______ (n > 0) {
        sum += n % 10;
        n /= 10;
    }
    // 选择题结束
    printf("各位数字之和为:%d\n", sum);
    return 0;
}

A. for

B. while

C. do-while

D. 无法确定

该题较简单,选A。


3️⃣ 总结

此文为 【C语言你还没卷起来?】子系列之第五篇 ,通过以题代练的形式带领读者掌握C语言的循环结构,带领读者从0开始,深度掌握知识点。

以题代练对于C语言的学习是十分重要的,专栏将持续提供优质C语言编程题与理论课的学习,带领读者全方位掌握C语言,读者可订阅专栏持续跟进。

目录
相关文章
|
1月前
|
C语言
【C语言】循环结构程序设计(第二部分 -- 习题讲解)
【C语言】循环结构程序设计(第二部分 -- 习题讲解)
|
1月前
|
C语言
C语言循环结构
C语言循环结构
16 0
|
1月前
|
算法 C语言 数据安全/隐私保护
【C语言必知必会 | 第八篇】一文带你精通循环结构
【C语言必知必会 | 第八篇】一文带你精通循环结构
25 0
|
1月前
|
人工智能 C语言
【C语言必知必会| 第七篇】循环结构入门,这一篇就够了
【C语言必知必会| 第七篇】循环结构入门,这一篇就够了
29 0
|
2天前
|
C语言
【C语言基础篇】结构控制(中)循环结构
【C语言基础篇】结构控制(中)循环结构
C4.
|
1月前
|
程序员 C语言
C语言循环结构与程序设计
C语言循环结构与程序设计
C4.
31 0
|
1天前
|
C语言
C语言刷题(循环结构程序设计)
C语言刷题(循环结构程序设计)
|
1月前
|
C语言
C语言循环结构
C语言循环结构
26 1
|
27天前
|
C语言
C语言中的循环结构详解与实战
C语言中的循环结构详解与实战
13 0
|
29天前
|
C语言
C语言循环结构程序设计详解及代码实例
C语言循环结构程序设计详解及代码实例
24 0