上机操作题323.docx
- 文档编号:12223061
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:22
- 大小:87.77KB
上机操作题323.docx
《上机操作题323.docx》由会员分享,可在线阅读,更多相关《上机操作题323.docx(22页珍藏版)》请在冰豆网上搜索。
上机操作题323
所属年份:
2010.9;2012.3迭代法求给定多项式的值
编写函数fun,其功能是:
根据以下公式求π的值(要求精度0.0005,即某项小于0.0005时停止迭代)。
程序运行后,若输入精度0.0005,则程序应输出为3.14…。
注意:
部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
【参考答案】
doublefun(doubleeps)
{
doubles=1.0,s1=1.0;
intn=1;
while(s1>=eps)/*当某项大于精度要求时,继续求下一项*/
{s1=s1*n/(2*n+1);/*求多项式的每一项*/
s=s+s1;/*求和*/
n++;
}
return2*s;
}
【考点分析】
本题考查:
迭代法求给定多项式的值,迭代算法:
让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。
需要注意变量的数据类型以及赋初值操作。
【解题思路】
首先应该定义double类型变量,并且赋初值,用来存放多项式的某一项和最后的总和。
从第2项开始以后的每一项都是其前面一项乘以n/(2*n+1),程序中用s1来表示每一项,s表示求和后的结果。
需注意s1和s的初值都为1.0,因为循环变量从第二项开始累加。
所属年份:
2010.9;2011.9;2012.3;迭代法求给定方程的根
编写函数fun,其功能是:
利用下面的简单迭代方法求方程cos(x)-x=0的一个实根。
迭代步骤如下:
(1)取x1初值为0.0;
(2)x0=x1,将x1的值赋给x0;
(3)x1=cos(x0),求出一个新的x1;
(4)若x0-x1的绝对值小于0.000001,执行步聚(5),否则执行步聚
(2);
(5)所求x1就是方程cos(x)-x=0的一个实根,作为函数值返回。
程序将输出结果Root=0.739086。
注意:
部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号填入你编写的若干语句。
【参考答案】
doublefun()
{
doublex0,x1;
x1=0.0;
do
{
x0=x1;
x1=cos(x0);
}while(fabs(x0-x1)>=1e-6);
returnx1;
}
【考点分析】
本题考查:
迭代法求方程的实根;do…while循环语句,其形式为:
do{
语句
}while(表达式);
do…while循环与while循环的不同在于,它先执行循环中的语句,然后再判断表达式是否为真,如果为真则继续循环;如果为假,则终止循环。
因此,do…while循环至少要执行一次循环语句。
【解题思路】
用迭代方法求方程的一个实根,题目已经给出了算法,只要按照算法用合适的程序表达,就可以解题了。
所属年份:
2010.9;2011.3;2011.9二维数组三角元素操作
程序定义了N×N的二维数组,并在主函数中自动赋值。
请编写函数fun(inta[][N],intn),该函数的功能是:
使数组左下半三角元素中的值乘以n。
例如,若n的值为3,a数组中的值为:
则返回主程序后a数组中的值应为:
注意:
部分源程序在文件PROG1.C中。
请勿改动函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
【参考答案】
voidfun(inta[][N],intn)
{
inti,j;
for(i=0;i for(j=0;j<=i;j++) a[i][j]=a[i][j]*n; } 【考点分析】 本题的fun的功能是使数组的左下半三角元素中的值乘以n,因此本题需要使用双重for循环,for循环需要注意的是: (1)循环初值,根据题意要求控制循环变量的取值范围。 (2)循环条件,确定循环结束的条件,即当不满足条件时,结束循环。 【解题思路】 首先从数组中找出要被乘以n的那部分元素,这一过程其实就是找出将被挑出的元素在原数组中的分布规律的过程。 通过观察得出,要被处理的元素下标值的范围是每行中从第一个元素开始,直到列数等于该行行数时为止。 找到这个规律后,依次从数组中取得符合要求的元素,然后乘以n。 所属年份: 2010.9;2011.3;2012.3;二维数组求最值 请编写函数fun,其功能是: 找出2×M整型二维数组中最大元素的值,并将此值返回调用函数。 注意: 部分源程序在文件PROG1.C中。 请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。 【参考答案】 intfun(inta[][M]) { inti,j,max=a[0][0]; for(i=0;i<2;i++) for(j=0;j if(max max=a[i][j]; returnmax; } 【考点分析】 本题考查: 求数组的最大值,需要运用循环语句,因为数组是二维数值,所以应使用二层加for循环嵌套。 使用for循环语句时需要注意循环变量的取值范围。 【解题思路】 此类求最大值或最小值的问题,我们可以采用逐个比较的方式,要求对数组中所有元素遍历一遍,并且从中找出数组最大值或最小值。 首先定义变量max存放数组中的第一个元素的值,然后利用for循环逐个找出数组中的元素,并与max比较,如果元素值大于max,则将该值赋于max,循环结后max的值即为数组最大值,最后将该值返回。 【解题宝典】 该类题目考查较多,要掌握逐行比较的方法。 对于m*n二维数组,如采用逐行查找方法,代码实现为: for(i=0;i for(j=0;j …… 所属年份: 2011.9;2012.3矩阵操作 编写函数fun,其功能是: 实现B=A+A',即将矩阵A加上A的转置,存放在矩阵B中。 计算结果在main函数中输出。 例如,输入下面的矩阵: 其转置矩阵为: 程序输出: 注意: 部分源程序在文件PROG1.C中。 请勿请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。 【参考答案】 voidfun(inta[3][3],intb[3][3]) { inti,j; for(i=0;i<3;i++) for(j=0;j<3;j++) b[i][j]=a[i][j]+a[j][i];/*把矩阵a加上a的转置,存放在矩阵b中*/ } 【考点分析】 本题考查: 矩阵的操作,如何表示矩阵及其转置矩阵的各个元素。 【解题思路】 行列数相等的二维数组的转置就是行列互换,即转置后的第i行第j列正好对应原矩阵的第j行第i列。 本题使用双层循环实现矩阵的转置,并将计算结果存入矩阵B中,外层循环控制矩阵的行下标,内层循环控制矩阵的列下标。 【解题宝典】 若要将矩阵a转置后还存入a中,可用程序: inti,j,t; for(i=0;i for(j=i;j {t=a[i][j];a[i][j]=a[j][i];a[j][i]=t;} 注意第2个循环的初值。 若要将矩阵a转置后存入c中: inti,j; for(i=0;i for(j=0;j c[i][j]=a[j][i]; 注意数组c和a的下标。 所属年份: 2010.9;2011.9;2012.3;类似素数判断 编写函数fun,其功能是: 求出1~1000之间能被7或11整除,但不能同时被7和11整除的所有整数,并将其放在a所指的数组中,通过n返回这些数的个数。 注意: 部分原程序在文件PROG1.C中。 请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。 【参考答案】 voidfun(int*a,int*n) { inti,j=0; for(i=1;i<=1000;i++)/*求1到1000之内能被7或11整除、但不能同时被7和11整除的所有整数,并放入数组a中*/ if((i%7==0||i%11==0)&&i%77! =0) a[j++]=i; *n=j; } 【考点分析】 本题考查: if语句,用来判断能被7整除或者能被11整除,但是又不能同时被7和11整除的数,在这里充分理解"逻辑与"和"逻辑或"的区别;for循环语句的循环变量用来控制取值范围。 【解题思路】 该题需要运用循环判断结构来实现,其中循环语句比较容易,只要确定循环变量的范围即可,下面我们来看判断语句,题目要求找出能被7或11整除,但不能同时被7和11整除的所有整数。 能同时被7和11整除的整数一定能被77整除,且不能被77整除的数不一定就是能被7或11整除的数所以可得出程序中的if()语句。 注意: (i%7==0||i%11==0)两边必须要有小括号。 所属年份: 2011.9;累加累乘求和 某学生的记录由学号、8门课程成绩和平均分组成,学号和8门课程的成绩已在主函数中给出,请编写函数fun,其功能是: 求出该学生的平均分,并放入记录的ave成员中。 例如,学生的成绩是: 85.5,76,69.5,85,91,72,64.5,87.5,则他的平均分应为78.875。 注意: 部分源程序在文件PROG1.C中。 请勿改动主函数main和其它函数中的任何内容,仅在函数fun部位中填入你编写的若干语句。 【参考答案】 voidfun(STREC*a) { inti; a->ave=0.0; for(i=0;i a->ave=a->ave+a->s[i];/*求各门成绩的总和*/ a->ave/=N;/*求平均分*/ } 【考点分析】 本题考查: 结构体类型成员运算,指向结构体类型的指针变量作函数参数。 【解题思路】 本题考查自定义形参的相关知识点,程序流程是这样的: 在fun()函数中求出平均分后,返回到主函数时平均分也要带回,所以只能定义一个指针类型的形参STREC*a,此时,引用成员的方式可以使用指向运算符,即a->ave和a->s[i],当然也可用(*a).ave和(*a).s[i]。 所属年份: 2011.3累加累乘求和 请编写函数fun,其功能是: 计算并输出下列多项式的值。 例如,在主函数中从键盘为n输入50后,输出为S=1.718282。 注意: 要求n的值在大于1但不大于100之间。 部分源程序在文件PROG1.C中。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。 【参考答案】 doublefun(intn) { doublesum=0,tmp=1; inti; for(i=1;i<=n;i++) { tmp=tmp*i; sum+=1.0/tmp; } returnsum; } 【解题思路】 本题要求计算并输出多项式的值,通式为: 1/(1*2*……*n),在给出的参考程序中,由于函数的返回值为双精度型,所以定义sum、tmp为双精度型,再对符合条件的n,使用中间变量tmp求出1到n的累乘值,即题目中每个多项式中分子的值,再通过sum+=1.0/tmp;计算出所有多项式之和,最终返回值。 所属年份: 2010.9;2011.9;删除字符串中指定字符 规定输入的字符串中只包含字母和*号。 编写函数fun,其功能是: 删除字符串中所有的*号。 编写函数时,不得使用C语言提供的字符串函数。 例如,字符串中的内容为: ****A*BC*DEF*G*******,删除后字符串中的内容应当是: ABCDEFG。 注意: 部分源程序在文件PROG1.C中。 请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干的语句。 【参考答案】 voidfun(char*a) { inti,j=0; for(i=0;a[i]! ='\0';i++) if(a[i]! ='*') a[j++]=a[i];/*若不是要删除的字符'*'则留下*/ a[j]='\0'; } 【考点分析】 要删除字符串中所有*号需要用循环语句遍历字符串,用判断语句判断字符是否为*号,由此可以决定该程序应使用循环判断结构。 【解题思路】 用循环操作从字符串的开始往后逐个进行比较,若不是要删除的字符(用if(a[i]! =′*′)来控制)则保留。 变量i和j用来表示原字符串的下标和删除*号后新字符串的下标。 注意下标变量j要从0开始,最后还要加上字符串结束标识′\0′。 所属年份: 2012.3数组字符串转整数 请编写函数fun,其功能是: 将一个数字字符串转换为一个整数(不得调用C语言提供的将字符串转换为整数的函数)。 例如,若输入字符串"-1234",则函数把它转换为整数值-1234。 注意: 部分源程序在文件PROG1.C中。 请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。 【参考答案】 longfun(char*p) { longn=0; intflag=1; if(*p=='-')/*负数时置flag为-1*/ {p++;flag=-1;} elseif(*p=='+')/*正数时置flag为1*/ p++; while(*p! ='\0') {n=n*10+*p-'0';/*将字符串转成相应的整数*/ p++; } returnn*flag; } 【考点分析】 本题考查: 字符串转整数算法。 【解题思路】 if()语句的作用是判断该字符串应当为正数还是负数,while()循环的作用是将字符串转成相应的整数。 注意: *p是一个字符(如'9'、'4'),并不是一个数,要将其转成相应的数字需令其减去′0′(不是′\0′),即*p-′0′就得到*p这个字符的相应数字,如′0′-′0′=0、′8′-′0′=8等。 必须在程序的前面加#include 【解题宝典】 要实现字符串转整数操作,而且不允许使用相应的字符串函数,因此我们需要通过字符减去′0′来实现,即*p-′0′就得到*p这个字符的相应数字。 掌握以下语句: while(*p! ==′\0′) { n=n*10+*p-′0′; p++; } 所属年份: 2010.9;2011.9;2012.3素数判定 编写函数fun,其功能是: 将所有大于1小于整数m的非素数存入xx所指数组中,非素数的个数通过k返回。 例如,若输入17,则应输出: 4 6 8 9 10 12 14 15 16。 注意: 部分源程序在文件PROG1.C中。 请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。 【参考答案】 voidfun(intm,int*k,intxx[]) { inti,j,n=0; for(i=4;i {for(j=2;j if(i%j==0)break; if(j } *k=n;/*返回非素数的个数*/ } 【考点分析】 本题考查: 如何判断非素数;循环判断结构;数组的引用。 【解题思路】 题目要求将1~m之间的非素数存入数组中,应使用循环判断结构。 循环语句用来遍历1~m之间的每个数,判断语句用来判断该数是否素数,若不是素数,则将其存入数组中。 这道题目是考查一个数是否为素数的简单延伸,只要掌握了判断素数的方法,问题便能顺利解决。 【解题宝典】 判定一个数是否为素数,即该数除了能被1和它本身外,不能被任何数整除。 代码实现为: for(j=2;j if(i%j==0) /*如余数为0,证明i不是素数*/ …… 此语句需要熟记,很多判断素数的题目也可通过此法解决。 所属年份: 2011.3;2011.9统计问题 编写一个函数,该函数可以统计一个长度为2的字符串在另一个字符串中出现的次数。 例如,假定输入的字符串为"asdasasdfgasdaszx67asdmklo",子字符串为"as",则应当输出6。 注意: 部分源程序在文件PROG1.C中。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。 【参考答案】 intfun(char*str,char*substr) { inti,j=0; for(i=0;str[i+1]! ='\0';i++)/*如果一个长度为2的子字符串在主字符串中出现一次,则j+1,如此循环*/ if(str[i]==substr[0]&&str[i+1]==substr[1]) j++; returnj;/*返回子字符串在主字符串中出现的次数*/ } 【考点分析】 本题考查: 遍历字符串实现字符串的比较运算。 【解题思路】 该题中substr只有两个字符,所以可以用if语句直接进行判断。 要注意if语句中str数组的下标为i和i+1,即比较当前字符及其后面的一个字符是否分别与substr中的字符对应相同,若都相同则表示出现了一次。 所属年份: 2011.9;2012.3;一维数组元素的筛选 编写函数fun,其功能是: 求ss所指字符串中指定字符的个数,并返回此值。 例如,若输入字符串123412132,输入字符为1,则输出3。 注意: 部分源程序在文件PROG1.C中。 请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。 【参考答案】 intfun(char*ss,charc) { inti=0; for(;*ss! ='\0';ss++) if(*ss==c) i++;/*求出ss所指字符串中指定字符的个数*/ returni; } 【考点分析】 本题考查: for循环语句遍历字符串,并通过if条件语句,判断字符串是否结束。 【解题思路】 从字符串中查找指定字符,需要使用循环判断结构,循环语句用来遍历字符串,循环条件为字符串没有结束,即当前字符不是′\0′,判断语句用来判断当前字符是否为指定字符。 最后返回指定字符的个数。 所属年份: 2012.3;一维数组最值求解 请编写函数fun,其功能是: 找出一维整型数组元素中最大的值及其所在的下标,并通过形参传回。 数组元素中的值已在主函数中赋予。 主函数中x是数组名,n是x中的数据个数,max存放最大值,index存放最大值所在元素的下标。 注意: 部分源程序在文件PROG1.C中。 请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。 【参考答案】 voidfun(inta[],intn,int*max,int*d) { inti; *max=a[0]; *d=0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 上机 操作 323