您好,欢迎来到0527网。
搜索
您的当前位置:首页上机填空题5356

上机填空题5356

来源:0527网




上机填空题53-56.txt点的是烟抽的却是寂寞……不是你不笑,一笑粉就掉!人又不聪

明,还学别人秃顶。绑不住我的心就不要说我花心!再牛b的肖邦,也弹不出老子的悲伤!

活着的时候开心点,因为我们要死很久。请你以后不要在我面前说英文了,OK53

题目:

请补充fun函数,该函数的功能是求出以下分数序列的前n项之和。和值通过函数值返回

main函数。

2/13/28/513/821/13... ...

例如:若n=5,则应输出"8.391667"

注意:部分源程序如blank.c给出。

请勿改动主函数main和其它函数中的任何内容,仅在fun函数的横线上填入所编写的若干

表达式或语句。

#include<stdio.h>

#include<conio.h>

___1___fun(int n)

{

inta,b,c,k;

doubles;

s=0.0;

a=2;

b=1;

for(k=1;k<=n;k++)

{

s=s+(___2___)a/(___3___)b;

c=a;



a=a+b;

b=c;

}

returns;

}

main()

{

intn=5;

clrscr();

printf("Thevalue of function is:%lf\n",fun(n));

}

54

题目:

请补充fun函数,该函数的功能是比较字符串str1str2的大小,并返回比较的结果。

例如:当str1="abcd"str2="abc"fun函数返回">"

注意:部分源程序如blank.c给出。

请勿改动主函数main和其它函数中的任何内容,仅在fun函数的横线上填入所编写的若干

表达式或语句。

#include<stdio.h>

#include<conio.h>



#defineN 80

char*fun(char *str1,char *str2)

{

char*p1=str1,*p2=str2;

while(*p1&&*p2)

{

if(___1___)

return" < ";

if(___2___)

return" > ";

p1++;

p2++;

}

if(*p1==*p2)

return"==";

if(*p1==___3___)

return"<";

else

return">";

}

main()

{



charstr1[N],str2[N];

clrscr();

printf("Inputstr1:\n");

gets(str1);

printf("Inputstr2:\n");

gets(str2);

printf("\n*******theresult********\n");

printf("\nstr1%s str2\n",fun(str1,str2));

}

55

题目:

请补充fun函数,该函数的功能是:寻找两个整数之间的所有素数(包括这两个整数),把

结果保存在数组bb中,函数返回素数的个数。

例如:输入317,则输出为:35 7 11 13 17

注意:部分源程序如blank.c给出。

请勿改动主函数main和其它函数中的任何内容,仅在fun函数的横线上填入所编写的若干

表达式或语句。

#include<conio.h>

#include<stdio.h>

#define N 1000

intfun( int n,int m,int bb[N] )



{

int i,j,k=0, flag;

for(j=n;j<=m;j++)

{

___1___;

for(i=2;i<j;i++)

if(___2___)

{

flag=0;

break;

}

if(___3___)

bb[k++]=j;

}

returnk;

}

main()

{

int n=0,m=0,i,k;

intbb[N];

clrscr();

printf("Inputn:\n");



scanf("%d",&n);

printf("Inputm:\n");

scanf("%d",&m);

for(i=0;i<m-n;i++)

bb[i]=0;

k=fun(n,m,bb);

for(i=0;i<k;i++)

printf("%4d",bb[i]);

printf("\n");

}

56

题目:

请补充main函数,该函数的功能是把文本文件B中的内容追加到文本文件A的内容之后。

例如,文件B的内容为"I’m12.",文件A的内容为"I’ma students!",追加之后文件A

的内容为"I’ma students!I’m 12."

注意:部分源程序如blank.c给出。

仅在横线上填入所编写的若干表达式或语句,勿改动函数中的其它任何内容。

#include"stdio.h"

#include"conio.h"

#defineN 80



main()

{

FILE*fp,*fp1,*fp2;

inti;

charc[N],t,ch;

clrscr();

if((fp=fopen("A.dat","r"))==NULL)

{

printf("fileA cannot be opened\n");

exit(0);

}

printf("\nA contents are :\n\n");

for(i=0;(ch=fgetc(fp))!=EOF;i++)

{

c[i]=ch;

putchar(c[i]);

}

fclose(fp);

if((fp=fopen("B.dat","r"))==NULL)

{

printf("fileB cannot be opened\n");

exit(0);



}

printf("\n\n\nBcontents are :\n\n");

for(i=0;(ch=fgetc(fp))!=EOF;i++)

{

c[i]=ch;

putchar(c[i]);

}

fclose(fp);

if((fp1=fopen("A.dat","a"))___1___(fp2=fopen("B.dat","r")))

{

while((ch=fgetc(fp2))!=EOF)

___2___;

}

else

{

printf("Cannot open A B !\n");

}

fclose(fp2);

fclose(fp1);

printf("\n********newA contents*********\n\n");

if((fp=fopen("A.dat","r"))==NULL)

{



printf("fileA cannot be opened\n");

exit(0);

}

for(i=0;(ch=fgetc(fp))!=EOF;i++)

{

c[i]=ch;

putchar(c[i]);

}

___3___;

printf("\n");

}

