C语言程序设计题库 第四章:C语言的流程控制

一、单选题

1、关于C语言的程序结构,以下错误的说法是______
A、结构化程序由顺序结构、选择结构和循环结构三种基本结构组成
B、复合语句(或语句块)是指用一对花括号“{ }”括起的若干条语句,系统在语法上将它们视为一条语句
C、复合语句的花括号之后需要加“;”,表示语句结束
D、C语言是一种结构化程序设计语言

解析:答案选C
用花括号“{ }”括起的若干条语句就是一个完整的复合语句,括号之后不需要加“;”,所以选项C错误。选项C错误。

2、关于if语句,以下错误的说法是________。
A、if后面表达式两侧的圆括号不能省略
B、if后面的表达式可以是C语言中任意合法的表达式
C、在if (表达式) 的后面不能加“;”
D、else子句只能和if配对使用,不能单独作为一个语句使用

解析:答案选C
语法上,“if(表达式); ”,表示if语句的语句体是空语句,在逻辑上,表示当条件满足(即表达式为真)时,做空语句(即不做任何操作),所以该if语句无意义。选项C错误。

3、关于switch语句,以下错误的说法是________。
A、switch后面括号内的“表达式”的值只能是整型、字符型和枚举型
B、switch语句中的default子句是可选的
C、switch的case子句中若包含多条语句,可以不加大括号
D、switch的case子句后面只能跟整形变量

解析:答案选D
switch语句的基本知识
switch是“选择”语句,不是“循环”语句,break一般给我们的印象都是跳出“循环”,但break还有一个用法,就是跳出switch语句。
1)switch括号内的表达式必须是整数类型,不可以是float、double 型变量。
2)switch下的case和 default构成的代码块必须用一对大括号{}括起来。
3)当switch括号内表达式的值与某个case后面的“常量表达式”的值相等时,就执行该case子句。执行完完整的一个case子句后,流程控制转移到下一个case继续执行。如果你只想执行这一个case子句,不想执行其他case,那么就需要在这个case子句最后面加上break跳出switch语句。
4)若所有case后面的“常量表达式”的值都没有与switch后面括号内的表达式值相等,就执行default后面的语句,default是“默认”的意思。
5)每个case后面的“常量表达式”的值必须互不相同,否则就会出现互相矛盾的现象,而且这样写造成语法错误。
6)case后面的“常量表达式”的值只是起语句标号的作用,并不是在该处进行判断。在执行switch语句时,根据switch后面表达式的值找到匹配的入口标号,就从此标号开始执行下去,不再进行判断。
7)case和default只起标号的作用,顺序可以颠倒,颠倒时注意后面的break语句。

A、switch后面括号内的“表达式”的值只能是整型、字符型和枚举型,枚举类型在本质上就是有命名的整数,属于整型的一种,在代码中是可以和整型互换的。选项A正确。
B、若所有的case中的常量表达式的值都没有与switch后面括号内“表达式”的值相等的,就执行default后面的语句,default是“默认”的意思。可以选择不要default语句,就跟if…else不要else语句一样,但最好是加上,后面可以什么都不写,这样可以避免别人误以为你忘了进行default处理,可以提醒别人switch语句到此结束了。选项B正确。
C、switch的case子句中若包含多条语句,可以不加大括号。选项C正确。
D、case子句后面只能跟常量。选项D错误。

4、关于C语言的程序结构和语句,以下正确的说法是________。
A、结构化程序由顺序结构、选择结构和嵌套三种基本结构组成
B、花括号对{}只能用来表示函数的开头和结尾,不能用于其他目的
C、频繁地使用空语句会降低程序的可读性和运算速度
D、程序中包含了三种基本结构的算法就是结构化程序

解析:答案选C
A、结构化程序设计方法主要由以下三种逻辑结构组成: 1)顺序结构:顺序结构是一种线性、有序的结构,它依次执行各语句模块。 2)循环结构:循环结构是重复执行一个或几个模块,直到满足某一条件为止。 3)选择结构:选择结构是根据条件成立与否选择程序执行的通路。选项A错误。
B、C语言中花括号{}主要是为了表示一段代码是一个部分。
主要有以下集中用法:1)函数:int func() { …} 此处的花括号表示将这个部分括起来,是开始和结束的标志。2)宏定义:#define ADD(X,Y) { X+Y;},只是单纯的把整个部分包含起来。3)数组赋值:int a[] = {1,2,3}。4)用于特定语法,如if(){ …} while(…){ …}等。选项B错误。
C、频繁地使用空语句会降低程序的可读性和运算速度。选项C正确。
D、程序中包含了三种基本结构的算法就是结构化程序,这句话应该是片面地定义了结构化程序。选项D错误。

