C语言实验二报告.docx
- 文档编号:28987632
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:19
- 大小:19.67KB
C语言实验二报告.docx
《C语言实验二报告.docx》由会员分享,可在线阅读,更多相关《C语言实验二报告.docx(19页珍藏版)》请在冰豆网上搜索。
C语言实验二报告
北京电子科技学院(BESTI)
实验报告
课程:
程序设计基础
班级:
姓名:
学号:
成绩:
指导教师:
张晓昆
实验日期:
实验密级:
预习程度:
实验时间:
15:
30~18:
30
仪器组次:
必修/选修:
必修
实验序号:
2
实验名称:
函数编程练习
实验目的与要求:
主函数通常只处理输入和输出;掌握定义函数的方法;掌握函数实参与形参的对应关系,以及“值传递”的方式;掌握全局变量、局部变量、动态变量、静态变量的概念和使用方法,、了解函数的嵌套调用方法和递归调用方法。
观察堆栈窗口callstack,注意函数调用过程堆栈的动态变化。
有兴趣的同学可以将几个函数分别放到不同的.C文件中,分别编译,再利用Project建立工程文件,然后连接执行,观察结果。
实验内容
素数(PrimeNumber),又称为质数,它是不能被1和它本身以外的其他整数整除的正整数。
按照这个定义,负数、0和1都不是素数,而17之所以是素数,是因为除了1和17以外,它不能被2~16之间的任何整数整除。
任务1:
试商法是最简单的判断素数的方法。
用i=2~m-1之间的整数去试商,若存在某个m能被1与m本身以外的整数i整除(即余数为0),则m不是素数,若上述范围内的所有整数都不能整除m,则m是素数。
采用试商法,分别用goto语句、break语句和采用设置标志变量并加强循环测试等三种方法编写素数判断函数IsPrime(),从键盘任意输入一个整数m,判断m是否为素数,如果m是素数,则按"%disaprimenumber\n"格式打印该数是素数,否则按"%disnotaprimenumber\n"格式打印该数不是素数。
然后分析哪一种方法可读性更好。
1、goto语句
#include
#include
intIsPrime(intn);//判断是否是素数的函数原型
intmain()
{
intm;
printf("Pleaseenterainteger:
");
scanf("%d",&m);//用户输入欲判断的数
if(IsPrime(m)==1){//调用判断是否是素数的函数并输出结果
printf("%disaprimenumber!
\n",m);
}
else{
printf("%disnotaprimenumber!
\n",m);
}
return0;//返回0
}//主函数结束
intIsPrime(intn)//判断是否是素数的函数
{
inti=2;
intj=0;
if(n<2){//若n小于2,返回0值
return0;
}
if(n==2){
return1;
}
loop:
if(n%i==0){//利用goto语句
i++;
j++;
gotoloop;
}
if(j>=1){//若j大于2,则说明能被2~n-1之间的数整除,返回0;否则返回1
return0;
}
else{
return1;
}
}//子函数结束
2、break语句
#include
#include
intIsPrime(intn);//判断是否是素数的函数原型
intmain()
{
intm;
printf("Pleaseenterainteger:
");
scanf("%d",&m);//用户输入欲判断的数
if(IsPrime(m)==1){//调用判断是否是素数的函数并输出结果
printf("%disaprimenumber\n",m);
}
else{
printf("%disnotaprimenumber\n,",m);
}
return0;//返回0
}//主函数结束
intIsPrime(intn)//判断是否是素数的函数
{
inti;
intj=0;
if(n<2){//若n小于2,返回0值
return0;
}
for(i=2;i<=n-1;i++){
if(n%i==0){//利用试商法判断是否能被2~n-1之间的数整除
j++;
}
if(j>1){//若j大于2,则说明能被2~n-1之间的数整除,返回0;否则返回1
return0;
break;
}
}
if(j==0)
return1;
}//子函数结束
3、采用设置标志变量并加强循环测试
#include
#include
intIsPrime(intn);//判断是否是素数的函数原型
intmain()
{
intm;
printf("Pleaseenterainteger:
");
scanf("%d",&m);//用户输入欲判断的数
if(IsPrime(m)==1){//调用判断是否是素数的函数并输出结果
printf("%disaprimenumber\n",m);
}
else{
printf("%disnotaprimenumber\n,",m);
}
return0;//返回0
}//主函数结束
intIsPrime(intn)//判断是否是素数的函数
{
inti;
intj=0;
if(n<2){//若n小于2,返回0值
return0;
}
for(i=2;i<=n-1;i++){
if(n%i==0){//利用试商法判断是否能被2~n-1之间的数整除
j++;
}
}
if(j>=1){//若j大于2,则说明能被2~n-1之间的数整除,返回0;否则返回1
return0;
}
else{
return1;
}
}//子函数结束
任务2:
用数学的方法可以证明,不能被2~
(取整)之间的数整除的数,一定不能被1和它本身之外的其他任何整数整除。
根据素数的这个性质,通过修改素数判断函数IsPrime()的具体实现,编程完成任务1。
#include
#include
#include
intIsPrime(intn);//判断是否是素数的函数原型
intmain()
{
intm;
printf("Pleaseenterainteger:
");
scanf("%d",&m);//用户输入欲判断的数
if(IsPrime(m)==1){//调用判断是否是素数的函数并输出结果
printf("%disaprimenumber\n",m);
}
else{
printf("%disnotaprimenumber\n,",m);
}
return0;//返回0
}//主函数结束
intIsPrime(intn)//判断是否是素数的函数
{
inti;
intj=0;
if(n<2){//若n小于2,返回0值
return0;
}
for(i=2;i<=sqrt(n);i++){
if(n%i==0){//利用试商法判断是否能被2~n的开方(取整)之间的数整除
j++;
}
}
if(j>=1){//若j大于2,则说明能被2~n-1之间的数整除,返回0;否则返回1
return0;
}
else{
return1;
}
}//子函数结束
任务3:
从键盘任意输入一个整数n,编程计算并输出1~n之间的所有素数之和。
#include
#include
#include
intIsPrime(intm);//判断是否是素数并求和的函数原型
intmain()
{
intn;
printf("Pleaseenterainteger:
");
scanf("%d",&n);//用户输入欲判断的数
//打印输出1~n之间的所有素数之和
printf("Thesumofalltheprimesbetween1andthenumberyouenteris:
%d\n",IsPrime(n));
return0;//返回0
}//主函数结束
intIsPrime(intm)//判断是否是素数的函数
{
inti;
intj;
intsum=0;
for(i=2;i<=m;i++){
intk=0;
for(j=2;j<=sqrt(i);j++){
if(i%j==0){//利用试商法判断是否能被2~n的开方(取整)之间的数整除
k++;
}
}
if(k==0){//如果k等于0,说明i是素数,求和
sum=sum+i;
}
}
returnsum;//返回素数之和
}//子函数结束
任务4:
从键盘任意输入一个整数m,若m不是素数,则计算并输出其所有的因子(不包括1),例如对于16,输出2,4,8;否则输出"Nodivisor!
Itisaprimenumber\n"。
#include
#include
#include
intIsPrime(intn);//判断是否是素数的函数原型
intmain()
{
intm;
inti;
printf("Pleaseenterainteger:
");
scanf("%d",&m);//用户输入欲判断的数
if(IsPrime(m)==1){//调用判断是否是素数的函数,若不是素数,打印因子(不包括1)
for(i=2;i<=m;i++){
if(m%i==0){//利用试商法判断是否是因子
printf("%d",i);
}
}
}
if(IsPrime(m)==0){//调用判断是否是素数的函数并输出结果
printf("Nodivisor!
Itisaprimenumber\n");
}
return0;//返回0
}//主函数结束
intIsPrime(intn)//判断是否是素数的函数
{
inti;
intj=0;
for(i=2;i<=sqrt(n);i++){
if(n%i==0){//利用试商法判断是否能被2~n的开方(取整)之间的数整除
j++;
}
}
if(j>=1){//若j大于2,则说明能被2~n-1之间的数整除,返回1;否则返回0
return1;
}
else{
return0;
}
}//子函数结束
任务5:
如果一个正整数m的所有小于m的不同因子(包括1)加起来正好等于m本身,那么就被称它为完全数(PerfectNumber)。
例如,6就是一个完全数,是因为6=1+2+3。
请编写一个判断完全数的函数IsPerfect(),然后判断从键盘输入的整数是否是完全数。
#include
#include
intIsPerfect(intn);//判断输入的整数是否是完全数的函数原型
intmain()
{
intm;
printf("Pleaseenterainteger:
");
scanf("%d",&m);//用户输入欲判断的数
if(IsPerfect(m)==1){//调用判断是否是素数的函数,若是,打印语句
printf("ThenumberyouenterisaPerfectNumber!
\n");
}
if(IsPerfect(m)==0){//调用判断是否是素数的函数,若不是,打印语句
printf("ThenumberyouenterisnotaPerfectNumber!
\n");
}
return0;//返回0
}//主函数结束
intIsPerfect(intn)//判断输入的整数是否是完全数的函数
{
inti;
intsum=0;
for(i=1;i if(n%i==0){//判断是否是因子 sum=sum+i;//求因子之和 } } if(sum==n){//判断输入的整数是否是完全数 return1; } else return0; }//子函数结束 任务6: 从键盘任意输入一个整数m,若m不是素数,则对m进行质因数分解,并将m表示为质因数从小到大顺序排列的乘积形式输出,否则输出"Itisaprimenumber\n"。 例如,用户输入90时,程序输出90=2*3*3*5;用户输入91时,程序输出"Itisaprimenumber\n"。 #include #include #include intIsPrime1(intx);//判断是否是素数的函数原型 intIsPrime2(inty);//判断是否是素数的函数原型 intmain() { intm; inta=1;//a表示质因数之积 intb;//b表示m与其因数之商 printf("Pleaseenterainteger: "); scanf("%d",&m);//用户输入欲判断的数 if(IsPrime1(m)==1){//调用判断是否是素数的函数,若是,打印语句 printf("Itisaprimenumber! \n"); } //调用判断是否是素数的函数,若不是将m表示为质因数从小到大顺序排列的乘积形式输出 if(IsPrime1(m)==0){ printf("%d=",m); while(a! =m){//判断所有因子之积是否等于m,不等继续运行 b=m/a; printf("%d",IsPrime2(b));//打印因子 a=IsPrime2(b)*a;//m的因子之积 if(a! =m){ printf("*");//打印乘号 } } } return0; } intIsPrime1(intx)//判断是否是素数的函数 { inti; intj=0; for(i=1;i<=sqrt(x);i++){ if(x%i==0){//利用试商法判断是否能被2~n的开方(取整)之间的数整除 j++; } } if(j<=1){//若j小于2,则说明能被2~n的开方(取整)之间的数整除,返回1;否则返回0 return1; } else return0; }//子函数结束 intIsPrime2(inty)//判断是否是素数的函数 { inti; intj; for(i=2;i<=y;i++){//找出2~y之间的素数 intk=0; for(j=2;j<=sqrt(i);j++){ if(i%j==0){//利用试商法判断是否能被2~i的开方(取整)之间的数整除 k++; } } if(k==0&&y%i==0){ returni; } } } 任务7: 验证: 2000以内的正偶数都能够分解为两个素数之和(即验证哥德巴赫猜想对2000以内的正偶数成立),正奇数都能够分解为三个素数之和。 注意最后要将结果上传之前,请将2000改为500再运行,并注意输出格式,每行5个等式,如: 10=3+7;12=5+7;…。 #include #include #include intIsPrime1(intx);//输出正偶数分解为两个素数之和的函数原型 intIsPrime2(inty);//输出正奇数分解为三个素数之和的函数原型 intmain() { intm;//定义整型变量,为偶数 intn;//定义整型变量,为奇数 printf("正偶数等于两素数之和: \n"); for(m=2;m<=100;m+=2){//输出正偶数分解为两个素数之和 IsPrime1(m); } printf("\n正奇数等于三素数之和: \n"); for(n=5;n<=100;n+=2){//输出正奇数分解为三个素数之和 IsPrime2(n); } return0;//返回0 }//主函数结束 intIsPrime1(intx)//输出正偶数分解为两个素数之和的函数 { inti;//i表示素数 intj;//j用于判断i是否是素数 inta;//a表示素数 intb;//b用于判断a是否是素数 if(x%5==4){ printf("\n"); } for(i=2;i<=x;i++){//判断i是2~y之间的素数 intk1=0; for(j=2;j<=sqrt(i);j++){ if(i%j==0){ k1++; } } if(k1==0){ for(b=2;b<=x;b++){//判断b是2~y之间的素数 intk2=0; for(a=2;a<=sqrt(b);a++){ if(b%a==0){ k2++; } } if(k2==0){ if(i+b==x){//如果i、b都是素数,求和判断是否等于x,若等打印 printf("%d=%d+%d;",x,i,b); } if(i+b==x){ return0; } }//if结束 }//for循环结束 }//if结束 }//for循环结束 return0;//返回0 }//主函数结束 intIsPrime2(inty)//输出正奇数分解为三个素数之和的函数 { inti;//i表示素数 intj;//j用于判断i是否是素数 inta;//a表示素数 intb;//b用于判断a是否是素数 intg;//g表示素数 inth;//h用于判断g是否是素数 if(y%5==2){ printf("\n"); } for(i=2;i<=y;i++){//判断i是2~y之间的素数 intk1=0; for(j=2;j<=sqrt(i);j++){ if(i%j==0){ k1++; } } if(k1==0){ for(b=2;b<=y;b++){//判断b是2~y之间的素数 intk2=0; for(a=2;a<=sqrt(b);a++){ if(b%a==0){ k2++; } } if(k2==0){ for(g=2;g<=y;g++){//判断g是2~y之间的素数 intk3=0; for(h=2;h<=sqrt(g);h++){ if(g%h==0){ k3++; } } if(k3==0){ if(i+b+g==y){//如果i、b、g都是素数,求和判断是否等于y,若等打印 printf("%d=%d+%d+%d;",y,i,b,g); } if(i+b+g==y){//用于终止循环 return0; } }//if结束 }//for循环结束 }//if结束 }//for循环结束 }//if结束 }//for循环结束 return0; }//子函数结束
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 实验 报告