省钱又省力,合算吧,上淘宝,最合算

解答

53

分析:

题目要求在fun函数中求出以下分数序列的前n项之和。和值通过函数值返回到main函数。

此题的关键是考查考生的对类型的了解。

我们先看第一个填空处。第一个填空处是要填写fun函数的返回值类型。我们可以看到fun

函数最后存在语句:

returns;

说明fun返回的是s的值,而变量s的类型就是fun函数的返回类型。而fun函数中存在s

变量的定义如下:



doubles;

说明s变量的类型是double类型,也就是说fun函数的返回类型为double类型,那么第

一处填空处应该填写double

第二处和第三处填空为什么要填写double类型呢?这是因为在fun函数中存在以下定义:

inta,b,c,k;

那么ab变量均为int类型,而题目中的分数序列中的每一项都是具有小数部分的,例如

第二项3/2就存在小数0.5。而整除运算(/)在C语言中存在以下语法规定:两个整数进行

整除运算结果将丢弃小数部分而只剩下整数部分。但是我们在以下语句中需要保留小数部分:

s=s+(double)a/(double)b;

为了达到我们的目的,程序中使用强制转化将ab转化为double类型,两个double类型

的数字进行整除(/)运算,运算结果必然是带有小数的double类型。所以第二处和第三处

填空应该都填写double

程序注解如下:

#include<stdio.h>

#include<conio.h>

doublefun(int n)

{

inta,b,c,k;

doubles;

/*s 保存分数序列的前n项之和*/

s=0.0;

/*设置分数序列的第一项的分子与分母*/

a=2;

b=1;

for(k=1;k<=n;k++)



{

/*计算每一项的值并累加,注意这里将ab分别强制转化成double类型 */

s=s+(double)a/(double)b;

/*计算下一项的分子和分母*/

c=a;

a=a+b;

b=c;

}

returns;

}

main()

{

intn=5;

/*clrscr 函数的作用是清屏,清除输出窗口中所有已经显示的内容*/

/*clrscr 函数定义在conio.h中,所以需要#include<conio.h> */

clrscr();

printf("Thevalue of function is:%lf\n",fun(n));

}

54



分析:

题目要求在fun函数比较字符串str1str2的大小,并返回比较的结果。两个字符串比

较大小的方法是两个字符串对应位置的字符逐个比较大小。而两个字符之间进行比较大小实

质上就是比较两者的ASCII码值。ASCII码值大的字符就是两个字符中较大者。ASCII表全称

是美国标准信息交换码(AmericanStandard Code for Information Interchange)

例如"abcd""abc"两个字符串,前面三个字符都是一样的,所以判断第四个字符。第一个

字符串中第四个字符为"d",而第二个字符串中没有第四个字符,所以"abcd"字符串大于"abc"

字符串。

第二个例子:"abcd""aBc"两个字符串,第一个字符都是"a",然后再比较第二个字符。

"abcd"中的"b""aBc"中的"B"比较大小。因为"b"ASCII码值大于"B"ASCII码值,所以

"abcd"字符串大于"aBc"字符串。

利用以上原理,题目中的程序使用以下思路实现题目的要求:

1)首先定义两个指针p1p2分别指向str1str2字符串的第一个字符。

2)然后使用while循环逐个比较指针p1p2分别指向的字符,也就是逐个比较str1

str2字符串的对应位置的每一个字符。在比较过程中,指针p1p2分别在str1str2字符

串中往后移动,以便逐个比较字符。

3)逐个比较的时候会发生三种情况。第一种str1str2两个字符串的字符个数正好相

同。这种情况下str1str2两个字符串对应位置的字符都进行了比较。第二种情况就是str1

字符串的字符个数多于str2字符串,也就是while循环结束的时候*p1=='\0'表达式成立,

那么str2字符串还有字符没有参与比较,则str2字符串大于str1字符串。第三种情况就是

str1字符串的字符个数少于str2字符串,也就是while循环结束的时候*p2=='\0'表达式成

立,那么str1字符串还有字符没有参与比较,则str2字符串小于str1字符串。

程序注解如下:

#include<stdio.h>

#include<conio.h>

