文档库 最新最全的文档下载
当前位置:文档库 › 2014 C复试(seven吐血回忆)

2014 C复试(seven吐血回忆)

笔试考了175分。 回忆的时候发现自己出了很多错误,概念题也错了不少
答的不好的地方,回帖指正,本着帮助大家的原则,用尽脑力今天全部回忆了一遍
一、指出程序中的错误,说明原因并修正。
1、
Int *p,*q;
p=(int*)malloc(sizeof(int)*20);
q=(int*)malloc(sizeof(int)*10);

q=p;//修改的话可以删除这句话

free(p);
free(q);//重复释放同一内存会报错,还剩一块内存没有释放,内存泄露

2、交换两个字符串
Void swap(char *p, char *q)
{
Char temp[100];
Strcpy(temp,p);
Strcpy(p,q);
Strcpy(q,temp);
}

二、简答题
1、arr为整型数组,N为数组长度-1,enumb为整型变量,下列函数负责找出arr数组中等于enumb的元素所在位置。
For(i=N-1;arr!=enumb;--i)
Printf(“%d”,i);
指出程序会出现的3种异常,并说明原因。
I为负数且运行结束,i为正数且运行结束,i一直递减直到堆栈溢出
2、if(B) s1 else s2;请用显式结构语言表示该程序段,用伪代码写出来(注明条件跳转和强制跳转)。
if(b) goto L1;
s2; goto L2;
L1: s1;
L2:;
3、C语言中,常量存储在哪儿?static 全局变量和static 局部变量存储在哪儿?
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式,
静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,
当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。
而静态全局变量则限制了其作用域,
即只在定义该变量的源文件内有效,
在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,
因此可以避免在其它源文件中引起错误。

static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
三、填空题(部分参考seven版)
1. 选择排序法的链表实现
P=(struct node*)malloc(sizeof());
p->next=head;
head=p;//新建一个头结点
p=head->next;
k=q=head;
while(...)
{
//初始化,记不得了,大体结构就这样
while(p)
{
if(q->next->datadata)
q=p;
p=p->next;
}
If(q!=k)
{
r=q-;
q->next=r->next;
p->next=r;
}
}
P=head;
head=head->next;
free(p)
return head;
2. 快速排序法求某个数组前n个元素第k大的数
(答案大概是 iLow=0;high=n-1;
do{
I=low;j=high;t=a;
do{
While(a[--j]>t);
While(a[++i]If(i

)swap(a[j],a);//具体代码实在忘了,反正不是空空,我这样写运行是一样的
}while(iIf(i==k)
Returnt;
If(i>k)
high=i-1;
if(ilow=i+1;
}while(lowReturn a[low];//这个空我可能错了
3. 100个人围成圈,从第一个人开始,1~3报数,数到3的人退出,问剩下来的人编号是多扫?
约瑟夫环数组实现(答案大概是 p=a+N ,k=N, p>a+N, i<3 ,i%3, a!=0 )
//此题我理解为0号那个人不算,只算1-100人
Int a[N+1];
Int *p=a,i;
For(i=0;i*p=i;
P=a+1;
K=N;
For(j=1,i=0;k!=1;j++)
{
If(p>a+N) p=a+1;
If(*p!=0) i++;
If((i%3)==0) { k--;i=0;*p=0;}
}
For(i=0;i{
If(p!=0)
Printf(.);
}
4. 完美乘法,a*b=c,abc中只出现0~9的数字,且每个数字在这个等式中只出现一遍。
(答案大概是 c=a*b while(y>0) y=y/10;if(f[x]!=1) t=1; if(t==0) n++ 这题看着麻烦,其实最简单)
//这题程序太多了,很多地方记不得了,但不影响填空
for(i=12;i<999;i++)
{
t=0;
for(x=0;x<10;x++)
f[x]=0;
for(j=345;j<9999;j++)
{
c=a*b;
s[0]=a;s[1]=b;s[2]=c;
for(x=0;x<3;x++)
{
y=s[x];
while(y>0)
{
Int t=y%10;
f[t]++;
y=y/10;
}
for(x=0;x<10;x++)
{
if(f[x]!=1) t++;
}
if(t==0)
n++;
}
}
}
四、程序题
1、编写函数,实现字符串的逆序,不允许申请新的数组空间
Void reverse(char *str)
{
Int i=0,len=strlen(str);
For(;i{
Char a=str;//突然想到我当时写成了Int,,。日
str=str[len-i-1];
str[len-i-1]=a;
}
}
2、身份证长度是18,其中第7至14个数字是生日,编写完整程序判断2个身份证号的出生日期先后。
Int judge(char *s1,char*s2)
{
Int low=6,high=14,i;
For(i=low;i{
If(s1>s2)
Return 1;
Else if(s1Return -1;
}
Return 0;
}
3、编写完整程序,计算1-x+x^2/2!-x^3/3!+…+x^n/n!,只允许有Main函数,不允许定义其他函数,x是单浮点数,n是整数。
(ywt贡献)
Floatsum=0,x=1,res=0,res1=0;
Int i,j,k;
for(i=1;ifor(j=1;jsum=sum*j;}

for(k=0;kx=x*x;}

res=x/sum; //得到结果
if(i%2==1) //处理符号
res=0-res;

res1=res+res1;
}
4、编写完整程序,一个链表,找出其中数据项最大的结点,然后将其移动到链表尾部(结点node由整型data和节点指针next构成),不允许申请新的结点。

(特殊情况我没考虑)
Struct node*p,*q,*r;
P=q=head;
while(p->next)
{
if(q->next->datanext->data)
q=p;
p=p->next;
}
r=q->next;
q->next=r->next;
p->next=r;
五、从提高程序执行效率的角度,说明C语言采取哪些措施并指出原因。
写的越多分越多,时间不够的随便写吧,我写了一点点扣了不少分

相关文档
相关文档 最新文档