五道选择题
1、有以下代码,程序的输出结果是( )
#include <stdio.h> int main() { int a = 0, b = 0; for (a = 1, b = 1; a <= 100; a++) { if (b >= 20) break;//1 if (b % 3 == 1)//2 { b = b + 3; continue; } b = b-5;//3 } printf("%d\n", a); return 0; }
A.10 B.9 C.8 D.7
解析: 先看代码构成,代码的主要部分是一个循环,最终目标是打印出a的大小。
直接看循环,for循环先将a和b都初始化成了1,循环进行的条件是a<=100,循环每次结束后,a+1
接着看循环的内部,1代码代表的意思是,当b>=20时会执行break语句,跳出循环。
2代码表达的意思是当b%3==1,也就是当b=3*n+1的时候会执行b+3,然后执行continue语句。
continue语句的作用是直接中止这次循环,然后执行a++,再判断循环是否能够继续,如果能则继续循环。
3代码表达的意思是b-5
观察完代码的构成,我们可以看出,b=1。而从语句2进入的条件可以看出,当b为3*n+1的话就一定会执行语句2,当b的值大于20时就会直接跳出循环,打印目标。 而每执行一次语句2,b都会+3,所以,b会一直走语句2 当b>20时就会跳出循环,而a的值也就是b加3的次数再a原来的值即可(b只要加了3就会执行continue间接使a+1) 可以看出,当b=3*7+1的时候会跳出循环,这时b已经加过7次3了,7+1就是8,所以最后会打印出8,所以答案选C
2、下面代码的结果使()
#include <stdio.h> int main() { int arr[] = {1,2,(3,4),5}; printf("%d\n", sizeof(arr)); return 0; }
A.4 B.16 C.20 D.5
解析:这是一道基础题,就考验你的基础扎不扎实。arr这个数组看似有5个元素,实际上只有4个元素,为什么?因为arr数组中有一个逗号表达式,而逗号表达式的运算规则是从左往右依次计算,整个表达式的值为最后一个表达式的值。4个整型元素所占的字节数为4*4=16,因此答案为B
3、以下叙述中正确的是( )
A. 只能在循环体内和switch语句体内使用break语句
B. 当break出现在循环体中的switch语句体内时,其作用是跳出该switch语句体,并中止循环体的执行
C. continue语句的作用是:在执行完本次循环体中剩余语句后,中止循环
D. 在while语句和do-while语句中无法使用continue语句
解析:A选项,在循环体里使用break可以跳出循环,在switch语句中使用break可以跳出switch,除了这两种用法,break确实不能被用在其他地方。故A对。
B选项,break只会跳出一层循环,同样的,在switch语句中它也只会跳出一层switch,站在break的角度来看,switch和循环语句是等价的,谁来我都只跳过一层,B的描述则是跳出了两层,故B错。
C选项跟continue语句的作用完全不符,continue语句的作用是跳过循环体中剩余的语句而强行执行下一次循环,故C错。D选项大错特错,continue语句设计出来就是给循环用的。综上所述,答案选A
4、设函数 fun 和实参数组的说明是如下形式,则对函数的调用语句中,正确的是( )
void fun(char ch,float x[]); float a[10];
A.fun("asd",a[ ]) B.fun('x' , A)
C.fun('68' , 2.8) D.fun(32 , a)
解析:这类题目,看着好做,实际上也很好做(滑稽)。目标就是要和被调用的函数的参数类型保持一致便可以实现函数的成功调用。
先看函数,函数的返回类型是void型,参数一个为char(字符)型,一个为float[ ](浮点型数组) ,因此,第一个变量传字符型变量,第二个变量传一个浮点型数组或者传一个float*的指针。先观察第一个变量,A传了一个字符串显然错误,A排除。BC均传了一个字符,正确。
而D传了一个数字,好像错了,但它是对的,为什么?因为字符型的变量的本质其实是它们的ASCII码值,因此字符型其实是可以被看作是整型家族的成员的,传递32给fun函数,相当于传递了ASCII码值为32的字符,故D对。
再看第二个变量,A已经被排除,不用看。B,B传了一个字符,不符合我们分析的结果,错,C传了一个浮点数,错。D传了数组名,而数组名在通常情况下被看作数组首元素的地址,也就是传递了一个float*的指针。符号条件。综上所述,答案选D
5、在C语言中,以下正确的说法是( )
A. 实参和与其对应的形参各占用独立的存储单元
B. 实参和与其对应的形参共占用一个存储单元
C. 只有当实参和与其对应的形参同名时才共占用存储单元
D. 形参是虚拟的,不占用存储单元
解析:在调用函数的时候,真实传递给函数的是实参,函数定义部分函数名后的参数是形参。形参和实参的名字是可以相同的,在函数调用的时候,形参是实参的一份临时拷贝,分别占用不同的内存空间,所以A正确,B错误。即使形参和实参的名字相同,也是占用不同的内存空间,C错误。函数如果不被调用时,函数的形参是形式上存在的,但是函数在被调用的时候,形参是要分配内存空间的,所以D错误。综上所述,答案选A
编程题1:
这道题要是对^(异或)操作符了解的小伙伴是非常简单的。^操作符的作用可以将两个数相同的位变为0,不同的位变为1,那么两个相同的数^就会出现0,而^又是满足交换律的 所以我们不需要在意^的顺序,偶数次出现的数一旦被^就会像对对碰一样变为0。奇数次出现一旦被^就只会剩下它本身,因此,遍历一遍数组,然后在遍历的过程中^最后出来的结果就是奇数次出现的数。
#include <stdio.h> int main() { int a=0; scanf("%d",&a); int i=0;int order=0; //order=0是因为,异或操作符^0才会保持不变,^1可能会使最后一位丢失 for(i=0;i<a;i++) { int b=0; scanf("%d",&b); order^=b;//边输入,边异或 } printf("%d",order); }
编程题2:
目标是输出截取后的字符串,创建两个数组,一个数组用来存放输入的字符串,通过遍历的方式使另一个数组存放截取后的字符串,最后打印出对应数组即可。
#include <stdio.h> #include<string.h> int main() { char arr1[1000]={0}; char arr2[1000]={0}; gets(arr1); //使用gets,避免字符串中有空格 //空格会使scanf的输入中止 int len=strlen(arr1); //计算输入的字符串长度 int k=0; scanf("%d",&k); if(k>=len) //当k>=len时就不用截取了,直接打印就可以 { printf("%s",arr1); return 0; } for(int i=0;i<k;i++) { arr2[i]=arr1[i]; //将前k个字符截取到对应数组中 } printf("%s",arr2); }
好了,今天的练习到这里就结束了,感谢各位友友的来访,祝各位友友前程似锦O(∩_∩)O