计算机二级C语言上机真题(41)【附详解】
【真题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; /*返回所求结果*/
}
通过形参传入。
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; /*返回所求结果*/
}