一、选择题:
1.一个含有n个顶点和e条边的简单无向图,在其邻接矩阵存储结构中共有____个零元素。
A.e    B.2e    C.n2-e   D.n2-2e
2.____是面向对象程序设计语言中的一种机制。这种机制实现了方法的定义与具体的对象无关,而对方法的调用则可以关联于具体的对象。
A.继承(Inhertance) B.模板(Template)
C.对象的自身引用(Self-Reference) D.动态绑定(Dynamic Binding)
3.应用层DNS协议主要用于实现 网络服务功能.
A. IP地址到网络设备名字的映射 B. IP地址到网络硬件地址的映射
C. 网络设备名字到IP地址的映射 D. 网络硬件地址到IP地址的映射
4.linux默认情况下,一个进程最多能打开多少文件?
A.64 B. 128 C. 512 D. 1024
5.下面结构体
struct s1 {
char ch, *ptr;
union {
short a, b;
unsigned int c:2, d:1;
}
struct s1 *next;
};
的大小是_____:
A. 12字节 B.16字节 C.20字节 D. 24字节

6.任何一个基于"比较"的内部排序的算法,若对6个元素进行排序,则在最坏情况下所需的比较次数至少为____。
A.10 B.11 C.21 D.36
7.以下不是进程间通讯的是___
A 共享内存 B 信号量 C线程局部存储 D 消息队列
8.下面程序,求count的值
int func(x)
{
int count= 0;
x=9999;
while(x)
{
Count ++;
x = x&(x-1);
}
return count;
}

A 8; B 10; C 5; D 11
9.使用malloc系统调用分配的内存是在____ 上分配的?
A 栈; B bss; C 物理内存; D 堆
10.最坏情况下,合并两个大小为n的已排序数组所需要的比较次数_____
A.2n B.2n-1 C.2n+1 D.2n-2
二、简答题:20分,共3题
1.(5分)下面这段代码是把中英文混合字符串(汉字用两个字节表示,特点是第一个字节的最高位为1)中的大写字母转化为小写字母,请找出其中的bug,注意各种异常情况。
for (char *piterator = szWord; *piterator != 0; piterator++)
{
if (*piterator & 0x80 != 0)
{
piterator++;
}
else if (*piterator >= A && *piterator <= Z)

piterator += 32;
}

2.(5分)对给定的上亿条无序的url,请按照domain、site以及path分别排序,并请指出排序过程中可能会遇到的哪些问题?如何提高效率?
例如:[url]http://www.baidu.com/path/about.html[/url],domain、site以及path的定义分别如下:
Domain:baidu.com
Site:[url]www.baidu.com[/url]
Path: [url]www.baidu.com/path[/url]
3.(10分)某型CPU的一级数据缓存大小为16K字节,cache块大小为64字节;二级缓存大小为256K字节,cache块大小为4K字节,采用二路组相联。经测试,下面两段代码运行时效率差别很大,请分析哪段代码更好,以及可能的原因。
为了进一步提高效率,你还可以采取什么办法?
A段代码
int matrix[1023][15];
const char *str = "this is a str";
int i, j, tmp, sum = 0;
tmp = strlen(str);
for(i = 0; i < 1023; i++) {
for(j = 0; j < 15; j++) {
sum += matrix[i][j] + tmp;
}
}

B段代码
int matrix[1025][17];
const char *str = "this is a str";
int i, j, sum = 0;

for(i = 0; i < 17; i++) {
for(j = 0; j < 1025; j++) {
sum += matrix[j][i] + strlen(str);
}
}
三、编程题:30分 共1题
    注意:要求尽可能提供完整代码,如果可以编译运行酌情加分。
1. 内存中有一个长数组,条目数为10万,数组单元为结构体struct array,sizeof(struct array)为512字节。结构有一int型成员变量weight。现需要取得按weight值从大到小排序的前500个数组单元,请实现算法,要求效率尽可能高。 四、设计题:35分 共1题
   注意:请尽可能详细描述你的数据结构、系统架构、设计思路等,建议多写一些伪代码或者流程说明。
1. 请设计一个字典。以字符串为索引,存储用户定义的定长结构。要求有增、删、查、改的功能。已经给定一个函数,可以由字符串映射到一个签名,每个签名由两个 unsigned int类型组成。假设每一个字符串能够对应唯一的一个签名,完全没有重复(或者重复的概率可以忽略),并且签名分布足够均匀。
    请描述你的数据结构?内存如何申请?增、删、查、改的功能如何实现?如果操作很频繁,该如何优化?
 
 
