文档库 最新最全的文档下载
当前位置:文档库 › 上机填空题57-60

上机填空题57-60

题目:

请补充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");

}

相关文档
相关文档 最新文档