校软招新考试 原卷 题解
选择题:
(1)
1 #include <stdio.h> 2 int main(void) { 3 int a = 3, b = -1, k; 4 if (!(--a < 0) || (++b < 0)) { 5 k = (b++ == 0) && (a-- >= 0); 6 } else { 7 k = (--a == 0) && (++b > 0); 8 } 9 printf("%d %d %d", a, b, k); 10 return 0; 11 }
答案:2 0 0 参考:i++与 ++i的区别,运算符优先级,||,&&,短路规则
首先看if语句,先执行括号内的--a<0 ,a先自减1,a=2,再判断a<0的值,
因为!的优先级比||高,所以先去执行!(--a < 0),结果为 1,因为||和&&有短路规则
所以,后面的(++b < 0) 不执行。
再执行 if里面的语句,k = (b++ == 0)&& (a-- >= 0) 先执行b++,此时b并没有改变自己的值,还是 b=-1
做判断 b++ == 0 为假,然后 b =0,因为短路规则,后面的 (a-- >= 0)不执行,所以 k=0
(2)那个选项是C语言合法标识符:
A.print _3d db8 aBc
B.I\am one_half start$it 3pai
C.str_1 Cpp pow while
D.Pxq My->book line# His.age
答案:A,参考:C语言标识符规则
B项中的 \,$,开头数字为3 都是C语言中不容许的
C项中的 pow while 为 C语言本身自带的关键字
D项中的 ->,#,. 都是不能出现的
(3)
(3)下面( )表达式的结果是4
A.11 / 3
B.11.0 / 3
C.(float) 11 / 3
D.(int) (11.0 / 3 + 0.5)
答案:D
A 11/3==3
C B 11.0/3 == 3.667
D 11.0/3 + 0.5 == 4.1 (int)强制类型转换 向下取整 等于4
(4)
(4)若“int n; float f=13.8;”,则执行“n=(int) f % 3”后,n的值是( )
A.1
B.2
C.3
D.3.333
答案:A
(int)强制类型转换向下取整,f==13,13%3==1
(5)
int a[ ][3] = {{1, 2, 3}, {4, 5}, {6, 7}};
数组a的第一维大小:
A 2
B 3
C 4
D 无确定值
答案:3 ,三行三列的二维数组
填空题:
(1)ROM定义:只读存储器 read-only memory(ROM的最大特点是在电源中断后信息也不会消失或受到破坏。)
(2) 计算机网络如果按作用范围进行分类,可分为______局域网(LAN)___、______广域网(WAN)___、和城域网(MAN)
(3)网络协议通常采用分层思想进行设计,OSI RM中的协议分为___7____层,而TCP/IP中的协议分为_____4___层
OSI :https://blog.csdn.net/yaopeng_2005/article/details/7064869
TCP/IP:https://www.cnblogs.com/onepixel/p/7092302.html
(4) Linux mount:用于挂载Linux系统外的文件 http://www.runoob.com/linux/linux-comm-mount.html
(5) 若已知 sizeof(int) = 4,则int的最大值为? int 是四个字节 一个字节是8位,所以 int == 4*8 ==32,因为int为有符号位,所以是 2^32-1=2147483637
(6)计算机内部的三大总线分别是: 数据总线,地址总线,控制总线 ,详解:《汇编语言》 王爽,《计算机组成原理》,《计算机科学导论》
(7) 安卓的四大组件:Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器
(8) 已知一个八进制数为:215,则对应的二进制数为:_____1000 1101____、十进制数为____141___________、十六进制数为______8D__________
(9)C语言中,若有条件 2 < x < 3或x < -10,则用C语言描述则为 if(x<3&&x>2||x<-10)
(10) Shell 脚本的本质:Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的。Shell既是一种命令语言,又是一种程序设计语言
https://my.oschina.net/u/658505/blog/666807
(11) gcc的编译步骤按先后顺序分别为____预处理___、____编译___、____汇编__和链接生成可执行文件
https://blog.csdn.net/xiaohouye/article/details/52084770
(12)#include <filename.h> 和#include “filename.h” 有什么区别:
对于#include<filename.h>,编译器先从标准库路径开始搜索filename.h,使得系统文件调用比较快;
对于#include"filename.h",编译器先从用户的工作路径开始搜索filename.h,后去寻找系统路径,使得自定义文件较快。所以在写代码的过程中要根据实际情况选择是<>还是""
(13)你都知道哪些文本编辑器呢____ (随便写)
(14) do………while();和while()有什么区别__ do...while 先无条件执行一次循环体,然后在判断执行,while直接判断执行
(15) 语句for (; 1; ){ }代表什么意思: for的死循环
判断题:
(1) 一个网吧将其所有的计算机连成网络,这个网络是属于吧网 ,错,属于局域网
(2)在按OSI标准建造的网络中具有路径选择功能的唯一层次是数据链路层 ,错,是网络层
网络层主要任务是通过路由算法,为分组通过通信子网选择最适当的路径。网络层要实现路由选择、拥塞控制与网络互联等功能。
数据链路层最基本的服务是将源计算机网络层来的数据可靠的传输到相邻节点的目标计算机的网络层
(3)IP地址200.64.32.65的主机号是200 ,错,是65
IP地址子网掩码都是32位的2进制,通过子网掩码来区分网络位和主机位,子网掩码跟IP地址对应,则子网掩码为1的是网络位,为0的是主机位。
例如:192.168.1.123 掩码255.255.255.0 。网络位是192.168.1,主机位是123。需要注意的是ip地址最大数值为255。
(4)Linux中常用cmd来表示终端 ,错,windows下常用cmd,powershell来表示终端,linux下的终端常用terminal表示
(5)C语言中可以动态定义数组长度,对,https://blog.csdn.net/u013398034/article/details/51882061
https://blog.csdn.net/caohu2010/article/details/53883737 此链接,代码第22行注释掉的地方是错的,数组首地址不能改变,如果要用指针,int *t;t = array;,用*t存;
(6)C语言中,switch语句中的参数可以是整形,浮点型和字符型 ,错,switch后面的参数只能是整形或者枚举类型,不能是浮点类型
(7) C语言中,若一个函数在声明时没有指定任何类型,则默认为void型,错,默认为int型
(8)C语言中,若有char str1[20] = {“abcde”}, str2[20]; 若想要将str1的值直接赋给str2,可以直接赋值,如str2 = str1 ,错,
1)字符数组。
字符数组相当于字符串,可以用标准函数strcpy()和strncpy()直接进行字符串复制。
2)其他数组。
由于C语言的原始性,它并不具备操作符重载。所以对于数组复制,都需要对数组进行遍历,
然后每个元素每个元素的一一复制。根据数组的大小和维数,可选择不同的循环或者递归进行复制。
(9)C语言是一门面向对象的语言 ,错,面向过程
(10)给计算机中安装防火墙软件可以防止计算机着火,错
程序分析题
(1)结果:1 3 5 7 9
#include <stdio.h> #define LEN 10 int main(void) { int array[LEN]; for (int i = LEN - 1, j = 0; i >= 0; i--) { array[j++] = LEN - i; } for (int i = 0; i < LEN; i += 2) { printf("%d ", array[i]); } return 0; }
分析 :
#define LEN 10 ,表示代码中所有的LEN 被替换成 10
所以 array[LEN] 为 array[10],执行第一个循环,array[10]={1,2,3,4,5,6,7,8,9,10}
输出的时候,步进为2,从0开始,所以输出: 1 3 5 7 9
(2)答案:1 2 3 4 5
#include <stdio.h> #define LEN 5 int main(void) { int array[LEN] = {5, 4, 3, 2, 1}; for (int i = 0; i < LEN - 1; i++) { for (int j = 0; j < LEN - i - 1; j++) { if (array[j] > array[j + 1]) { int temp = array[j + 1]; array[j + 1] = array[j]; array[j] = temp; } } } for (int i = 0; i < LEN; i++) { printf("%d ", array[i]); } return 0; }
一看两层for,和if的判断,交换变量,就是冒泡没错了。。,
第二层中的 LEN -i -1 其实是把待排序的区间缩小了,博客里面有冒泡的讲解,百度也有,可以去看看。
(3) 有下列程序拟计算sum = 1/1 + 1/2 + … + 1/25:
#include <stdio.h> #define LEN 5 int main(void) { double sum = 0; int i = 0; do { i += 1.0; sum += (double)(1 / i); } while (i <= 25); printf("%.2f", sum); return 0; }
哪里错了? int i=0;
为什么错了 1/i 总为0
怎么改正 double i=0;