5、在C语言中,逻辑“真”等价于_______。
A、大于零的数
B、大于零的整数
C、非零的数
D、非零的整数

解析:答案选C
在C语言中,逻辑“真”等价于非零的数。选项C正确。

6、能正确表示”x的取值在[1,10]和[200,210]范围内为真,否则为假”的表达式是_______。
A、(x>=1)&&(x<=10)&&(x>=200)&&(x<=210)
B、(x>=1)||(x<=10)||(x>=200)||(x<=210)
C、(x>=1)&&(x<=10)||(x>=200)&&(x<=210)
D、(x>=1)||(x<=10)&&(x>=200)||(x<=210)

解析:答案选C
逻辑与&&用在两个表达式需要同时满足的时候,逻辑或用在两个表达式只需要一个满足即可的时候。x>=1和x<=10需要同时满足,应使用逻辑与&&,x>=200和x<=210也需要同时满足,应使用逻辑与&&,而这两个等式只需要满足一个即可,应使用逻辑或||。

7、以下程序的运行结果是________。

#include <stdio.h>
int main()
{ int a=0,b=0,c=0,d=0;
if(a=1) b=1;c=2;
else d=3;
printf("%d,%d,%d,%d",a,b,c,d);
return 0;
}

A、1,1,2,0
B、0,0,0,3
C、编译有错
D、0,1,2,0

解析:答案选C
编译的错误之处在于if语句后面的b=1;c=2;没有使用{},使得仅有b=1成为了if语句判断为真的执行语句,c=2;这个语句相当于把if和else隔断了。

8、以下程序的运行结果是________。

#include <stdio.h>
int main()
{ int m=5;
if(m++>5) printf(%d\n”,m);
else printf(%d\n”,m++);
return 0;
}

A、4
B、5
C、6
D、7

解析:答案选C
详细步骤:
在这里插入图片描述

程序运行截图:
在这里插入图片描述

9、为了避免嵌套的if-else 语句的二义性,C语言规定else 总是与_______组成配对关系。
A、缩排位置相同的if
B、在其之前未配对的最远的if
C、在其之前未配对的最近的if
D、书写在同一行上的if

解析:答案选C

10、以下程序的运行结果是________。

#include <stdio.h>
int main()
{ int a=1,b=0;
if(!a) b++;
else if (a==0)
if (a) b+=2;
else b+=3;
printf("%d",b);
return 0;
}

A、0
B、1
C、2
D、3

解析:答案选A

把代码缩进修改一下为

#include <stdio.h>
int main()
{ 
int a=1,b=0;
if(!a) 	
	b++;
else if (a==0)//else if与上一个最近的if配对成功
	 if (a) 
		b+=2;
	 else 
		b+=3;//else与最近的未配对的if配对,只有上一行的if
printf("%d",b);
return 0;
}

详细步骤:
在这里插入图片描述

程序运行截图:
在这里插入图片描述

11、以下程序的运行结果是________。

#include <stdio.h>
int main()
{ int a=1,b=0;
if(!a) b++;
else if (a==0)
{if (a) b+=2;} /*注意与上一题此行比较*/
else b+=3;
printf("%d",b);
return 0;
}

A、0
B、1
C、2
D、3

解析:答案选D

把代码缩进修改一下为

#include <stdio.h>
int main()
{ 
int a=1,b=0;
if(!a) 
	b++;
else if (a==0)
	{
		if (a) 
			b+=2;
	} /*注意与上一题此行比较*/
else 
	b+=3;
printf("%d",b);
return 0;
}

详细步骤:
在这里插入图片描述

程序运行截图:
在这里插入图片描述

12、以下程序运行时,输入的值在哪个范围才会有输出结果________。

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

A、小于3的整数
B、不大于10的整数
C、大于3或等于10的整数
D、大于3且不等于10的整数

解析:答案选D
需要注意if(x<=3)后面有一个空语句;有输出结果的情况是执行else if语句printf(“x=%d\n”,x);说明条件不满足前面的if条件,但满足else if条件,所以应该是大于3且不等于10。选项D正确。

13、已知ch是 char型变量,其值为’A’,则表达式ch=(ch>=‘A’&&ch<=‘Z’)? (ch+32):ch的值为________。
A、‘A’
B、‘a’
C、‘Z’
D、‘z’

