码迷,mamicode.com
首页 > 编程语言 > 详细

c语言博客作业-函数

时间:2017-11-18 22:04:09      阅读:320      评论:0      收藏:0      [点我收藏+]

标签:提交   换行   最大   运算   过程   print   因子   老师   jpg   

一PTA实验作业

题目一6-9 使用函数验证哥德巴赫猜想

1.本题PTA提交列表

技术分享图片

2.设计思路

第一个函数

  • 1.定义i为循环变量
  • 2.如果p=1,return 0;
  • 3.使用for循环,for(i=2;i<p;i++){
    if(p%i==0)return 0;
    }
    return 1;
  • 4.第二个函数,定义变量k,l,j,都用于控制循环次数
  • 5.使用for循环,当k小于要分解的n时,进入下一步
  • 6.使用for循环,当j小于n-k时,j递增
  • 7.如果所有小于n-k的 j 都不能被n-k整除,说明n-k时素数,进入第八步。
  • 8.使用for循环,令l从2递增到 k,如果所有的 l 都不能被 k 整除,说明 k 也是素数。进入第九步
  • 9.输出算式n=k+(n-k)

3.本题调试过程碰到问题及PTA提交列表情况说明

  • 在判断n-k是否为素数时,我使用的时 if ( n-k )%j==0,就说明它非素数,但我忽略了当(n-k)=j时也符合该if语句,所以我在后续判断 k 是否为素数时的条件改为 if((n-k)==j)才进入循环。一图为第一次的,二图为改正后的。技术分享图片

技术分享图片

  • 第一次写的时候忘了判断 k 是否为素数,当判断完n-k是素数就直接输出语句了

题目二6-8 使用函数输出指定范围内的Fibonacci数

1.本题PTA提交列表

技术分享图片

2.设计思路

第一个函数

  • 1.定义变量i控制循环次数,z为Fibonacci数,k,l辅助z的增值
  • 2.如果n为1,返回1;如果n大于1,执行第三步
  • 3.给z,k,l赋初值分别为1,1,0
  • 4.for(i=2;i<=n;i++){
    k=l;l=z;z=z+k;
    }
  • 5.返回z。
    第二个函数
  • 6.定义变量同上
  • 7.当m=n=1时,输出1 1
  • 8.此外,给i赋初值为1,其他变量同上
  • 9.如果m=1,但是n不等于1,输出1,同时 i 加一
  • 10.同上循环步骤,找Fibonacci数,当z存在m,n范围内时输出,同时i加一。
  • 11.当z大于n时结束循环,
  • 12.如果i的值为1,说明没有Fibonacci数,输出No Fibonacci number。

3.本题调试过程碰到问题及PTA提交列表情况说明

这道题有一个很麻烦的地方是第一和第二的Fibonacci数都是1 ,所以在输出是有很多小错误,

  • 第一个,忘记了当m=1时应该输出1
  • 第二个,在第二个函数中,当m=1时,最开始我的代码只会输出一个1,因为我的代码实质上都是从第二个Fibonacci数开始找的,于是我在循环中添了if语句。当m=1时先输出一个1.
  • 第三个不是1的问题,而是空格输出的问题,我的printf语句是输出“%d ”,但正确应该是“ %d”,这样就不会导致最后一个输出有问题。
  • 第四个是最大的一个误解,就是当m=1,n=1时,我认为它的区间内只有一个Fibonacci数,只输出一个1,但正确是要输出两个1,这个区间意味的是Fibonacci数有那些个,而正好第一个和第二个Fibonacci数都在该区间内,且都为1.

题目三7-1求组合数

1.本题PTA提交列表

技术分享图片

2.设计思路

  • 1.主函数,定义m,n为输入值,result为结果
  • 2.输入m,n,表达式result=fact(n,m),输出result
  • 3.fact函数,定义浮点型变量i,sum1,sum2,sum3,i用于控制循环。
  • 4.将这些变量都赋初值为1
  • 5.for(i=1;i<=n;i++)
    sum1=sum1*i;
  • 6.sum1,sum2同上
  • 7.return sum1/(sum2*sum3);

3.本题调试过程碰到问题及PTA提交列表情况说明

  • 本题一次过,没有问题。

二同学代码结对互评

1.互评照片

技术分享图片

2.我的代码、互评同学代码截图

  • 我的代码
int factorsum( int number )
{
    int j,k;//j控制循环次数,使每个小于m的数都被m求余一次观察是否为其因子, 
    k=0;//k为各因子的和 
    for(j=1;j<=number;j++){
        if(number%j==0)//如果m求余后为0,既是其因子, 
            k=k+j;//将因子加起来 ,从1加到其本身, 
    }
    if(number==1)// 当m为1,输出k 
    return k;
    else//当m为大于一的数,返回值需减其本身 
    return k-number;
 }
