计算机二级C语言上机题型总结.docx
《计算机二级C语言上机题型总结.docx》由会员分享,可在线阅读,更多相关《计算机二级C语言上机题型总结.docx(17页珍藏版)》请在冰点文库上搜索。
计算机二级C语言上机题型总结
计算机二级C语言上机题型总结
一)“******”问题
1、将字符串中的前导*号全部删除,中间和后面的*号不删除。
voidfun(char*a)
{
char*p=a;
while(*p==’*’) p++;
for(;*p!
=’\0’;p++,a++)
*a=*p;
*a=’\0’;
}
2、只删中间*
inti;
for(i=0;a[i]==’*’;i++)
for(;h
if(*h!
=’*’)
a[i++]=*h;
for(;*p;p++)
a[i++]=*p;
a[i]=’\0’;
3、只删尾*
while(*a!
=’\0’)
a++;
a--;
while(*a==’*’)
a--;
*(a+1)=’\0’;
4、只留前*
inti,j=0;
for(i=0;a=’*’;i++);
j=i;
for(;a;i++)
if(a!
=’*’)
a[j++]=a[i];
a[j]=’\0’;
5、只留中间*
inti,j=0;
for(i=h;i a[j++]=a[i];
a[j]=’\0’;
6、只留尾*
char*t=a;
for(;t<=p;t++)
if(*t!
=’*’)
*(a++)=*t;
for(;t!
=’\0’;t++)
*(a++)=*t;
*a=’\0’;
7、*个数>n个,删多余的*;*个数<=n个,不做任何处理。
inti=0,k=0;
char*p,*t;
p=t=a;
while(*t==’*’)
{
k++;
t++;
}
if(k>n)
{
while(*p)
{a[i]=*(p+k-n);
i++;p++}
a[i]=’\0’;
}
(二)移动问题
1、若一维数组中有n个整数,要求把下标从p到n-1(p<=n-1)的元素平移到数组前面。
inti,j,t;
for(i=p;i<=n-1;i++)
{
t=w[n-1];
for(j=n-2;j>=0;j--)
w[j+1]=w[j];
w[0]=t;
}
2、把下标从0到p(p<=n-1)的元素平移到数组最后。
inti,j,t;
for(i=0;i<=p;i++)
{
t=w[0];
for(j=1;j w[j-1]=w[j];
w[j-1]=t;
}
3、把字符串str中的字符向前移动,原来第1个字符放串尾,结果仍保存在原串中。
ch=str[0];
for(i=0;str[i+1];i++)
str[i]=str[i+1];
str[i]=ch;
4、移动字符串中的内容,把第1到第m个字符平移到串后,把第m+1到后移到前。
voidfun(char*w,intm)
{
inti,j;
chart;
for(i=1,i<=m;i++)
{
t=w[0];
for(j=1;w[j]!
=’\0’;j++)
w[j-1]=w[j];
w[j-1]=t;
}
}
(三)排序法
1、冒泡法
for(i=1;ifor(j=0;jif(a[j]>a[j+1])
{t=a[j];a[j]=a[j+1];a[j+1]=a[j];}
2、选择法
for(i=0;i{
p=i;
for(j=i+1;j if(a[p]>a[j])p=j;
if(p!
=i)
t=a[i];a[i]=a[p];a[p]=t;
}
3、插入法
for(i=1;i{
t=a[i];
for(j=i-1;a[j]>t&&j>=0;j--)
a[j+1]=a[j];
a[j+1]=t;
}
(四)Fibonacci问题
1、求Fibonacci数列中小于t的最大的一个数,结果由函数返回。
intfun(intt)
{
inta=1,b=1,c=0,i;
do
{
c=a+b;
a=b;
b=c;
}while(cc=a;
returnc;
}
2、用递归算法计算数列中第n项的值。
longfun(intg)
{
swich(g)
{
case0:
return0;
switch(g)
case1:
case2:
return1;
}
return(fun(g-1)+fun(g-2));
}
(五)素数问题
1、将大于整数m且紧靠m的k个非素数存入所指的数组中。
voidfun(intm,intk,intxx[])
{
inti,j,n;
for(i=m+1,n=0;n for(j=2;j
if(i%j==0)
{xx[n++]=i;
break;}
}
2、小于或等于lim的所有素数放在aa数组中,该函数返回所求出的素数个数。
intfun(intlim,intaa[MAX])
{
inti,j,k=0;
for(i=2;i<=lim;i++)
{
for(j=2;j
if(i%j==0)break;
if(j>=i) aa[k++]=i;
}
returnk;
}
3、将所有大于1小于整数m的非素数存入xx数组中,个数通过k传回。
voidfun(intm,int*k,intxx[])
{
inti,j,n=0;
for(i=4;i{
for(j=2;j
if(i%j==0)break;
if(j
}
*k=n;
}
或
{inti,j,t,n=0;
for(i=2;i {t=1;
for(j=2;j
if(i%j==0)
{t=0;break;}
if(t==1)xx[n++]=I;}
*k=n;
}
(六)删除相同数
intfun(inta[],intn)
{inti,j=1;
for(i=1;iif(a[j-1]!
=a[i])
a[j++]=a[i];
returnj;
}
或
{inti,t,j=0;
t=a[0];
for(i=1;i if(t==a[i])
;
else
{
a[j++]=t;
t=a[i];
}
a[j++]=t;
returnj;
}
(七)统计字符个数,单词个数。
1、按‘0’到‘9’统计一个字符串中的奇数数字字符各自出现的次数,结果保存在数组num中。
voidfun(char*tt,intnum[])
{inti,j;
intbb[10];
char*p=tt;
for(i=0;i<10;i++)
{num[i]=0;
bb[i]=0;}
while(*p)
{if(*p>=’0’&&*p<=’9’) bb[*p-‘0’]++;
p++;}
for(i=1,j=0;i<10;i=i+2,j++)
num[j]==bb[i];
}
2、str全部由小写字母和空格字符组成的字符串,num传入字符串长度。
统计单词个数。
voidfun(char*s,int*num)
{intI,n=0;
for(i=0;i<*num;i++)
{
if(s[i]>=’a’&&ss[i]<=’z’&&(s[i+1]==’’||s[i+1]==’0’))
n++;
}
*num=n;
}
3、从’a’到’z’统计一个字符串中所有字母字符各自出现的次数,结果存在数组alf中。
voidfun(char*tt,intalf[])
{inti;
char*p=tt;
for(i=0;i<26;i++)
alf[i]=0;
while(*p)
{
if(*p>=’A’&&*p<=’Z’) *p+=32;
if(*p>=’a’&&*p<=’z’) alf[*p-‘a’]++;
p++;
}
}
4、str字符序列由字符0和1组成。
查找0字符连续出现的最长长度,若有几个0字符长度相同,只记录最后1个0字符串相关信息,通过m和k返回最长0字符长度和其下标。
voidfun(char*str,int*m,int*k)
{inti,j=0;
intbb[N];
char*p=str;
*m=0;
*k=0;
for(i=0;i bb[i]=0;
i=0;
while(*(p+i))
{
if(*(p+i)==’0’)
{bb[j]++;i++;}
else{j++;i++;}
if(*m<=bb[j])
{*m=bb[j];*k=i-1;}
}
}
5、统计在tt字符串中”a”到”z”26个字母各自出现的次数,并依次放在pp所指数组中。
voidfun(char*tt,intpp[])
{
inti;
for(i=0;i<26;i++)
pp[i]=0;
for(;*tt!
=’\0’;tt++)
if(;*tt>=’a’&&*tt<=’z’)
pp[*tt-’a’]++;
}
6、统计一个长度为n的字符串在另一个字符串中出现的次数。
intfun(char*str,char*substr)
{
intn;
char*p,*r;
n=0;
while(*str)
{
p=str;
r=substr;
while(*r)
if(*r==*p)
{r++;p++;}
elsebreak;
if(*r==’\0’) n++;
str++;
}
returnn;
}
7、求出ss所指字符串中指定字符的个数,并返回此值。
intfun(char*ss,charc)
{inti=0;
for(;*ss!
=’\0’;ss++)
if(*ss==c)
i++;
returni;
}
8、统计一个长度为2的字符串在另一个字符串中出现的次数。
intfun(char*str,char*substr)
{
inti,j=0;
for(i=0;str[i+1]!
=’\0’;i++)
if(str[i]==substr[0]&&str[i+1]==substr[1])
j++;
returnj;
}
(八)进制转换
1、把str字符串转换成任意进制的数。
x:
原进制;y:
要转换成的进制。
intfun(char*str,intx,inty)
{intsum;
inti=0;
char*p=str;
for(i=0;ixx[i]=0;
sum=*p-‘\0’;
p++;
while(*p)
{sum=sum*x+*p-‘0’;
p++; }
i=0;
while(sum!
=0)
{xx[i]=sum%y;
sum=sum/y;
i++;}
returni;
}
注:
(1) 将x转换成10进制:
sum=sum*x+*p-‘0’;
(2) 将10进制转换成y:
sum%y得到y进制数的最低位。
sum/y 得到y进制数的次低位。
2、str字符串由‘0’和‘1’组成。
转换成十进制数。
intfun(char*str)
{intn;
char*p=str;
n=*p-‘0’;
p++;
while(*p)
{n=n*2+*p-‘0’;
p++;}
returnn;
}
(九)比较字符串长度
1、比较两个字符串的长度,函数返回较短的字符串。
char*fun(char*s,char*t)
{inti,j;
for(i=0;s[i]!
=’\0’;i++);
for(j=0;t[j]!
=’\0’;j++);
if(i<=j)
returns;
else
returnt;
}
2、从传入的num个字符中找出最长的一个字符串,通过形参指针max传回该串地址。
fun(char(*a)[81],intnum,char*max)
{inti=0;
max=a[0];
for(i=0;i if(strlen(max) max=a[i];
returnmax;
}
(十)最大公约数,最小公倍数
1、intfun(inta,intb)
{intr,t;
if(a
{t=a;a=b;b=t;}
r=a%b;
while(r!
=0)
{a=b;b=r;r=a%b}
return(b);
}
2、输入两整数m和n,求最大公约数,最小公倍数。
while(b!
=0)
{t=a%b;a=b;b=t;}
printf(“%d”,”%d”,a,n*m/a);
注:
(1) 最大公约数:
若b/a的非零余数能整除a。
(2) 最小公倍数:
两数乘积除以最大公约数。