1.1、以下程序的输出结果是 A 。
main()
{
int k1=1,k2=2,k3=3,x=15;
if(!k1) x--;
else if(k2)
if(k3) x=4;
else x=3;
printf(“x=%d\n”,x);
}
A x=4 B x=15 C x=14 D x=3
解析:if(!k1) x--;
检查 k1
是否为0。因为 k1
的值为1,所以该条件不成立,x
的值不变(仍为15)。接下来,else if(k2)
检查 k2
是否为非0值。因为 k2
的值为2,该条件成立。进入 if(k3) x=4;
。k3
的值为3,所以该条件成立,x
被赋值为4。由于 k3
的条件成立,所以 else x=3;
这部分代码不会被执行。所以打印出x=4
1.2、有以下程序,while循环执行 A 次。
int main()
{
int k=2;
while(k=1)
printf(“%d”,k);
k--;
printf(“\n”);
}
A) 无限次 B) 2 C) 1 D) 0
解析:while
循环的条件是 k=1
,这是一个赋值表达式,它将 k
的值设置为 1,并返回 1 作为表达式的值。赋值表达式的结果是被赋的值,因此 k=1
的结果是 1,这是一个非零值,所以 while
循环的条件始终为真。由于 while
循环的条件始终为真,循环将无限次地执行,直到被外部因素(如用户干预或程序崩溃)中断。每次循环迭代都会执行 printf(“%d”,k);
语句,打印当前 k
的值,然后 k--
语句将 k
的值减 1。然而,由于 while
循环的条件是 k=1
(它总是将 k
重新设置为 1),k
的值永远不会减小到 0 或负数,因此循环不会自然终止。所以,while
循环将执行无限次
1.3、有以下程序
int main()
{
int a=1,b;
for(b=1;b<=10;b++)
{
if(a>=8) break;
if(a%2==1) { a+=5; continue;}
a-=3;
}
printf("%d\n",b);
}
程序运行后的输出结果是 B
A)3 B)4 C)5 D)6
解析:在每次循环中,程序首先检查a
是否大于等于8。如果是,则使用break
语句退出循环。如果不是,则继续执行。接下来,程序检查a
是否是奇数(即a%2==1
)。如果是奇数,a
增加5,并使用continue
语句跳过当前循环的剩余部分,进入下一次循环。如果a
是偶数,则a
减去3,然后继续执行下一次循环。第一次循环:a
是奇数,a
加5,a
变为6,continue
,跳过剩余部分,进入下一次循环。第二次循环:a
是偶数,a
减3,a
变为3,继续执行下一次循环。第三次循环:a
是奇数,a
加5,a
变为8,continue
,跳过剩余部分,进入下一次循环。a
大于等于8,break
,退出循环。所以最终b
的值是4
1.4、有以下程序
#include <sthio.h>
int main()
{
int s=0,n;
for (n=0;n<3;n++) 0 1 2
{
switch(s)
{ case 0:
case 1:s+=1;
case 2:s+=2;break;
case 3:s+3;
case 4:s+=4;
}
printf((“%d\n”,s);
}
}
程序运行后的结果是 C
A)1,2,4 B) 3,10,10 C) 3,6,10 D) 3, 7, 7
解析:初始时,s
被赋值为 0。进入第一个 for
循环迭代(n = 0
)。s
的值是 0,进入 case 0:
,执行 s += 1;
,s
变为 1。由于没有 break
语句,继续执行 case 2:
,执行 s += 2;
,s
变为 3。输出 s
的值,即 3。进入第二个 for
循环迭代(n = 1
)。s
的值是 3,进入 case 3:
,执行 s += 3;
,s
变为 6。输出 s
的值,即 6。进入第三个 for
循环迭代(n = 2
)。s
的值是 6,进入 case 4:
,执行 s += 4;
,s
变为 10。输出 s
的值,即 10
1.5、有以下程序
#include<stdio.h>
int main()
{int a=1,b=0;
if(-a) b++;
else if(a=0)b+=2; else b+=3;
printf("%d\n",b);
)
程序运行后的输出结果是( B )。
A)0 B)1 C)2 D)3
解析:int a=1, b=0;
:变量 a
初始化为1,变量 b
初始化为0。if(-a) b++;
:由于 -a
的值是 -1
(因为 a
是1),这是一个非零值,所以条件为真,执行 b++
,此时 b
的值变为1。else if(a==0) b+=2;和else b+=3;都不会执行,所以打印出b为1
1.6有以下程序
#include<stdio.h>
int main()
{
int a=7;
while(a--);
printf("%d\n",a);
}
程序运行后的输出结果是( B )。
A)-1 B)0 C)1 D)7
解析:while(a--);
:这是一个 while
循环,其条件是 a--
。在每次循环迭代中,a
的值会减1,并且由于 a--
是一个后缀递减操作,它在表达式中保持其原始值(在递减之前)。循环将一直执行,直到 a
的值变为0。由于 a
初始值为7,循环将执行7次。printf("%d\n", a);
:在 while
循环结束后,a
的值将是0(因为循环执行了7次,每次减1)。这行代码将打印出 a
的值,即0。因此,程序运行后的输出结果是 0
。
2、填空题
2.1、以下程序运行结果是( 2 )。
#include<stdio.h>
int main()
{
int x=2,y=-1,z=2;
if(x<y)
if(y<0) z=0;
else z+=1;
printf("%d\n",z);
}
解析:初始时,x
的值为 2,y
的值为 -1,z
的值为 2。程序首先检查 if(x<y)
。由于 x
的值是 2,而 y
的值是 -1,2 不小于 -1,所以这个条件为假。因此,接下来的 if(y<0) z=0; else z+=1;
代码块不会被执行。所以,z
的值保持为初始值 2,并且最终程序输出 z
的值,即 2。
2.2以下程序的执行结果是( 20 )。
#include<stdio.h>
int main()
{
int a,b,c,d,x;
a=c=0;
b=1;
d=19;
if(a) d=d-10;
if(!c)
x=15;
else
x=25;
d++ ;
printf("d=%d\n",d);
}
解析:由于 a
的值为 0,所以条件 if(a)
为假,不会执行 d=d-10
,d
的值仍然是 19。由于 c
的值为 0,!c
(即 c
的非值)为真,因此会执行 x=15
,将 x
的值设置为 15。d
的值增加 1,从 19 变为 20。最后,程序输出 d
的值:20
2.3以下程序的执行结果是( first third )。
#include<stdio.h>
int main()
{
int x=1,y=0;
switch(x)
{
case 1:
switch(y)
{
case 0:printf("first\n");break;
case 1:printf("second\n");break;
}
case 2:printf("third\n");
}
}
解析:初始化变量 x
为 1,y
为 0。进入外层 switch
语句,检查 x
的值。由于 x
的值为 1,执行 case 1:
下的代码块。进入内层 switch
语句,检查 y
的值。由于 y
的值为 0,执行 case 0:
下的 printf("first\n");
,并遇到 break;
语句,退出内层 switch
语句。由于内层 switch
语句中没有其他 break;
语句来退出外层 switch
语句,因此会继续执行外层 switch
语句中 case 1:
之后的代码,即 case 2:
下的 printf("third\n");
。因此,程序的执行结果是:first third
2.4 以下程序在输入5,2之后的执行结果是( s=2,t=3 )。
#include<stdio.h>
int main()
{
int s,t,a,b;
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("s=%d,t=%d\n",s,t);
}
解析:因为a
是5,大于0,所以s
将增加1,变为2。if(a>b)
:因为a
是5,b
是2,所以a
大于b
,条件成立,t
将被赋值为s+t
,即2+1=3
。由于if(a>b)
的条件已经成立,后面的else if
和else
块将不会被执行。最后,程序输出s
和t
的值:s=2,t=3
2.5 以下程序的执行结果是( # )。
#include<stdio.h>
int main()
{
int a=2,b=7,c=5;
switch(a>0)
{
case 1:
switch(b<0)
{
case 1:printf("@");break;
case 2:printf("!");break;
}
case 0:
switch(c==5)
{
case 0:printf("*");break;
case 1:printf("#");break;
case 2:printf("$");break;
}
default:printf("&");
}
printf("\n");
}
解析:因为 a
的值是 2,显然 a > 0
是真的,所以外层 switch
语句将执行 case 1:
下的代码块。接下来,我们进入内层第一个 switch
语句:由于 b
的值是 7,b < 0
是假的,因此内层第一个 switch
语句不会执行任何 case
。由于缺少 break
语句,控制流将继续执行到外层 switch
语句的下一个 case
。现在,进入外层 switch
语句的 case 0:
因为 c
的值是 5,所以 c == 5
是真的,内层第二个 switch
语句将执行 case 1:
下的代码块输出字符 #
,并且由于有 break
语句,内层第二个 switch
语句结束。
2.6 以下程序运行结果是( 5 5 5 )。
#include <stdio.h>
int main()
{
int x,y=1;
if(y!=0) x=5;
printf("\t%d\n" ,x);
if(y==0) x=4;
else x=5;
printf("\t%d\n" ,x);
x=1;
if(y<0)
if(y>0) x=4;
else x=5;
printf("\t%d\n" ,x);
}
解析:第一个 if
语句检查 y
是否不等于0。由于 y
的值为1,这个条件为真,因此 x
被赋值为5。第一个 if
语句检查 y
是否不等于0。由于 y
的值为1,这个条件为真,因此 x
被赋值为5。打印 x
的值,此时 x
为5。第二个 if-else
语句检查 y
是否等于0。由于 y
的值为1,这个条件为假,因此执行 else
分支,x
再次被赋值为5。再次打印 x
的值,此时 x
仍为5。第三个 if-else
语句是嵌套的。首先检查 y
是否小于0,这个条件为假,因此不会执行内部的 if (y > 0)
分支。而是直接执行 else
分支,将 x
赋值为5。最后,打印 x
的值,此时 x
仍为5。
2.7 以下程序的运行结果是( 4 -2 4 0 -2 -2 )
#include<stdio.h>
int main()
{
int x , y=-2, z=0;
if ((z=y)<0) x=4;
else if (y==0)
x=5;
else
x=6;
printf("\t%d\t%d\n" ,x, z);
if(z=(y==0))
x=5;
x=4;
printf("\t%d\t%d\n" ,x,z);
if(x=z=y) x=4;
printf("\t%d\t%d\n" ,x,z);
}
解析:变量y
被初始化为-2,z
被初始化为0。在if
语句中,(z=y)
将y
的值-2赋给z
,并返回-2,因此(z=y)<0
为真,所以x
被赋值为4。z
的值为-2。输出为4 -2,z=(y==0)
会检查y
是否等于0,由于y
的值为-2,所以(y==0)
为假,即0。因此,z
被赋值为0,并且if
语句的条件为假,所以不会执行x=5
。接下来,x
被明确赋值为4。输出为4 0,x=z=y
会先将y
的值-2赋给z
,然后再将z
的值-2赋给x
。因此,x
和z
现在都等于-2。然后,if(x=z=y)
的结果为-2,这是一个非零值,所以条件为真,但由于x=4
前面没有else
,所以这个赋值不会执行。输出为-2 -2,
3编程题、
3.1 编写程序实现:服装店经营套服,也单件出售,若买的不少于50套,每套80元;不足50套的每套90元;只买上衣每件60元;只买裤子每条45元。输入所买上衣c和裤子t的件数,计算应付款m。
#include <iostream>
using namespace std;
int main()
{int c,t;double m;//输入上衣和裤子的数量cout << "请输入购买上衣的数量: ";cin >> c;cout << "请输入购买裤子的数量: ";cin >> t;//根据输入计算应付款int suits=c<t?c:t;//计算可以组成多少套服int tops=c-suits;//计算剩余上衣数量int pants=t-suits;//计算剩余裤子数量if(suits>=50){//如果套服数量不少于50套,每套80元m=suits*80.0;}else{//如果套服数量不足50套,每套90元m=suits*90.0;}//加上剩余上衣和裤子的费用m+=tops*60.0;m+=pants*45.0;//输出应付款cout << "应付款为: " << m << "元" << endl;return 0;
}
结果:
4.思考题
4.1 下面是C语言中两种if语句判断方式。请问哪种写法更好?为什么?
int n;
if (n == 10) // 第一种判断方式
if (10 == n) // 第二种判断方式
答:在C语言中,两种if
语句的判断方式都是有效的,并且可以产生相同的结果。然而,从编程习惯和可读性的角度来看,通常推荐使用“常量在前,变量在后”的写法,即第二种判断方式 if(10==n)
。因为:
- 防止误操作:将常量放在前面可以防止因为误输入赋值操作符(
=
)而导致的逻辑错误。例如,如果你不小心写成了if (n = 10)
,这实际上是一个赋值操作,而不是比较操作,这将导致n
被赋值为10,而条件判断始终为真。但如果使用if (10 = n)
,编译器会立即报错,因为这个表达式是不合法的。 - 提高可读性:将常量放在前面是一种广泛接受的编程习惯,这有助于其他开发者更快地理解代码的逻辑。这种写法在C语言社区中更为常见。
- 一致性:保持代码风格的一致性对于维护代码的可读性和可维护性非常重要。如果你在一个项目中混合使用这两种写法,可能会使代码看起来混乱。
综上所述,虽然两种写法在功能上是等效的,但从避免错误和提高代码可读性的角度来看,推荐使用第二种判断方式 if(10==n)
。
4.2 思考一下,计算1+2+3+……+100的和,最优化的算法是? 编程实现
答:C++中,计算1到100的和的最优化算法是使用高斯求和公式,也被称为等差数列求和公式。这个公式是:S=n/2*(a1+an)
其中,S
是和,n
是项数,a1
是第一项,an
是最后一项。对于1到100的序列,n=100
,a1=1
,an=100
。将这些值代入公式,我们得到:S=100/2*(1+100)=50*101=5050
#include <iostream>
using namespace std;
int main()
{int n=100;//求和的总项数int a1 = 1;//首项a1的值int an = 100; //尾项an的值int sum = n/2 * (a1 + an);//高斯公式cout << "The sum of numbers from 1 to 100 is: " << sum << endl; return 0;
}
结果:
4.3 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?
答:在程序末尾加一句while(1);
while(1)
创建了一个无限循环,因为1
在C语言中始终为真。printf
语句会在每次循环迭代时执行,打印出一条消息。由于循环是无限的,所以return 0;
语句永远不会被执行。
注意,无限循环可能会消耗大量的系统资源,因此在嵌入式系统中使用时需要格外小心。在大多数情况下,你应该在循环中添加一些条件来中断循环,或者提供一个退出循环的方法。