上机填空题5356.docx
- 文档编号:17867670
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:20
- 大小:20.80KB
上机填空题5356.docx
《上机填空题5356.docx》由会员分享,可在线阅读,更多相关《上机填空题5356.docx(20页珍藏版)》请在冰点文库上搜索。
上机填空题5356
53
题目:
请补充fun函数,该函数的功能是求出以下分数序列的前n项之和。
和值通过函数值返回到main函数。
2/1,3/2,8/5,13/8,21/13......
例如:
若n=5,则应输出"8.391667"。
注意:
部分源程序如blank.c给出。
请勿改动主函数main和其它函数中的任何内容,仅在fun函数的横线上填入所编写的若干表达式或语句。
#include
#include
___1___fun(intn)
{
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("Thevalueoffunctionis:
%lf\n",fun(n));
}
54
题目:
请补充fun函数,该函数的功能是比较字符串str1和str2的大小,并返回比较的结果。
例如:
当str1="abcd",str2="abc",fun函数返回">"。
注意:
部分源程序如blank.c给出。
请勿改动主函数main和其它函数中的任何内容,仅在fun函数的横线上填入所编写的若干表达式或语句。
#include
#include
#defineN80
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%sstr2\n",fun(str1,str2));
}
55
题目:
请补充fun函数,该函数的功能是:
寻找两个整数之间的所有素数(包括这两个整数),把结果保存在数组bb中,函数返回素数的个数。
例如:
输入3和17,则输出为:
357111317。
注意:
部分源程序如blank.c给出。
请勿改动主函数main和其它函数中的任何内容,仅在fun函数的横线上填入所编写的若干表达式或语句。
#include
#include
#defineN1000
intfun(intn,intm,intbb[N])
{
inti,j,k=0,flag;
for(j=n;j<=m;j++)
{
___1___;
for(i=2;i if(___2___) { flag=0; break; } if(___3___) bb[k++]=j; } returnk; } main() { intn=0,m=0,i,k; intbb[N]; clrscr(); printf("Inputn: \n"); scanf("%d",&n); printf("Inputm: \n"); scanf("%d",&m); for(i=0;i bb[i]=0; k=fun(n,m,bb); for(i=0;i printf("%4d",bb[i]); printf("\n"); } 56 题目: 请补充main函数,该函数的功能是把文本文件B中的内容追加到文本文件A的内容之后。 例如,文件B的内容为"I’m12.",文件A的内容为"I’mastudents! ",追加之后文件A的内容为"I’mastudents! I’m12." 注意: 部分源程序如blank.c给出。 仅在横线上填入所编写的若干表达式或语句,勿改动函数中的其它任何内容。 #include"stdio.h" #include"conio.h" #defineN80 main() { FILE*fp,*fp1,*fp2; inti; charc[N],t,ch; clrscr(); if((fp=fopen("A.dat","r"))==NULL) { printf("fileAcannotbeopened\n"); exit(0); } printf("\nAcontentsare: \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("fileBcannotbeopened\n"); exit(0); } printf("\n\n\nBcontentsare: \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("CannotopenAB! \n"); } fclose(fp2); fclose(fp1); printf("\n********newAcontents*********\n\n"); if((fp=fopen("A.dat","r"))==NULL) { printf("fileAcannotbeopened\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; 那么a、b变量均为int类型,而题目中的分数序列中的每一项都是具有小数部分的,例如第二项3/2就存在小数0.5。 而整除运算(/)在C语言中存在以下语法规定: 两个整数进行整除运算结果将丢弃小数部分而只剩下整数部分。 但是我们在以下语句中需要保留小数部分: s=s+(double)a/(double)b; 为了达到我们的目的,程序中使用强制转化将a、b转化为double类型,两个double类型的数字进行整除(/)运算,运算结果必然是带有小数的double类型。 所以第二处和第三处填空应该都填写double。 程序注解如下: #include #include doublefun(intn) { inta,b,c,k; doubles; /*s保存分数序列的前n项之和*/ s=0.0; /*设置分数序列的第一项的分子与分母*/ a=2; b=1; for(k=1;k<=n;k++) { /*计算每一项的值并累加,注意这里将a、b分别强制转化成double类型*/ s=s+(double)a/(double)b; /*计算下一项的分子和分母*/ c=a; a=a+b; b=c; } returns; } main() { intn=5; /*clrscr函数的作用是清屏,清除输出窗口中所有已经显示的内容*/ /*clrscr函数定义在conio.h中,所以需要#include clrscr(); printf("Thevalueoffunctionis: %lf\n",fun(n)); } 54 分析: 题目要求在fun函数比较字符串str1和str2的大小,并返回比较的结果。 两个字符串比较大小的方法是两个字符串对应位置的字符逐个比较大小。 而两个字符之间进行比较大小实质上就是比较两者的ASCII码值。 ASCII码值大的字符就是两个字符中较大者。 ASCII表全称是美国标准信息交换码(AmericanStandardCodeforInformationInterchange)。 例如"abcd"和"abc"两个字符串,前面三个字符都是一样的,所以判断第四个字符。 第一个字符串中第四个字符为"d",而第二个字符串中没有第四个字符,所以"abcd"字符串大于"abc"字符串。 第二个例子: "abcd"和"aBc"两个字符串,第一个字符都是"a",然后再比较第二个字符。 "abcd"中的"b"和"aBc"中的"B"比较大小。 因为"b"的ASCII码值大于"B"的ASCII码值,所以"abcd"字符串大于"aBc"字符串。 利用以上原理,题目中的程序使用以下思路实现题目的要求: (1)首先定义两个指针p1、p2分别指向str1、str2字符串的第一个字符。 (2)然后使用while循环逐个比较指针p1、p2分别指向的字符,也就是逐个比较str1、str2字符串的对应位置的每一个字符。 在比较过程中,指针p1、p2分别在str1、str2字符串中往后移动,以便逐个比较字符。 (3)逐个比较的时候会发生三种情况。 第一种str1、str2两个字符串的字符个数正好相同。 这种情况下str1、str2两个字符串对应位置的字符都进行了比较。 第二种情况就是str1字符串的字符个数多于str2字符串,也就是while循环结束的时候*p1=='\0'表达式成立,那么str2字符串还有字符没有参与比较,则str2字符串大于str1字符串。 第三种情况就是str1字符串的字符个数少于str2字符串,也就是while循环结束的时候*p2=='\0'表达式成立,那么str1字符串还有字符没有参与比较,则str2字符串小于str1字符串。 程序注解如下: #include #include #defineN80 char*fun(char*str1,char*str2) { /*p1、p2指针分别指向str1、str2字符串的第一个字符*/ char*p1=str1,*p2=str2; /*while(*p1&&*p2)是while(*p1! ='\0'&&*p2! ='\0')的简写方式*/ /*while循环条件的意思是str1和str2字符串都有字符参加比较大小*/ while(*p1&&*p2) { /*如果p1指针指向的字符小于p2指针指向的字符就返回"<"*/ /*这是因为前面的字符已经决定出大小则无需再比较后续字符*/ if(*p1<*p2) return"<"; /*如果p1指针指向的字符大于p2指针指向的字符就返回">"*/ if(*p1>*p2) return">"; /*前面的字符相等的情况下*/ /*p1、p2指针分别各自向后移动一个字符,准备比较下一个字符*/ 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 clrscr(); printf("Inputstr1: \n"); /*gets函数的作用是接收键盘输入的字符串将其放入参数中*/ /*gets函数定义在stdio.h中,所以需要#include gets(str1); printf("Inputstr2: \n"); gets(str2); printf("\n*******theresult********\n"); /*输出比较结果*/ printf("\nstr1%sstr2\n",fun(str1,str2)); } 55 分析: 该题的核心在于如何判断一个数是素数。 所谓素数是这样的整数,它除了能表示为它自己和1的乘积以外,不能表示为任何其它两个整数的乘积。 例如,15=3*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可以整除5。 11%5等于6,不等于0,那么11不可以整除5。 使用以上原理,题目中的程序使用for循环逐一检查n至m之间的各个整数是否为素数。 检查整数j是否为素数的方法如下: 先设置flag标记为1,然后使用for循环将整数j逐个整除从2至j-1,如果发现从2至j-1存在数字可以被整数j整除,那么设置flag标记为0,记录循环结束的原因,同时退出for循环,因为只要有一个数字可以被整除就说明整数j不是素数,所以就不需要再检查其他数字能够被整除。 退出for循环之后,程序检查flag标记的值,如果flag等于1,说明在for循环中flag没有被修改过,也就是说没有发现某数字能被整数j整除,那就说明整数j是一个素数。 程序将判断为素数的整数j放入bb数组中,k变量记录整数j存放入bb数组的位置。 以上过程中flag标记的用法是程序设计中常用的手法,希望考生能够理解体会。 程序注解如下: #include #include #defineN1000 /*fun函数寻找n至m之间的素数,将这些找到的素数放入bb数组中*/ intfun(intn,intm,intbb[N]) { inti,j,k=0,flag; /*使用for循环逐个检查n至m之间的整数是否为素数*/ for(j=n;j<=m;j++) { /*开始判断整数j是否为素数*/ /*预先设置flag为1,以便判断在下面的for循环中是否设置为0*/ flag=1; /*检查从2至j-1之间的整数是否能被当前检查是否为素数的i整除*/ for(i=2;i if(j%i==0) { /*如果存在可以被i整除的整数,则说明i不是素数*/ /*那就不需要检查后续整数,可以直接退出循环*/ flag=0; break; } /*只有flag为1才说明2至j-1之间的整数都不能被i整除,即i为素数*/ /*bb[k++]=j;相当于bb[k]=j;k++;*/ if(flag==1) bb[k++]=j; } returnk; } main() { intn=0,m=0,i,k; intbb[N]; /*clrscr函数的作用是清屏,清除输出窗口中所有已经显示的内容*/ /*clrscr函数定义在conio.h中,所以需要#include clrscr(); printf("Inputn: \n"); scanf("%d",&n); printf("Inputm: \n"); scanf("%d",&m); /*将存放素数的bb数组各成员初始化为0*/ for(i=0;i bb[i]=0; k=fun(n,m,bb); /*输出存放素数的bb数组各成员*/ for(i=0;i printf("%4d",bb[i]); printf("\n"); } 56 分析: 题目中的程序首先将A.dat和B.dat以只读的方式打开,显示两者的内容,然后关闭两个文件。 然后分别以追加和只读的方式打开A.dat和B.dat,使用循环逐个地读取B.dat文件中的每一个字符然后写入A.dat文件,处理结束之后关闭这两个文件。 最后将A.dat以只读的方式打开,然后显示处理之后的内容。 程序注解如下: #include"stdio.h" #include"conio.h" #defineN80 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("fileAcannotbeopened\n"); /*exit函数的作用是退出整个程序*/ exit(0); } printf("\nAcontentsare: \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("fileBcannotbeopened\n"); exit(0); } printf("\n\n\nBcontentsare: \n\n"); /*逐一读取B.dat每一个字符显示在输出窗口*/ for(i=0;(ch=fgetc(fp))! =EOF;i++) { c[i]=ch; putchar(c[i]); } fclose(fp); /*分别以追加"a"和只读"r"的方式打开A.dat和B.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("CannotopenAB! \n"); } /*处理结束关闭处理的两个文件*/ fclose(fp2); fclose(fp1); printf("\n********newAcontents*********\n\n"); /*以只读"r"的形式打开A.dat文件*/ if((fp=fopen("A.dat","r"))==NULL) { printf("fileAcannotbeopened\n");
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 上机 填空 5356