解析:答案选B
条件运算符有时候也称为三元运算符,因为它是唯一需要 3 个操作数的运算符,条件表达式的一般形式为:条件 ? 表达式1 : 表达式2。如果条件表达式为真,整个表达式的值为表达式1的值;如果条件表达式为假,整个表达式的值为表达式2的值。赋值运算符的优先级最低,所以最后才进行赋值操作,ch=‘A’,满足判断大写字母表达式(ch>=‘A’&&ch<=‘Z’),表达式为真,执行(ch+32),即将大写字母转换为小写字母。选项B正确。

14、若w=1,x=2,y=3,z=4,则表达式w<x?w:y<z?y:z 的值是
A、4
B、3
C、2
D、1

解析:答案选D
条件运算符的结合性是自右向左,原式子w<x?w:y<z?y:z=w<x?w:(y<z?y:z)=w<x?w:3=w=1。选项D正确。

15、有如下嵌套的if语句

if(a<b)
if(a<c) k=a;
else k=c;
else
if(b<c) k=b;
else k=c;

以下选项中与上述语句等价的语句是________。
A、k=(a<b)?((b<c)?a:b): ((b>c)?b:c);
B、k=(a<b)?((a<c)?a:c): ((b<c)?b:c);
C、k=(a<b)?a:b; k=(b<c)?b:c ;
D、k=(a<b)?a:b; k=(a<c)?a:c ;

解析:答案选B
把代码缩进修改一下为:

if(a<b)
if(a<c) 
k=a;
else 
k=c;
else if(b<c) 
k=b;
else 
k=c;

代码思路
在这里插入图片描述

16、下列叙述中正确的是________。
A、在switch语句中,不一定使用break语句
B、在switch语句中必须使用default
C、break语句必须与switch语句中的case配对使用
D、break语句只能用于switch语句

解析:答案选A
A、在switch语句中,不一定使用break语句,不使用break语句示例一:(虽然没有得到想要的答案,但是也能够说明在switch语句中,不一定使用break语句)
在这里插入图片描述

而如果需要正确表示的话,就需要加上break语句,当然,具体情况需要具体分析,请看示例二:
在这里插入图片描述

选项A正确。
B、上一个示例中使用了default语句,其实可以选择不要default语句,就跟if…else不要else语句一样,但最好是加上,后面可以什么都不写,这样可以避免别人误以为你忘了进行default处理,可以提醒别人switch语句到此结束了。选项B错误。
C、在swich语句中,可以不用使用break。选项C错。
D、C语言中break语句有以下两种用法:1、当break语句出现在一个循环内时,循环会立即终止,且程序流将继续执行紧接着循环的下一条语句。2、它可用于终止switch语句中的一个case。如果使用的是嵌套循环(即一个循环内嵌套另一个循环),break语句会停止执行最内层的循环,然后开始执行该块之后的下一行代码。选项D错误。

17、语句while(!e);中的条件!e等价于________。
A、e==0
B、e!=0
C、e!=1
D、e<>0

解析:答案选A
在逻辑表达式中,非0为真,e的ASCII码值为非0,所以!e的值恒等于0。选项A正确。

18、下面程序片段,退出while循环时,s的值是________。
int i=0,s=1;
while(i<3) s+=i++;
A、6
B、5
C、4
D、3

解析:答案选C
流程图示
在这里插入图片描述

循环流程解析
在这里插入图片描述

19、在C语言中,执行语句for(j=1;j<5;j++); 后,变量j的值是________。
A、3
B、4
C、5
D、6

解析:答案选C
流程图示
在这里插入图片描述

循环流程解析
在这里插入图片描述

20、以下程序的运行结果是________。

#include<stdio.h>
int main()
{ int y=9;
for( ;y>0;y--)
if(y%3==0) printf(%d”,--y);
return 0;
}

A、852
B、875421
C、741
D、963

解析:答案选A
流程图示
在这里插入图片描述

循环流程解析
在这里插入图片描述

程序运行截图
在这里插入图片描述

21、设j为int型变量,则下面程序段的执行结果是________。

for(j=10;j>3;j--)
{ if(j%3)
j--;
j--;
j--;
printf("%d ",j);
}

A、6 3
B、7 4
C、6 2
D、7 3

解析:答案选B
流程图示
在这里插入图片描述

循环流程解析
在这里插入图片描述

程序运行截图
在这里插入图片描述

22、C语言中关于while和do-while,以下说法正确的是________。
A、do-while的循环体至少无条件执行一次;
B、while的循环控制条件比do-while的循环控制条件严格
C、while和do-while循环体都有可能一次不被执行一次
D、do-while的循环体不能是复合语句;

解析:答案选A
A、do-while的循环体至少无条件执行一次。选项A正确。
B、控制条件是程序员自己设定,没有严格和不严格之说。选项B错误。
C、do-while的循环体至少无条件执行一次。选项C错误。
D、do-while的循环体可以是复合语句。选项D错误。

