【真题1】 给定程序的功能是根据公式计算S,计算结果通过形参指针sn 传回;n 通过形参传入。 1 1 1 1 1 Sn = ─ - ─ + ─ - ─ + … ─── 1 3 5 7 2n+1 例如:若n 的值为15 时,输出的结果是:S=0.769788 N=15。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确结果。 #include < stdio.h >void fun(float *sn, int n) {/**************found**************/ int i,j=___1___; float s=0.0; for(i=0;i< =n;i++) { s=s+j*1.0/(2*i+1); j*=-1; } /**************found**************/ ___2___=s; } main() { int n=15; float s; /**************found**************/ fun(___3___); printf("S=%f N=%d\n", s, n); } (2011年2月) 解析: 本题的考核点是公式算法。 提示思路:通过关于变量j的表达式j*=-1;来控制是加还是减。 答案:【1】1 【2】*sn 【3】&s,n 【真题2】 下列给定程序是建立一个带头结点的单向链表,并用随机函数为各结点 数据域赋值。函数fun()的作用是求出单向链表结点(不包括头结点)数据域中的最大 值,并且作为函数值返回。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动main 函数,不得增行或删行,也不得更改程序的结构。 试题程序: #include < stdio.h >#include < conio.h >#include < stdlib.h >typedef struct aa { int data; struct aa *next; } NODE; /**********************found***********************/ fun (NODE *h) { int max=-1; NODE *p; p=h- >next; while(p) { if(p- >data >max) max=p- >data; /**********************found***********************/ p=h- >next; } return max; } outresult(int s, FILE *pf) { fprintf(pf, "\nThe max in link :%d\n ",s);} NODE *creatlink(int n, int m) { NODE *h,*p,*s,*q; int i, x; h=p=(NODE *)malloc(sizeof(NODE));h- >data=9999; for(i=1;i< =n;i++) { s=(NODE *) malloc(sizeof(NODE)); s- >data=rand()%m; s- >next=p- >next; p- >next=s; p=p- >next; } p- >next=NULL; return h; } outlink(NODE *h,FILE *pf) { NODE *p; p=h- >next; fprintf(pf, "\n The LIST :\n\n HEAD"); while(p) { fprintf(pf, "- >%d",p- >data); p=p- >next;} fprintf(pf, "\n"); } main() { NODE *head; int m; clrscr(); head=creatlink(12,100); outlink(head,stdout); m=fun(head); printf("\nThe RESULT :\n"); outresult(m,stdout); } (2011年2月) 解析: (1)错误:fun(NODE *h) 正确:int fun(NODE *h) (2)错误:p=h- >next; 正确:p=p- >next; 本题考查的这种链表的数据结构中,必须利用指针变量才能实现。即一个结点 中应包含一个指针变量,用它存放下一结点的地址。建立单向链表的一般步骤 是:建立头指针→建立第一个节点→头指针指向第一个节点→建立第二个节点 →第一个节点的指针域指向第二个节点→……→最后一个节点指向NULL。本题 重点是:了解链表的基本思想和相关算法,其实考试时的程序根本没有书上的 难。在这里我们要说,重点理解有关链表插入及删除时指针移动的先后顺序问 题。注意指针的保存和归位。(即头指针的保存和链表遍历时指针的归位)。 这都是考试重点! 【真题3】 请编一个函数double Pdt(int n,double pp[]), 它的功能是:求出数 组pp 中n 个数的整数部分的和,并返回此值。 例如: 若输入4 和11.91、23.87、35.79、40.83, 则输出109.0,整数部分的 值应小于10 的16 次方。 注意:此程序存贮在prog.c中。 请勿改动主程序main、函数WriteData 和函数compute 中的任何内容,仅在函数 Pdt 的花括号中填入你编写的若干语句。 #include < conio.h >#include < stdio.h >#include < math.h >#define M 20 double Pdt( int n, double pp[] ) {……} main( ) { int i, m; double tt[M]; clrscr(); printf("\nPlease enter number of numbers: "); scanf("%d", &m ); printf("\nPlease enter %d decimal numbers: ", m); for( i = 0; i < m; i++ ) scanf("%lf", &tt[i] ); printf( "\nThe product of their integer part is: %lf.", Pdt(m, tt) ); compute(); } /* 以下部分与考生答题无关, 考生不必阅读, 但不得进行任何修改 */ WriteData(double sum) { FILE *fp; fp = fopen("dat62.dat", "w") ; fprintf(fp, "%lf", sum); fclose(fp); } compute( ) { int i, n; double pp[M]; FILE *fp; fp = fopen("c9670603.in", "r"); fscanf(fp, "%d", &n ); for( i = 0; i < n; i++ ) fscanf(fp, "%lf", &pp[i] ); fclose(fp); WriteData(Pdt(n, pp)); } (2011年2月) 解析: 本题的考核点是C语言的类型转换规则。 解题思路:根据C 编译器的隐式类型转换原则,将一个A类型的数据赋给一个 B类型时,先将A类型数据转换为B 类型数据,然后再赋给B,因此将一个浮 点型的数据赋给整型时,将得到这个浮点型数据的整数部分,我们将整数部分 累加即可得出结果。 double Pdt( int n, double pp[] ) { int i, int_data; double result = 0; for (i = 0;i < n; i++) { int_data = pp[i]; /*将字符数组pp中的元素隐式转换为整型值赋给变量 int_data*/ result += int_data; /*求出数组pp中n 个数的整数部分的和*/ } return result; /*返回所求结果*/ } |