114199249.doc 2007年7月11日 第 1 页 共 6 页 武汉大学计算机学院 2006-2007学年度第2学期2006级 《高级语言程序设计》期末考试试卷A卷 姓名: 学号: 专业: 说明:开卷考试,答案请全部写在答题纸上,写在试卷上无效。 未经主考教师同意,考试试卷、答题纸、草稿纸均不得带离,否则视为违规。 题号 一 二 三 四 五 总分 总分 16 24 15 30 15 100
一. 单项选择题:(选择最合适的答案填空,每小题2分,共16分) ( )1、在执行以下程序时,从键盘上输入9,则该程序输出结果是__________。 #include int main( ) { int n; scanf("%d",&n); if(n++<10) printf("%d\n",n); else printf("%d\n",n--); return 0; } A、8 B、9 C、10 D、11 ( )2、表达式0156637&~0777的结果是____________。 A、0156000 B、156000 C、0637 D、637 ( )3、假设有如下定义:int m=1,n=1; 则执行表达式(m=’5’<’3’)&&(n=’7’>’9’)后,m和n的值分别是_____________________。 A、1和1 B、1和0 C、0和1 D、0和0 ( )4、表达式-11%3+7/2的结果是____________。 A、5.5 B、5 C、1.5 D、1 ( )5、设有如下宏定义: #define BOOK(x) 8-x 则执行赋值语句 v=BOOK(2)*BOOK(4); /*v为int型变量*/ 后,变量v的值为 。 A、-12 B、0 C、24 D、44 ( )6、设有如下定义: int a[6][4]; int (*p)[4]; p=a; 则与表达式*p+3等价的选项是_________。 A、a[0][3] B、&a[0][3] C、a[3][0] D、&a[3][0] ( )7、假设有以下定义: static char *a=”h\te\nY\0W\0o\b”; 114199249.doc 2007年7月11日 第 2 页 共 6 页
则表达式strlen(a)的结果为________。 A、15 B、10 C、7 D、5 ( )8、假设有如下定义: int a=1,b=2,c=3,u,v; 执行下面语句组后,整型变量u和v的值分别为_____________。 u = a ? b : c; v = (a = 2) ? b + a:c + a; A、3和3 B、3和4 C、2和3 D、2和4
二. 程序阅读与分析(每小题8分,共24分) 9、分析下面程序执行流程,指出程序执行结果。 #include int main() { int i; for(i=1;i<=6;i++) switch (i%5) { case 0: printf(“*”);break; case 1: printf(“#”);break; default: printf(“\n”); case 2: printf(“&”); } return 0; } 10、下面程序完成的功能如下:输入一个由10个整数组成的数组a,将该数组下标值为偶数的元素由小到大排序,将下标值为奇数的元素由大到小排序。 例如,输入数组a为{8,1,6,3,4,5,2,7,0,9},执行下面程序后,数组a为{0,9,2,7,4,5,6,3,8,1}。 请在空白处填写合适内容以正确完成整个程序。 #include int main() { (1) a[10],n; int i,j,t; for(i=0;i<10;i++) scanf("%d", (2) ); for(i=0;i<7;i+=2) for(j= (3) ;j<10; (4) ) { if( (5) ) { t=a[i]; a[i]=a[j]; a[j]=t; } if( (6) ) { t=a[i+1]; a[i+1]=a[j+1]; a[j+1]=t;} } for(i=0; (7) ;i++) printf("%d\t", (8) ); return 0; 114199249.doc 2007年7月11日 第 3 页 共 6 页
} 11、分析以下程序执行流程,请指明错误之处,并简要说明错误原因,并给出修改意见。(共4个错误)
/*输入多个整数,以0作为结束标记,将这些整数存入到Exam.dat文件中*/ /*然后将这些数据从Exam.dat文件中读出来,显示到显示器上*/ #include #include int main() { File *fp; if((fp = fopen("Exam.dat","w"))==NULL) { printf("open file error!"); exit(1); } do { scanf("%d", p); fprintf(fp,”%d ”,p); }while(p!=0); fclose(fp); if((fp = fopen ("Exam.dat","r")) == NULL) { printf("open file error!"); exit(1); } do { fscanf(fp,"%d",p); printf("%6d\t",p); }while(p!=0); fclose(fp); return (0); }
三. 程序测试与分析(每小题5分,共15分) 12、以下程序计算-32768-3,执行以下程序,得到如下所示的运行结果,请分析结果为什么不是-32771?并指出该如何修改。 #include int main() { short int a,b; a=-32768; b=a-3; printf("a=%d,b=%d\n",a,b); } 运行结果: 114199249.doc 2007年7月11日 第 4 页 共 6 页
a=-32768,b=32765 13、上机调试下面的程序,在编译过程提示有如下语法错误“too many arguments to function in max(int,int)”。分析下面程序,说明出现上述语法错误的原因。并指出用下划线标注的语句的作用是什么? #include #define MAX #ifdef MAX int max(int x, int y) { return (x>y)?x:y; } #else int max(int x, int y, int z) { int k; k=x>y?x:y; return (z>k)?z:k; } #endif int main() { int a,b,c; scanf(“%d%d%d”,&a,&b,&c); printf(“max=%d\n”,max(a,b,c)); return 0; } 14、下面的函数的功能是从一个整数组成的单链表中删除指定整数n的节点。 #include #include struct node{ int data; struct node *next; }; int deletelink (struct node *phead,int n) { struct node *p,*q; p=phead; while(p->data!=n&&p->next!=NULL) { q=p; p=p->next; } if(p->data==n) /*找到*/ { if(p==phead) /*被删除的结点是链头*/ phead=p->next; else /*被删除的结点不是链头*/ q->next=p->next; free(p); return (1); } else 114199249.doc 2007年7月11日 第 5 页 共 6 页
return (0); } 假设有下图所示的单链表:
现在要求从上图所示的单链表中删除数据值等于3的节点,通过执行函数调用deletelink(head,3)来完成该删除操作。但是函数调用结束后,该链表仍然和上图一样,整数3并没有从链表中删除,请分析出错的原因,并给出修改意见。 (提示:被删除的节点是单链表中的第一个节点。)
四. 程序实现题(每小题15分,共30分) 15、下面程序完成的功能如下:输入一个整数,要求按原来的规律将它插入一个已经排好序的数组中。分析该程序的执行流程,写出该程序的流程图。 #include int main() { int a[11]={1,4,6,9,13,16,19,28,40,100}; int temp1,temp2,number,end,i,j; printf("original array is:\n"); for(i=0;i<10;i++) printf("%5d",a[i]); printf("\n"); printf("insert a new number:"); scanf("%d",&number); end=a[9]; if(number>end) a[10]=number; else { for(i=0;i<10;i++) { if(a[i]>number) { temp1=a[i]; a[i]=number; for(j=i+1;j<11;j++) { temp2=a[j]; a[j]=temp1; temp1=temp2; } break; } } } for(i=0;i<11;i++) printf("%6d",a[i]);
3 4 5 / head