C语言实验二报告.docx

上传人:b****6 文档编号:7545581 上传时间:2023-05-11 格式:DOCX 页数:16 大小:19.74KB
下载 相关 举报
C语言实验二报告.docx_第1页
第1页 / 共16页
C语言实验二报告.docx_第2页
第2页 / 共16页
C语言实验二报告.docx_第3页
第3页 / 共16页
C语言实验二报告.docx_第4页
第4页 / 共16页
C语言实验二报告.docx_第5页
第5页 / 共16页
C语言实验二报告.docx_第6页
第6页 / 共16页
C语言实验二报告.docx_第7页
第7页 / 共16页
C语言实验二报告.docx_第8页
第8页 / 共16页
C语言实验二报告.docx_第9页
第9页 / 共16页
C语言实验二报告.docx_第10页
第10页 / 共16页
C语言实验二报告.docx_第11页
第11页 / 共16页
C语言实验二报告.docx_第12页
第12页 / 共16页
C语言实验二报告.docx_第13页
第13页 / 共16页
C语言实验二报告.docx_第14页
第14页 / 共16页
C语言实验二报告.docx_第15页
第15页 / 共16页
C语言实验二报告.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

C语言实验二报告.docx

《C语言实验二报告.docx》由会员分享,可在线阅读,更多相关《C语言实验二报告.docx(16页珍藏版)》请在冰点文库上搜索。

C语言实验二报告.docx

C语言实验二报告

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//因调用sqrt()函数,故需此预处理命令

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//因调用sqrt()函数,故需此预处理命令

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//因调用sqrt()函数,故需此预处理命令

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//因调用sqrt()函数,故需此预处理命令

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//因调用sqrt()函数,故需此预处理命令

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;

}//子函数结束

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2