计算机二级C语言上机真题(40)【附详解】
【真题1】 函数fun()它的功能是计算:
s=(1-ln(1)-ln(2)-ln(3)-…-ln(m))2
s 作为函数值返回。
在C 语言中可调用log(n)函数求ln(n)。log函数的引用说明是double log
(double x)。
例如,若m 的值为15,则fun()函数值为723.570801。
注意:部分源程序给出如下。
试题程序:
#include < conio.h >#include < stdio.h >#include < math.h >double
fun(int m)
{ int i;
double s=1.0;
for(i=1;i< =__1__;i++)
s=s-log(i); /*计算s=1-ln(1)-ln(2)-ln(3)-…-ln(m)*/
return (__2__); /*对s 求平方并返回*/
}
main()
{
printf("%f\n ",fun(15));
}
(2011年2月)
解析: 首先,题目要求计算1依次减去从1 到m 的对数,可用从1 到m的循
环,每次循环都减一个数的对数。该题需要注意之处是,log()函数的形式参数
应当为double型变量,而用于循环的基数变量为整数,需要进行强制转换。最
后在返回的时候求平方。
答案:1: m 2: s*s
【真题2】 给定程序modi.c 中的函数Creatlink 的功能是创建带头结点的单向链
表,并为各结点数据域赋0 到m-1 的值。请改正函数Creatlink 中指定部位的错
误,使它能得出正确的结果。注意:不要改动main 函数,
#include < stdio.h >#include < conio.h >#include < stdlib.h >typedef
struct aa
{ int data;
struct aa *next;
} NODE;
NODE *Creatlink(int n, int m)
{ NODE *h=NULL, *p, *s;
int i;
/**********found***********/
p=(NODE )malloc(sizeof(NODE));
h=p;
p- >next=NULL;
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;
}
/**********found***********/
return p;
}
outlink(NODE *h)
{ NODE *p;
p=h- >next;
printf("\n\nTHE LIST :\n\n HEAD ");
while(p)
{ printf("- >%d ",p- >data);
p=p- >next;
}
printf("\n");
}
main()
{ NODE *head;
clrscr();
head=Creatlink(8,22);
outlink(head);
}
(2011年2月)
解析: 本题的考核点是建立链表并为各结点赋值。
提示思路:设三个指针变量:h、p、s,它们都指向结构体类型数据。先用
malloc函数开辟一个结点,并使h 指向它,通过循环再开辟新的结点,并使s
指向新开辟的结点,将读入的随机数给s 所指的结点,即为s 结点赋值。
程序中的第一个错误:p=(NODE )malloc(sizeof(NODE)); 应改为:
p=(NODE *)malloc(sizeof(NODE));
程序中的第二个错误:return p; 应改为:return h;
【真题3】 请编写一个函数 void fun (int x, int pp[], int *n),它的功能是:求
出能整除 x 且不是奇数的各整数,并放在数组pp 中, 这些除数的个数由 n 返回。
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其它函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < conio.h >#include < stdio.h >void fun ( int x, int pp[], int *n )
{……}
main( )
{ int x, aa[1000], n, i ;
clrscr() ;
printf( "\nPlease enter an integer number:\n" ) ; scanf("%d", &x) ;
fun(x, aa, &n ) ;
for( i = 0 ; i < n ; i++ )
printf("%d ", aa[i]) ;
printf("\n") ;
}
(2011年2月)
解析: 本题的考核点是C语言的指针及循环的嵌套。
解题思路:
1、通过循环找出能整除 x 且不是奇数的整数;
2、在函数中的循环中,一旦找到能整除 x 且不是奇数的整数,立即将其存入数
组pp[]中;
3、定义计数器j,在循环查找特定整数的过程中,j 对特定整数的数目进行记
录;
4、循环查找完毕后,将特定整数的数目传给n。
/*由于要求的数不能是奇数故编程时从0 开始循环而步长为2 这样正好保正i
永远是偶数。这里也要注意存放结果的数组pp的下标变化方式*/
void fun(int x, int pp[], int *n)
{ int i,j=0;
for( i=0;i< =x;i=i+2) /*i从0 开始循环而步长为2 这样正好保正i永远是
偶数*/
if( x%i==0) /*判断x能否被i整除*/
pp[j++]=i; /*将符合条件的数存入数组pp[]中*/
*n=j; /*将统计的符合条件的数的个数传给*n*/
}
s=(1-ln(1)-ln(2)-ln(3)-…-ln(m))2
s 作为函数值返回。
在C 语言中可调用log(n)函数求ln(n)。log函数的引用说明是double log
(double x)。
例如,若m 的值为15,则fun()函数值为723.570801。
注意:部分源程序给出如下。
试题程序:
#include < conio.h >#include < stdio.h >#include < math.h >double
fun(int m)
{ int i;
double s=1.0;
for(i=1;i< =__1__;i++)
s=s-log(i); /*计算s=1-ln(1)-ln(2)-ln(3)-…-ln(m)*/
return (__2__); /*对s 求平方并返回*/
}
main()
{
printf("%f\n ",fun(15));
}
(2011年2月)
解析: 首先,题目要求计算1依次减去从1 到m 的对数,可用从1 到m的循
环,每次循环都减一个数的对数。该题需要注意之处是,log()函数的形式参数
应当为double型变量,而用于循环的基数变量为整数,需要进行强制转换。最
后在返回的时候求平方。
答案:1: m 2: s*s
【真题2】 给定程序modi.c 中的函数Creatlink 的功能是创建带头结点的单向链
表,并为各结点数据域赋0 到m-1 的值。请改正函数Creatlink 中指定部位的错
误,使它能得出正确的结果。注意:不要改动main 函数,
#include < stdio.h >#include < conio.h >#include < stdlib.h >typedef
struct aa
{ int data;
struct aa *next;
} NODE;
NODE *Creatlink(int n, int m)
{ NODE *h=NULL, *p, *s;
int i;
/**********found***********/
p=(NODE )malloc(sizeof(NODE));
h=p;
p- >next=NULL;
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;
}
/**********found***********/
return p;
}
outlink(NODE *h)
{ NODE *p;
p=h- >next;
printf("\n\nTHE LIST :\n\n HEAD ");
while(p)
{ printf("- >%d ",p- >data);
p=p- >next;
}
printf("\n");
}
main()
{ NODE *head;
clrscr();
head=Creatlink(8,22);
outlink(head);
}
(2011年2月)
解析: 本题的考核点是建立链表并为各结点赋值。
提示思路:设三个指针变量:h、p、s,它们都指向结构体类型数据。先用
malloc函数开辟一个结点,并使h 指向它,通过循环再开辟新的结点,并使s
指向新开辟的结点,将读入的随机数给s 所指的结点,即为s 结点赋值。
程序中的第一个错误:p=(NODE )malloc(sizeof(NODE)); 应改为:
p=(NODE *)malloc(sizeof(NODE));
程序中的第二个错误:return p; 应改为:return h;
【真题3】 请编写一个函数 void fun (int x, int pp[], int *n),它的功能是:求
出能整除 x 且不是奇数的各整数,并放在数组pp 中, 这些除数的个数由 n 返回。
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其它函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < conio.h >#include < stdio.h >void fun ( int x, int pp[], int *n )
{……}
main( )
{ int x, aa[1000], n, i ;
clrscr() ;
printf( "\nPlease enter an integer number:\n" ) ; scanf("%d", &x) ;
fun(x, aa, &n ) ;
for( i = 0 ; i < n ; i++ )
printf("%d ", aa[i]) ;
printf("\n") ;
}
(2011年2月)
解析: 本题的考核点是C语言的指针及循环的嵌套。
解题思路:
1、通过循环找出能整除 x 且不是奇数的整数;
2、在函数中的循环中,一旦找到能整除 x 且不是奇数的整数,立即将其存入数
组pp[]中;
3、定义计数器j,在循环查找特定整数的过程中,j 对特定整数的数目进行记
录;
4、循环查找完毕后,将特定整数的数目传给n。
/*由于要求的数不能是奇数故编程时从0 开始循环而步长为2 这样正好保正i
永远是偶数。这里也要注意存放结果的数组pp的下标变化方式*/
void fun(int x, int pp[], int *n)
{ int i,j=0;
for( i=0;i< =x;i=i+2) /*i从0 开始循环而步长为2 这样正好保正i永远是
偶数*/
if( x%i==0) /*判断x能否被i整除*/
pp[j++]=i; /*将符合条件的数存入数组pp[]中*/
*n=j; /*将统计的符合条件的数的个数传给*n*/
}