二级C语言上机试题

全国计算机等级考试二级C语言上机精选

全国计算机等级考试二级C语言上机精选一

个十百千位加减并大小排序问题:

求出个位数上的数减千位数上的数减百位数上的数减十位数上的数大于零的个数cnt,再把所有满足此条件的四位数依次存入数组b中,然后对数组b的四位数按从大到小的顺序进行排序。

{

int i,j,k,t;

for(i=0;i<300;i++)

if(a[i]%10-a[i]/1000-a[i]/100%10-a[i]/10%10>0)

b[cnt++]=a[i];

for(i=0;i

{k=i;

for(j=i+1;j

if(b[k]

if(k!=i){t=b[k];b[k]=b[i];b[i]=t;}

}

}

全国计算机等级考试二级C语言上机精选二

个十百千重新排列,符合条件的数大小排序问题:

把千位数字和十位数字重新组成一个新的十位数ab(新十位数的十位数字是原四位数的千位数字,新十位数的个位数字是原四位数的十位数字),以及把个位数字和百位数字组成另一个新的十位数cd(新十位数的十位数字是原四位数的个位数字,新十位数的个位数字是原四位数的百位数字),如果新组成的两个十位数ab>cd,ab必须是偶数且能被5整除,cd 必须是奇数,同时两个新数的十位数字均不为零,则将满足此条件的四位数按从大到小的顺序存入数组b中,并要计算满足上述条件的四位数的个数cnt。

void jsVal()

{

int i,j,k,A,B,C,D;

for(i=0;i

{A=a[i]/1000;B=a[i]/10%10;C=a[i]%10;D=a[i]/100%10;

if(A!=0&&C!=0&&(B==0)&&(D%2!=0)&&(10*A>10*C+D))

b[cnt++]=a[i];

}

for(i=0;i

{k=i;

for(j=i+1;j

if(b[k]

if(k!=i){A=b[k];b[k]=b[i];b[i]=A;}

}

}

全国计算机等级考试二级C语言上机精选三

求符合条件的数的总和和平均值问题:

求出千位数上的数减百位数上的数减十位数上的数减个位数上的数大于零的个数cnt,再求出所有满足此条件的四位数平均值pjz1,以及所有不满足此条件的四位数平均值pjz2。

{

int i;

for(i=0;i<300;i++)

if(a[i]/1000-a[i]/100%10-a[i]/10%10-a[i]%10>0)

{cnt++;pjz1+=a[i];}

else pjz2+=a[i];

if(cnt)pjz1/=cnt;

if(cnt<300)pjz2/=300-cnt;

}

全国计算机等级考试二级C语言上机精选四

求共有几个数以及各位数相加为基数的个数并求平均值问题:

1.求出这文件中共有多少个正整数totNum;

2.求出这些数中的各位数字之和是奇数的数的个数totCnt,以及满足此条件的这些数的算术平均值totPjz。

void Calvalue(void)

{

while(xx[totNum]!=0)

{

if((xx[totNum]/1000+xx[totNum]/100%10+xx[totNum]/10%10+xx[totNum]

%10)%2)

{totCnt++;totPjz+=xx[totNum];}

totNum++;

}

if(totCnt)totPjz/=totCnt;}

5、报数出圈

void Josegh(void) {

int i,j,s1,w;

s1=s;

for(i=1;i<=n;i++)

p[i-1]=i;

for(i=n;i>=2;i--)

{s1=(s1+m-1)%i;

if(s1==0)

s1=i;

w=p[s1-1];

for(j=s1;j p[j-1]=p[j];

p[i-1]=w;

}

以行为单位对行中以空格或标点符号为分隔的所有单词进行倒排,同时去除标点符号,之后把已处理的字符串(应不含标点符号)仍按行重新存入字符串数组xx中。

void StrOL(void)

{

int i,j,k,m,n,ll;

char yy[80];

for(i=0;i

{ll=strlen(xx[i]);k=n=0;

for(j=ll-1;j>=0;j--)

{if(isalpha(xx[i][j]))k++;

else

{for(m=1;m<=k;m++)

yy[n++]=xx[i][j+m];

k=0;

}

if(xx[i][j]=='')yy[n++]='';

}

for(m=1;m<=k;m++)

yy[n++]=xx[i][j+m];

/*上面两行处理每行的第一个单词。如果漏写,结果显然不正确,但并不影响得分。*/ yy[n]=0;

strcpy(xx[i],yy);

}/*标准答案与此法结果相比,每行后面多一个空格。*/

}

全国计算机等级考试二级C语言上机精选七

以行为单位把字符串中的第一个字符的ASCII值加第二个字符的ASCII值,得到第一个新的字符,第二个字符的ASCII值加第三个字符的ASCII值,得到第二个新的字符,以此类推一直处理到最后第二个字符,最后一个字符的ASCII值加原第一个字符的ASCII值,得到最后一个新的字符,得到的新字符分别存放在原字符串对应的位置上,之后把已处理的字符串逆转后仍按行重新存入字符串数组xx中。

void ChA(void)

{/

int i,j;char ch;

for(i=0;i

for(j=0;j

xx[i][j]+=xx[i][j+1];

xx[i][j]+=ch;

strrev(xx[i]);

}

}

全国计算机等级考试二级C语言上机精选八

以行为单位依次把字符串中所有小写字母o左边的字符串内容移到该串的右边存放,然后并把小写字母o删除,余下的字符串内容移到已处理字符串的左边存放,之后把已处理的字符串仍按行重新存入字符串数组xx中。

void StrOR(void)

{

int i,j;char yy[80],*p;

for(i=0;i

for(j=0;j

if(xx[i][j]=='o')

strcpy(yy,p);

strncat(yy,xx[i],j);

strcpy(xx[i],yy);

j=0;

}

}

全国计算机等级考试二级C语言上机精选九

以行为单位把字符串中的最后一个字符的ASCII值右移4位后加最后第二个字符的ASCII值,得到最后一个新的字符,最后第二个字符的ASCII值右移4位后加最后第三个字符的ASCII值,得到最后第二个新的字符,以此类推一直处理到第二个字符,第一个字符的ASCII值加原最后一个字符的ASCII值,得到第一个新的字符,得到的新字符分别存放在原字符串对应的位置上,之后把已处理的字符串仍按行重新存入字符串数组xx中。

void CharConvA(void)

{/**/

int i,j,ll;char ch;

for(i=0;i

{ll=strlen(xx[i]);ch=xx[i][ll-1];

for(j=ll-1;j;j--)

xx[i][j]=(xx[i][j]》4)+xx[i][j-1];

xx[i][0]+=ch;

}

}

全国计算机等级考试二级C语言上机精选十

以行为单位把字符串中的所有小写字母改写成该字母的上一个字母,如果是字母a,则改写成字母z,大写字母和其它字符保持不变。把已处理的字符串仍按行重新存入字符串数组xx中。

void ConvertCharD(void)

{/**/

int i,j;

for(i=0;i

for(j=0;j

if(xx[i][j]=='a')xx[i][j]='z';

else if(islower(xx[i][j]))xx[i][j]-=1;

}

1、请编一个函数fun,它的功能是:根据以下公式求π的值(要求满足精度0.0005,即,某项小于0.0005时停止迭代):

程序运行后,如果输入精度0.0005,则程序输出多少。

注意:部分源程序存在PROG1.C中,请勿改动主函数和其他函数中的内容,仅在函数fun的指定的部位填入你编写的若干语句。

试题源程序如下:

#include <stdio.h>

#include <math.h>

double fun(double eps)

{

}

main()

{ double x;

printf("Input eps:");

scanf("%lf",&x); printf("\neps=%lf, PI=%lf\n",x,fun(x));

}

分析:

(1)本题所用基本算法应为累加。假设累加值放在变量s中,累加项放在变量t中,累加操作由语句s=s+t;来实现。

(2)若称为第1累加项,则其前的1为第0累加项,其后的一项为第2累加项,按给定的公式可知,从第1累加项开始,后一项的累加项是前一项的值乘以。所以当前的累加项应当是:t=t*n/(2.0*n+1.0)。表达式右边的t中是前一项的值,表达式左边的t为当前的每累加累加项。请注意,不要写成:t*n/(2*n+1)而进行整除。

(3)若第0累加项的1作为s的初值,语句:s=s+t;执行n次,就把第1到第n项累加到了s中。每进行一次累加,n值增1。

(4)把以上操作放在循环中。按本题规定,当某项小于eps(0.0005)时停止迭代,因此若用while循环,可用t>=eps作为控制循环进行的条件:

while( t>=eps ){ s+=t; n++; t=t*n/(2.0*n+1); }

(5)注意应给所用变量赋适当的初值。

(6)退出循环后,函数的返回值应是:2*s。

2、请编一个函数fun,其中n所指存储单元中存放了数组中元素的个数。函数的功能是:删除所有值为y的元素。已在主函数中给数组元素赋值,y的值由主函数通过键盘读入。

注意:部分源程序存在PROG1.C中,请勿改动主函数和其他函数中的内容,仅在函数fun的指定的部位填入你编写的若干语句。

试题源程序如下:

#include <stdio.h>

#define M 20

void fun(int bb[],int *n, int y)

{

}

main()

{ int aa[M]={1,2,3,3,2,1,1,2,3,4,5,4,3,2,1}, n=15, y, k;

printf("The original data is: \n");

for(k=0; k<n; k++ ) printf("=",aa[k]);

printf("\nEnter a number to deleted: "); scanf("%d",&y);

fun(aa, &n, y);

printf("The data after deleted %d: \n",y);

for(k=0; k<n; k++ ) printf("=",aa[k]);

printf("\n\n");

}

分析:

(1)本题的基本算法是查找和删除。

(2)若循环控制变量是i,通过for循环逐个检查元素中的值,把数组元素中不等于y的值从头开始重新放入bb所指的数组中。用i作为下标,逐个引用数组元素;用i作为下标,把不等于y的元素中的值逐一重新放入bb所指的数组中。这一操作可用以下语句来实现:if(bb[i]!=y)bb[j++]=bb[i];

(3)因为已删除了与y值相等的元素,因此,数组中数据的个数已经改变;所以循环结束后,需要重新给n所指变量赋值。退出循环后,变量j中存放的是删除后数组中数据的个数,通过语句*n=j;把它赋给n所指变量即可。

(4)主函数中输出aa数组中原有的数据,和删除后的数据。考生可以对照所编函数是否正确。

3.请编写一个函数void fun(char m,int k,int xx[]),该函数的功能是:将大于整数m且紧靠m的k个素数存入xx所指的数组中。例如,若输入17和5,则应输出:19,23,29,31,37。

注意:部分源程序存在PROG1.C中,请勿改动主函数和其他函数中的内容,仅在函数fun的指定的部位填入你编写的若干语句。

试题源程序如下:

#include <stdio.h>

void fun(int m, int k, int xx[])

{

}

main()

{ int m, n, zz[100];

printf("\nPlease enter two integers(m & n): ");

scanf("%d%d",&m,&n);

fun(m, n, zz);

for(m=0; m<n; m++) printf("%d ",zz[m]);

printf("\n\n");

分析:

(1)本题的基本算法是求素数。假设有整数i,若i不能被2到i之间的任意一个数除尽,则i就是素数;若一旦能被某个数除尽就不是素数。

(2)以下是求i是否为素数的基本算法:变量ok用作i是素数的标志,ok为1,则i是素数。

ok=1;

for(p=2; p<i/2; p++)

if( i%p==0){ ok=0; break; }

if(ok)……

(3)本题要求把大于m的k个素数存入xx所指的数组中。所以,i的值应大于m;取大于m的值逐一进行判断,若是素数就放入xx所指数组中。把以上语句放入一个循环中:for( i=m+1,j=0; ? ; i++ )

{ ok=1;

for(p=2; p<=i/2; p++)

if( i%p==0 ){ ok=0; break; }

if (ok) { xx[j]=i;j++; }

}

此处,变量i统计存入数组中元素的个数,同时作为下标。

(4)按本题的要求,外循环结束的条件应当是:j<k(j的值从0到k-1)。只要求得了k个素数,就可退出循环。因此在?处应填入j<k。

相关推荐
相关主题
热门推荐