void PrintPN( int m, int n )
{
    int a,j,k,l;//a用于控制循环次数,l用于观察制定区间内非完数的个数 
    l=0; 
    for(a=m;a<=n;a++){
        k=0;//赋初值,以防止上一次运算结果带入下一次运算 
        for(j=1;j<=a;j++){
            if(a%j==0)
                k=k+j;
        }//运算每个a的因子值之和 
        if(a==1){//当a=1是为特殊情况 
            printf("1 = 1");
            putchar(‘\n‘);
        }
        else if(a==k-a){//当a不等1时,判断其是否为完数 
            printf("%d = 1",a);//是的话,先输出必有的1, 
            for(j=2;j<a;j++){
                if(a%j==0)
                printf(" + %d",j);//其次输出各因子 
            } 
            putchar(‘\n‘);//算式之间要换行 
        }
        else
        l=l+1;//累加非完数的和 
    }
    if(l==(n-m+1))
    printf("No perfect number");//当该区间内没有完数,输出 No perfect number
}
  • 林晓露的代码
int factorsum( int number )
{
  int j,sum;
  sum=0;
  if(number==1)//把1的特殊情况单独讨论
  return 1;
  for(j=1;j<=number/2;j++){
    if(number%j==0){
      sum=sum+j;//计算整数因子和
    }
  }
  return sum;
}
void PrintPN( int m, int n )
{
  int k,j;
  j=1;
    for(k=m;k<=n;k++){
    if(k==factorsum(k)){//若该数恰好等于除自身外的因子之和
     printf("%d =",k);
     if(k==1)//讨论1的特殊情况
     printf(" 1");
    for(j=1;j<=k/2;j++){
      if(k%j==0){//在已知是完数的情况下循环输出因子
        printf(" %d",j);
        if(j<k/2){
          printf(" +");
        }
      }
    }
    printf("\n");//每输出一个完数及其因子的表示形式后换行
  }
}
if(j==1&&m!=1)//如果没进入内循环,j=1,且m不为1
printf("No perfect number");
}

3.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?如果同学代码有错的也请帮忙指出来哪里出问题。

  • 在第一个函数中,我的循环变量是要小于number,这样我累加的因子和还累加了自身,返回时需减去,而她的循环变量是小于number/2,不会加上自身,比我简洁。
  • 在第二个函数中,她的代码先进行了第一个函数的运用,判断输入的k是否为完数,而我的则是相当于将第一个代码又重新打了一遍,她比我简洁。
  • 在判断区间内有无函数时,我新定义一个变量,每次输出算式时累加,通过变量的值观察是否输出算式,从而得知是否有完数,而她的代码直接判断是否进入循环而判断是否有完数,比我简洁。
  • 我们两个的代码思路风格其实相近,但她的代码比我短很多,因为很多细节我写得比她复杂,所以我更喜欢她的代码。

三、截图本周题目集的PTA最后排名

技术分享图片

四、本周学习总结

1.你学会了什么?

1.1 C语言哪些数据类型?

整数型(定点型)、实数型(浮点型)和字符型

1.2 字符型数据需要注意地方?

字符型常量指单个字符,且需加单引号,字符型变量的值可以是字符或整数,整型变量和字符型变量的值可以互换。

1.3 自增自减运算符?

自增运算符++,自减运算符--

1.4 运算符优先级?

逻辑运算符!>算术运算符>关系运算符>逻辑运算符&& ||>条件表达式>赋值运算符>逗号运算符

1.5 C语言哪些表达式?课堂派哪里做错,做错的请在这里分析原因?

算术表达式,赋值表达式,逻辑表达式,逗号表达式。课堂派的运算题我没做对,但是不知道++放在前面还是后面的运算差别。
技术分享图片

第一题y的值不变还是3,因为t=4为真,就不再执行||后面的算式。第二题j的值还是为3.

2.本周的内容,你还不会什么?

对这些运算符的使用可能还存在误解,因为上课时老师让我们进行的运算我都没算对。

1.哪题做错了,怎么改?

后两道题一分没拿,倒数第二道是因为不知道如何将十进制转换成二进制,当时考试紧张没想起来,最后一道写了调试了,但是拿不到分

2.考试结果满意么,怎么改进?

不太满意,还是缺乏做题,所以像最后一题这样有难度一点就做不出来,改进的话多做题。

3.其他总结。

这次的考试其实我前三题做的挺快,有什么小错误通过printf语句也很快找到了,可是后两题的运算花了我一半多的时间,一是因为第四题我不知道怎么讲是禁止换成二进制,所以用了2*10的n次方的计算,虽然结果会对,但是运算过程中计算量太大,超出int 甚至double的范围,所以,我这道题没过,倒数二十分钟的时候我想着从最后一题拿点分,显然我太天真了。当时考完试的第一感觉就是我做的题量实在是太少了,不然不至于没及格。还是更努力点吧。

c语言博客作业-函数

标签:提交   换行   最大   运算   过程   print   因子   老师   jpg   

原文地址:http://www.cnblogs.com/yiyeluo0701/p/7854177.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!