23、以下程序的运行结果是________。

#include <stdio.h>
int main()
{ int x=3;
do
printf("%d ",x-=2);
while(!(--x));
return 0;
}

A、1
B、1 -2
C、3 0
D、是死循环

解析:答案选B
流程图示
在这里插入图片描述

循环流程解析
在这里插入图片描述

程序运行截图
在这里插入图片描述

24、以下程序的运行结果是________。

#include <stdio.h>
int main( )
{ int sum=0, x=5;
do
sum+=x;
while(!--x);
printf("%d\n", sum);
return 0;
}

A、0
B、5
C、14
D、15

解析:答案选B
流程图示
在这里插入图片描述

循环流程解析
在这里插入图片描述

程序运行截图
在这里插入图片描述

25、以下说法正确的是________。
A、continue语句的作用是结束整个循环的执行
B、只能在循环体内和switch语句体内使用break语句
C、在循环体内使用break语句或continue语句的作用相同
D、使用break可以直接从多层循环嵌套中退出

解析:答案选B
A、break与continue的区别:break:结束所有循环,本次循环体不再执行,跨出循环体以内的内容。continue:结束本轮循环,开启下一轮循环,本轮循环剩下的内容不在执行。选项A错误。在for循环中,continue语句使程序直接跳到更新表达式出,然后跳到测试表达式出。在while循环中,continue语句将使程序直接跳到测试表达式处,因此while循环体中位于continue之后的表达式都将被跳过。
B、只能在循环体内和switch语句体内使用break语句。选项B正确。
C、在循环体内使用break语句或continue语句的作用不同。选项C错误。
D、多层嵌套循环中如果遇到break,只能跳出break所在的内层循环。选项D错误。

26、以下程序的运行结果是________。

