}
A12B13C19D8
9、如下:
intfunc(inta){
intb;
switch(a){
case1:
b=100;
case2:
b=200;
case3:
b=250;
default:
b=0;}
returnb;
}
问f
(1)等于多少?
0
10、给出以下定义:
CharacX[]=”abcdefg”;
CharacX[]={‘a’,’b’,’c’,’d’,’e’,’f’,’g’};
则正确的叙述为()
A、数组acX和数组acY等价
B、数组acX和数组acY的长度相同
C、数组acX的长度大于数组acY的长度
D、数组acX的长度小于数组acY的长度
11、有下面一段代码:
CharszMsisdn[MAX_LEN_MSISDN-1];
szMsisdn[sizeof(szMsidn)]=’\0’;
则对执行以上代码后,正确的叙述为:
程序执行后有问题,内存被踩。
解析:
给szMsisdn[MAX_LEN_MSISDN-1]赋值是越界行为。
12、对下列常见的各种网络术语,描述错误的是——
A、DNS(域名系统)是一种用于TCP/IP应用程序的分布式数据库,因此它在TCP/IP体系结构中处于应用层。
B、TFTP是一种文件传递应用程序,它使用的传输层协议是TCP
C、Telnet是标准的提供远程登录功能的应用,可以在不同OS系统的主机之间运行;
D、Ping是对两个TCP/IP系统连通性进行测试的基本工具,它利用ICMP进行基本的请求和应答。
13、由国际化组织(ISO)和国际电信联盟(ITU-T)共同提出的开放系统互连(OSI)参考模型中共有—7—层。
14、下列关于进程的叙述中,哪一个是正确的:
A、进程获得处理机而运行是通过调度而得到的。
B、优先级是进行进程调度的重要依据,一旦确定不能改变
C、在单CPU系统中,任意时刻有1个进程处于运行状态
D、进程申请CPU资源得不到满足时,其状态变为等待状态
上图分别是进程3/5/7状态模型
15、考虑在一个计算机系统里,进程可以申请和释放一个或多个资源。
资源一旦分配给一个进程,则该进程独占此资源,直到资源被主动释放。
如果一个进程申请的资源,正在被其他进程占有,那么该进程进入等待该资源的一个队列,直到该资源能够得到满足。
下列方法中,哪一个不能很好解决死锁问题:
A、给每一个进程不同的优先级,并按照优先级的大小决定在资源队列中的顺序。
B、让进程开始运行时获得全部的资源,在不能获得全部资源时重新启动。
C、给资源编号,并要求进程按照编号的顺序申请资源。
?
?
D、提供超时机制,在进程进入资源等待后一段随机时间内重启进程。
E、系统监控等待队列发生死锁时,重启相关进程。
16.下面的各种RAID类别中,没有任何数据冗余保护的是:
A.RAID0B、RAID1C、RAID5D、RAID10
解析:
见后面截图资料。
17、在概念设计阶段,最常使用的数据模型是:
A、对象模型B、物理模型C、逻辑模型D、实体联系模型
解析:
数据库概念设计阶段用实体联系模型
逻辑设计阶段需要将E-R图转换为关系模型
18、——是DBMS的基本单位,它是构成单一逻辑工作单元的操作集合:
A、进程B、SQLC、事务D、文件
19、事务的持续性是指:
——
A、事务中包括的所有操作要么都做,要么不做
B、事务一旦提交,对数据库的改变时永久的
C、一个事务内部的操作及使用的数据对并发的其他事务是隔离的
D、事务必须是使数据库从一个一致性状态变到另一个一致性状态
20、解决并发操作带来的数据不一致行问题,一般采用方法:
A、恢复B、封锁C、存取控制D、协商
多选题:
1、完全二叉树的概念
满二叉树
a)深度为k且有2k-1个结点的二叉树。
b)特点
i.每一层上的结点数都是最大结点数;
ii.所有的分支结点的度数都为2;
iii.叶子结点都在同一层次上。
完全二叉树
c)若对满二叉树的结点从上到下从左至右进行编号,则深度为k且有n个结点的二叉树称为完全二叉树,当且仅当其每一个结点都与深度为k的满二叉树的编号从1到n一一对应时。
d)特点
i.叶子结点只可能在层次最大的两层上出现;
ii.前k-1层中的结点都是“满”的,且第k层的结点都集中在左边。
2、栈在——中应用。
A、递归B、快速排序(非递归程序用栈实现)C、表达式求值D、树的遍历
3、队列是一种运算受限的线性表,以下说法准确的是:
A、单向队列在允许删除的一端叫队头,在允许插入的一端叫队尾。
B、单向队列在允许删除的一端叫队尾,在允许插入的一端叫队头。
C、队列可以用数组实现,也可以用链表实现
D、队列是先进先出的,栈是后进先出的
4、下列关于线性表描述正确的是:
A、适用于数据项数量不能预知的情况
B、逻辑相邻的2元素的存储空间可以是不连续的
C、链表节点一般有数据元素和指针域两部分组成
D、存储空间需要动态分配
解析:
线性表存储空间分配的静态、动态性是由其实现方式决定的,线性表可以通过顺序表和链表实现,顺序表是静态分配的,链表又分为静态和动态,静态链表静态分配,动态链表动态分配。
5、下面说法正确的是:
A、归并排序的平均复杂性为O(N*log(N));
B、快速排序最坏情况下时间复杂度是O(N2)
C、堆排序在最好最坏情况下时间复杂度都是O(N*log(N))
D、快速排序会比归并排序消耗更多的交换空间
解析:
归并排序时间复杂度O(n),消耗空间最多。
6、下面网络知识的阐述中,存在错误的是:
A、ARP协议根据MAC地址查询其对应的IP地址,便于IP通信;
B、TCP协议是面向连接的,UDP协议时面向无连接的
C、127.0.0.1属于私有地址
D、IPV6协议是下一代IP协议
解析:
回送地址:
127.0.0.1。
一般用于测试使用。
例如:
ping127.0.0.1来测试本机TCP/IP是否正常。
广播地址:
是专门用于同时向网络中所有工作站进行发送的一个地址。
在使用TCP/IP协议的网络中,主机标识段hostID为全1的IP地址为广播地址,广播的分组传送给hostID段所涉及的所有计算机。
例如,对于10.1.1.0(255.255.255.0)网段,其广播地址为10.1.1.255(255即为2进制的11111111),当发出一个目的地址为10.1.1.255的分组(封包)时,它将被分发给该网段上的所有计算机。
广播地址应用于网络内的所有主机
1)有限广播
它不被路由但会被送到相同物理网络段上的所有主机
IP地址的网络字段和主机字段全为1就是地址255.255.255.255
2)直接广播
网络广播会被路由,并会发送到专门网络上的每台主机
IP地址的网络字段定义这个网络,主机字段通常全为1,如192.168.10.255
私有地址(Privateaddress)属于非注册地址,专门为组织机构内部使用。
私有地址就是在互联网上不可用,被用在局域网中的地址。
如果你的IP地址是自动获取IP地址,而你在网络上又没有找到可用的DHCP服务器,这时你将会从以下私有地址中临得获得一个IP地址。
以下表列出留用的内部寻址地址
A类10.0.0.0--10.255.255.255
B类172.16.0.0--172.31.255.255
C类192.168.0.0--192.168.255.255
7、关于死锁的说法正确的有:
A、竞争可剥夺资源会产生死锁
B、竞争临时资源会产生死锁?
?
C、在发生死锁时,必然存在一个进程—资源的环形链
D、如果进程在一次性申请其所需的全部资源成功后才运行,就不会发生死锁。
临时性资源又叫可消费资源:
死锁的例子:
1)进程推进顺序不当产生死锁
2)PV操作使用不当产生死锁
3)资源分配不当引起死锁
4)对临时性资源使用不加限制引起死锁
死锁预防:
通过破坏产生死锁的四个条件中的一个或多个条件,保证不会发生死锁。
1、破坏互斥条件
2、破坏占有及等待条件
3、破坏不可剥夺条件
4、破坏环路等待条件
可剥夺资源:
可以被其他进程抢占的资源,如CPU、内存等
不可剥夺资源:
一旦进入便不可被抢占,只能完成后自己释放,如打印机、磁带机等。
8、目标模块装入内存有几种方式:
A、绝对装入B、可重定位装入C、动态运行时装入
4.类似图片中的题目,数组做函数参数
7,4,4,7
二、找错、改错
1、请指出以下程序的两处错误,并给出错误原因:
#include
#include
#include
voidGetMemory(char**p,intnum)
{
if(NULL==p&&num>0)
return;
*p=(char*)malloc(num);
return;
}
voidmain(void){
char*str=NULL;
GetMemory(&str,100);
if(NULL!
=str){
strcpy(&str,"hello");
printf(str);
}
returntrue;
}
错误1:
main函数返回值类型为void不可以有returntrue.
错误2:
strcpy(&str,”hello”);修改为strcpy(str,”hello”);
}
题目结果:
hello
strcpy(s1,s2);strcpy函数的意思是:
把字符串s2中的内容copy到s1中,连字符串结束标志也一起copy.
char*s2=”ch”这样s1在内存中的存放为:
ch\0;
在cout<ch\0。
strlen函数的意思是测试字符串的字符长度,不含字符串结束标志的。
sizeof是个运算符,它的结果是字符串在内存中的所占字节大小,它要把\0算进去的。
2、如下程序用于输出“WelcometoHuaweiTest”,请指出其中的两处错误,并给出错误原因。
char*GetWelcome(void){
char*pcWelcome;
char*pcNewWelcome;
pcWelcome="WelcometoHuaweiTest";
pcNewWelcome=(char*)malloc(strlen(pcWelcome));
if(NULL==pcNewWelcome){
returnNULL;
free(pcNewWelcome);
}
strcpy(pcNewWelcome,pcWelcome);
returnpcNewWelcome;
}
错误1:
pcNewWelcome=(char*)malloc(strlen(pcWelcome));修改为pcNewWelcome=(char*)malloc(strlen(pcWelcome)+1);
错误2:
returnNULL;free(pcNewWelcome);顺序错了,先free再return
测试程序如下:
#include
#include
#include
char*GetWelcome(void){
char*pcWelcome;
char*pcNewWelcome;
pcWelcome="WelcometoHuaweiTest";
pcNewWelcome=(char*)malloc(strlen(pcWelcome));
if(NULL==pcNewWelcome){
returnNULL;
free(pcNewWelcome);
}
strcpy(pcNewWelcome,pcWelcome);
returnpcNewWelcome;
}
voidmain(){
char*str;
str=GetWelcome();
printf(str);
}
3、请指出下面程序的两处错误,并给出错误原因:
unsignedlongFUNC_B(unsignedcharstr)
{
unsignedlongsum;
while(0<=str)
{
sum+=str;
str--;
}
returnsum;
}
错误1:
sum赋初值=0;
错误2:
0<=str修改为0测试程序:
#include
#include
#include
unsignedlongFUNC_B(unsignedcharstr)
{
unsignedlongsum=0;
while(0{
sum+=str;
str--;
}
returnsum;
}
//seeitclearly!
//thisbutton;右键添加断点或者
(F9)
//thismenu;
或者菜单栏中组件—>开始调试(F5)
//shift+F9—quickwatch
//找到原因了吧?
嗯,sum初始化问题,
intmain()
{
//now,initialthissum;letusgettheissue;
//declareanumfirst;
//addabreakpointhere
//clearly?
unsignedlongsummer;
summer=FUNC_B(5);
return0;
}
应用题
注意:
p是数组的首地址,相当于指针常量,是不能赋值。
p++ 相当于 p = p + 1; 隐含的要改变p的值,这肯定不成, 也就是说p不能做左值(l-value),应该换个指针变量来指向p。
1、对于一个任意输入的少于200字节的字符串,把它按‘-’分成若干子串(子串最多20个),输出原始字符串和每个子串,要求能依次处理用户输入的多个字符串,直到用户输入字符串“0”时程序退出。
#include
usingnamespacestd;
#include
voidmain(){
charstr_s[200];
char*ptr=str_s;
char*pt=str_s;
intlenth;
cout<<"pleaseinputthesourcestringyouwanttodealwith:
"<while(true){
gets(str_s);
lenth=strlen(str_s);
char*ptr=str_s;
char*pt=str_s;
if(str_s[0]=='0')
{
break;
}
intflag=0,length=0;
if(lenth<200){
while(*ptr!
='\0'&&length<=lenth){
cout<<*ptr;
ptr++;
length++;
}
cout<while(*pt!
='\0'&&flag<=20){
if(*pt!
='-'){
cout<<*pt;
pt++;
}
else{
flag++;
pt++;
cout<}
}
cout<}
cout<<"pleaseinputthesourcestringyouwanttodealwith:
"<}
}
小笨解析:
#include"stdafx.h"
#include
usingnamespacestd;
int_tmain(intargc,_TCHAR*argv[])
{
chargetword[200];
cout<<"Pleaseenteryourword:
"<while(true)
{
cin>>getword;
if(getword[0]=='0')
{break;}
}
return0;
}
这么写就能处理多个了
小笨的程序:
引入临时数组
#include
usingnamespacestd;
intmain()
{
cout<<"Pleaseenteryourword:
"<//charoutdata[20][200];//用于保存输出的二维数组。
while(true)
{
chargetword[200]={'\0'};//保存用户输入的数组
cin>>getword;//用户输入,碰到回车键的时候进行判断
cout<if(getword[0]=='0')//如果输入为0,退出执行程序
{
break;
}
intnum=0;//源数组的计数
inttempnum=0;//临时数组的计数
intlength=strlen(getword);
if(getword[length-1]!
='-')//如果最后一个字符不是“-”,则自动添加一个“-”
{
getword[length]='-';
getword[length+1]='\0';
}
chartemparray[200]={'\0'};//数组初始化操作
while(getword[num]!
='\0')
{
if(getword[num]=='-')//如果碰到了“-”数组计数依然向后移动,
//而临时数组归零,为下一个数组。
{
temparray[tempnum]='\0';
cout<tempnum=0;
}
else
{
temparray[tempnum]=getword[num];//将子串赋给临时数组
tempn