原题链接:点这儿.
1、一个C语言程序在一台32位机器上运行。程序中定义了三个变量x, y, z
,其中x
和z
是int型,y
为short型。当x=127,y=-9
时,执行赋值语句z=x+y
后,x, y, z
的值分别是
x=0000007FH,y=FFF9H,z=00000076H
x=0000007FH,y=FFF9H,z=FFFF0076H
x=0000007FH,y=FFF7H,z=FFFF0076H
x=0000007FH,y=FFF7H,z=00000076H
D.
计算机中表示数据都是用补码表示的,那么如何快速求补码呢?先写出该数对应的二进制原码,然后从右往左找到第一个1,这个1左边的二进制全部取反,符号位不变,右边的二进制不变;y
的二进制原码为1000000000001001
,得到补码为1111111111110111
,即FFF7H
,依次可得x
的补码为0000007FH
,z=x+y=118
,补码为00000076H
。
2、关于进程状态的说法,下列错误的是
- 处于就绪状态的进程,当进程调度程序为之分配了处理机后,该进程便由就绪状态变为执行状态
- 当前进程因发生某事件而无法执行,如访问已被占用的临界资源,就会使进程由执行状态转变为阻塞状态
- 当前进程因时间片用完而被暂停执行,该进程便由执行状态转变为阻塞状态
- 处于挂起状态的进程不能接收处理机调度
C.
要分清楚阻塞状态和就绪状态的导致原因是什么。阻塞状态的原因是当前进程得不到除CPU之外的资源而导致等待的一种状态;就绪状态的原因是当前进程得不到CPU而导致等待的一种状态。很明显,C选项是因为得不到CPU,所以该进程由执行状态变为就绪状态。
3、同一进程下的线程不可以共享的是
- stack
- data section
- code section
- file fd
A.
同一进程下的进程由自己独立的栈空间,因此不可以共享栈段;
- 线程可以共享的资源:
- 地址空间
- 全局变量
- 打开的文件
- 子进程
- 信号及信号服务程序
- 线程不可以共享的资源:
- PC的值
- 寄存器
- 栈段
- PSW的值
4、在OSI 7 层模型中,网络层的功能有
- 确保数据的传送正确无误
- 确定数据包如何转发与路由
- 在信道上传送比特流
- 纠错与流控
B.
AD是数据链路层的功能;C选项是物理层的功能;B选项是网络层的功能。
5、应用程序PING 发出的是什么报文
- TCP 请求报文
- TCP 应答报文
- ICMP 请求报文
- ICMP 应答报文
C.
Ping命令工作在应用层,直接使用网络层的ICMP协议,而没有使用传输层的TCP或UDP协议,traceroute工作在网络层 ;Ping命令测试两个主机之间的连通性,traceroute用来跟踪分组经过的路由。
6、使用traceroute命令测试网络时可以
- 检验链路协议是否运行正常
- 检验目标网络是否在路由表中
- 检验应用程序是否正常
- 显示分组到达目标路径上经过的各路由器
D.
见上一题的解析。
7、主机甲向主机乙连续发送了两个TCP报文段,其序号分别为70和100。下列错误的是
- 第一个报文段携带了30个字节的数据
- 主机乙收到第一个报文段后发回的确认中的确认号是100
- 如果主机乙收到第二个报文段后发回的确认中的确认号是180,那么甲发送的第二个报文段中的数据有80字节
- 如果甲发送的第一个报文段丢失了,但第二个报文段到达了乙,乙在第二个报文段到达后向甲发送确认,这个确认号为100
D.
TCP协议的确认机制是累积确认,当且仅当前面的所有数据都正确收到时,接收方才会发送下一个期望收到的数据包的序号
8、在单链表中删除指针p
所指结点的后继结点,则执行什么操作
p->next=p->next->next
p->next=p->next
p=p->next->next
p=p->next;p->next=p->next->next
A.
A选项是正确的做法;
B选项不知道在干什么;
C选项是令当前结点指向当前结点的下下个结点;
D选项删除了指正p
指向结点的后续结点的后续结点。
9、表达式(a-b)*(c+5)
的后缀式是
a b c 5 + * -
a b – c + 5 *
a b c - * 5 +
a b - c 5 + *
D.
考察后缀表达式的处理。
如何求后缀表达式:设立一个符号栈s
;扫描表达式,遇到数字和变量直接照写,遇到操作符则和栈顶的操作符进行比较,如果当前操作符级别大于栈顶操作符,则将当前操作符入栈,如果当前操作符级别小于或等于栈顶操作符,那么对s
执行出栈操作,直到当前操作符级别大于栈顶操作符,然后将当前操作符入栈;还要注意,遇到左括号则无条件入栈,虽然左括号优先级最低,遇到右括号则对s
进行出栈操作,直到遇到左括号为止;最后将栈中的操作符一次出栈,这样后缀表达式就求完了。
10、堆是一种数据结构,下面哪一个是堆
(10,50,80,30,60,20,15,18)
(10,18,15,20,50,80,30,60)
(10,15,18,50,80,30,60,20)
(10,30,60,20,15,18,50,80)
B.
堆采用完全二叉树存储,故把数组写成二叉树的形式,然后判断下是否符合大根堆和小根堆就行了。
11、略。
12、略。
13、编程题:读入一个字符串str
,输出字符串str
中的连续最长的数字串
#include <bits/stdc++.h>
using namespace std;
int main()
{
string str;
cin >> str;
str += "a";
int ans_src, ans_des, ans_len = 0;
for (int i = 0, src = 0, des = 0; i < (int)str.size(); i++) {
if (isdigit(str[i]))
des = i + 1;
else {
if (ans_len < des - src) {
ans_len = des - src;
ans_src = src;
ans_des = des;
}
src = des = i + 1;
}
}
cout << str.substr(ans_src, ans_len) << endl;
return 0;
}
14、编程题:找出n
个数里最小的k
个
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<int> arr;
int x;
while (cin >> x)
arr.push_back(x);
sort(arr.begin(), arr.end() - 1);
for (int i = 0; i < arr[arr.size() - 1]; i++)
cout << arr[i] << (i == arr[arr.size() - 1] - 1 ? "\n" : " ");
return 0;
}
15、编程题:输入n
个整数,输出出现次数大于等于数组长度一半的数。
设置一个哨兵,遍历数组,遇到和哨兵不一样的值,使哨兵的数量减一;如果一样,使其数量加一;如果哨兵的数量为0,则设置当前元素为新的哨兵,最后由于保证一定有解,于是就直接输出哨兵就行了,如果不保证有解,那么最后还要遍历一遍数组,判断下哨兵到底是不是解。
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<int> arr;
int x;
while (cin >> x)
arr.push_back(x);
int tag = arr[0], cnt = 1;
for (int i = 1; i < arr.size(); i++)
if (tag == arr[i])
++cnt;
else if (cnt > 0)
--cnt;
else
tag = arr[i], cnt = 1;
cout << tag << endl;
return 0;
}
16、略。