#include <stdio.h>
int main()
{ 
int i;
for(i=1;i<=5;i++)
{	if(i%2)
printf(*);
else
continue;
printf(“#”);
}
printf(“$”);
return 0;
}

A、###$
B、
##$
C、#
##$
D、##$

解析:答案选A
代码思路
在这里插入图片描述

流程图示
在这里插入图片描述

循环流程解析
在这里插入图片描述

程序运行截图
在这里插入图片描述

27、以下叙述中正确的是________。
A、if语句只能嵌套一层
B、不能在else子句中在嵌套if 语句
C、改变if-else 语句的缩进格式,会改变程序的执行流程
D、if子句和else 子句中可以是任意合法的C语句

解析:答案选D
A、if语句可以嵌套多层。选项A错误。
B、可以在else子句中在嵌套if 语句。选项B错误。例如题11:

#include <stdio.h>
int main()
{ int a=1,b=0;
if(!a) 
b++;
else if (a==0)
{
if (a) 
b+=2;
} 
else 
b+=3;
printf("%d",b);
return 0;
}

C、改变if-else 语句的缩进格式,不会改变程序的执行流程。选项C错误。
D、if子句和else 子句中可以是任意合法的C语句。选项D正确。

28、以下叙述中正确的是________。
A、在while语句和do-while语句中无法使用continue语句
B、当break出现在循环体中的switch语句体内时,其作用是跳出该switch语句体,并终止循环
C、continue 语句的作用是:在执行完本次循环体中剩余语句后,终止循环
D、只能在循环体内和switch语句体内使用break语句

解析:答案选D
A、在while语句和do-while语句遇到continue语句后,continue之后的语句不会执行,会直接跳到循环判断入口处判断是否需要进行下一轮循环。选项A错误。
B、当break出现在循环体中的switch语句体内时,其作用仅是跳出该switch语句体,不会终止循环(题目的意思应该是这个switch语句体放在了一个循环体里面)。选项B错误。
C、continue 语句的作用是:不执行本次循环体中剩余语句,结束本轮循环,进入下循环判断入口处判断是否需要进行下一轮循环。选项C错误。
D、只能在循环体内和switch语句体内使用break语句。选项D正确。

二、填空题

29、以下程序的运行结果是________。

#include <stdio.h>
int main()
{   int x=-1;
    printf("x=");
   if (x>=0)
        if (x==0) 
            printf("Zero.");
        else if (x>0) 
            printf("Positive.");
   		else
       		 printf("Negative.");
    return 0;
}

解析:答案为:x=
代码思路:首先打印x=,接着如果满足x>=0的话,打印Zero.,如果只满足x>0的话,打印Positive.,否则打印negative.,总是x=的后面如果需要打印,前提是x>0,否则x=后面没有输出,因为x=-1,所以只打印:x=。
程序运行截图
在这里插入图片描述

30、以下程序的运行结果是________。

#include <stdio.h>
int main()
{   int a=1,b=2,c=3,d=4,e=5,k;
    k=a>b?c:d>e?d:e;
    printf("%d",k);
    return 0;
}

解析:答案为:5
代码思路:条件运算符具有右结合性,所以先计算表达式d>e?d:e,得出d和e中的最大值,即5后,再计算表达式a>b?c:5的值,如果a>b表达式为真,结果k=c,否则k=5,因为1>2表达式为假,所以k=5,打印5。
程序运行截图
在这里插入图片描述

31、运行以下程序,输入“abc123def”,则程序的运行结果是________。

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

解析:答案为:ABCDEF
代码思路:打印输入字符的大写字母,如果不是字母,则不做处理。当用getchar进行输入时,如果输入的第一个字符为有效字符(即输入是文件结束符EOF,Windows下为组合键Ctrl+Z,Unix/Linux下为组合键Ctrl+D),那么只有当最后一个输入字符为换行符’\n’(也可以是文件结束符EOF)时,getchar才会停止执行,整个程序将会往下执行。如下面程序段:

while((c = getchar()) != EOF)
{
putchar(c);
}

执行程序,输入:abc,然后回车。则程序就会去执行putchar©,然后输出abc,这个地方不要忘了,系统输出的还有一个回车。然后可以继续输入,再次遇到换行符的时候,程序又会把那一行的输入的字符输出在终端上。请看示例三:
在这里插入图片描述

所以当换行符’\n’之前的字符都会进入循环里面,而真正putchar的字符是输入字母的所有大写字母,所以应该打印ABCDEF。
程序运行截图
在这里插入图片描述

32、以下程序的运行结果是:x=,y=

#include <stdio.h>
int main( )
{   int  x, y;
    for(x=30, y=0; x>=10, y<10; x--, y++)
        x/=2, y+=2;
    printf("x=%d,y=%d\n",x,y);
    return 0;
}

解析:答案为:0 12
注意事项:本题for语句的初始化表达式、条件表达式、修正表达式以及循环体都是逗号表达式。逗号表达式的值为最后一个表达式的值,所以条件表达式“x>=10, y<10”的判断依据是“y<10”。
流程图示
在这里插入图片描述

循环流程解析
在这里插入图片描述

程序运行截图
在这里插入图片描述

33、运行以下程序,输入1234<回车>,则程序的运行结果是________。

#include <stdio.h>
int main()
{   int num,c;
    scanf("%d",&num);
    do
    {   c=num%10;
        printf("%d",c);
    }while((num/=10)>0);
    printf("\n");
    return 0;
}

解析:答案为:4321
代码思路:逆序打印输入的数字
流程图示
在这里插入图片描述

循环流程解析
在这里插入图片描述

程序运行截图
在这里插入图片描述

34、运行以下程序,输入:1 2 3 4 -2 5 0 -7 8 2<回车>,则程序的运行结果是:s=,count=

#include <stdio.h>
#define N 10
int main()
{   int i,s=0,count=0;
    int temp;
    for(i=0; i<N; i++)
    {   scanf("%d", &temp);
        if(temp<=0) continue;
        s+=temp;
        count++;
    }
    printf("s=%d,count=%d\n", s, count);
    return 0;
}

解析:答案为:25 7
程序功能:输入10个数,计算其中大于零的数的和,并计数,输入达10个数时终止程序。
流程图示
在这里插入图片描述

循环流程解析
在这里插入图片描述

程序运行截图
在这里插入图片描述

35、运行以下程序,输入:1 2 3 4 -2 5 0 -7 8 2<回车>,则程序的运行结果是:s=,count=

#include <stdio.h>
#define N 10
int main()
{   int i,s=0,count=0;
    int temp;
    for(i=0; i<N; i++)
    {   scanf("%d", &temp );
        if(!temp) break;
        if(temp<0) continue;
        s+=temp;
        count++;
    }
    printf("s=%d,count=%d\n", s, count);
    return 0;
}

解析:答案为:15 5
程序功能:输入不多于10个数,计算其中大于零的数的和,并计数,输入达10个数或输入:“0”时终止程序。
流程图示
在这里插入图片描述

循环流程解析
在这里插入图片描述

程序运行截图

在这里插入图片描述

36、以下程序的运行结果是________。

#include <stdio.h>
#define N 5
int main( )
{   int i,j;
    for(i=N/2; i>=-(N/2); i--)
    {   for(j=-(N/2); j<=N/2; j++)
            if (abs(i)>=abs(j))  printf("*");
            else printf(" ");
        printf("\n");
    }
    return 0;
}

解析:答案为:
在这里插入图片描述

代码思路双重循环的执行过程为:外循环变量确定一个值后,进入内循环,内循环从头做到尾,然后返回外循环,外循环变量确定下一个值,重新进入内循环,内循环再次从头做到尾,……,直到外循环变量的最后一个值做完。本题构建了一个坐标模型,变量i对应纵坐标,其值从2至-2,变量j对应横坐标,其值从-2至2,通过两重循环嵌套遍历坐标区域,当纵坐标绝对值大于等于横坐标绝对值时输出“*”,否则输出空格。
流程图示
在这里插入图片描述

程序运行截图
在这里插入图片描述

37、以下程序的运行结果是________。

#include <stdio.h>
int main()
{   int a=1,b=3,c=5;
    if (c=a+b) 
        printf("正确\n");
    else
        printf("错误\n");
    return 0;
}

解析:答案为:正确
代码思路:初始化a=1,b=3,c=5;进入if语句进行逻辑判断,表达式c=a+b的值为4,为真,所以进入if子句,打印:正确。
程序运行截图
在这里插入图片描述

38、以下程序的运行结果是:a=, b=

#include <stdio.h>
int main()
{ int a=1,b=2,t=0;
if(a>b) t=a; a=b; b=t; 
printf("a=%d, b=%d",a,b);
return 0;
}

解析:答案为:2 0
代码思路:初始化a=1,b=2,t=0,乍一看为如果a>b则进行a,b值的交换,其实这样是掉进了出题者的陷阱,if语句判断a>b为真后,真正属于if子句的只有t=a这一个赋值语句,它与后面两个语句并没有用{}结合,跟{ t=a; a=b; b=t;}有本质上的区别,所以无论if条件为真,或是假,都会执行a=b;b=t;两个语句,因此打印:a=2,b=0。
程序运行截图
在这里插入图片描述

39、运行以下程序,输入:-1<回车>,则程序的运行结果是:-1 is a ____ ____。

#include <stdio.h>
int main()
{ int m;
scanf("%d", &m);
if (m >= 0)
if (m%2 == 0) printf("%d is a positive even\n", m);
else printf("%d is a positive odd\n", m);
else if (m%2 == 0) printf("%d is a negative even\n", m);
else printf("%d is a negative odd\n", m);
return 0;
}

解析:答案为:negative odd
代码思路
首先调整一下代码缩进方便理解

#include <stdio.h>
int main()
{ 
int m;
scanf("%d", &m);
if (m >= 0)
	if (m%2 == 0) 
		printf("%d is a positive even\n", m);//even指偶数
	else 
		printf("%d is a positive odd\n", m);// odd指奇数
else if (m%2 == 0) 
	printf("%d is a negative even\n", m);
else 
	printf("%d is a negative odd\n", m);
return 0;
}

如果m>=0且能被2整除,则m是正偶数,否则m是正奇数,如果m<0且能被2整除,则m是负偶数,以上都不满足,则m肯定是负奇数。所以-1是负奇数,因此打印:-1 is a negative odd。
程序运行截图
在这里插入图片描述

40、运行以下程序,输入:A<回车>,则程序的运行结果是____。

#include <stdio.h>
int main( )
{ char ch;
ch=getchar();
switch(ch)
{ case 'A' :
printf("%c",'A');
case 'B' :
printf("%c",'B');
break;
default:
printf("%s\n","other");
}
return 0;
}

解析:答案为:AB
代码思路
首先调整一下代码缩进方便理解

#include <stdio.h>
int main( )
{ 
char ch;
ch=getchar();
switch(ch)
	{
	case 'A' :
		printf("%c",'A');
	case 'B' :
		printf("%c",'B');
		break;
	default:
		printf("%s\n","other");
}
return 0;
}

用ch接受一个字符,然后用该字符进行选择输出,注意第一个case语句没有break,所以输入A时会执行第二个case语句,所以结果应该为:AB。
程序运行截图
在这里插入图片描述

41、以下程序的运行结果是:a=, b=

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

解析:答案为:2 1
代码思路:
首先调整一下代码缩进方便理解

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

此题需要注意的是看清楚哪里有break语句哪里没有,内层的switch语句执行完了是否有break,所以x=1,y=0时,执行a++;break;执行完后a=1,跳出内层switch后,没有遇到break,进入case2:执行a++;b++;break;执行完后a=2,b=1;所以最终打印:a=2,b=1。
程序运行截图
在这里插入图片描述

42、以下程序的运行结果是:____, ____。

#include <stdio.h>
int main( )
{ int sum=10,n=1;
while(n<3)
{ sum=sum-n;
n++;
}
printf("%d, %d",n,sum);
return 0;
}

解析:答案为:3 7
流程图示
在这里插入图片描述

循环流程解析
在这里插入图片描述

程序运行截图
在这里插入图片描述

43、以下程序的运行结果是:____, ____。

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

解析:答案为:-1 -1
代码思路:本题的代码过程看起来很简单,其实有两个需要注意的点:一、while条件判断之后有一个空语句,因此循环只会执行这个空语句;二、while(k–)无论条件判断为真或是假,k—都会被执行一次,有关规则整理如下
一:while(n–)
while(n–):表达的意思是先运算后递减。
先运算:把n的值作为while语句的判断条件,非0为真。
后递减:判断结束后,再将n递减,其中n的值是否递减,不会受到while语句判断结果的影响,while语句的判断结果只影响是否执行循环体中的printf()语句,不论while()语句为真假,n都会递减,while(n++)同理。
请看示例四:判断条件是n
在这里插入图片描述

二:while(–n)
与while(n—)不同之处仅在于条件判断,两者都会在正式执行while循环体内的语句之前或者跳出循环之后立马进行自减,while(++n)同理。
请看示例五:判断条件是n-1
在这里插入图片描述

除了while循环还有for循环,那—n、n–、++n、n++在for循环里的规则是如何?
例如for(n=5;n>0;n–)和for(n=5;n>0;–n)的规则没有while这么刁钻,在初始化n后,条件判断为真后进入循环体,循环体内容执行完后,执行n—或者—n,这里的n—和—n的效果一样,执行完后再进行判断,所以遇到for循环后,只需要按照常规方法进行步骤计算即可。
流程图示
在这里插入图片描述

循环流程解析
在这里插入图片描述

程序运行截图
在这里插入图片描述

44、以下程序的运行结果是____。

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

解析:答案为:5050
代码思路:打印1-100所有整数之和
流程图示
在这里插入图片描述

循环流程解析
在这里插入图片描述

程序运行截图
在这里插入图片描述

45、以下程序的功能:输入年份,验证其有效性并判断其是否是闰年,请填空。

#include <stdio.h>
int main()
{   int year,r;
    do
    {   printf("请输入年份:");
        r=scanf("%d",&year);
    }while( r____0 );
    if(year%4==0____year%100!=0____year%400==0)        //填空提示:&&  ||  !
        printf("%d年是闰年\n",year);
    else
        printf("%d年非闰年\n",year);
    return 0;
}

解析:答案为:<= && ||
代码思路
在这里插入图片描述

程序运行截图

在这里插入图片描述

46、以下程序功能:用辗转相除法求两个数的最大公约数和最小公倍数,请填空。

#include <stdio.h>
int main()
{   int a,b,r,tmp_a,tmp_b;
    printf("please input two numbers:\n");
    scanf("%d%d",&a,&b);
    tmp_a=a;
    tmp_b=b;
    r= a____b;
    while (r!=0)
    {   a=b; b=r; r=a%b;   }
    printf("最大公约数:%d\n",b);
    printf("最小公倍数:%d\n",tmp_a*tmp_b/____);
    return 0;
}

解析:答案为:% b(注意:这里不是r,跳出循环后r为0了,所以应该时上一次的除数)
代码思路:辗转相除法求最大公约数:
在这里插入图片描述

最小公倍数=a*b/(最大公约数),所以题目中的while循环的入口判断应该是余数不等于0,r!=0,当余数为0时跳出循环,进入循环体后,反复执行除数为被除数,余数作商进行除法运算,而当执行完循环体后,a和b的值以及改变,此题还需要求最小公倍数,所以在循环前用tmp_a=a;tmp_b=b;拷贝一份a和b的值为最后计算做准备。
程序运行截图
在这里插入图片描述

47、以下程序功能:判断一个数是否是回文数,请填空。

#include <stdio.h>
int main()
{   int a,tmp,sum=0;
    scanf("%d",&a);
    tmp=a;
    while(____)
    {   sum = sum*10+tmp%10;
        ______=tmp/10;
    }
    if(sum == a)
        printf("%d是回文数\n",a);
    else
        printf("%d不是回文数\n",a);
    return 0;
}

解析:答案为:tmp tmp
代码思路:回文数:一个数字从左边读和从右边读的结果是一模一样的,例如131。观察数字我们可以知道:1=010+1;13=110+3;131=1310+1;一位数:1=010+个位数字;两位数:前面的一位数10+十位数字;三位数:前面的两位数10+百位数字。所以题目中的sum = sum*10+tmp%10;中tmp需要保证每次都要减少一位,以确保tmp%10可以得到从低到高的每一位数字,_____=tmp/10;这一步则需要将tmp的值缩短一位,所以此处应填tmp,而tmp=tmp/10之后,总有一次会变成0,因此把tmp作为循环判断条件即可,或者tmp!=0。
程序运行截图
在这里插入图片描述

48、以下程序功能:打印输出斐波那契数列的前20项,请填空。

解析:答案为:f1+f2 f1+f2
代码思路:斐波那契数列(Fibonacci sequence),又称黄金分割数列,因意大利数学家莱昂纳多·斐波那契(Leonardo Fibonacci)1202年以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13……这个数列从第3项开始,每一项都等于前两项之和。
流程图示
在这里插入图片描述

程序运行截图
在这里插入图片描述

49、以下程序功能:判断输入整数是否是素数,请填空。

#include <stdio.h>
#include <math.h>
int main( )
{   int x, b, i;
    printf("Please input a integer number: ");
    scanf("%d", &x);
    b = (int)sqrt((double)x); /* sqrt()是数学库函数,功能为开平方根 */
    for(i=2; i____b; i++)
        if(x%i==0) break;
    if(____>=b+1)
        printf("%d is a prime number\n", x);
    else
        printf("%d is not a prime number\n", x);
    return 0;
}

解析:答案为:<= i
在这里插入图片描述

50、以下程序实现了一个简易计算器:从键盘输入数据,验证其有效性后进行四则运算,并输出计算结果,请填空。

#include <stdio.h>
int main()
{   float x, y;
    char op;
    if (scanf("%f%c%f",&x,&op,&y)==3 )
    {   float result;
        printf("%.2f%c%.2f=", x, op, y);
        switch (____)
        {   case '+':
                printf("%f\n", x+y);
                break;
            case '-':
                printf("%f\n", x-y);
                break;
            case '*':
                printf("%f\n", x*y);
                break;
            case '/':
                if (____) printf("除数不能是零\n");
                else printf("%f\n",x/y);
                ____;
            default:
                printf("输入数据有误\n");
        }
    }
    else printf("输入数据有误\n");
    return 0;
}

解析:答案为:op y==0 break
代码思路
在这里插入图片描述

程序运行截图
在这里插入图片描述

51、以下程序功能:利用公式Π/2=1+1/3+1/32/5+1/32/53/7+⋯+1/32/53/7n/(2n+1)求圆周率,要求当通项精度小于10-6时,输出结果,请填空。

#include <stdio.h>
#include <math.h>
int main()
{   int i=1;
    double pi=0,t=1;
    do
    {   pi=pi+t;
        t=____*i/(2*i+1);
        i++;
    }
    while(fabs(t)>=1e-6); /* fabs()数学库函数,功能为求实数绝对值 */
    printf("result: %lf\n",____*pi);
    return 0;
}

解析:答案为:t 2
代码思路
在这里插入图片描述

程序运行截图
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
单片机C语言程序设计实训100例:基于AVR Proteus仿真 PDF 是一本针对单片机C语言程序设计的实训教材。该教材以AVR单片机为基础,结合Proteus仿真软件,提供了100个实例供学习者练习和巩固所学的单片机C语言编程知识。 这本教材的特点如下: 1. 针对实际应用场景:教材中的实例均基于实际应用场景设计,涵盖了单片机各个方面的知识和应用,包括IO口操作、定时器、串口通信、LCD显示等。通过这些实例,学习者可以更好地了解单片机的应用领域和常见应用技巧。 2. 详细的编程步骤:每个实例都有详细的编程步骤和思路说明,学习者可以按照教材提供的指导逐步完成实验。同时,教材还提供了相应的代码和仿真电路图,学习者可以在Proteus中进行仿真调试,观察程序的运行情况和相应的电路变化。 3. 巩固知识点:教材设计了一些较为复杂的实例,通过这些实例,学习者可以巩固已学的知识,并进一步提升自己的编程能力和解决问题的能力。 4. 实践与理论相结合:教材在介绍实验内容的同时,还提供了相关的理论知识,帮助学习者理解实验的原理和背后的知识点。这样学习者不仅可以掌握实验的具体操作步骤,更能够理解其背后的原理和机制。 通过学习这本教材,学习者可以系统地学习和掌握单片机C语言编程,提高自己的实际操作能力。同时,通过Proteus仿真软件的使用,学习者能够在电脑上进行实验,不受硬件设备的限制,更加方便灵活。 总之,单片机C语言程序设计实训100例:基于AVR Proteus仿真 PDF是一本很好的教材,对于学习者来说是一份宝贵的学习资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一直学不会编程的小徐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值