5.下面结构体
struct s1 {
char ch, *ptr;
union {
short a, b;
unsigned int c:2, d:1;
}
struct s1 *next;
};
的大小是_____:
A. 12字节 B.16字节 C.20字节 D. 24字节
结果是:B,经过上机测试,我的猜测:sizeof(ch)==1+*ptr对齐字节3+sizeof(*ptr)=4+sizeof(union部分)=4+sizeof(*next)=4 共计为:16
即:1+3+4+4+4=16;主要考对齐问题

6.任何一个基于"比较"的内部排序的算法,若对6个元素进行排序,则在最坏情况下所需的比较次数至少为____。
A.10 B.11 C.21 D.36
解:A
这是2003年软考的64试题

8.下面程序,求count的值
int func(x)
{
int count= 0;
x=9999;
while(x)
{
count ++;
x = x&(x-1);
}
return count;
}

A 8; B 10; C 5; D 11
结果为:A:8,上机测试结果,手工计算我也不清楚,还请大家指教。

9.使用malloc系统调用分配的内存是在____ 上分配的?
A 栈; B bss; C 物理内存; D 堆
解:D

10.最坏情况下,合并两个大小为n的已排序数组所需要的比较次数_____
A.2n B.2n-1 C.2n+1 D.2n-2
解:B
二、简答题:20分,共3题
1.(5分)下面这段代码是把中英文混合字符串(汉字用两个字节表示,特点是第一个字节的最高位为1)中的大写字母转化为小写字母,请找出其中的bug,注意各种异常情况。
for (char *piterator = szWord; *piterator != 0; piterator++)
{
if (*piterator & 0x80 != 0)
{
piterator++;
}
else if (*piterator >= 'A' && *piterator <= 'Z')

piterator += 32;
}
解:看了csdn上的讨论后自己做了个测试:得知就是优先级问题:!=的优先级高于&,以下是测试代码:
#include "stdafx.h"
#include"iostream.h"
void UpToLow(char *szWord)
{
 for   (char   *piterator   =   szWord;   *piterator   !=   0;   piterator++)    
 {   
  // if (*piterator & 0x80 != 0) //原始错误代码
  //if   ((*piterator   &   0x80)   ==   0x80)//或者
  if ((*piterator & 0x80) != 0)
  {    
   piterator++;    
  }    
  else   if   (*piterator   >=   'A'   &&   *piterator   <=   'Z')    
  {  
   *piterator   +=   32;        
  }     
 }
}
int main(int argc, char* argv[])
{
 char str[]="ASD我是中国人ASDsad";
 cout<<str<<endl;
 UpToLow(str);
 cout<<str<<endl;
 return 0;
}
结果: 
原始:
ASD我是中国人ASDsad
asD我是中国人AsDsad
修正后:
ASD我是中国人ASDsad
 asd我是中国人asdsad
3:

3.(10分)某型CPU的一级数据缓存大小为16K字节,cache块大小为64字节;二级缓存大小为256K字节,cache块大小为4K字节,采用二路组相联。经测试,下面两段代码运行时效率差别很大,请分析哪段代码更好,以及可能的原因。
为了进一步提高效率,你还可以采取什么办法?
A段代码
int matrix[1023][15];
const char *str = "this is a str";
int i, j, tmp, sum = 0;

tmp = strlen(str);
for(i = 0; i < 1023; i++) {
for(j = 0; j < 15; j++) {
sum += matrix[i][j] + tmp;
}
}

B段代码
int matrix[1025][17];
const char *str = "this is a str";
int i, j, sum = 0;

for(i = 0; i < 17; i++) {
for(j = 0; j < 1025; j++) {
sum += matrix[j][i] + strlen(str);
}
}
我的想法:
1:B中strlen(str)重复计算,而且可以提到外边整体直接计算。以下有csdn网友代码:
for(i   =   0;   i   <   1023;   i++)   {    
  for(j   =   0;   j   <   15;   j++)   {    
  sum   +=   matrix[i][j];    
  }    
  }      
  sum   +=   strlen(str)*1023*15;
2:A中是按行存取,而B中是按列存取,而一般操作系统都是按行存储的,A可以连续读取。
另外,A的大小是1023*15<16K故一级缓存就可以全部装下,而B大小是1025*17>16K,故B必然会发生缺叶中断,但B是按列存取,不是连续存取,过他会频繁的交换数据,导致多次发生无谓的缺叶中断。