Ctest题库(ans)

更新时间:2024-03-30 09:52:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

2003-2005年上海市高等学校计算机等级考试试卷

二级(C程序设计)

试题一(每小题4分)

解答下列各小题,把正确的解答写在答卷纸的对应栏内。

(1) 假设对n(n>0)个学生按下列方法进行分班:每班k(k>0)个学生,最后一个班若不足

k人也单独编成一个班。试用C语言中的条件表达式表示所编班级个数。

(2) 设有变量定义:

struct rec{ int x; int y;

}s[]={{4,28},{9,36}},*p=s;

计算表达式(p->y/p->x*s[1].x+s[1].y)的值。

(3) 写出下列程序的输出结果。

#include void main(){

char s[]=\ for(i=0;c=s[i];i++){ switch(c-'0'){ case 2:

case 3:putchar(c+4);continue; case 4:putchar(c+4);break; case 5:putchar(c+3); default:putchar(c+2); }

putchar(?\\n?); } }

(4) 分别写出下列4个指针变量p1,p2,p3,p4的含义。

int *p1,*p2[5],(*p3)(),(*p4)[5];

(5) 写出程序的输出结果(假定类型unsigned int的字长为16位)。

#include void main(){

unsigned int u1=0x958,u2,u3; u2=(u1 & 0xFF)<<4; u3=(u1 & 0xFF00)>>4;

printf(\}

(6) 阅读如下程序段,把其中的switch语句改写成先进等价的条件语句。

int x,y;

