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
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
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
9、为了避免嵌套的if-else 语句的二义性,C语言规定else 总是与_______组成配对关系。
A、缩排位置相同的if
B、在其之前未配对的最远的if
C、在其之前未配对的最近的if
D、书写在同一行上的if
解析:答案选C
10、以下程序的运行结果是________。
#include
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
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
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
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
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
B、3
C、2
D、1
解析:答案选D
条件运算符的结合性是自右向左,原式子w
15、有如下嵌套的if语句
if(a<b)
if(a<c) k=a;
else k=c;
else
if(b<c) k=b;
else k=c;
以下选项中与上述语句等价的语句是________。
A、k=(ac)?b:c);
B、k=(a C、k=(a D、k=(a
解析:答案选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
循环流程解析:
19、在C语言中,执行语句for(j=1;j<5;j++); 后,变量j的值是________。
A、3
B、4
C、5
D、6
20、以下程序的运行结果是________。
#include
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
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
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
int main()
{ int x=3;
do
printf("%d ",x-=2);
while(!(--x));
return 0;
}
A、1
B、1 -2
C、3 0
D、是死循环
24、以下程序的运行结果是________。
#include
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
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
int main()
{
int i;
for(i=1;i<=5;i++)
{ if(i%2)
printf(“*”);
else
continue;
printf(“#”);
}
printf(“$”);
return 0;
}
A、###$
B、##$
C、###$
D、##$
27、以下叙述中正确的是________。
A、if语句只能嵌套一层
B、不能在else子句中在嵌套if 语句
C、改变if-else 语句的缩进格式,会改变程序的执行流程
D、if子句和else 子句中可以是任意合法的C语句
解析:答案选D
A、if语句可以嵌套多层。选项A错误。
B、可以在else子句中在嵌套if 语句。选项B错误。例如题11:
#include
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
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
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
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
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
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
#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
#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
#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
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
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
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
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
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
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
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
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
int main( )
{ int sum=10,n=1;
while(n<3)
{ sum=sum-n;
n++;
}
printf("%d, %d",n,sum);
return 0;
}
43、以下程序的运行结果是:____, ____。
#include
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
#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
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
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
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
#include
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;
}
50、以下程序实现了一个简易计算器:从键盘输入数据,验证其有效性后进行四则运算,并输出计算结果,请填空。
#include
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;
}
51、以下程序功能:利用公式Π/2=1+1/3+1/32/5+1/32/53/7+⋯+1/32/53/7n/(2n+1)求圆周率,要求当通项精度小于10-6时,输出结果,请填空。
#include
#include
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;
}