实验二教案.docx
《实验二教案.docx》由会员分享,可在线阅读,更多相关《实验二教案.docx(22页珍藏版)》请在冰豆网上搜索。
实验二教案
第二课
教学内容:
数值处理类算法
教学目的:
掌握数值数据处理类算法的考题
教学内容:
一、数值数据处理类算法的考题特点
1.考题中的算法涉及对一个整数分解和重组、求最大公约数、求阶乘、求素数、在指定范围内找符合给定条件的数、取一个整数的某些指定位等等。
此类算法仍然结合循环、函数考查考生的综合应用能力。
2.在填空和改错题中容易考到的知识:
(1)分解整数的各位数字。
一般用循环结合求余、整除等运算实现。
如n%10表示取出n的个位数,n/10%10表示取n的十位,n/100%10表示取n的百位,n/10表示将n的个位舍弃。
(2)判断数字的奇偶性:
n%2==0或n%2!
=1成立表示n是偶数,否则是奇数。
(3)循环条件:
结合算法理解,一般是关系表达式或逻辑表达式。
(4)运算的时候填空是10*x还是x*10?
正确答案是10*x
(5)返回结果:
如果要求结果通过形参指针带回,则在函数最后需要将计算出的结果存入形参指针指向的实参变量中。
(6)其他:
主要考查语法知识。
如关键字写法、控制结构语法、语句结束标志等。
3.编程题答题注意:
(1)涉及将两个整数分解、重组的算法,函数体内仅一条语句即可。
(2)其他的算法请考生结合实际应用多练习以达掌握的目的。
二、课堂练习
第一套
1、程序填空题
给定程序中,函数fun的功能是:
将形参n所指变量中,各位上为偶数的数去除,剩余的数按原来从高位到低位的顺序组成一个新的数,并通过形参指针n传回所指变量。
例如,输入一个数:
27638496,新的数:
为739。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:
源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
#include
voidfun(unsignedlong*n)
{unsignedlongx=0,i;intt;
i=1;
while(*n)
{t=*n%【1】;
if(t%2!
=【2】
{x=x+t*i;i=i*10;}
n=*n/10;
}
*n=【3】;
}
main()
{unsignedlongn=-1;
while(n>99999999||n<0)
{printf("Pleaseinput(0");
scanf("%ld",&n);}
fun(&n);
printf("\nTheresultis:
%ld\n",n);
}
2、程序改错题
下列给定程序中,函数fun的功能是:
找出100到n(不大于1000)之间三个位上的数字都相等的所有整数,把这些整数放在s所指的数组中,个数作为函数值返回。
请改正函数fun中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include
#defineN100
intfun(int*s,intn)
{intI,j,k,a,b,c;
j=0;
for(I=100;I{
/*************found**************/
k=n;
a=k%10;
k/=10;
/*************found**************/
b=k/10;
c=k/10;
if(a==b&&a==c)
s[j++]=I;
}
returnj;
}
voidmain()
{inta[N],n,num=0,i;
do
{printf("\nEntern(<=1000):
");
scanf("%d",&n);
}while(n>1000);
num=fun(a,n);
printf("\n\nTheresult:
\n");
for(i=0;iprintf("%5d",a[i]);
printf("\n\n");
}
3、程序设计题
请编写函数fun,函数的功能是:
将大于形参m且紧靠m的k个素数存入xx所指的数组中。
例如,若输入17,5,则应输出:
19,23,29,31,37。
函数fun中给出的语句仅供参考。
注意:
部分源程序在文件PROG1.C文件中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include
voidfun(intm,intk,intxx[])
{}
main()
{intm,n,zz[1000];
printf("\nPleaseentertwointegers:
");
scanf("%d%d",&m,&n);
fun(m,n,zz);
for(m=0;mprintf("%d",zz[m]);
printf("\n");
}
第二套
1、程序填空题
给定程序中,函数fun的功能是:
将形参n中,各位上为偶数的数取出,并按原来从高位到低位的顺序组成一个新的数,并作为函数值返回。
例如,从主函数输入一个整数:
27638496,函数返回值为:
26846。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:
源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
#include
unsignedlongfun(unsignedlongn)
{unsignedlongx=0,s,i;intt;
s=n;
/**********found**********/
i=【1】;
/**********found**********/
while(【2】)
{t=s%10;
if(t%2==0)
/**********found**********/
{x=x+t*i;i=【3】;}
s=s/10;
}
returnx;
}
main()
{unsignedlongn=-1;
while(n>99999999||n<0)
{printf("Pleaseinput(0");
scanf("%ld",&n);
}
printf("\nTheresultis:
%ld\n",fun(n));
}
2、程序改错题
给定程序MODI1.C中函数fun的功能是:
计算n的5次方的值(规定n的值大于2、小于8),通过形参指针传回主函数;并计算该值的个位、十位、百位上数字之和作为函数值返回。
例如,7的5次方是16807,其低3位数的和值是15。
请改正函数fun中指定部位的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include
#include
intfun(intn,int*value)
{intd,s,i;
/**************found**************/
d=0;s=0;
for(i=1;i<=5;i++)d=d*n;
*value=d;
for(i=1;i<=3;i++)
{s=s+d%10;
/**************found**************/
d=d\10;
}
returns;
}
main()
{intn,sum,v;
do
{printf("\nEntern(2");scanf("%d",&n);}
while(n<=2||n>=8);
sum=fun(n,&v);
printf("\n\nTheresult:
\nvalue=%dsum=%d\n\n",v,sum);
}
3、程序设计题
函数fun的功能是:
将两个两位数的正整数a、b合并形成一个整数放在c中。
合并的方式是:
将a数的十位和个位数依次放在c数的个位和百位上,b数的十位和个位数依次放在c数的千位和十位上。
例如,当a=45,b=12时,调用该函数后,c=1524。
注意:
部分源程序存在文件PROG1.C中。
数据文件IN.DAT中的数据不得修改。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include
voidfun(inta,intb,long*c)
{}
main()
{inta,b;longc;
printf("Inputa,b:
");
scanf("%d,%d",&a,&b);
fun(a,b,&c);
printf("Theresultis:
%ld\n",c);
}
三、课后练习
1、程序填空题
给定程序中,函数fun的功能是:
将形参n中,各位上为偶数的数取出,并按原来从高位到低位相反的顺序组成一个新的数,并作为函数值返回。
例如,输入一个整数:
27638496,函数返回值为:
64862。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:
源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
#include
unsignedlongfun(unsignedlongn)
{unsignedlongx=0;intt;
while(n)
{t=n%10;
/**********found**********/
if(t%2==【1】)
/**********found**********/
x=【2】+t;
/**********found**********/
n=【3】;
}
returnx;
}
main()
{unsignedlongn=-1;
while(n>99999999||n<0)
{printf("Pleaseinput(0");
scanf("%ld",&n);
}
printf("\nTheresultis:
%ld\n",fun(n));
}
2、程序填空题
给定程序中,函数fun的功能是:
找出100~999之间(含100和999)所有整数中各位上数字之和为x(x为一正整数)的整数,然后输出;符合条件的整数个数作为函数值返回。
例如,当x值为5时,100~999之间各位上数字之和为5的整数有:
104、113、122、131、140、203、212、221、230、302、311、320、401、410、500。
共有15个。
当x值为27时,各位数字之和为27的整数是:
999。
只有1个。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:
源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
#include
fun(intx)
{intn,s1,s2,s3,t;
n=0;
t=100;
/**********found**********/
while(t<=【1】)
/**********found**********/
{s1=t%10;s2=(【2】)%10;s3=t/100;
/**********found**********/
if(s1+s2+s3==【3】)
{printf("%d",t);
n++;
}
t++;
}
returnn;
}
main()
{intx=-1;
while(x<0)
{printf("Pleaseinput(x>0):
");scanf("%d",&x);}
printf("\nTheresultis:
%d\n",fun(x));
}
3、程序填空题
函数fun的功能是:
统计所有小于等于n(n>2)的素数的个数,素数的个数作为函数值返回。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:
源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
#include
intfun(intn)
{inti,j,count=0;
printf("\nTheprimenumberbetween3to%d\n",n);
for(i=3;i<=n;i++)
/**********found**********/
{for(【1】;j
/**********found**********/
if(【2】%j==0)
break;
/**********found**********/
if(【3】>=i)
{count++;
printf(count%15?
"%5d":
"\n%5d",i);}
}
returncount;
}
main()
{intn=20,r;
r=fun(n);
printf("\nThenumberofprimeis:
%d\n",r);
}
4、程序填空题
函数fun的功能是:
统计长整数n的各个位上出现数字1、2、3的次数,并通过外部(全局)变量c1,c2,c3返回主函数。
例如:
当n=123114350时,结果应该为:
c1=3c2=1c3=2。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:
源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
#include
intc1,c2,c3;
voidfun(longn)
{c1=c2=c3=0;
while(n)
/**********found**********/
{switch(【1】)
/**********found**********/
{case1:
c1++;【2】;
/**********found**********/
case2:
c2++;【3】;
case3:
c3++;
}
n/=10;
}
}
main()
{longn=123114350L;
fun(n);
printf("\nTheresult:
\n");
printf("n=%ldc1=%dc2=%dc3=%d\n",n,c1,c2,c3);
}
5、程序改错题
给定程序MODI1.C中函数fun的功能是:
从低位开始取出长整型变量s中偶数位上的数,依次构成一个新数放在t中。
高位仍在高位,低位仍在低位。
例如,当s中的数为:
7654321时,t中的数为:
642。
请改正程序中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
/************found************/
voidfun(longs,longt)
{longsl=10;
s/=10;
*t=s%10;
/************found************/
while(s<0)
{s=s/100;
*t=s%10*sl+*t;
sl=sl*10;
}
}
main()
{longs,t;
printf("\nPleaseenters:
");scanf("%ld",&s);
fun(s,&t);
printf("Theresultis:
%ld\n",t);
}
6、程序改错题
给定程序MODI1.C中函数fun的功能是:
判断一个整数是否是素数,若是返回1,否则返回0。
在main()函数中,若fun返回1输出YES,若fun返回0输出NO!
。
请改正程序中的错误,使它能得出正确的结果。
注意:
不要改动main函数。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
intfun(intm)
{intk=2;
while(k<=m&&(m%k))
/************found************/
k++
/************found************/
if(m=k)
return1;
elsereturn0;
}
main()
{intn;
printf("\nPleaseentern:
");scanf("%d",&n);
if(fun(n))printf("YES\n");
elseprintf("NO!
\n");
}
7、程序改错题
下列给定程序中函数fun的功能是:
计算n!
。
例如,给n输入5,则输出120.000000。
请改正程序中的错误,使程序能输出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include
#include
doublefun(intn)
{doubleresult=1.0;
/*************found**************/
ifn==0
return1.0;
while(n>1&&n<170)
/*************found**************/
result=n--;
returnresult;
}
voidmain()
{
intn;
printf("InputN:
");
scanf("%d",&n);
printf("\n\n%d!
=%lf\n",n,fun(n));
}
8、程序改错题
给定程序MODI1.C的功能是:
读入一个整数k(2≤k≤10000),打印它的所有质因子(即所有为素数的因子)。
例如,若输入整数:
2310,则应输出:
2、3、5、7、11。
请改正程序中的语法错误,使程序能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
/************found************/
IsPrime(intn);
{inti,m;
m=1;
for(i=2;i/************found************/
if!
(n%i)
{m=0;break;}
return(m);
}
main()
{intj,k;
printf("Pleaseenteranintegernumberbetween2and10000:
");
scanf("%d",&k);
printf("\n\nTheprimefactor(s)of%dis(are):
",k);
for(j=2;j<=k;j++)
if((!
(k%j))&&(IsPrime(j)))
printf("\n%4d",j);
printf("\n");
}
9、程序改错题
给定程序MODI1.C中函数fun的功能是:
求整数x的y次方的低3位值。
例如,整数5的6次方为15625,此值的低3位值为625。
请改正函数fun中指定部位的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include
longfun(intx,inty,long*p)
{inti;
longt=1;
/**************found**************/
for(i=1;it=t*x;
*p=t;
/**************found**************/
t=t/1000;
returnt;
}
main()
{longt,r;intx,y;
printf("\nInputxandy:
");scanf("%ld%ld",&x,&y);
t=fun(x,y,&r);
printf("\n\nx=%d,y=%d,r=%ld,last=%ld\n\n",x,y,r,t);
}
10、程序改错题
给定程序MODI1.C中函数fun的功能是:
统计一个无符号整数中各位数字值为零的个数,通过形参传回主函数;并把该整数中各位上最大的数字值作为函数值返回。
例如,若输入无符号整数30800,则数字值为零的个数为3,各位上数字值最大的是8。
请改正函数fun中指定部位的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include
intfun(unsignedn,int*zero)
{intcount=0,max=0,t;
do
{t=n%10;
/**************found**************/
if(t=0)count++;
if(maxn=n/10;
}while(n);
/**************fo