1湖南省计算机二级316分程序阅读填空.docx
- 文档编号:3600953
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:19
- 大小:21.60KB
1湖南省计算机二级316分程序阅读填空.docx
《1湖南省计算机二级316分程序阅读填空.docx》由会员分享,可在线阅读,更多相关《1湖南省计算机二级316分程序阅读填空.docx(19页珍藏版)》请在冰豆网上搜索。
1湖南省计算机二级316分程序阅读填空
程序填空题一
1.下面C语言程序将两个递增有序的数值a和b合并一个数组c,并保持递增次序,最后输出数组c.
#include
#defineM6
#defineN5
main()
{inta[M]={1,3,5,7,9,11}b[N]={2,4,6,8,10}
intc[M+N]
inti,j,k;
i=j=k=0
while
(1)
ifa[i]
c[k++]=a[i++];
elsec[k++]=b[j++];
while
(2)
c[k++]=a[i++];
while(j c[k++]=(3) for(k=0;k<(4);k[++]) printf(%dxt,c[k];) 其中 (1) (2)(3)(4)处分别填一数据,使程序达到其功能。 答案: 1: i 2: i 3: b[j++]; 4: M+N 2.下面h函数的功能是计算如下数学函数H的值。 请填空。 doublefgh(double(*f)(doublea),double(*g)(doubleb), doublex,doubley) {return(【1】);}doubleh(doublea,doubleb) return(fgh(sin,cos,a,b)*fgh(【2】));} 解: (1)(*f)(x+y)/(*g)(y-x) (2)cos,sin,a,b [解析]本题考察的是函数的声明。 要填写的两个空都出现在return语句中,所以要仔细分析函数的返回值。 本题的第二个空相对要容易一些,只要根据题干和乘号前面的调用语句对比一下即可得到调用语句的四个参数。 第一个空相对要难一些,函数fgh定义时用到了函数指针(*f)和(*g)是为了增加函数的灵活性。 根据函数h的定义以及题干要求,可以看出函数fgh应该表示的是乘号两边的某一项。 (*f)和(*g)用来表示sin或cos,参数x和y的加减法运算作为sin或cos函数的参数,故应填写(*f)(x+y)/(*g)(y-x)。 3.下面程序的作用是将以下给出的字符按其格式读入数组ss中,然后输出行、列号之和为3的数组元素,请在____处填入正确内容。 A a f c B d e b c g f D main() { staticcharss[4][3]={'A','a','f','c','B','d','e','b','C','g','f','D'}; intx,y,z; for(x=0;【1】;x++) for(y=0;【2】;y++) {z=x+y; if(【3】) printf("%c\n",ss[x][y]); } } 解: (1)x<4 (2)y<3 (3)z==3 [解析]本题应用穷举法找到满足要求的值。 第一个空: 变量x为行数所以是x<4;第二个空: 变量y为列数所以是y<3;第三个空: 判断x+y是否为3所以是z==3。 4.下面程序的作用是将以下给出的字符按其格式读入数组ss中,然后输出行、列号之和为3的数组元素,请在____处填入正确内容。 A a f c B d e b c g f D main() { staticcharss[4][3]={'A','a','f','c','B','d','e','b','C','g','f','D'}; intx,y,z; for(x=0;【1】;x++) for(y=0;【2】;y++) {z=x+y; if(【3】) printf("%c\n",ss[x][y]); } } 解: (1)x<4 (2)y<3 (3)z==3 [解析]本题应用穷举法找到满足要求的值。 第一个空: 变量x为行数所以是x<4;第二个空: 变量y为列数所以是y<3;第三个空: 判断x+y是否为3所以是z==3。 程序填空题二 【3.1】下面程序的功能是不用第三个变量,实现两个数的对调操作。 #include main() { int a,b; scanf("%d%d",&a,&b); printf("a=%d,b=%d\n",a,b); a= ① ; b= ② ; a= ③ ; printf("a=%d,b=%d\n",a,b); } 答案: ① a+b ② a-b ③ a-b 或者 ① a^b ② b^a ③ a^b 【3.2】下面程序的功能是根据近似公式: π2/6≈ 1/12+1/22+1/32+ …… +1/n2,求π值。 #include double pi(long n) { double s=0.0; long i; for(i=1;i<=n;i++) s=s+ ① ; return( ② ); } 答案: ① 1.0/(float)(i*i) ② sqrt(6*s) /* sqrt()是求平方根函数*/ 【3.3】下面程序的功能是计算1-3+5-7+ …… -99+101的值。 main() { int i,t=1,s=0; for(i=1;i<=101;i+=2) { ① ; s=s+t; ② ; } printf("%d\n",s); } 答案: ① t=t*i ② t=t>0? -1: 1 【3.4】下面程序的功能是从键盘上输入若干学生的学习成绩,统计并输出最高成绩和最低成绩,当输入为负数时结束输入。 main() { float x,amax,amin; scanf("%f",&x); amax=x; amin=x; while( ① ) { if(x>amax) amax=x; if( ② ) amin=x; scanf("%f",&x); } printf("\namax=%f\namin=%f\n",amax,amin); } 答案: ① x>=0 ② x 【3.5】下面程序的功能是将形参x的值转换为二进制数,所得的二进制数放在一个一维数组中返回,二进制数的最低位放在下标为0的元素中。 fun(int x,int b[]) { int k=0,r; do { r=x% ① ; b[k++]=r; x/= ② ; }while(x); } 答案: ① 2 ② 2 【3.6】下面程序的功能是输出100以内的个位数为6、且能被3整除的所有数。 main() { int i,j,n; n=0; for(i=0; ①i<10 ;i++) { j=i*10+6; n=n+1; if( ② j%3! =0) ; printf("%d",j); } } 答案: ① i<=9 ② j%3! =0 说明: 100以内的个位数为6的数有10个,即6、16、26、36、46、56、66、76、86、96 【3.7】下面程序的功能是用辗转相除法求两个正整数m和n的最大公约数。 hcf(int m,int n) { int r; if(m { r=m; ① ; n=r; } r=m%n; while( ② ) { m=n; n=r; r=m%n; } ③ ; } 答案: ① m=n ② r! =0 ③ return(n) 【3.8】下面程序的功能是使用冒泡法对输入的10个浮点数从小到大进行排序。 排好序的10个数分两行输出。 程序如下: #include main() { ① ; int i,j; printf("Input 10 numbers please\n"); for(i=0; ② ;i++ ) scanf("%f", &a[i]); printf("\n"); for(i=2; ③ ;i++ ) for(j=0; ④ ;j++ ) if( ⑤ ) { x=a[j]; ⑥ ; a[j+1]=x; } printf("The sorted 10 numbers;\n"); for(i=0; ⑦ ;i++ ) { if( ⑧ ) printf("\n"); printf("%f\t",a[i]); } printf("\n"); } 答案: ① float a[10],x ② i<=9 ③ i<=8 ④ j<=9-i ⑤ a[j]>a[j+1] ⑥ a[j]=a[j+1] ⑦ i<=9 ⑧i%5==0 【3.9】下面程序的功能是读入20个整数,统计非负数个数,并计算非负数之和。 #include "stdio.h" main() { int i,a[20],s,count; s=count=0; for(i=0;i<20;i++ ) scanf("%d", ① ); for(i=0;i<20;i++) { if(a[i]<0) ② ; s+=a[i]; count++; } printf("s=%d\t count=%d\n",s,count); } 答案: ① &a[i] ② continue 注释: ①是基本概念,使用scanf函数输入数组元素的值。 当输入的元素值小于0时,应当跳过后面的语句,取下一个数,所以②要填入continue。 【3.10】下面程序的功能是删除字符串s中的空格。 #include main() { char *s="Beijing ligong daxue"; int i,j; for(i=j=0;s[i]! ='\0';i++) if(s[i]! = ' ') ① ; else ② ; s[j]= '\0'; printf("%s",s); } 答案: ① s[j++]=s[i] ② s[j]=s[i] 【3.11】下面程序的功能是将字符串s中所有的字符'c'删除。 请选择填空。 #include main( ) { char s[80]; int i,j; gets(s); for(i=j=0;s[i]! = '\0';i++ ) if(s[i]! = 'c') ① ; s[j]= '\0'; puts(s); } 答案: ① s[j++]=s[i] 【3.12】下面程序的功能是输出两个字符串中对应相等的字符。 请选择填空。 #include char x[]="programming"; char y[]="Fortran"; main() { int i=0; while(x[i]! = '\0' && y[i]! = '\0') if(x[i]==y[i]) printf("%c", ① ); else i++; } 答案: ① x[i++] 【3.13】下面程序的功能是将字符串s中的每个字符按升序的规则插到数组a中, 字符串a已排好序。 #include main() { char a[20]="cehiknqtw"; char s[]="fbla"; int i,k,j; for(k=0;s[k]! = '\0';k++ ) { j=0; while(s[k]>=a[j] && a[j]! = '\0' ) j++; for( ① ) ② ; a[j]=s[k]; } puts(a); } 答案: ① i=strlen(a);i>=j;i-- ② a[i+1]=a[i] 【3.14】下面的函数index(char s[], char t[])检查字符串s中是否包含字符串t,若包含,则返回t在s中的开始位置(下标值),否则送回-1。 index(char s[], char t[]) { int i,j,k; for(i=0;s[i]! = '\0';i++ ) { for(j=i,k=0; ① && s[j]==t[k];j++,k++) ; if( ② ) return (i); } return(-1); } ① t[k]! = '\0' ② t[k]== '\0' 【3.15】下面程序的功能是计算S= k! 。 k=0 long fun(int n) { int i; long s; for(i=1;i ① ;i++) s*=i; return( ② ); } main() { int k,n; long s; scanf("%d",&n); s= ③ ; for(k=0;k<=n;k++) s+= ④ ; printf("%ld\n",s); } 答案: ① <=n ② s ③ 0 ④ fun(k) 【3.16】以下程序是计算学生的年龄。 已知第一位最小的学生年龄为10岁,其余学生的年龄一个比一个大2岁,求第5个学生的年龄。 #include age( int n ) { int c; if( n==1 ) c=10; else c= ① ; return(c); } main() { int n=5; printf("age: %d\n", ② ); } 答案: ① 2+age(n-1) ② age(5) 注释: 由于程序是递归算法,因此首先要建立问题的递归数学模型。 根据原题的描述可以写出如下递归公式: age(n) = 10 (n=1) age(n) = 2+age(n-1) (n>1) 对照程序和递归公式可以看出: n的含义是第n位学生。 很显然,要求第5位学生的年龄,②处应当是调用函数age,实参的值应当是5。 在①处应该是函数的递归调用,根据递归公式,应当填写: 2+age(n-1)。 【3.17】下面的函数是一个求阶乘的递归调用函数。 facto(int n) { if( n == 1 ) ① ; else return( ② ); } 答案: ① return (1) ② n*facto(n-1) 注释: 我们熟悉的求n! 的算法一般是采用循环语句实现,但在此程序中根本没有循环语句。 这时我们应该想到: 是采用递归算法实现的。 首先写出求n! 的递归公式; n! =1 当n=1时 n! =n*(n-1) 当n>1时 根据此递归定义,可以很容易完成程序。 【3.18】下列函数是求一个字符串str的长度。 int strlen( char *str ) { if( ① ) return (0); else return ( ② ); } 答案: ① *str=='\0' ② 1+strlen(str+1) 注释: 求串长算法的关键是确定串结束标记'\0'的位置。 根据求串长的方法,可以得到如下递归算法: 指针str指向字符串的首字符 如果 当前字符(*str)== 串结束标记'\0' 则 串长=0 否则 串长 = 1+除第一个字符之外的剩余字符串的串长 因此,在①的位置上应当填写"*str=='\0'",以判断当前字符(*str)是否是串结束标记'\0'。 在②的位置应当是根据上面的递归算法进行递归调用,因此应当填写"1+strlen(str+1)"。 【3.19】函数revstr(s)将字符串s置逆,如输入的实参s为字符串"abcde", 则返回时 s 为字符串"edcba"。 递归程序如下: revstr( char *s ) { char *p=s, c; while(*p) p++; ① ; if(s { c=*s; *s=*p; ② ; revstr(s+1); ③ ; } } 如下是由非递归实现的revstr(s)函数: revstr (s) char *s; { char *p=s, c; while( *p ) p++; ④ ; while( s { c=*s; ⑤ = *p; *p-- = c; } } 答案: ① p-- ② *p='\0' ③ *p=c ④ p-- ⑤ *s++ 注释: 在递归算法中,指针s指向字符串首部要反向的字符,即要将指针s所指向的字符与指针p 所指向的字符串尾的字符('\0')进行交换,在交换过程中,将尚没有交换的字符串的中间部分作为一个整体,进行递归处理。 程序中首先执行"c=*s",将首字符存入临时变量;然后执行"*s=*p",将尾字符存入串首;执行"revstr(s+1)"是递归处理串的中间部分,这时,在②处应当填入"*p='\0'",即存入串结束标记。 这是这一程序中的关键所在。 在③处要完成将存在临时变量c中的字符存入串尾的工作,应当填写"*p=c"。 【3.20】下面函数用递归调用的方法,将str中存放的长度为n的字符串反转过来,例如原来是"ABCDE",反序为"EDCBA"。 void invent(char *str,int n) { char t; t=*str; *str=*(str+n-1); *(str+n-1)=t; if( n>2 ) invent ( ① ,n-2); else ② ; } 答案: ① str+1 ② return ①改为 n-2 【3.21】下面程序的功能是实现数组元素中值的逆转。 #include main() { int i,n=10,a[10]={1,2,3,4,5,6,7,8,9,10}; invert(a,n-1); for(i=0;i<10;i++) printf("%4d",a[i]); printf("\n"); } invert(int *s,int num) { int *t,k; t=s+num; while( ① ) { k=*s; *s=*t; *t=k; ② ; ③ ; } } 答案: ① s 【3.22】下面函数的功能是将字符变量的值插入已经按ASCII码值从小到大排好序的字符串中。 void fun(char *w,char x,int *n) { int i,p=0; while(x>w[p]) ① ; for(i=*n;i>=p;i--) ② ; w[p]=x; ++*n; } 答案: ① p++ ② w[i+1]=w[i] } 【3.23】下面程序的功能是输入学生的姓名和成绩,然后输出。 #include struct stuinf { char name[20]; /* 学生姓名 */ int score; /* 学生成绩 */ } stu, *p; main ( ) { p=&stu; printf("Enter name: "); gets( ① ); printf("Enter score: "); scanf("%d", ② ); printf("Output: %s, %d\n", ③ , ④ ); } 答案: ① stu.name ② &stu.score ③ p->name ④ p->score 【3.24】下面程序的功能是按学生的姓名查询其成绩排名和平均成绩。 查询时可连续进行,直到输入0时才结束。 #include #include #define NUM 4 struct student { int rank; char *name; float score; }; ① stu[ ]={ 3,"liming",89.3, 4,"zhanghua",78.2, 1,"anli",95.1, 2,"wangqi",90.6 }; main() { char str[10]; int i; do { printf("Enter a name"); scanf("%s",str); for( i=0;i if( ② ) { printf("Name : %8s\n",stu[i].name); printf("Rank : %3d\n",stu[i].rank); printf("Average : %5.1f\n",stu[i].score); ③ ; } if( i>=NUM ) printf("Not found\n"); }while( strcmp(str,"0")! =0 ); } 答案: ① struct student ② strcmp(stu[i].name,str)==0 ③ break 注释: 程序的主体是一个二重循环,内层for循环完成查找学生的工作。 ①处是进行结构数组说明并初始化,按照结构变量说明的格式规定,应该填写: strcut student。 ②处为if语句的逻辑条件,应当是当查找到指定的学生后输出学生的情况,因此应当填写: strcmp(stu[i].name,str)==0。 ③处应当将控制退出内层的for循环,只能选择break语句。 【3.25】下面函数将指针p2所指向的线性链表,串接到p1所指向的链表的末端。 假定p1所指向的链表非空。 #define NULL 0 struct link { float a; struct link *next; }; concatenate ( p1,p2 ) struct list *p1,*p2; { if( p1->next==NULL ) p1->next=p2; else concatenate( ① ,p2); } 答案: ① p1->next 【326】下面函数的功能是创建一个带有头结点的链表,将头结点返回给主调函数。 链表用于储存学生的学号和成绩。 新产生的结点总是位于链表的尾部。 struct student { long num; int score; struct student *next; }; struct student *creat() { struct student *head=NULL,*tail; long num; int a; tail= ① malloc(LEN); do { scanf("%ld,%d",&num,&a); if(num! =0) { if(head==NULL) head=tail; else ② ; tail->num=num; tail->s
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 湖南省 计算机 二级 316 程序 阅读 填空
![提示](https://static.bdocx.com/images/bang_tan.gif)