#defineN 80

char*fun(char *str1,char *str2)

{

/*p1p2指针分别指向str1str2字符串的第一个字符*/



char*p1=str1,*p2=str2;

/*while(*p1&&*p2)while(*p1!='\0'&&*p2!= '\0')的简写方式*/

/*while 循环条件的意思是str1str2字符串都有字符参加比较大小*/

while(*p1&&*p2)

{

/*如果p1指针指向的字符小于p2指针指向的字符就返回"< " */

/*这是因为前面的字符已经决定出大小则无需再比较后续字符*/

if(*p1<*p2)

return" < ";

/*如果p1指针指向的字符大于p2指针指向的字符就返回"> " */

if(*p1>*p2)

return" > ";

/*前面的字符相等的情况下*/

/*p1p2指针分别各自向后移动一个字符,准备比较下一个字符*/

p1++;

p2++;

}

/*如果两个字符串字符个数相同且每个字符都相等,循环结束就会存在这情况*/

if(*p1==*p2)

return"==";

if(*p1=='\0')

/*p1 指向的str1字符串的字符个数少于p2指向的str2字符串字符个数*/



return"<";

else

/*p2 指向的str2字符串的字符个数少于p1指向的str1字符串字符个数*/

return">";

}

main()

{

charstr1[N],str2[N];

/*clrscr 函数的作用是清屏,清除输出窗口中所有已经显示的内容*/

/*clrscr 函数定义在conio.h中,所以需要#include<conio.h> */

clrscr();

printf("Inputstr1:\n");

/*gets 函数的作用是接收键盘输入的字符串将其放入参数中*/

/*gets 函数定义在stdio.h中,所以需要#include<stdio.h> */

gets(str1);

printf("Inputstr2:\n");

gets(str2);

printf("\n*******theresult********\n");

/*输出比较结果*/

printf("\nstr1%s str2\n",fun(str1,str2));

}



55

分析:

该题的核心在于如何判断一个数是素数。所谓素数是这样的整数,它除了能表示为它自己和1的乘积以外,不能表示为任何其它两个整数的乘积。例如,153*5,所以15不是素数;又如,12=6*2=4*3,所以12也不是素数。另一方面,13除了等于13*1以外,不能表示为其它任何两个整数的乘积,所以13是一个素数。

了解素数的概念之后,我们可以有以下思路用于判断某一个整数是否为素数:

给定一个整数y,我们可以从2开始至y-1逐一检查在这范围之内的整数是否可以被y整除。如果可以,那说明整数y除了能表示为它自己和1的乘积以外,还能表示为其他两个整数的乘积,所以整数y不是素数。如果从2开始至y-1范围之内的所有整数都不可以被y整除,那说明整数y符合素数的定义,所以整数y是一个素数。

那从2开始至n-1逐一检查在这范围之内的整数是否可以被n整除呢?一方面我们可以循环进行,另外判断两个整数是否可以被整除可以使用取模(%)运算。例如10%5等于0,那么10可以整除511%5等于6,不等于0,那么11不可以整除5

使用以上原理,题目中的程序使用for循环逐一检查nm之间的各个整数是否为素数。检查整数j是否为素数的方法如下:先设置flag标记为1,然后使用for循环将整数j逐个整除从2j-1,如果发现从2j-1存在数字可以被整数j整除,那么设置flag标记为0,记录循环结束的原因,同时退出for循环,因为只要有一个数字可以被整除就说明整数j不是素数,所以就不需要再检查其他数字能够被整除。

退出for循环之后,程序检查flag标记的值,如果flag等于1,说明在for循环中flag没有被修改过,也就是说没有发现某数字能被整数j整除,那就说明整数j是一个素数。程序将判断为素数的整数j放入bb数组中,k变量记录整数j存放入bb数组的位置。

以上过程中flag标记的用法是程序设计中常用的手法,希望考生能够理解体会。

程序注解如下:

#include<conio.h>

#include<stdio.h>

#define N 1000



/*fun 函数寻找nm之间的素数,将这些找到的素数放入bb数组中*/

intfun( int n,int m,int bb[N] )

{

int i,j,k=0, flag;

/*使用for循环逐个检查nm之间的整数是否为素数*/

for(j=n;j<=m;j++)

{

/*开始判断整数j是否为素数*/

/*预先设置flag1,以便判断在下面的for循环中是否设置为0*/

flag=1;

/*检查从2j-1之间的整数是否能被当前检查是否为素数的i整除*/

for(i=2;i<j;i++)

if(j%i==0)

{

/*如果存在可以被i整除的整数,则说明i不是素数*/

/*那就不需要检查后续整数,可以直接退出循环*/

flag=0;

break;

}

/*只有flag1才说明2j-1之间的整数都不能被i整除,即i为素数*/

/*bb[k++]=j;相当于bb[k]=j;k++;*/

if(flag==1)



bb[k++]=j;

}

returnk;

}

