全部知识点
int x=2; z=x++-1;
则x的值为_____。
已知:
int i=8,j=10,m,n; m=++i; n=j++;
问语句执行后m=_____,n=_____。
输入整型变量a的值:
int a;
scanf("%d",_____);当a=3,b=2,c=1时,执行以下程序段后a=_____。
if(a>b) a=b; if(b>c) b=c; else c=b; c=a;
表示"x≥y≥z"的C表达式是_____。
设x=5>1+2,x的值为_____。
若输入字符串:abcde<回车>,则以下while循环体将执行_____次。
while((ch=getchar())=='e')
printf("*");按内存排列顺序,数组char a[2]中的所有元素是a[0]和_____。
若有定义:
char s[]="china";
则C编译系统为数组s开辟_____个字节的内存单元。
函数调用语句func((e1,e2),(e3,e4,e5))中含有_____个实参。
预处理命令行都必须以_____号开始。
将数组a的首地址赋给指针变量p的语句是_____。
设有以下共用体类型说明和变量定义,则变量c在内存所占字节数是_____。
union stud
{
short int num;
char name[10];
float score[5];
double ave;
}
c;功能:统计出若干个学生的平均成绩,最高分以及得最高分的人数。
例如:输入10名学生的成绩分别为92 87 68 56 92 84 67 75 92 66,则输出平均成绩为77.9,最高分为92,得最高分的人数为3人。
#include<stdio.h>
float max=0;
int j=0;
float fun(float array[],int n)
{
int i;
float sum=0,ave;
_____1_____
for(_____2_____)
{
if(_____3_____)
_____4_____
_____5_____
}
_____6_____
for(_____7_____)
if(_____8_____)
_____9_____
_____10_____
}
TestFunc()
{
FILE *IN,*OUT;
float iIN[10],iOUT;
int iCOUNT;
IN=fopen("in.dat","r");
if(IN==NULL)
{
printf("Please Verify The Currernt Dir..It May Be Changed");
}
OUT=fopen("out.dat","w");
if(OUT==NULL)
{
printf("Please Verify The Current Dir.. It May Be Changed");
}
for(iCOUNT=0;iCOUNT<10;iCOUNT++)
fscanf(IN,"%f",&iIN[iCOUNT]);
iOUT=fun(iIN,10);
fprintf(OUT,"%f %f\n",iOUT,max);
fclose(IN);
fclose(OUT);
}
void main()
{
float a[10],ave;
int i=0;
for(i=0;i<10;i++)
scanf("%f",&a[i]);
ave=fun(a,10);
printf("ave=%4.1f\n",ave);
printf("max=%4.1f\n",max);
printf("Total:%d\n",j);
TestFunc();
}(13分)对于有向图,如果一个顶点的出度大于入度,则这个顶点称为K页点,有向图用邻接矩阵存储,数据结构定义如下:
typedef struct{
int numVertex, numEdge;//顶点数,边数
char VertexList[MAXV];//顶点表
int Edge[MAXV][MAXV];//邻接矩阵
}MGraph;要求实现函数int printVertices(MGraph G),输出有向图中所有K页点,并返回K顶点的总数
(1)说明算法思想(占5-6分)
(2)用C/C++实现算法(占7-8分)
[
(10分)在进行外部排序时,可使用置换-选择排序生成初始归并段。内存工作区可存储n个记录,某文件含 n 个记录。
(1)若n=19,m=4。文件记录关键字为:51,94,37,92,14,63,15,99.48,56,23,60,31,17,43,8,90,166,100。使用置换-选择排序,可生成几个初始归并段?每个归并段各是什么?
(2)对于任意 m(n>>m>0),使用置换-选择排序生成第一个初始归并段的最大可能长度、最小可能长度分别是?
[
(14分)某机器字长为32位的计算机M,采用请求调页存储管理。虚拟地址32位,页面大小4KB。Cache采用4路组相联映射,内存块大小为32B,Cache数据区大小为8KB。二维数组int a[24][64]按行优先存储,数组的起始虚拟地址为0042 2000H。数组a的数据初始时未调入内存,按如下方式访问数组a:
for (int i=0;i<24; i++) for (int j=0;j<64; j++) a[i][j]=10;
(1)数组a分为几个页面存储?访问数组a 缺页几次?页故障地址各是什么?
(2)不考虑对变量i,j的访问,访问数组 a 的过程是否具有时间局部性?为什么?
(3)在计算机M的32位地址中,块内地址是哪几位? Cache组号是哪几位?数组元素a[1][0]的虚拟地址是什么?对应的Cache组号是什么?
(4)数组a总共占多少块?访问a的Cache 命中率是多少?若采用如下方式访问数组a,则命中率又是多少?
for (int j=0;j<64;j++) for (int i=0; i<24; i++) a[i][j]=10;
[
(9分)43题的C语言代码,对应的机器级代码如下,请回答问题。
for(int i=0;i<24;i++) 1 00401070 C7... mov[ebp-8],0 2 00401079 EB 09 jmp 00401084h 3 0040107B 8B 55 F8 mov eax,[ebp-8] ... ... ... ... 7 00401088 7D32 jpe 004010bch for(int j=0;j<64;j++) 8 0040108A C7 45... mov[ebp-4],0 ... ... ... ... a[i][j]=10; ... ... ... ... 19 004010AE C7 84 82 00 20 42 00 0A 00 00 00 mov[ecx+edx*4+00422000h],0Ah 20 ... ...
(1)第20条指令的虚拟地址是什么?
(2)第2条指令jmp的操作码是 EBH,它的转移目标地址是00401084h。第7条指令jge的操作码是7DH,它的转移目标地址是 004010bch。这两条指令分别采用什么寻址方式?请给出jmp 指今的转移目标地址计算过程
(3)第19条指令,实现了adll-10该指今的源操作数采用什么寻址方式?已知edx 存放的值,ecx存放的是什么?该系统采用大端还是小端存储?
(4)第一次取第19条指令时,是否发生缺页?为什么?
[
(7分)采用swap 指今实现进程互斥。lock为TRUE时,不可进入临界区; lock 为FALSE 时,可以进入临界区。某学生写的代码如下:
bool lock = FAlSE;//共享变量 ...... // 进入区 bool key = TRUE; if (key == TRUE) swap (key,lock); // 临界区 ...... // 退出区 lock=TRUE; ......
newSwap (boola, bool *b){
bool temp =*a;
*a=*b;
*b=temp;
}(1)请修改代码,正确实现互斥(不增加语句条数)
(2)是否可以用函数newSwap(&a&b)代替swap 指令?为什么?
[
(8分)进程P通过系统调用请求从键盘读入一个字符。题目乱序给出6个处理步骤:1.将进程P插入就绪队列,2.将进程插入阻塞队列,3.将字符从键盘控制器读入系统缓冲区,4.启动中断处理程序,5.系统调用返回,6.用户通过键盘输入字符。
(1)1.的前、后分别是哪个步骤? 6.的后面是什么步聚?
(2)哪个步骤一定会使CPU从P进程切换到其他进程?哪个步骤之后调度器可以调度进程p?(3)哪个步骤是由键键盘驱动程序完成的?
(4)中断处理时,进程P是什么状态? CPU处于内核态还是用户态?
[参考管案]
(1)1的前面是3(1分)
1的后面是5(1分)
6的后面是4(1分)
(2)2使得CPU从进程P切换为其他进程 (1分)
1之后调度器可以调廉进程P (1分)
(3)3由键盘驱动程序完成(1分)
(4)中断处理时,进程P处于阻塞态(1分)
CPU处于内核态(1分)
[解析]6个步骤的处理序是: 2 6 4 3 1 5