
6.以下程序运行时输出结果是 (6 ) 。
#include #define M 3 #defme N M+1 #define NN N*N/2 main() . {printf("%d\\n",NN);} 7.以下程序运行时输出结果是 (7) 。 #include main() {char a=256: int d=a; prinff("%d",d+1); } 、 8•有如下程序,假定所用编译系统用两个字节存储一个int型操作数,已知输出结果第一行是FFD2,则第二行应当是( 8) main() {int a[10]={1,2,3,4,5,6,7,8,9,0},*p; P=&a[5]; printf("%X\\n",p);printf("%X\\n",p-1); 9•以下程序运行时输出结果的第一行是(9) ,第二行是(10)。 int C: void fl(int x,int *sum) {static int y; x++;y++;c=c+y; *sum=(x+y)/c; } main() {int a,b=100: for(a=O;a<2;a++) {f1(a,&b);printf("%d%d%d\\n",a,b,c)} , 10.以下程序运行时输出结果的第一行是___(11)_______,第三行是______(12)__________ #include void mat_change(int b[4][4]) {int i,j,m,n,k,c[6][6]; for(i=0;i<6;i++) for(j=0;j<6;j++) c[i][j]=1; for(i=1;i<5;i++) for(j=1;j<5;j++) c[i][j]=b[i-1][j-1]; for(i=1;i<5;i++) for(j=1;j<5;j++) {if(c[i][j]==0) {k=0; for(m=-1;m<=1;m++) for(n=-1;n<=1;n++) if(!(m==O&&n==O))k=k+c[i+m][j+n]; if(k==8)c[i][j]=1; } } for(i=1;i<5;i++) for(j=1;j<5;j++) b[i-1][j-1]=c[i][j]; } main() {int i,j,a[4][4]={{0,1},{1,1,1,l},{0,1,0,1},{0,1,1,1}}; mat_change(a); for(i=0;i<4;i++) . {for(j=0;j<4;j++)printf("%d",a[i][j]); printf("\\n"); } } 11.以下程序运行时输出结果是(13) 。 #include void f(int a[],int n,int x,int *c); main() {int a[10]={1,3,5,2,3,5,3,7,4,1},t=0; f(a,10,5,&t);printf("%d",t); } void f(int a[],int n,int X,int *c) {if(n==0)return; if(a[O]>=x)(*c)++; f(a+1,n-1,x,c); } 12.以下程序运行时输出结果的第一行是 (14) ,第二行是(15) ,第三行是(16) #include typedef struct s { int index; int value; }M; main() {static int i,j,k,c[4][4]; M a[10]={{0,1},{3,2},{5,3},{6,4},{9,5},{15,6},{-l,0}},*p=a, b[10]={{1,1},{3,2},{4,3},{6,4},{lO,5},{13,6},{-1,0}},*q=b; while(p->index!=-1) { i=p->index/4; j=p->index%4; c[i][j]=P->value; p++; } while(q->index!=-1) { i=q->index/4; j=q->index%; c[i][j]+=q->value; q++; } for(i=0;i<4;i++) { for(j=0;j<4;j++) printf("%d",c[i][j]); printf("\\n"); } } 13.以下程守运行时输出结果的第一行是__(17)______ ,第二行是____(18)________ 。 void q(char *s,int left, int right) { int i,j; char x,y; i=left; j=right; x=s[(1eft+right)/2]; do {while(s[i]>x&&i if(i<=j) { y=s[i]; s[i]=s[j]; s[j]=y; i++;j--; } }while(i<=j); } main() {char strl[6]="abcde",str2[7]="25134"; q(strl,0,4);puts(strl); q(str2,1,4);puts(str2); } ●完善程序题(共12分) 7 14.如果一个两位整数是质数,将组成它的两个数字交换位置后形成的整数仍为质数,则称这 样的数为绝对质数。例如,13就是一个绝对质数。以下程序用于找出所有两位绝对质数。 #include int a_prime(int n) {int j,k,m[2]; m[O]=n; m[1]= _____(19)_______ ; for(j=0;j<2;j++) for(k=m[j]/2;k>1;k--) if( (20) )return 0; return 1; } main() {int i; for(i=10;i<100;i++) if(a_prime(i))printf("%d",i); } 20 i 15.计算∑ ∑n!的值,即求(1!)+(1!+2!)+(1!+2!+3!)+…+(1!+2!+3!+…+20!) i=1 n=1 main() {int i,n;double s=0,t; for(i=1;i<=20;i++) { ________(21)__________ ; for(n=1;_____(22)___________ ;n++) { t=t*n;s=s+t;} } printf("1!+(1!+2!)+…+(1!+2!+…+20 !)=%e\\n",s); } . 16.以下程序中函数strmerge的功能是:合并a和b两个有序的字母字符串(字典序)而产生一 个新的字符串,在合并的过程中删除重复出现的字符,合并后的字符串仍然保持原序并保 存到c指向的数组中,函数返回在合并过程中删除的字符个数。main函数中输出合并后 的字符串“copy”以及在合并过程中删除的字符个数3。 include int strmerge(char *a,char *b,char *c) {int i=0,j=0,k=O;char t; while(a[i]!='\\0' && ( 22 ) {if(a[i]==b[j]) {t=a[i];i++; ( 24 ); } else if(a[i] t=a[i++]; else t=b[j++]; if(t!=c[k-1]) ( 25 ) =t; 。 } while(a[i]) if(a[i]!=c[k-1]) . c[k++]=a[i++]; else i++: while(b[j]) if(b[j]!=c[k-1]) c[k++]=b[j++]; else j++; e[k]='\\0'; return ( 26 ) ; } main() {static char s1[10]="",s2[10]="oppy",s3[20];int n; n=strmerge(sl,s2,s3); puts(s3); printf("%d",n); } 17.设某链表上每个结点的数据结构为 typedef struct node {int d; struct node *next; }NODE; 函数NODE *invert(NODE *head)的功能是:将head指向的单链表逆置,即原链表最后一 个结点变为第一个结点,原来倒数第二个结点变成第二个结点,以此类推。在逆置过程中不建 立新的链表。 NODE *invert(NODE *head) {NODE *P,*q,*r; if(head==0|| ( (27) ) return head; P=head; q=P->next; while(q!=0) {r= ( 28 ) ; q->next=p;p=q;q=r; } ( 29 ) =O; head= ( 30 ) ; return head; } (6)6 (7)1 (8)FFD0 (9)021 (10)113 (11)1100 (12)0111 (13)3 (14)1104 (15)3380 (16)0550 (17)edcba (18) 25431 (19)n/10+n%10*10 (20)m[j]%k==0 (21)t=1 (22)n<=i (23)b[j]!=’\\0’ (24)j++ (25)c[k++] (26) i+j-k (27)head->next==0 (28)q->next (29)head->next (30) p ●阅读程序题(共11分) 6.以下程序运行时输出结果是( 6 ) 。 #define PT 3.14 #define S(x) PT*x*x main() ’ {int a=2; printf("%4.1f",6.28/S(a)); } 7.已知int型变量的存储字节数为2,以下程序运行时输出结果是( 7 )。 #include main() {int a=3,b=2,c=7,d=6,e=8; long f=a*10000+b*1000+c*100+d*10+e; printf("%ld",f); } 8.以下程序运行时输出结果是( 8 ) 。 #include main() {char *P="student"; if(P=="student") printf("yes"); else printf("no"); } 9.以下程序运行时输出结果是( 9 )。 #include #include main() {char *s="23a4"; int k=0,a=0,b=0; do {if(isdigit(s[k])) {if(s[k]%2==0) {a=a+s[k]-'0'; continue; } a=a+s[k]-'0';b=b+s[k]-'0'; } }while(s[k+1]&&++k); printf("%d,%d,%d\\n",k,a,b); } 10.以下程序运行时输出结果是(10) 。 #include int f(int a[],int m,int b[],int n,int c[]) {int i,j,k=0,t; for(i=0;i {t=O;break;} if(t) c[k++]=a[i]; } return k; } void main() {int x[]={7,2,3,6,5,4,1},y[]={5,10,7,9,8,6},z[10],w,j; w=f(x,7,y,6,z); for(j=0;j 11.以下程序运行时输出结果是(11) void fun(int *p1,int *p2); main() {int i,a[6]={1,2,3,4,5,6}; fun(a,a+5); for(i=O;i<5;i++) printf("%2d",a[i]); } void fun(int *pl,int *p2) {int t; if(pl fun(p1+=2,p2-=2); } } 12.以下程序运行时输出结果的第一行是 ( 12 ) ,第二行是( 13 )。 void swap(int *a,int *b) {int c; c=*a; *a=*b; *b=c; } main() {int i,j,a[3][3]={1,2,3,4,5,6,7,8,9}; for(i=0:i<2:i++) for(j=0;j<2-i;j++) if(i==j) swap(&a[i][j],&a[i+2][j+2]); else swap(&a[i][j],&a[i+1][j+1]); for(i=0;i<3;i++) { for(j=0;j<3;j++) printf("%d",a[i][j]); printf("\\n"); } } 13.以下程序运行时输出结果的第一行是 ( 14 ) ,第二行是 ( 15 ) ,第三行是(16 ) 提示:函数int toupper(int ch)的功能是:将小写字母字符转换为对应的大写字母字符。 #include #include long fun(char *s) {long n,sign,base=10,t; for(;isspace(*s);s++); sign=(*s=='-')?-1:1; if(*s=='+'||*s=='-')s++; if(*s=='0'&&s++) {if(*s=='x||*s=='X') {base=16;S++;} else base=8; } for(n=0,t=1;t&&(isdigit(*s)||isalpha(*s));s++) switch(base) {case 10:if(isdigit(*s)) n=n*base+*s-'0'; else t=0; break: case 8:if(*s>='0'&&*s<='7')n=n*base+*s-'0'; else t=0: break; default:if(isdigit(*s))n=n*base+*s-'0'; else if(toupper(*s)>='A'&&toupper(*s)<='F') n=n*base+toupper(*s)-'A'+lO; else t=0; } return sign*n: } main() {char c1[]="0x1f",c2[]="0409",c3[]="-33a"; printf("%ld\\n%ld\\n%ld",fun(c1),fun(c2),fun(c3)); } ●完善程序题(共14分) 14.程序中函数double,mycos(double x)的功能是:根据下列公式计算cos(x)的近似值。 cos(x)=1-x^2/2!+x^4/4!-x^6/6!+....+(-1)^n*(x^2*n/(2*n)!) 精度要求:当通项的绝对值小于等于10^-6时为止。 #include #include< ____(17)____________> . double mycos(double x) . {int n=1; double sum=0,term=1.0; while( ___(18)_________ >=le-6) {sum+=term; term*= ___(19)_________ ; n=n+2: } return sum; } main() {double x; scanf("%lf",&x); printf("fx(%f)=%f,%f\\n",x,mycos(x),cos(x)); } 15.main函数内结构数组P中的元素已按结构成员index的值升序排列。以下程序先在P中插入s1和s2两组数据,再将数组的所有元素输出。要求插入数据后数组p中的元素仍按 结构成员index的值升序排列。 #include typedef struct s {int index; char text[10]; }T; int inserttv(T *p,T s,int n) {int k,j; for(k=0;k {for(j=n;j>k;j--)p[j]=p[j一1]; break; } ( 21 ) =s; return n+1; } main() {int n; T p[8]={{0,"a",},{5,"t",},{10,"e",},{15,"r"}}; T s1={3,"f"},s2={16,"s"},*q; n=inserttv(p,s2, __________(22)__________ ); for(q=p;q index,q->text); } 16.以下程序的功能是:查找所有满足以下条件的两个整数对:(1)两个整数都是3位数;(2) 组成两个整数各位的数字各不相同并且不出现数字O;(3)第二个数等于第一个数的两 倍。例如,134和268就是满足该条件的一个整数对。 main() {int a,b,c,j,k,w,s[6],sum; for(a=1;a<=5;a++) /*a百位,b十位,c个位*/ for(b=1;b<=9;b++) for(c=1;c<=9;c++) {s[o]=a;s[1]=b;s[2]=c; sum= ____(23)_________ ; sum=2*sum; if(sum>999) continue; s[3]= ______(24)_____________ ; s[4]=(sum-s[3]*100)/10; s[5]=sum%10; _____(25)___________________ ; for(j=0;j<5;j++) for(k=0;k<6;k++) if(s[k]==0||j!=k&& ___(26)____________ w=0; if(w) for(k=0;k<2;k++) printf("%d%d%d\\n",s[k*3],s[k*3+1],s[k*3+2]); } } 17.设有一个线性单链表的结点定义如下: struct node {int d; struct node next; }; . 函数int copy_dellist(struct node *head,int x[])的功能是:将head指向的单链表中存储的所有 整数从小到大依次复制到x指向的整型数组中并撤消该链表;函数返回复制到x数组中的整 数个数。算法:找出链表中数值最小的结点,将其值存储到x数组中,再将该结点从链表中删 除,重复以上操作直到链表为空为止。 int copy_dellist(struct node *head,int x[]) {struct node *pk,*pj,*pm,*pn; int data,k=O; while(head!=0) {pk=head;data=pk->d;pn=pk; while(______(27)_______!=0) {pj=pk->next; if(_____(28)___________ {data=pj->d;pm=pk;pn=pj;} pk=pj; } x[k++]=pn->d; . if( ___29___________)pm->next=pn->next; else head=pn->next; free(pn); } . ____(30)__________________ ; } (6)8.0 (7)-32768 (8) no (9)3, 9, 3 (10)2,3,4,1 (11)6,2,4,3,5,1 (12)9 6 3 (13)8 5 2 (14)31 (15)32 (16)-33 (17) math.h (18)fabs(term) (19)--x*x/(n*(n+1)) (20)p[k].index (21)p[k] (22)inserttv(p,s1,4) (23)a*100+b*10+c (24)sum/100 (25)w=1; (26)s[j]==s[k] (27)pk->next (28)pj->d (29)pn!=head (30)return k ●阅读程序题(共7分) 5.以下程序运行后输出____(6)____ #include int f(char *sl,char *s2) {static int nl,n2; while(*s1++)n1++; while(*s2++)n2++; return n1-n2; } main() {printf("%d",f("c:\\\\program 6•下列程序执行后,x的值为____(7)______ main() {int x,y; for(x=1,y=1;x<=100;x++) {if(y>=20)break; if(y%3==1){y+=3;continue;} y-=5; } printf("%d\\n",x); } 7.以下程序运行时输出_____(8)________ #include #include main() {char s[20]="acef",sl[]="bd"; int i,j,k; for(k=0;sl[k]!='\\0';k++) {j=0; while(sl[k]>=s[j]&&s[j]!='\\0')j++; for(i=strlen(s);i>=j;i--)s[i+1]=s[i]; s[j]=sl[k]; } puts(s); } 8.以下程序运行时输出结果的第-行是___(9)_____,第二行是____(10)______。 int m=5,n=7,a[10]={0,1,2}; void fl(void); void f2(int m); main() { int i; for(i=0;i<7;i++)fl(); f2(1);printf("\\n%d,%d",a[m],a[n]); } void fl(void) {static int n=3; a[n]=a[n-1]+a[n-2]+a[n-3];n++; } void f2(int m) {for(;m<3;m+=2) {int m; for(m=1;m<4;m++) printf("%d,",a[m++]); } } 9.以下程序运行后输出结果的第-行是__(11)_____,第二行是___(12)______ 。 extern int m1,m2; void fun(int n,int *p1,int *p2) {int i; *p1=1;*p2=1; for(i=1;i<=n;i++){*p1+=3;*p2*=3;} m1+=*p1;m2+=*p2; } int m1,m2; main() { int i,k1[4],k2[4]; for(i=0;i<4;i++) fun(i,&k1[i],&k2[i]); for(i=0;i<4;i++) printf(“%d,”,k1[i]); printf(“%d\\n”,m1); for(i=0;i<4;i++) printf(“%d,”,k2[i]); printf(“%d”,m2); } 完善程序题(共18分) 10.以下程序中函数encode完成一个字符串的加密功能,将s1字符串中的字符经过变换后保存到s2指向的字符数组中,二维数组cs保存了一个明码密码对照表,第一行是明码字符,第二行是对应的密码字符,加密方法如下:从s1字符串中每取一个字符,均在cs表第一行中查找有无该明码字符,若找到则将对应的密码字符放入s2中,否则将s1中原来的字符放入s2中。 #include #include char cs[2][10]={“aceghjlnp”,”fonptiude”}; void encode(char *s1, char *s2) { int n,i,j; for(n=0;s1[n]!=’\\0’;n++) { for(i=0;i<10&&s1[n]!=cs[0][i];_______(13)____) if(i<10) s2[n]=______(14)_____; else s2[n]=______(15)_______; } s2[n]=’\\0’; } main() { char ts[80]=”jntwrnwt”, td[80]; encode(ts,td); puts(td); } 11.以下程序依次输入某单位每位职工的姓名和工资数(整型数),然后计算发放工资时所需 发给每位职工的不同面值的纸币张数,并计算工资总和以及累计所需不同币值的张数 #include #include struct{ char name[10]; /*姓名*/ int total; /*工资数*/ int mnum[7]; /*发放工资时所需不同币值的张数*/ }st[21]; int mvalue[7]={100,50,20,10,5,2,1}; main() {FILE *fp; int n=0,i,j,wage; fp=fopen("wage.dat if(fp= =NULL)exit(1); while(!feof(fp)) {fscanf(fp,"%s%d",st[n].name,&st[n].total); wage=st[n].total; for(j=0;j<7&&wage;j++) {st[n].mnum[j]=___(16)_________; wage= _____(17)______; } _________(18)________; } strcpy(st[n].name,"summary"); for(i=0;i for(j=0;j<7;j++) st[n].mnum[j]+=_____(19)_______; } for(i=O;i for(j=0;j<7;j++) printf("%d",st[i].mnum[j]); } } 12.以下函数的功能是以十进制字符形式打印出任一int函数 #include "stdio.h" void f(int n) {int i; if(n<0) {putchar('-');____(20)____;} if((_____(21)______)!=0)f(i); putchar(____(22)_______+'0'); } 13.以下程序中函数maxmin的功能是:对于x中存储的一个任意的四位整数,求出:(1)组成以这个整数的四个数字由大到小排列后构成的最大的四位数;(2)组成以这个整数的四个 数字由小到大排列后构成的最小的四位数。 #include void maxmin(int x,int *pmax,int *pmin) {int num[4],i,j,k,temp; *pmax=0;*pmin=0; for(i=0;i<4;i++) {num[i]=x%10;x=_____(23)_____;} for(i=O;i<3;i++) {k=i; for(j=i+1;j<4;j++) if(num[k] } for(i=0;i<4;i++) {*pmax=*pmax*10+____(25)____; /*生成最大的四位数*/ *pmin=*pmin*10+ _____(26)_______; /*生成最小的四位数*/ } } main() {int n=3169,max=0,min=O; maxmin(n,&max,&min); printf("\\n%d%d",max,min); } 14.设某链表上结点的数据结构定义如下: struct node{ int x; struct node *next; } 函数create的功能是:创建一个有序的链表(结点中x的值按升序排序),链表中结点的个数为参数n的值,函数返回该有序链表的头指针。算法思想如下:每产生一个新的结点,插入到链表中的恰当位置,使得插入新结点以后的链表仍然保持有序 _______(27)_______create(int n) { struct node *p,*p1,*p2,*h=NULL; int i=0; if(n<1) return NULL; while(______(28)________) { p=(struct node *) malloc(sizeof(struct node)); scanf(“%d”,&p->x);p->next=NULL; if(h= =NULL)_______(29)____________; else {p1=p2=h; while(p2 &&p->x>=p2->x) {p1=p2;p2=p2->next;} if(p2==h){_____(30)____________;h=p;} else{p->next=p2;p1->next=p;} } i++; } return h; } (6)4 (7)8 (8)abcdef (9)1,3 (10)11,37 (11)1,4,7,10,2 (12)1,3,9,27,40 (13)i++ (14)cs[1][i] (15)s1[n] (16)wage/mvalue[j] (17)wage%mvalue[j] (18)n++ (19)st[i].mnum[j] (20)n=-n (21)i=n/10 (22)n%10 (23)x/10 (24)i!=k (25)num[i] (26)num[3-i] (27)struct node * (28)i 改错题:(20分) 以下程序检查地名登记表,使每个地名只登记一次,并输出登记表内容 函数del_line删除s指向的n行字符串中重复出现的字符串,只保留第一次出现的字符串 若程序正确,运行后输出结果应为:shanghai beijing nanjing 含有错误的源程序如下: #include #include int del_line(char s[10][ ],int n) { int i,j,k; for(i=0;i while(j {for(k=j;k } else j++; } return n; } main() { char line[10][10]={“shanghai”,”beijing”,”nanjing”,”shanghai”,”nanjing”}; int k,n=5; n=del_line(line,n); for(k=0;k 将上述程序录入到文件myf1.c中,然后根据题目的要求以及程序中语句之间的逻辑关系对程序中的错误进行修改。 2•改错时,可以修改语句中的一部分内容,调整语句次序,增加少量的变量说明或编译 预处理命令,但不能增加其他语句,也不能删去整条语句。 3.改正后的源程序(文件名myfl.c)必须放在考试软盘的根目录下,供阅卷用,否则不 予评分。 二:编程题(20分) 1. 编写函数int _max(int a[ ],int b[ ],int n),求长度为n的数组a中所有相邻两元素的最大公约数(共n-1个),并将之依次保存到数组b中,函数返回b数组中最大数的下标 2. 编写函数main函数,声明一个数组并用以下测试数据对其初始化,调用函数_max,将求得的所有公约数,最大公约数及其下标写入文件myf2.out中。 例如:输入测试数据3,6,4,16,8,5,15,10,12,18,则输出结果应为:3,2,4,8,1,5,5,2,6,max1=3,max=8 1.将源文件取名为myf2.c,输出结果文件取名为myf2.out。 ‘ 2.数据文件的打开、使用和关闭等操作均用C标准库中缓冲文件系统的文件操作函数 实现。 3.源程序文件和运行结果文件均须保存在T:盘的根目录下,供阅卷用。 4.不要将myf2.obj、myf2.exe保存到T:盘中。 改错答案: (1) int del_line(char s[10][ ],int n)修改为: int del_line(char s[ ][10],int n) (2) j=i; 修改为:j=i+1; (3) s[k]=s[k+1] 修改为:strcpy(s[k],s[k+1]); (4) puts(line); 修改为: puts(line[k]); 编程题答案: #include "stdio.h" int _max(int a[ ],int b[ ], int x) { int i,k=0,t,r,m,n; int max,maxk; for(i=0;i m=a[i];n=a[i+1]; if(m while(r!=0) { m=n;n=r;r=m%n; } b[k++]=n; } max=b[0]; maxk=0; for(i=1;i } main() { FILE *fp; int a[10]={ 3,6,4,16,8,5,15,10,12,18},i,k; int b[9]={0}; if((fp=fopen("myf2.out { printf("Create file myf2.out failed!\\n"); exit(0); } k=_max(a,b,10); for(i=0;i<9;i++) { printf("%5d",b[i]); fprintf(fp,"%5d",b[i]); } fprintf(fp,"\\n"); fprintf(fp,"max1=%d,max=%d\\n",k,b[k]); fclose(fp); } 一:改错题(20分) 题目: 函数find_replace的功能是:在s1串中查找s2子串,并用s3子串替换找到的所有s2子串,若s1串中没有出现s2子串,则不做替换并使函数返回0,否则返回1. 例如:若s1子串为”This is a test program and a test data.”,s2子串为”test”,s3子串为”actual”,若程序正确,输出结果应为:”This is a actual program and a actual data.” 含有错误的源程序如下: #include #include int find_replace(char *s1, char *s2, char s3) { int i,j,k=0,t=0; char temp[80]; if(*s1='\\0' || *s2='\\0') return t; for(i=0;s1[i]!='\\0';i++) { for(j=0,k=0;s1[j]= =s2[k];j++,k++); /*比较s2是否在s1中*/ if(s2[k]= ='\\0') { strcpy(temp, s1[j]); strcpy(&s1[i],s3); i=i+strlen(s3); strcpy(&s1[i],temp); t=1; } } return t; } main() { char line[80]="This is a test program and a test data. substr1[10]="test",substr2[10]="actual"; puts(line); if(find_replace(line,substr1,substr2)) puts(line); else printf("not found"); } 编程题目: [题目] 1. 编写函数int encode(int a[ ][4]),对二维数组中左下三角的全部元素(包括对角线上的元素)做如下变换:(1)若该元素不是素数则保持不变(2)若该数是素数,则用大于它的最小素数替换该数,函数返回二维数组左下三角的元素中素数的个数 2. 编写main函数,声明一个二维数组并用以下测试数据给二维数组赋初值。调用encode函数对该数组作变换,将变换后的数组全部元素(以二维数组形式)及左下三角元素中素数的个数写入文件myf2.out中 测试数据 3 6 4 7 8 5 9 10 12 19 7 20 4 14 21 23 变换后的数据 5 6 4 7 8 7 9 10 12 23 11 20 4 14 21 29 1.将源文件取名为myf2.c,输出结果文件取名为myf2.out。 ‘ 2.数据文件的打开、使用和关闭等操作均用C标准库中缓冲文件系统的文件操作函数 实现。 3.源程序文件和运行结果文件均须保存在T:盘的根目录下,供阅卷用。 4.不要将myf2.obj、myf2.exe保存到T:盘中。 改错题答案: (1) int find_replace(char *s1, char *s2, char s3) 修改为:int find_replace(char *s1, char *s2, char *s3) (2) if(*s1='\\0' || *s2='\\0') 修改为: if(*s1= ='\\0' || *s2= ='\\0') (3) for(j=0,k=0;s1[j]= =s2[k];j++,k++); 修改为:for(j=i,k=0;s1[j]= =s2[k];j++,k++); (4) strcpy(temp, s1[j]); 修改为: strcpy(temp, &s1[j]); 编程题答案: #include #include int prime(int n) /*判断素数算法*/ { int i,k=sqrt(n); for(i=2;i<=k;i++) if(n%i==0) return 0; return 1; } int encode(int a[][4]) { int i,j,k=0; for(i=0;i<4;i++) for(j=0;j<=i;j++) if(prime(a[i][j])) { while(!prime(a[i][j]+=2));k++;/*求大于它的最小素数*/ } return k; } main() { FILE *fp; int a[4][4]={3,6,4,17,8,5,9,10,12,19,7,20,4,14,21,23},i,j,count=0; if((fp=fopen("myf2.out {printf("create file myf2.out failed!\\n");exit(0);} count=encode(a); for(i=0;i<4;i++) { for(j=0;j<4;j++) {fprintf(fp,"%4d",a[i][j]); printf("%4d\\n",a[i][j]); } fprintf(fp,"\\n"); } fprintf(fp,"count=%4d\\n",count); fclose(fp); } 改错题目: 下列程序中函数divfun的功能是对于s指向的一个含有数字字符和非数字字符的字符串(串长不超过80),将其中连续的数字字符转换为一个整数,如果连续的数字字符个数超过4个,则以4个数字字符为一组进行转换。将转换后生成的整数一次存放到整型数组a中。函数返回a数组中整数的个数。例如:若输入的字符串”c123yz45! 786 *56abc1234567”,则a数组中的数值分别为:{123,45,786,56,1234,5678,9} #include #include void divfun(char *s, int a) { char *p=s; int i=0,k,sum; while(*p) if(isdigit(*p)) { sum=*p-'0';p++;k=1; while(isdigit(*p)) { k++; if(k<=4){sum=sum+*p-'0';p++;} else{a[i++]=sum; k=1;sum=*p-'0';p++; } } a[i++]=sum; } else p++; return i-1; } main() { char *str;int i,n,num[40]; gets(str);n=divfun(str,num); puts(str); for(i=0;i<=n;i++) printf("%6d",num[i]); printf("\\n"); } 编程题目: 编写函数int value(int bb[ ]),在三位正整数中寻找所有符合以下条件的正整数:它既是完全平方数并且又有两位数字相同。例如:144是12的平方并且有两位数字相同,因此144是符合条件的数。将找到的数按从小到大的次序依次存入bb数组中,函数返回bb数组中有效数据的个数 编写main函数,调用函数value,将结果数组中全部有效数据按照每行5个数据的格式保存到文件myf2.out中。 符合上述条件的整数有:100,121,144,225,400,441,484,676,900 1.将源文件取名为myf2.c,输出结果文件取名为myf2.out。 ‘ 2.数据文件的打开、使用和关闭等操作均用C标准库中缓冲文件系统的文件操作函数 实现。 3.源程序文件和运行结果文件均须保存在T:盘的根目录下,供阅卷用。 4.不要将myf2.obj、myf2.exe保存到T:盘中。 改错题目答案: (1) void divfun(char *s, int a) 修改为:int divfun(char *s, int a) (2) void divfun(char *s, int a) 修改为:int divfun(char *s, int a[ ]) (3) if(k<=4){sum=sum+*p-'0';p++;} 修改为:if(k<=4){sum=sum*10+*p-'0';p++;} (4) char *str; 修改为:char str[80]; 编程题目答案: #include int value(int bb[ ]) { int i,i2,j=0,a,b,c; for(i=10;i<32;i++) { i2=i*i; a=i2/100; b=i2/10%10; c=i2%10; if((a==b||b==c||c==a)&&!(a==b&&b==c)) /*两个数相同*/ bb[j++]=i2; } return j; } main(){ int i,n,zz[32]={0}; FILE *fp; if((fp=fopen("myf2.out { printf("Can't open file!"); exit(0);} n=value(zz); for(i=0;i fprintf(fp,(i+1)%5?"%7d":"%7d\\n",zz[i]);} fprintf(fp,"\\n"); fclose(fp);} 江苏计算机C语言结构体与共同体考核 考点1:结构体 例题:已知有结构体定义和变量声明如下:(2008秋) struct student {char name[20]; int score; struct student *h; }stu, *p; int *q; 以下选项中错误的是_________ A.p=&stu; B.q=&stu.score; C.scanf(“%s%d”,&stu); D.stu.h=p; 例题:以下程序运行时输出结果的第一行是________,第二行是__________ #include struct s {int x,*y; }*p; int d[5]={10,20,30,40,50}; struct s a[5]={100,&d[0],200,&d[1],300,&d[2],400,&d[3],500,&d[4]}; void main() {p=a; printf(“%5d”,p->x++); printf(“%5d\\n”,p->x); printf(“%5d”,*p->y); printf(“%5d\\n”,*++p->y); } 考点2:处理链表 例题:以下程序的功能是:函数struct node *insert(struct node *head, struct node *p)将p指向的结点作为首结点插入head指向的链表中,main函数接收从键盘输入的一行字符,每接收一个字符后,申请一个新节点保存该字符,并调用insert函数将新结点插入链表中,最后从表头开始一次输出该链表个结点成员c的值,试完善程序以达到要求的功能 #include #include struct node {char c; struct node *next; }; void main() {struct node *insert(struct node *head, struct node *p); char ch; struct node *head,*p; head=NULL; while((ch=getchar())!=’\\n’) {p=(struct node *)malloc(sizeof(struct node)); _______________=ch; p->next=NULL; __________________; } p=head; while(p!=NULL) {printf(“%c”,p->c); ________________; } } struct node *insert(struct node *head, struct node *p) {if(head= =NULL) head=p; else {______________________--; head=p; } return head; } 考点 3:共用体: 考点4:枚举类型 例题:已知”enum ab{a,b=5,c,d}”,枚举常量d的值是___________ 考点5:用typedef定义类型 例题:以下结构变量stu1的声明形式中,错误的是__________ A.typedef struct stu{char name[10];float score;} STU; STU stu1; B.#define STU struct stu STU {char name[10];float score;}stu1; C.struct stu{char name[10]; float score;} stu1; D.struct stu{char name[10];float score;} STU; STU stu1; 第十二章:文件 文件指针是很重要的一个概念,定义文件指针的格式: 考点1:文件打开 FILE *文件指针名; 例如: FILE *fp; fp=fopen(“文件名”,”打开文件方式”); 文件的打开: "r"(只读) "r+"(为读/写方式打开已存在的文本文件) "w"(只写) "w+"(以读/写方式新建文本文件) "a"(追加) "a+"(以读/写方式将数据追加到文件尾) “rb+”(读写) 为读写打开一个二进制文件 “wb+”为读写建立一个二进制文件 考点2:文件关闭 fclose(文件指针) 考点3:文件的读写函数 fputc函数:将一个字符写到磁盘文件上 fgetc函数:从指定的文件读入一个字符 fread函数:用来读一个数据块,fwrite函数:用来写一个数据块 fprintf函数:格式化写函数,fscanf函数:格式化读函数,针对的不是终端而是磁盘文件 rewind函数:使位置指针重新返回文件的开头 fseek函数:改变文件的位置指针 江苏省计算机等级考试C语言第一至三章考点 第一、二章节必会试题: 1.以下叙述中正确的是_________(多选) A)在编译时可以发现注释中的拼写错误 B)C语言程序的每一行只能写一条语句 C)main(){}必须位于程序的开始 D)C语言程序可以由一个或多个函数组成 E)main()函数至少必须有一条语句 F)C程序总是从main函数的第一条语句开始执行 G)C程序总是在执行完main函数的最后一条语句后结束 第三章必会试题: 考点1:常量与变量 在程序执行过程中,值保持不变的量称为常量。变量是指向内存中的一个单元符号。在C语言中,规定变量只能由字母、数字和下划线组成,且第一个字符必须是字母、数字或下划线,常量分为:整型常量、实型常量、字符型常量、字符串型常量、标识符常量 (1)整型常量分为:八进制(以0开头,由数字0—7组成,且第一个数字必须为0),十进制(由数字0—9组成,且第一个数字不能为0),十六进制(以0x开头,由数字0—9,a--f组成) (2)整型变量:基本整型(int)、短整型(short int)、长整型(long int),长整型以L结尾,无符号整数以U结尾(3)实型常量:十进制小数形式与指数形式(用e表示,e之前必须要有数字,且在E或e之后的指数必须是整数), (4)实型变量:float,double (5)字符型常量:用一对单括号引起来的一个字符或以’\\’开头的字符序列 (6)字符变量:char (7)字符串型常量:用一对双括号引起来的若干个字符,在字符串的最后有结束标记”\\0”,在C语言中没有专门的字符串变量,只能以字符数组存储 1.设有四个常数:①4e0.5、②’\\87’、③0x5A、④” \\” ”,其中符合C语法规则的常量是_____ 2.以下常数表示中不正确的是____________ A.’\\55’ B.’55’ C.’\\x55’ D.0x55 3.以下选项中,不能作为合法常量的是_________ A.0X2A B.015 C.2.8e9 D.123.6e0.4 4.设有声明语句:char a=’\\72’;则变量a__________ A.包含一个字符 B.包含2个字符 C.包含三个字符 D.声明不合法 5.以下哪个是合法的常量______________ A.35u B.1.25e3.4 C.’\\96\\45’ D.0387 6.以下选项中不能用做用户自定义标识符的是__________ A. length_ B._length C.length.d D.For 考点2:运算符与表达式 (1)算术运算符:单目运算符:+,- 双目运算符:+,-,*,/,% (2)关系运算符:> , <, >=, <=, ==,!=,关系成立时,运算结果为整数1,否则为整数0 (3)逻辑运算符:&&(逻辑与),||(逻辑或),!(逻辑非),优先级从高到底:!, ||, && &&与||有短路效应,&&只要第一个为假,则后面不再管结果,||只要有一个为真,则后面不再管结果 (4)赋值运算符:= , +=,-=,*=,/=,%=,^= (5)自增、自减运算符:++,--,只有变量才能自增,常量是不能自增的 (6)逗号运算符:其运算顺序为从左到右依次计算各个表达式的值,并把最后一个表达式的值作为整个表达式的值 (7)sizeof()运算符:用来计算某种类型或数据做占用的字节数 (8)条件运算符:条件表达式”?:”为三目运算符,要求有三个操作对象 (9)各类运算符号的顺序:首先执行:!,++,--,然后算术运算符,然后关系运算符,然后逻辑运算符,然后条件运算符,然后赋值运算符,然后逗号运算符 例题: 1.设有语句int a=6, b=3; float x=8,y; y=b/a*x/2;,则y的值是________________ 2.有数学式3xy/5ab中,变量x和y的取值为整数,而变量a和b的取值为实数,在C程序中对应的正确表达式是______________________ A.3/5*x*y/a/b B.3*x*y/5/a/b C.3*x*y/5*a*b D.3/a/b/5*x*y 3..设有语句”float x=2.9;int a=5,b;b=a+x;”,则变量b的值是___________ 4.若a1、a2、a3和a4均为整型变量,则以下选项中符合C语法规则的表达式是______ A.a1=25%3.3 B.a2=a1+a3=3*5 C.a3=078 D.a4=0xa2 5.设有语句”int a,b,c;a=b=c=5;”,执行语句”b+=++a>b &&++c>b;”,则a,b,c的值分别为____ 6. 设x为整数,C中能正确的表达数学式0≤x<5的是_______ A.0<=x<5 B.x=0||x=1||x=2||x=3||x=4 C.x>=0||x<5 D.!(x<0||x>=5) 7.设有变量说明:”short int a=0,b=0;”,则表达式sizeof(‘a’+’b’)的值是_____ A.1 B. 2 C.4 D.8 8.设有语句:char s[ ]=”Rep\\0Ch”; int m=sizeof(s);则m的值是_________ 9.执行以下语句后,a的值为___________ int a=0,m=3,n=10; a=(m++,m+n); 10.设有说明语句int a=3,b=2,c; c=--a==b++;则a,b,c的值为_____________________ 11.设有说明语句”int a,b;”,执行语句”b=(a=3*5,a*4),a+15;”后,b的值为________ 第四章考点: 考点一:字符输入函数(getchar) 考点二:格式输入函数(scanf) 1。设有说明语句:double x, 不能通过scanf语句正确的输入数据的语句是________ A.scanf(“%lf”,x); B.scanf(“%f”,&x); C.scanf(“%lf”,&x) D.scanf(“%le”,&x); 例题2. 考点三:字符输出函数(putchar) 考点四:格式输出函数(printf) 2:如有声明”float f=123.45678;”,则执行语句”printf(“%.3f”,f);”后,输出结果为( ) A.1.23e+02 B.123.457 C.123.456780 D.1.234e+02 第五、六章考点: 考点一:分支结构(单分支与多分支结构) 1.以下函数中输入5,3,输出结果是_______ #include int main() { int a,b,max; scanf(“%d,%d”,&a,&b); if(a>b) max=a; else max=b; printf(“%d%d”,a,b); return 0; } 考点二:switch语句 1.执行以下程序段后,变量i的值是___________ int i=10; switch(i) { case 9: i+=1 case 10: i+=1; case 11: i+=1; default: i+=1; } 考点三:while语句 1.在while(!a)中,其中的!a与表达式_____________等价 A.a==0 B.a==1 C.a!=1 D.a!=0 2.有以下程序段,while循环次数为__________ int k=0; while(k=1) k++; 考点四:do…while语句 1.以下程序输出的第一行是____________,第二行是______________ #include void main(void) { int x=6; do { x-=2; printf(“%d\\n”,x); }while(--x); } 2.设整型变量x的当前值为3,执行以下循环语句后,输出结果为___________ do { x-=2; printf(“%d\\n”,x); }while(!(--x)); 3。下面关于while与do……while循环语句的叙述中正确的是______ A.do……while的循环体至少执行一次 B.while的循环体至少执行一次 C.do……while的循环体不能是复合语句 D.do……while允许从循环体外跳转到循环体内 考点五:for循环语句 1.循环语句for(<表达式1>;<表达式2>;<表达式3>)<循环体>中,<循环体>执行情况是___________ A.至少执行一次 B至少执行两次 C.可能执行,也可能不执行 D.不执行 2.有如下程序: void main() { int i,sum=0; for(i=1;i<=3;i++) sum+=i; printf(“%d\\n”,sum); } 该程序的执行结果是_______________ A.6 B.3 C.无穷循环 D.0 3.设有语句”for(int i=5,sum=0;i<10,sum++;i++) sum+=i;”,则for()语句的执行情况是_____________________ A.循环0次 B.循环4次 C.循环5次 D.循环6次 考点六:break,continue 1。执行以下程序后,输出___________ int s1=0,s2=0,s3=0,s4=0; for(int t=1;t<=4;t++) switch(t) { case 4: s1++;break; case 3: s2++;break; case 2: s3++; default: s4++; } printf(“%d,%d,%d,%d\\n”,s1,s2,s3,s4);; 2.continue语句只能用在______________语句中 3.下面程序的功能是:输出100以内(不含100)能被3整除且个位数为6的所有整数,请填空: #include #include main() { int i; int j; for(i=0;_____________;i++) { j=i*10+6; if(_____________) continue; else printf(“%d\\n”, j); } } 考点3:switch语句 例题:下列程序运行后的输出结果,第一行是__________(2008春) #include main() { int i,a=0,c=2; switch(++a,a*c) {case 1: printf(“1”); case 2: printf(“2”); case 3:printf(“3\\n”);break; default:printf(“other\\n”);} } 第六章:循环控制 考点1:while与do while语句实现循环 例题:程序”int x=3; do{printf(“%d”,x--);}while(!x);”的执行结果是____________(2006秋) A.3 2 1 B.2 C.3 D.无穷循环 例题:以下程序运行时输出的结果是_____________(2007秋) main() { int s=1,n=235; do{ s*=n%10; n/=10; }while(n); printf(“%d\\n”,s); } 例题:以下程序运行后输出结果的第一行为____________,第二行为_______________(2007春) #include “stdio.h” void main() { int i=5; do {switch(i%2) { case 0:i--;break; case 1:i--;break; } i--;printf(“%d\\n”,i); }while(i>0); } 考点二:for循环 例题:若有声明”int i,k=1;unsigned j;”,则下列语句执行时会出现无限循环的语句是___________(2008春) A.for(j=15;j>0;j-=2) k++; B.for(j=0;j<15;j+=2) k++; C.for(i=0;i<15;i+=2) k++; D.for(i=15;i>0;i-=2) k++; 例题:以下程序运行时输出结果为____________________(2007秋) #include void main() { int i,sum=0; for(i=0;i<5;i++) {switch(i) {case 0: case 1:sum++; case 3:sum++; case 4: sum--;break; } } printf(“%d\\n”,sum); } 例题:以下程序执行后,输出结果的第一行为____________,第二行为________________(2006秋) #include void main() {int w=0,i; for(i=0;i<3;i++) switch(w++) {case 0: case 1: case 2: case 3: printf(“%d\\n”,w++);} } 例题:下列关于语句的说法中正确的是___________________(2004秋) A. do…while语句的循环体至少会被执行1次 B. while语句的循环至少会被执行1次 C. for语句的循环体至少会被执行1次 D. 在c语言中只能用do,do…while或for语句实现循环 例题:定理:对于任意一个正整数都可以找到至少一串连续奇数,它们的和等于该正整数的立方。例如:33=27=7+9+11,43==1+3+5+7+9+11+13+15。以下程序用[2,20]之间的所有正整数验证该定理。(2004秋) #include main() {long n,i,k,j,p,sum; for(n=2;n<=20;n++) {k=n*n*n; for(i=1;i if(sum==k) {printf(“\\n%ld*%ld*%ld=%ld=”,n,n,n,sum); for(p=i;p<___________;p+=2) printf(“%ld+”,p);printf(“%ld”,p); break;} } if(i>=k/2) printf(“\\n error!”); } } 例题:以下程序采用递推法计算 考点三:break,continue语句 例题:以下程序运行后输出结果的第一行为_______________-,第二行为_______________(2007春) #include void main() {int i=5; do {switch(i%2) { case 0:i--;break; case 1:i--;break; } i--;printf(“%d\\n”,i); }while(i>0); }