main()

{

int n=0,m=0,i,k;

intbb[N];

/*clrscr 函数的作用是清屏,清除输出窗口中所有已经显示的内容*/

/*clrscr 函数定义在conio.h中,所以需要#include<conio.h> */

clrscr();

printf("Inputn:\n");

scanf("%d",&n);

printf("Inputm:\n");

scanf("%d",&m);

/*将存放素数的bb数组各成员初始化为0*/

for(i=0;i<m-n;i++)

bb[i]=0;

k=fun(n,m,bb);

/*输出存放素数的bb数组各成员*/

for(i=0;i<k;i++)

printf("%4d",bb[i]);



printf("\n");

}

56

分析:

题目中的程序首先将A.datB.dat以只读的方式打开,显示两者的内容,然后关闭两个

文件。然后分别以追加和只读的方式打开A.datB.dat,使用循环逐个地读取B.dat文件

中的每一个字符然后写入A.dat文件,处理结束之后关闭这两个文件。最后将A.dat以只读

的方式打开,然后显示处理之后的内容。

程序注解如下:

#include"stdio.h"

#include"conio.h"

#defineN 80

main()

{

FILE*fp,*fp1,*fp2;

inti;

charc[N],t,ch;

/*clrscr 函数的作用是清屏,清除输出窗口中所有已经显示的内容*/

/*clrscr 函数定义在conio.h中,所以需要#include"conio.h" */

clrscr();



/*fopen 函数的作用是以第二个参数指定的方式打开第一个参数指定的文件*/

/*fopen 函数定义在stdio.h中,所以需要#include"stdio.h" */

/*以只读"r"的方式打开A.dat,成功的情况下fp指向打开的文件*/

if((fp=fopen("A.dat","r"))==NULL)

{

/*如果文件打开失败,则输出提示信息*/

printf("fileA cannot be opened\n");

/*exit 函数的作用是退出整个程序*/

exit(0);

}

printf("\nA contents are :\n\n");

/*逐一读取A.dat每一个字符显示在输出窗口*/

/*fgetc 函数作用是从fp参数指定的文件中读取一个字符*/

for(i=0;(ch=fgetc(fp))!=EOF;i++)

{

c[i]=ch;

/*在输出窗口显示c[i]的内容*/

putchar(c[i]);

}

/*fclose 函数作用是关闭fp参数指定的文件*/

fclose(fp);

/*以只读"r"的方式打开B.dat,成功的情况下fp指向打开的文件*/



if((fp=fopen("B.dat","r"))==NULL)

{

printf("fileB cannot be opened\n");

exit(0);

}

printf("\n\n\nBcontents are :\n\n");

/*逐一读取B.dat每一个字符显示在输出窗口*/

for(i=0;(ch=fgetc(fp))!=EOF;i++)

{

c[i]=ch;

putchar(c[i]);

}

fclose(fp);

/*分别以追加"a"和只读"r"的方式打开A.datB.dat文件*/

/*因为要实现文本文件B中的内容追加到文本文件A的内容后面*/

/*必须两个文件都要成功打开,所以这里填空填写&&*/

if((fp1=fopen("A.dat","a"))&&(fp2=fopen("B.dat","r")))

{

/*使用fgetc函数逐个从B.dat读取字符写入A.dat*/

/*A.dat 是使用追加"a"方式打开的,所以写入的字符追加在已有内容后面*/

while((ch=fgetc(fp2))!=EOF)

/*fputc 函数的作用是将ch字符写入fp1指定的文件*/



fputc(ch,fp1);

}

else

{

/*A.dat B.dat两个文件只要由一个打开失败就显示以下信息*/

printf("Cannot open A B !\n");

}

/*处理结束关闭处理的两个文件*/

fclose(fp2);

fclose(fp1);

printf("\n********newA contents*********\n\n");

/* 以只读"r"的形式打开A.dat文件*/

if((fp=fopen("A.dat","r"))==NULL)

{

printf("fileA cannot be opened\n");

exit(0);

}

/*使用fgetc函数逐一读取fp参数指定文件中的字符*/

for(i=0;(ch=fgetc(fp))!=EOF;i++)

{

c[i]=ch;

/*使用putchar函数显示读取得到的字符*/



putchar(c[i]);

}

fclose(fp);

/*切记文件处理结束之后必须使用fclose函数关闭文件,fp代表文件*/

printf("\n");

}

Copyright © 2019- 0527ly.com 版权所有

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务