题目:
请补充fun函数,该函数的功能是:计算并输出下列多项式的值。
S = 1 + 1/(1+2) + 1/(1+2+3) + ...... + 1/(1+2+3+ (50)
例如,若主函数从键盘给n输入50后,则输出为S=1.960784。
注意:部分源程序如blank.c给出。
请勿改动主函数main和其他函数中的任何内容,仅在fun函数的横线上填入所编写的若干表达式或语句。
#include
___1___ fun(int n)
{
int i,j;
double sum=0.0,t;
for(i=1;i<=n;i++)
{
t=0.0;
for(j=1;j<=i;j++)
t+= ___2___;
sum+= ___3___;
}
return sum;
}
main()
{
int n;
double s;
printf("\nInput n: ");
scanf("%d",&n);
s=fun(n);
printf("\n\ns=%f\n\n",s);
}
58
题目:
请补充main函数,该函数的功能是,将保存在磁盘文件中的10个学生的数据中的第1、3、5、7、9个学生的数据输入计算机,并在屏幕上显示出来。
注意:部分源程序如blank.c给出。
仅在横线上填入所编写的若干表达式或语句,勿改动函数中的其它任何内容。
#include
struct student
{
char name[10];
int num;
int age;
char sex;
}stud[10];
main()
{
int i;
FILE *fp;
if((fp=fopen("stud.dat","rb"))==NULL)
{
printf("can not open file\n");
exit(0);
}
for(i=0; i<10; i+=___1___)
{
fseek(fp, ___2___*sizeof(struct student),0);
fread(___3___, sizeof(struct student),1,fp);
printf("%s %d %d %c\n",stud[i].name, stud[i].num, stud[i].age,stud[i].sex);
}
fclose(fp);
}
59
题目:
请补充main函数,该函数的功能是,计算两个自然数n和m(m<1000)之间所有数的和。n和m从键盘输入。
例如,当n=1,m=100时,sum=5050,当n=100,m=1000时,sum=495550。
注意:部分源程序如blank.c给出。
仅在横线上填入所编写的若干表达式或语句,勿改动函数中的其它任何内容。
#include
#include
main()
{
int n,m;
long sum;
___1___;
clrscr();
printf("\nInput n,m\n");
scanf("%d,%d",&n,&m);
while( n<=m )
{
___2___;
n++;
}
printf("sum=%___3___\n",sum);
}
60
题目:
请补充fun函数,该函数的功能是把数组bb中的数按从大到小排列。数组的值及元素个数从主函数中输入。
例如:输入2 1 3 5 4,结果为1 2 3 4 5。
注意:部分源程序如blank.c给出。
请勿改动主函数main和其它函数中的任何内容,仅在fun函数的横线上填入所编写的若干表达式或语句。
#include
#define N 100
void fun(int bb[],int n)
{
int i,j,t;
for(i=0;___1___;i++)
for(j=0;___2___;j++)
if(bb[j]>bb[j+1]) {
t=bb[j];
bb[j]=bb[j+1]; bb[j+1]=t;
}
}
main()
{
int i=0,n=0;
int bb[N];
clrscr();
printf("\nInput n:\n");
scanf("%d",&n);
printf("\nInput data:\n"); while(i { printf("bb[%d]=",i); scanf("%d",&bb[i]); i++; } fun(bb,n); printf("\n******** the result *********\n"); for( i=0; i printf("%4d",bb[i]); printf("\n"); } 精打细算,还是上淘宝网合算 解答 57 分析: 题目要求程序计算S = 1 + 1/(1+2) + 1/(1+2+3) + …… + 1/(1+2+3+……+50)的值。所以必须使用循环计算S的每一项,然后使用某一变量(题目的程序使用了fun函数的t变量)累加每一项。而在计算S的每一项的时候也需要使用循环进行累加从而计算分母。 程序的第一个填空处应该填写double,因为从fun函数的最后一句语句: return sum; 可以看出fun函数返回的是sum变量的值,而sum变量类型为double类型。按照C语言的语法,函数的返回值类型就是被返回的变量的类型,所以fun函数的返回类型就是sum变量的类型,也就是double类型。 第二处填空处应该填写j,这是因为第二处填空处是在使用for循环计算S多项式第i项的分母1+2+……+i的值,而j正好表示1至i的值,所以填写j。 第三处填空处填写1.0/t,表示计算多项式S的各个项,其中t表示每一项中的分母。可能有考生会问,为什么不写1/t,而非要写 1.0/t呢?这里关键的问题是 1.0是实数类型(float类型或者double类型),而t也是实数类型(double类型),按照C语言的语法,两个实数类型的数字使用整除(/)运算符之后,计算结果还是实数,也就是说小数部分得到保留。如果两个int类型的整数使用整除(/)运算符之后,计算结果必定还是int类型,小数部分将丢失。而1就是int类型,所以填写1.0/t更加合适。 程序注解如下: #include /* fun返回类型和被返回的sum变量类型一致,即为double类型 */ double fun(int n) { int i,j; /* sum将存放多项式S=1+1/(1+2)+1/(1+2+3)+……+1/(1+2+3+……+n)的总和 */ /* t将存放多项式S每一项的分母 */ double sum=0.0,t; /* 计算多项式S,一共计算n项,最后一项为1/(1+2+3+……+n) */ for(i=1;i<=n;i++) { /* t准备用于累加计算第i项的分母,所以初始化为0.0 */ t=0.0; /* 计算第i项的分母1+2+……+i的值,将值放入t变量中 */ for(j=1;j<=i;j++) t+= j; /* 计算多项式S的第i项的值 */ sum+= 1.0/t; } return sum; } main() { int n; double s; printf("\nInput n: "); /* 输入n的值,可以输入50 */ scanf("%d",&n); s=fun(n); printf("\n\ns=%f\n\n",s); } 58 分析: 题目要求在main函数中将保存在磁盘文件中的10个学生的数据中的第1、3、5、7、9个学生的数据输入计算机,并在屏幕上显示出来。 此题涉及文件操作部分的函数,主要考察考生对fseek函数和fread函数的掌握程度。fseek 函数的原型如下: int fseek(FILE *fp,long offset,int fromwhere) fseek函数的作用是将文件的位置指针设置到从fromwhere开始的第offset字节的位置上,其中fromwhere是下列宏定义之一: (1)符号常数SEEK_SET,数值0,含义是从文件开头 (2)符号常数SEEK_CUR,数值1,含义是从文件指针的现行位置 (3)符号常数SEEK_END,数值2,含义是从文件末尾 fseek函数移动文件位置指针的目的是为了在文件中定位,以便后续程序可以进行操作,例如读取文件位置当前位置的内容。 fread函数的原型如下: int fread(void *buf,int size,int count,FILE *fp) fread函数是从文件中读取count个字段,每一个字段长度为size个字节,并把它们存放到buf指针所指向的缓冲区。 了解了fseek和fread函数之后,我们就能实现题目所规定的要求。程序首先使用fopen 函数以只读并且二进制的方式"rb"打开stud.dat文件。然后程序使用for循环逐个读取文件中的10个学生的数据中的第1、3、5、7、9个学生的数据。所以程序使用fseek函数定位第1、3、5、7、9个学生数据在stud.dat文件中的位置,定位之后使用fread函数读取学生数据到stud数组中。 程序中关键的代码有以下两句: (1)fseek(fp, i*sizeof(struct student),0); 作用:在fp文件指针指向的文件中将文件位置指针从文件开头位置往后移动i*sizeof(struct student)个字节。文件中的数据就是以student结构体为单位的,计算单个student结构体所占用的字节数使用sizeof关键字。sizeof关键字可以计算参数所占用的字节大小,例如sizeof(struct student)能够计算得到单个student结构体所占用的字节数。而i*sizeof(struct student)计算的是i个单个student结构体所占用的字节数。由于i在for循环中分别为0、2、4、6、8,所以通过fseek(fp, i*sizeof(struct student),0);语句就可以定位到第1、3、5、7、9个学生数据的位置。 (2)fread(&stud[i], sizeof(struct student),1,fp); 作用:从fp指向的文件中读取1个字段,这个个字段长度为单个student结构体长度,即sizeof(struct student)所计算得到的长度,并把它存放到stud数组第i个成员中。读取从fseek函数定位的位置开始。对照fread函数原型,第一个参数为指针类型,而stud[i]只是一个普通的数组成员,是int类型,而不是int *类型,所以需要使用&运算符针对stud[i]取地址,即&stud[i],这样才能使fread函数的第一个参数转化为指针类型。 程序注解如下: #include /* 封装学生信息的student结构体 */ struct student { char name[10]; int num; int age; char sex; }stud[10]; main() { int i; FILE *fp; /* 以"rb"的方式打开stud.dat文件 */ if((fp=fopen("stud.dat","rb"))==NULL) { /* 打开文件失败则输出提示信息 */ printf("can not open file\n"); /* exit函数作用是退出程序,参数表示程序结束的原因 */ /* 参数0一般表示正常退出 */ exit(0); } /* 读取第1、3、5、7、9个学生的数据,由于是奇数位置,所以i+=2 * for(i=0; i<10; i+=2) { /* 从文件fp开头往后移动i个student结构体大小的长度 */ fseek(fp, i*sizeof(struct student),0); /* 从fp所指文件的当前位置读取一个学生数据放入stud[i]中 */ fread(&stud[i], sizeof(struct student),1,fp); /* 显示读取的学生信息,例如name、num、age、sex */ printf("%s %d %d %c\n",stud[i].name, stud[i].num, stud[i].age,stud[i].sex); } /* 关闭fp所指向的文件 */ fclose(fp); } 59 分析: 题目要求计算两个自然数n和m(m<1000)之间所有数的和。其中n和m从键盘输入。为了实现以上要求,程序必须要定义一个存放总和的变量,而这个变量初始值应该设置为0。这个变量在题目的程序中便是sum变量。另外,由于两个自然数n和m(m<1000)之间所有数的总和可能比较大,有可能超出int类型所能表示的大小范围,所以需要使用表示范围更大的long类型定义sum变量。long类型就是long int类型的缩写,这种类型的能够表示的数值范围比int类型大。 在使用scanf函数接收从键盘输入的n、m变量值之后,程序使用while循环从n到m逐个 累加到sum变量中。当while循环结束的时候,sum变量的值便是两个自然数n和m(m<1000)之间所有数的和。最后程序将sum变量的值输出。 程序注解如下: #include #include main() { int n,m; /* sum为保存总和的变量 */ long sum; /* 由于累加的和要加入sum,所以sum初始值设置为0 */ sum=0; /* clrscr函数的作用是清屏,清除输出窗口中所有已经显示的内容 */ /* clrscr函数定义在conio.h中,所以需要#include "conio.h" */ clrscr(); printf("\nInput n,m\n"); /* 接收键盘上输入的n、m值 */ scanf("%d,%d",&n,&m); /* 累加n至m之间所有的自然数,总和放入sum变量中 */ while( n<=m ) { sum += n; n++; } /* 输出sum变量的值,也就是自然数n和m(m<1000)之间所有数的总和 */ printf("sum=%ld\n",sum); } 60 分析: 题目要求在fun函数中把数组bb中的数按从大到小排列。为了实现题目要求,题目中的程序使用了著名的冒泡排序算法。冒泡排序的基本思想是:依次比较数组中相邻的两个数,将较小数放在前面,较大数放在后面。即首先比较第1个和第2个数,将较小数放前,较大数放后。然后比较第2个数和第3个数,将较小数放前,较大数放后,如此继续,直至比较最后两个数,将较小数放前,较大数放后。此时第一趟结束,在最后的数必是数组中所有数字中的最大数。然后重复以上过程,仍从第1个和第2个数开始比较,将较小数放在前面,较大数放在后面。第二趟结束的时候,在数组倒数第二个数字就是本趟选出的最大数。如此下去,直至最终完成排序。 例如:数组中原先的数字顺序是9 1 5 8 4,第一趟之后便是1 5 8 4 9,第二趟之后便是1 5 4 8 9,第三趟之后便是1 4 5 8 9,第四趟之后便是1 4 5 8 9,第五趟之后便是1 4 5 8 9。第五趟结束的时候,排序过程全部完成。 由于在排序过程中总是大数往后放,小数往前放,相当于气泡往上升,所以形象地称为冒泡排序。 程序注解如下: #include #define N 100 /* bb数组为要进行从大到小排列的数组,n为bb数组中成员的个数 */ void fun(int bb[],int n) { int i,j,t; /* 有多少个数字就重复几趟排序 */ for(i=0;i /* 每一趟中重复比较相邻的两个数*/ for(j=0;j /* 比较相邻的两个数,将较小数放前面,较大数放后面 */ if(bb[j]>bb[j+1]) { /* 以下三句语句的作用是将bb[j]和bb[j+1]的值进行交换 */ t=bb[j]; bb[j]=bb[j+1]; bb[j+1]=t; } } main() { int i=0,n=0; int bb[N]; /* clrscr函数的作用是清屏,清除输出窗口中所有已经显示的内容 */ clrscr(); printf("\nInput n:\n"); /* 输入bb数组中数据的个数 */ scanf("%d",&n); printf("\nInput data:\n"); /* 逐个输入bb数组中的各个成员 */ while(i { printf("bb[%d]=",i); scanf("%d",&bb[i]); i++; } /* 调用fun函数进行题目所要求的从大到小排列处理 */ fun(bb,n); printf("\n******** the result *********\n"); /* 输出处理之后得到的bb数组 */ for( i=0; i printf("%4d",bb[i]); printf("\n"); }