scanf(\switch(x!=0){

case 0:y=0;break; case 1:switch(x>0){ case 1:y=1;break; case 0:y=-1; } }

(7) 描述函数conv()的功能,并写出下列程序的输出结果。

void conv(int m){ if(m>=2) conv(m/2);

printf(\}

void main(){ conv(13); }

(8) 设有变量说明:

int a=5,b=4,c=3,r1,r2;

请写出执行下列语句后r1和r2的值。 r1=a>b>c;

r2=a>b&&b>c;

(9) 试写出下列算式的C语言表达式。

asin75?

x?log2y(10) 执行下列程序后,i,j,k的值是多少?

for(i=k=0,j=6;i

(11) 执行下列程序后,b和c的值各为多少?

#include void main(){ int *a[10],b,c; a[0]=&b; *a[0]=5; c=(*a[0])++;

printf(\}

(12) 设有如下程序:

#include void main(){

int clock;float f;char cpu[20];

scanf(\ printf(\ %.0f %s\\n\}

13假设输入数据流为200015.0 P4 is GOOD!,请写执行该程序后的输出结果。

(13) 下列程序的输出结果是什么?

#include main(){

int c1=0,c2=0,c3=0,c4=0; char *p=\ while(*p){ switch(*p){

case '1':c1++;break; case '2':c2++;

case '3':c3++;break; default:c4++; } p++; }

printf(\}

(14) 执行下列程序后,s的值为多少?

#define sq(X) X*X void main(){

int s=15,a=2,b=1;

printf(\}

(15) 设int a=12,试写出计算表达式a+=a/=a-=a*a以后的值。

(16) 设:int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};int (*p)[4]=a;求*(*(p+2)+1) (17) 设有变量定义:

struct num

{int x;int y;}sa[]={{2,32},{8,6}}; struct num *p=sa;

试计算表达式p->y/sa[1].x*++p->x的值。

(18) 写出如下程序段的输出结果。

int a=0,b=0,c=0,x;

x=(a=50)&&(b=0)&&(c=100); printf(“%d,%d,%d,%d\\n”,x,a,b,c);

(19) 执行下面程序段以后,数组a的成员值各为多少?

int a[4]={1,3,5,7};

a[3]=--a[0]?++a[1]:a[2]--;

(20) 下列程序的输出结果是什么?

main(){

int x=1,y,a=0,b=0; switch(x) {case 1:

for(y=0;y<10;y++) switch(y)

{case 0:a++;break;

case 1:b++;break;

case 2:a++;b++;break;}} printf(“a=%d,b=%d”,a,b); }

(21) 下列程序的输出结果是什么?

main(){ int a=3,b=8;

a=a+b;b=a-b;a=a-b;

printf(“a=%d,b=%d”,a,b); }

试题二(每小题6分)

阅读下列程序并回答问题,把答案写在答卷纸的对应栏内。

(1) [程序2.1]

#include void sort(int a[],int n){ int i,j,t;

for(i=0;i

if(a[i]>a[j])t=a[i],a[i]=a[j],a[j]=t; }

delsame(int x[],int n){ int i,j,m=n;

for(i=0;i

while(x[i]==x[i+1]){ for(j=i;j

return m; }

void main(){

int x[]={74,4,35,4,65,65,72,74,35},i,m,n; n=sizeof(x)/sizeof(x[0]); sort(x,n);

m=delsame(x,n);

for(i=0;i

(a)函数sort()的功能是什么?(b)函数delsame()的功能是什么?(c)程序的输出是什么? (2) [程序2.2]

#include \#define M 4 void main() {

int i,j,k,m,a[4];

printf(\

for(i=0;i0;i--){ k=a[M-1];

for(j=M-1;j>0;j--)a[j]=a[j-1]; a[0]=k;

for(m=0;m

设一维数组a的4个输入整数是1,2,3,4,则程序的输出是什么? (3) [程序2.3]

#define N 6 void main(){ int i,j,a[N];

for(i=1;i

for(j=i-1;j>1;j--) a[j]+=a[j-1]; for(j=1;j<=i;j++) printf(\ printf(\ } }

(4) [程序2.4]

#include void fun(char *s){ while(*s){

*s=(*s-'0'+3)+'0'; ++s; } }

void main(){

char a[]=\ fun(a+3);

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

printf(\}

(5) [程序2.5]

#define exch1(x,y) {int t=x;x=y,y=t;} exch2(int x,int y) {int t=x;x=y,y=t;} exch3(int *x,int *y) {int t=*x;*x=*y,*y=t;} main()

{int a=2,b=1; exch1(a,b);

printf(“a=%d b=%d\\n”,a,b); exch2(a,b);

printf(“a=%d b=%d\\n”,a,b); exch3(&a,&b);

printf(“a=%d b=%d\\n”,a,b); }

(6) [程序2.5]

#include int a=3,b=4,c=5; sub(int a)

{int b=20;static int s=10; b+=a++; s+=b+c;

printf(\}

main()

{int b=6,c=7; sub(10); sub(a+c);

printf(\}

试题三(12分,每小题6分)

改错。下列程序中都有三个错误,按原来程序的要求,纠正错误,并以“将#XX行改为YYYY”的形式进行解答,代码左边的“#01”、“#02”、…是附加的行号。

(1) 程序3.1输入10个正整数,计算其中的素数之和并输出结果(不考虑溢出情况)。

[程序3.1]

#01 #include \#02 int sum(int *b,int m){ #03 int s=0,is_prime(long); #04 while(m--) #05 if(is_prime(*b++))s+=*b; #06 return s; #07 } #08 int is_prime(long m){

#09 #10 #11 #12 #13 #14 #15 #16 #17 #18 #19 #20

int k;

if(m<=1)return 0;

if(m==2||m==3)return 1; for(k=2;k*k<=m;k++) if(m%k==0)return 0; else return 1; }

void main(){ int x[10],i;

for(i=0;i<10;i++)scanf(\printf(\}

(2) 程序3.2计算字符串s中最后一次出现子串t的地址,通过函数值返回,在主函数中

输出此地址开始的字符串;若未找到,函数返回NULL(例如字符串s为“456712345678abcd”,当子串t为“567”时,输出为“5678abcd”;当t为“789”时,输出“Not found!”)。

#01 #include #02 char *fun(char *s,t){ #03 char *p,*r,*a; #04 a=null; #05 while(*s){ #06 p=s;r=t; #07 while(*r) #08 if(r==p){r++;p++;} #09 else break; #10 if(*r=='\\0')a=s; #11 s++; #12 } #13 return a; #14 } #15 void main(){ #16 char s[100],t[100],*p; #17 printf(\#18 printf(\#19 p=fun(s,t); #20 if(p)printf(\#21 else printf(\#22 }

(3) 程序3.1功能是输入一个字符串,并将其中的字符?a?用字符串”shu”替代后输出。如

输入为”123abcaHello”,则输出为”123shubcshuHello”。 [程序3.1]

#01 #include #02 void main()

#03 #04 #05 #06 #07 #08 #09 #10 #11 (4)

{

int i;char line[81]; scanf(\ for(i=0;line[i]!='\\n';i++) if(line[i]=='a')

printf(\ else

printf(\}

程序3.2实现对输入的长度小于100的英文字母串(空格表示结束)进行头尾相接,围成一个环,输出按顺时针方向出现的相邻两个递增字母及其个数(如下图中的HI,IJ,ST,总共出现3次)。

H T T S V W I J A T #01

#02 #03 #04 #05 #06 #07 #08 #09 #10 #11 #12 #13 #14 #15 #16 #17 #01 #02 #03 #04 #05 #06 #07

#include void main() {

char s[100]; int k,len,no; scanf(\ len=strlen(s); s[len]=s[0]; s[len++]='\\0';

for(k=0;k

printf(\ no++; }

printf(\}

#include #include main()

{char *name[5]={\VRIABLE\ \ char temp; int i;

(5) 在5个字符串中求最小字符串并输出结果。

#08 #09 #10 #11 #12 #13 temp=name[0]; for(i=1;i<5;i++) if(temp>*name[i]) temp=name[i]; printf(\}

于0的元素个数不统计),并求数组中所有元素的平均值。本题约定:平均值通过函数返回,其余两个统计结果通过形式参数的方法返回。

(6) 以下程序中,main函数调用aver函数统计某数组中值大于0和小于0的元素个数(等

试题四(18分,每小题9分)

按指定的要求编写C程序段,把解答写在答卷纸的对应栏内,不要求写完整的程序,也不必定义语句中出现的变量。

(1) π的值可以使用下公式计算

?2?1?112123???????? 335357请编写函数compute_pi(double eps)计算π的近似值,当公式中某一项的值小于eps(例如,eps=1e-5)时,停止计算并返回结果。

(2) 编写函数fun,它的功能是:对于输入字符串s,先将s中的字符逆序放到字符串t

中(t的初始值为空串),再把字符串s正序连接到字符串t后面(例如,若s为“ABCDE”,则最后生成的字符串t为“EDCEAABCDE”)。

试题五(15分,每空3分)

阅读下列问题描述和相应的C程序,把应填入其中 (n) 处的内容写在答卷纸的对应栏内。

(1) 输入任意一个三位数d(要求d不等于495且其百位、十位、个位不全相等,否则重复输入),求出由此数的百位、十位、个位三个数字组成的最大数max和最小数min(百位数可以为0),再求出新三位数max-min,即max和min的差(如结果小于100,则百位数视为0);只要该数不等于495,重复以上运算,则经过有限次计算后,必定得到495。在程序中,函数get_maxmin()计算由三位数的百位、十位、个位所组成的最大数和最小数。

例如,对于输入792,有下列计算过程:

972-279=693->963-369=594->954-459=495 对于输入202,有下列计算过程:

202-22=198->981-189=192->972-279=693->963-369=594->954-459=495 [程序5.1]

#include

void get_maxmin(int a,int b,int c, (1) ){ int t;

if(a

if(b

void main(){

int a,b,c,max,min,d; do{scanf(\ a=d/100; b=d0/10; c=d;

}while( (4) ); while(d!=495){

get_maxmin( (5) ); d=max-min; a=d/100; b=d0/10; c=d; }

printf(\}

(2) 不断地从键盘输入字符,直到输入EOF(Control+Z)为止。对于输入的小写字符,先

转换为相应的大写字符,其他字符不变,然后逐个输出到文件text.txt中,行结束符回车(‘\\n’)也作为一个字符对待,最后统计文件中的字符个数和行数。 [程序5.2]

#include main(){ FILE *fp;

char c,str[256]; int i=0,no=0,line=0;

if((fp=fopen(\ (1) ))==NULL) {printf(\ exit(0); }

printf(\ while((c=getchar())!=EOF)

{if(c>='a'&&c<='z') (2) ; fputc( (3) ,fp); }

fclose(fp);

if((fp=fopen(\ {printf(\ exit(0); }

while(!feof(fp))

{c= (4) ; no++;

if( (5) )line++; }

printf(\ fclose(fp); }

(3) 已知一维数组a和b均为整型数组,以下程序的功能是从一维数组a中挑选出互不

相同的数,并按从小到大的顺序转存于一维数组b中。 #define L sizeof(a)/sizeof(a[0]) int a[]={5,7,5,6,4,3,4,6,7,2},b[L]; main()

{int i,j,k,t,low,mid,high; k=0;

for(i=0;i

while( (1) ) {mid=(low+high)/2; if(a[i]

(2) ; else if(a[i]>b[mid]) (3) ; else

{low=mid; break; } }

if((a[i]!=b[low])||(low>=k)) {for( (4) ) b[j+1]=b[j];

(5) ; k++; } }

for(j=0;j

试题六(15分,每空3分)

阅读下列问题描述和相应的C程序,把应填入其中 (n) 处的内容写在答卷纸的对应栏内。

(1) 给出两个链表,按交替的顺序轮流从这两个链表中取其成员归并成为一个新的链表,

如其中一个链表的成员取完,另一个链表的多余成员依次接到新链表的尾部,并把指向新链表的指针作为函数值返回。例如,若两个链表成员分别是{1,2,3,8,10,15}和{7,13,1},则链接成的新链表是{1,7,2,13,3,1,8,10,15}。结果 [程序6.1]

#include typedef struct node{ int data;

struct node *next; };

struct node *createlink(struct node *list,int x){ struct node *u=list,*p; p= (1) ; (2) ; p->next=NULL;

if(list==NULL)list=p;

else{while(u->next!=NULL)u=u->next; u->next=p;} return list; }

struct node *ShuffleMerge(struct node *a,struct node *b){ struct node dummy;

struct node *tail=&dummy; dummy.next=NULL;

while( (3) ){ if( (4) ){ tail->next=b; break; }

else if(b==NULL){ tail->next=a; break; }

else{ /*轮流从两个链表中取其成员链接到新链表的尾部 tail->next=a;tail=a;a=a->next; tail->next=b;tail=b;b=b->next;} }

return( (5) ); }

*/ void main(){ int x;

struct node *alist=NULL,*blist=NULL,*list=NULL; do{scanf(\ /* 建立alist链表 */ if(x<0)break;

alist=createlink(alist,x); }while(x>0);

do{scanf(\ /* 建立blist链表 */ if(x<0)break;

blist=createlink(blist,x); }while(x>0);

list=ShuffleMerge(alist,blist); }

(2) 本程序中的函数convert(int n,int d)采用“除d取余法”,将十进制整数n转换

成d进制数的字符串,其中的字符序列用字符链表表示。具体方法是将先求得的余数放在链表的尾部,循环求余数直至商为零为止,最后输出字符链表中的每一个结点字符。

假设n=20,d=3,则调用上述函数以后生成的链表输出结果为202。结果 [程序6.3]

#include struct node {char val;

struct node *next; }; main()

{struct node *p,*head; int n,d;

struct node *convert(int n,int d); do

{printf(\ scanf(\ }while(d<2||d>16); head=convert(n,d);

for(p=head;p!=NULL;p=p->next) printf(\ printf(\}

void insert(struct node **h,char ch) {struct node *p;

p= (1) ; p->val=ch;

(2) ; (3) ; }

struct node *convert(int n,int d)

{char letter[]=\ int m=n<0?-n:n; struct node *h; h=NULL; while(m!=0)

{insert( (4) ); m/=d; }

if(n<0)insert( (5) ,'-'); return h; }

答案:

试题一:

(1) n%k==0?n/k:n/k+1或n%k?n/k+1:n/k (2) 28/4*9+36=99 (3) 68

9 7

(4) p1:指向整型变量的指针变量

p2:指针数组,有5个指向整型变量的指针元素 p3:函数指针,指向整型函数

p4:数组指针,指向长度为5的一维整型数组

(5) 580 90 590 (6) int x,y;

scanf(\if(x==0)y=0; else if(x>0)y=1; else y=-1;

或:y=x==0?0:(x>0?1:-1);

(7) 函数conv()的功能:使用递归调用把十进制整数m(通过参数提供)转换成对应二

进制数并输出;输出结果:1101 (8) r1=0,r2=1

(9) pow(a,1.0/3.0)*sin(75.0*3.1415926/180.0)/fabs(x-log(y)/log(2)) (10) i=3,j=3,k=-63 (11) b=6,c=5

(12) 2000 15 P4

(13) c1=2 c2=3 c3=7 c4=5 (14) s=7 (15) a=2 (16) 10 (17) 12

(18) 0,50,0,0 (19) 0 3 4 5 (20) a=2,b=2 (21) a=8,b=3

试题二:

(1) (a)函数sort()的功能:对整型数组a[](第一个参数)的前n(第二个参数)

个数据进行从小到大排序;(b)函数delsame()的功能:删除一个已排序的整型数组x[](第一个参数)的前n(第二个参数)个数据中重复的数据,产生一个新的序列,并返回新序列中元素的个数;(c)程序输出: 4 35 65 72 74

(2) 程序的输出:

4 1 2 3

(3)

3 4 1 2 2 3 4 1 1 2 3 4 程序的输出: (4)(5)(6)试题三(1)(2)(3)(4)(5)试题五(1)(2)1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 程序的输出: 1 9 1

程序的输出: a=1 b=2 a=1 b=2 a=2 b=1 程序的输出: 11,30,45 11,30,80 3,6

将#05行改为:if(is_prime(*b++))s+=*(b-1);

将#14行改为:return 0;

将#18行改为:for(i=0;i<10;i++)scanf(“%d”,x+i);

或:for(i=0;i<10;i++)scanf(“%d”,&x[i]);

将#02行改为:char *fun(char *s,char *t){

将#04行改为:a=NULL;

将#08行改为:if(*r==*p){r++;p++;}

将#05行改为:scanf(%s”,line);

将#06行改为:for(i=0;line[i]!=?\\0?;i++) 将#10行改为:printf(“%c”,line[i]);

将#09行改为:s[++len]=?\\0?;

将#11行改为:if(s[k]+1==s[k+1])

将#13行改为:printf(“%c %c\\n”,s[k],s[k+1]

将#06行改为:char *temp;

将#10行改为:if(strcmp(temp,name[i])>0) 将#12行改为:printf(\

int *max,int *min *max=a*100+b*10+c

(3) (4) (5) (1) (2) (3) (4) (5) (1) *min=c*100+b*10+a d==495||a==b&&b==c a,b,c,&max,&min \c=c-32 c

fgetc(fp)

c=='\\n'||c==EOF low<=high (2)(3)(4)(5)试题六(1)(2)(3)(4)(5)(1)(2)(3)(4)(5)high=mid-1 low=mid+1

j=k-1;j>=low;j— b[low]=a[i]

(struct node *)malloc(sizeof(struct node)) p->data=x 1

a==NULL

dummy.next 返回

(struct node *)malloc(sizeof(struct node)) p->next=*h *h=p

&h,letter[m%d] &h 返回

本文来源:https://www.bwwdw.com/article/k7qr.html

Top