经典c语言笔试题.docx
《经典c语言笔试题.docx》由会员分享,可在线阅读,更多相关《经典c语言笔试题.docx(35页珍藏版)》请在冰点文库上搜索。
经典c语言笔试题
100、
有两个磁盘文献A和B,各存储一行字母,规定把这两个文献中信息合并(按字母顺序排列),输出到一种新文献C中.
#include
#include
intmain(intargc,char*argv[])
{
FILE*fp;
inti,j,k,num,NUM;
charc[50],t,ch;
if((fp=fopen("A","r"))==NULL)
/*canbereplacedbyopen
*intfd=open("A",O_RDONLY|O_CREAT);*/
{
printf("fileAcannotbeopened\n");
exit(0);
}
printf("\nAcontentsare:
\n");
for(i=0;(ch=fgetc(fp))!
=EOF;i++)/*一种字符一种字符读*/
{
c[i]=ch;
putchar(c[i]);
}
num=i+1;
fclose(fp);
if((fp=fopen("B","r"))==NULL)
{
printf("fileBcannotbeopened\n");
exit(0);
}
printf("\nBcontentsare:
\n");
for(i=0;(ch=fgetc(fp))!
=EOF;i++)
{
c[num+i]=ch;
putchar(c[num+i]);
}
fclose(fp);
NUM=num+i+1;
for(k=0;k {
for(j=0;j {
if(c[j]>c[j+1])
{
t=c[j];
c[j]=c[j+1];
c[j+1]=t;
}
}
}
printf("\nCfileis:
\n");
fp=fopen("C","w");
for(i=0;i{
putc(c[i],fp);/*将字符一种个写入文献中*/
putchar(c[i]);/*一种个输出字符*/
}
fclose(fp);
return1;
}
86.有一浮点型数组A,用C语言写一函数实现对浮点数组A进行降序排序,并输出成果,规定要以数组A作为函数入口.(建议用冒泡排序法)
#include
#include
voidBubbleSort(intarr[],intn)
{
inti,j;
intexchange=1;//互换标志,提高算法效率;
inttemp;
for(i=0;i {
exchange=0;//本趟排序开始前,互换标志应为假
for(j=0;j {
if(arr[j+1]>arr[j])
{
temp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
exchange=1;//发生了互换,故将互换标志置为真
}
}
if(!
exchange)//本趟排序未发生互换,提前终结算法
return;
}
}
intmain(intargc,char*argv[])
{
intarr[5]={1,4,2,6,5};
inti;
BubbleSort(arr,5);
printf("aftersort,arris:
\n");
for(i=0;i<5;i++)
{
printf("%3d",arr[i]);
}
return1;
}
77.写出二分查找代码:
Intbinary_search(int*arr,intkey,intsize)
{
Intmid;
Intlow=0;
Inthigh=size-1;
While(low<=high)
{
Mid=(low+high)/2;
If(arr[mid]>key)
High=mid-1;
ElseIf(arr[mid] Low=mid+1;
Else
Returnmid;
}
Return-1;
}
补充1:
用帅选法查找100之内质数
#include
usingnamespacestd;
#defineN 100
intmain()
{
/*0~100共101个数*/
intsieve[N+1];
inti;
//step1:
初始化(sieve[i]=0表达不在筛中,即不是质数;1表达在筛中)
sieve[0]=sieve[1]=0;
for(inti=2;i<=N;i++)
{
sieve[i]=1;
}
//step2:
偶数(2倍数)必定不是质数,因此应当先筛除
for(i=2;i<=N/2;i++)
{
sieve[i*2]=0;
}
intp=2;//第一种质数是2
//step3:
从sieve中删去P倍数
while(p*p<=N)
{
p=p+1; //选下一种p
while(sieve[p]==0)
{
p++;
}
intt=p*p;
ints=2*p;/*质数与质数之和包括合数,但质数于合数之和必为质数,提高算法效率*/
while(t<=N)
{
sieve[t]=0; //删除
t=t+s;
}
}
//step4:
输出成果
for(i=2;i<=N;i++)
{
if(sieve[i]!
=0)
{
cout<
}
}
return1;
}
《《《《链表操作考察》》》》
87、实现双向链表删除一种节点P,在节点P后插入一种节点,写出这两个函数。
//删除操作
StatusListDelete_DuL(DuLinkList& L,int i,ElemType& e)
{
if(!
(p=GetElemP_DuL(L,i)))
return ERROR;//容错判断;
e=p->data;
p->prior->next=p->next;
p->next->prior=p->pror;
free(p);
p=NULL;//勿忘,否则内存泄露
returnOK;
}
//插入操作
StatusListInsert_DuL(DuLinkList&L,inti,ElemType&e)
{
if(!
(p=GetElemP_DuL(L,i)))
return ERROR;
if(!
(s=(DuLinkList)malloc(sizeof(DuLNode))))
return ERROR;
/*assert((s=(DuLinkList)malloc(sizeof(DuLNode)))!
=NULL)*/
s->data=e;
s->prior=p;
p->next->prior=s;
p->next=s;
s->next=p->next->next;
return OK;}
88、把一种链表反向。
//链表头插法;
intre_Link(LinklistH)
{
Linklistp=H->next,q;
H->next=NULL;
while(p!
=NULL)
{
q=p;
p=p->next;
q->next=H->next;
H->next=q;
}
return0;
}
《《《《strcpy和memcpy》》》》
76.已知strcpy函数原型是char*strcpy(char*strDest,constchar*strSrc);其中strDest是目字符串,strSrc是源字符串。
(1)不调用C++/C字符串库函数,请编写函数strcpy。
char*stringcpy(char*Des,constchar*Src)
{
assert((Des!
=NULL)&&(Src!
=NULL));
char*address=Des;
while((*Des++=*Src++)!
='\0');
returnaddress;
}
断言assert是一种宏,该宏在<assert>中,
当使用assert时候,给她个参数,即一种判读为真表达式。
预解决器产生测试该断言代码,如坚决言不为真,则发出一种错误信息告诉断言是什么以及它失败一会,程序会终结。
咱们普通可以用在判断某件操作与否成功上。
详见《高质量c&c++编程,林锐,6.5章》
(2)strcpy能把strSrc内容复制到strDest,为什么还要char*类型返回值?
为了实现链式表达式:
intlen=strlen(stringcpy(Des,"hello"));
内存复制:
void*memcpy(void*pvTo,constvoid*pvFrom,size_tsize)
{
assert((pvTo!
=NULL)&&(pvFrom!
=NULL));
byte*pbTo=pvTo;
byte*pbFrom=pbFrom;
while(size-->0)
{
*pbTo++=*pbFrom++;
}
returnpvTo;
}
注意:
内存拷贝时要避免内存空间重叠问题,(即pvfrom与pvto所指向内存不能重叠)
为了防止内存空间重叠,若是目的地址高于源地址,从后往前复制;
若是源地址高于目的地址,从前去后复制;
《《《《查找字符串中子串》》》》
84、请编写一种C函数,该函数在一种字符串中找到也许最长子字符串,该字符串是由同一字符构成。
#include
#include
#include
int ChildString(char*p)
{
char*q=p;
intstringlen=0,i=0,j=1,len=0,maxlen=1;
//stringlen=strlen(p);
while(*q!
='\0')//不能用strlen,求得长stringlen
{
stringlen++;
q++;
}
while(i {
if(*(p+i)==*(p+j)&&j {
len++;//记录子串长度
i++;
j++;
}
else
{
if(len>=maxlen)//记录最大子串长度
{
maxlen=len+1;
len=0;
}
else
len=0;
i++;
j++;
}
}
returnmaxlen;
}
intmain(intargc,char*argv[])
{
chararr[11];
intlen;
printf("pleaseinputchararr(10):
\n");
scanf("%s",arr);
len=ChildString(arr);
printf("thelenofchildarris:
%d\n",len);
return1;
}
99.计算字符串中子串浮现次数
办法1;
intmain(intargc,char*argv[])
{
charstr1[20],str2[20],*p1,*p2;
intsum=0;
printf("pleaseinputtwostrings\n");
scanf("%s%s",str1,str2);
p1=str1;
p2=str2;
while(*p1!
='\0')
{
if(*p1==*p2)
{
while((*p1++==*p2++)&& *p2!
='\0'); /*不断比较字符串1与2,至字符串2到达‘\0’*/
}
else
p1++; /*如果,字符串2一次匹配已结束,或者此刻*p1与*p2不等;*/
if(*p2=='\0') /*如果是字符串2结束,则成功找到一次,sum++*/
sum++;
p2=str2; /*p2始终指向str2;*/
}
printf("%d",sum);
return1;
}
办法2:
#include
#include
#include
//判断两字符串与否相等,相等返回1,不等返回0
intJudge(char*movePt,char*tempPt)
#if1
{
intret=0;
while(!
(*movePt-*tempPt)&&*tempPt)
{
movePt++;
tempPt++;
}
if(*tempPt=='\0')
{
ret=1;
}
returnret;
}
#endif
#if0
{
inti;
for(i=0;i {
if(*movePt!
=tempPt[i])
return0;
return1;
}
}
#endif
//计算子串浮现次数,str为原字符串,sub为子串
intStrCount(char*str,char*sub)
{
intcount=0;
char*move=str;
if(strlen(str) {
return0;
}
else
{
while(strlen(move)>=strlen(sub))
{
printf("%s\n",move);
if(Judge(move,sub))
{
count++;
printf("count++");
}
move++;
}
}
returncount;
}
intmain(intargc,char*argv[])
{
chararr1[20];
chararr2[20];
intnum;
printf("pleaseinputtwoarrs:
");
scanf("%s%s",arr1,arr2);
num=StrCount(arr1,arr2);
printf("thenumis:
%d\n",num);
return1;
}
90、输入一行字符,记录其中有多少个单词。
intmain(intargc,char*argv[])
{
charstring[81];
inti,num=0;//word=0;
charc;
gets(string); /*不能用scanf,视空格为终结*/
for(i=0;(c=string[i])!
='\0';i++)
{
if(c=='')
num++;
}
num++;
printf("Thereare%dwordsintheline\n",num);
return1;
}
83、请编写一种C函数,该函数在给定内存区域搜索给定字符,并返回该字符所在位置索引值。
intsearch(char*cpSource,intn,charch)//起始地址,搜索长度,目的字符
{
inti;
for(i=0;i=ch;++i);
returni;
}
《《《《数字问题,水仙花数,/和%用法》》》》
98某个公司采用公用电话传递数据,数据是四位整数,在传递过程中是加密,加密规则如下:
每位数字都加上5,然后用和除以10余数代替该数字,再将第一位和第四位互换,第二位和第三位互换。
#include
#include
intmain(intargc,char*argv[])
{
inta,i,aa[4],t;
scanf("%d",&a);
aa[0]=a%10;
aa[1]=a%100/10;
aa[2]=a%1000/100;
aa[3]=a/1000;
for(i=0;i<=3;i++)
{
aa[i]+=5;
aa[i]%=10;
}
for(i=0;i<=3/2;i++)
{
t=aa[i];
aa[i]=aa[3-i];
aa[3-i]=t;
}
for(i=3;i>=0;i--)
printf("%d",aa[i]);
return1;
}
97、809*?
?
=800*?
?
+9*?
?
+1其中?
?
代表两位数,8*?
?
成果为两位数,9*?
?
成果为3位数。
求?
?
代表两位数,及809*?
?
后成果。
output(longb,longi)
{
printf("\n%ld/%ld=809*%ld+%ld",b,i,i,b%i);
}
intmain()
{
long int a,b,i;
a=809;
for(i=10;i<100;i++)
{
b=i*a+1;
if(b>=1000&&b<=10000&&8*i<100&&9*i>=100)
output(b,i);
}
}
92、有1、2、3、4个数字,能构成多少个互不相似且无重复数字三位数?
都是多少?
#include"stdio.h"
Intmain()
{
inti,j,k;
printf("\n");
for(i=1;i<5;i++)/*如下为三重循环*/
for(j=1;j<5;j++)
for(k=1;k<5;k++)
{
if(i!
=k&&i!
=j&&j!
=k)/*保