1:
char s[]=”01231/0123asd”;
For(int i=0;s[i]!=0;i++)////这里的for循环遇到’\0’才会终止
2:void *fun()///说明该函数的返回值是无值型的指针类型
Void (*fun)()///说明指针fun指向一个函数,该函数无返回值
3:河内塔:n个盘子,3个柱子
void Hanoi(int n,int p1,int p2,int p3 ){
if(n==1)
cout<<”从盘子”<<p1<<”移到”<<p3<<endl;///当只移动一个时
else{
Hanoi(n-1,p1,p3,p2);///先将n-1各从p1移动到p2
cout<<”从盘子”<<p1<<”移到”<<p3<<endl;///输出每次的过程
Hanoi(n-1,p2,p1,p3);///再将n-1各从p2移动到p3
}
}
4:static函数与普通函数的区别:static函数只能在当前文件中说明和定义,在当前文件下使用,普通函数可以使用外部的函数,只需要在头文件或使用前说明即可;static的好处是不同文件可以使用相同的名字。
5:int (*a)[10] 一个指向有10个整数数组的指针
Int (*a)(int) 一个指向函数的指针(此函数有一个整型参数,同时返回一个整型数)
(*p)++是指数值增1 *p++是指指针增1
6:
Int a[5]={1,2,3,4,5};
Int *ptr=(int*)(&a+1);
Cout<<*(a+1)<<”\”<<*(ptr-1);
输出结果是2\5;;;;因为*(ptr-1)是a[4],&a+1不是首地址加1,而是一个a数组的偏移,是偏移了一整个数组的大小,所以*ptr=a[5](即*(a+5)),所以*(ptr-1)=a[4]=5
7:
#define f(x) x*x;
Int a=3 ;
s=f(a+1);///此代码会先待人f(x)再执行a+1 所以s=a+1*a+1=7
#define pi 3;
#define f(x) pi*x*x;////宏不能用来计算,所以程序错误
8:for(int k=-1;k=1;k++){....}////循环体会一直无限循环,因为k=1这个赋值语句总是正确,所以无限循环;;如果改为=k==1则for循环不会执行。
9:循环队列:
typedef struct{///定义一个循环队列
DataType data[QueueSize];///data数组
int front,rear;
}Cirqueue;
void EnQueue(Cirqueue *q,DataType x){///入队,从rear位置插入,每插入一个rear就向后移动一位
if(q->rear+1%QueueSize==q->front){///判断是否满了
cout<<"overflow"<<endl;exit(-1);
}
q->data[q->rear]=x;///将数组的即rear位赋值,rear即当前位置
q->rear=q->rear+1%QueueSize;///将rear+1
}
DataType DeQueue(CirQueue *q){///出队,返回数据,从front开始出站
DataType t;
if(q->front==q->rear){///判断是否为空
cout<<"empty"<<endl;exit(-1);
}
t=q->data[q->front];///取出第front位置的数据
q->front=q->front+1%Queuesize;///将front+1
return t;
}
10:快速排序递归实现n个不同元素集合中第i小的元素
int Partition(int *A,int low,int high){
int key=A[low];
while(low<high){
while(low<high&&A[high]>=key)
--high;
swap(A[low],A[high]);
while(low<high&&A[low]<=key)
++low;
swap(A[low],A[high]);
}
A[i]=key;
return i;
}
int find(int i,int *A,int m,int n){
int p=Partition(A,m,n);
if(p==i)return A[p];
if(p>i) return find(i,A,m,p);
if(p<i) return find(i-p,A,p,n);
}
11:某数据量很大序列中前i个最大或最小者,不要求完全排序(选择较快速的方法)
可以使用快速排序的方法,
void maxi(int *a,int i,int start,int end){
int j=(start+end)/2,xx,yy,ss=start,ee=end;
while(ee>ss){
while(ee>ss&&a[ss]<=a[j])
ss++;
while(ee>ss&&a[ee]>a[j])
ee--;
swap(a[ss],a[ee]);
}
if(end-ss+1-i==0) return null;
if(end-ss+1-i>0) maxi(a,i,ss,end);
else maxi(a,i-(end-ss+1),start,ee);
}
12:已知(a1,a2,....,an-1)是堆,请将(a1,a2,....,an)调整为堆,要求时间复杂度为O(logn);
假设(a1,a2,....,an-1)是最小堆,从底部开始调整,从a[n]开始调整。对于a[i]来说,他的父节点为a[i/2],如果a[i/2]>a[i]的话,就swap,并且从i/2开始继续向上调整。
void adjust(int *a,int n){
int i=n;
int tmp=a[n];
while(i>1){
int j=i/2;
if(a[j]>a[i])
a[i]=a[j];
else
break;
i=j;
}
a[i]=tmp;
}
13:进程同步与互斥
同步是指进程间沟通完成一项任务时直接相互作用的关系,即具有伙伴关系的进程在执行时间次序上必须遵守的规律;
互斥是指进程因竞争同一资源而相互制约,多个资源不能占用同一资源,信号量的初值为1
例:若有一个仓库,可以存放P1,P2两种产品,每次只能存放一种产品:
有 w=P1的数量-P2的数量; -i<w<k;
使用P-V操作实现产品入库,那么至少需要多少个同步信号量及多少个互斥信号量,其初值分别为多少
解:2 1 i-1,k-1 1
可得p1-p2<k ; p2-p1<i ;所以同步信号需要两个同步信号量,当不存p2时,当p1存了k-1个后,p1必须等到p2的存入才可以;当不存p1时,当p2存了i-1个后,p2 必须等到p1的存入才可以;所以需要两个同步信号量。
每次只能存放一种产品,所以需要一个互斥量。
14:在页式系统中,页表存放在内存中:
当无快表的情况下,需要两次访问内存才能得到页面;
在有快表的情况下,根据该数据所在的页号在快表中找出对应的物理块号,然后拼接页内地址,以形成物理地址,那么访问内存仅一次;如果在快表中没有相应的页号,则地址映射仍然通过内存中的页表进行,得到物理页块后写入空闲的快表中,则需要两次;
两次访问内存:
一次是根据页号访问页表,读出页表中的块号以便形成物理地址;
一次是根据地址进行读写操作;
(为了提高存取速度,在地址变换机构中增设了一个具有并行查询能力的特殊高速缓冲存储器,即快表)
15:在操作系统中,虚拟设备通常采用 Spooling 技术,采用 利用磁盘 设备来提供虚拟设备。
(Spooling技术是关于慢速字符设备如何与主机交换信息的一种技术,通常称为假脱机技术,实际上是一种外围设备同时联级操作技术,又称排队转存技术)
16:数据库:外模式、模式、内模式是数据库系统的3级模式;
网络模型、层次模型、关系模型是几种基本数据模型;
实体、联系、属性是概念中设计的基本概念;
数据结构、数据操作、完整性约束是数据模型的3要素;
17:ARP协议
在局域网中每台主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP地址和MAC地址的对应关系。
当源主机需要发送数据包到目的主机时,会首先检查自己的ARP列表中是否存在该IP地址对应的MAC地址,
如果有就直接向此MAC地址发送数据包;
如果没有,就需要向本地网段发送一个ARP请求的广播包,查询此目的主机对应的MAC地址。
此ARP数据包里包含源主机的IP地址,硬件地址,以及目的主机的IP地址;;
所有主机收到这个ARP请求后会检查自己的IP是否与此IP相同;;如果相同,此目的主机首先将发送端的MAC地址和IP地址添加到自己的ARP列表中,如果列表中已经存在该IP的信息,就将其覆盖,然后给源主机发送一个ARP响应数据包;源主机收到ARP响应数据包后,将得到的目的主机的IP地址和MAC地址添加到自己的ARP列表中,并利用此消息开始数据的传输。
18:严格路由由选项规定IP数据包要经过路径上的每一个路由器,且相邻路由不得有其他路由器,且顺序不能改变;
松散路由只是给出IP数据报必须经源站指定的路由器,不给出一条完整的路径,无直接连接的路由器之间的路由续IP软件的寻址功能补充;
19:设备驱动是一种可以是计算机和设备通信的特殊程序,可以说相当于硬件的接口,操作系统直接通过这个接口控制硬件设备的工作
设备驱动程序的任务是接收来自于设备无关的上层软件的抽象请求,进行与设备相关的处理