C语言博客作业--函数

一、PTA实验作业

题目1:使用函数输出指定范围内的完数

1. 本题PTA提交列表

2.设计思路

  • 第一步:定义函数int factorsum ( int number)返回int number的因子和,定义整型变量i存储循环次数以及表示各个因子,sum用于因子求和
  • 第二步:如果number==1,则返回值1
  • 第三步:令i的值为1,满足i<=number/2的条件时执行接下来的步骤
  • 第四步:如果满足number%i0的条件,运算sum=sum+i,求因子数和
    如果满足i
    number/2&&sum==number的条件,返回sum值,
  • 第一步:令i++,如果满足i<=number/2的条件,则执行第四步
  • 第二步:定义函数void PrintPN ( int m, int n )用于逐行输出给定范围[m, n]内每个完数的因子累加形式的分解式,定义整型变量j,k用于存放循环次数,count用于确定范围内是否有因子式存在
  • 第三步:令j=m,如果满足j<=n的条件,执行以下步骤
  • 第四步:如果满足factorsum(j)j为判断数j是否满足因子式的条件,再如果j1,输出(%d = 1,j) 并换行,令count=1
    否则输出(%d = 1,j)
  • 第五步:令k=1,满足k<=j/2的条件,则执行接下来的步骤
  • 第六步:如果满足k>=2&&j%k0的条件中再满足kj/2的条件则令count=1,输出(" + %d\n",k)
    否则输出(" + %d",k)
  • 第七步:令k++,如果满足k<=j/2的条件执行第六步,否则执行第八步
  • 第八步:令j++,如果满足j<=n的条件则执行第四步,否则执行第九步
  • 第九步:如果count==0,则输出No perfect number

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

  • 问题:发现输出没有1及其因子式1=1

    调试发现
    当进入PrintPN()时,i=0,number/2=1/2,不满足i<=number/2的条件,所以1进入不了函数factorsum(),不被当做完数
  • 解决方法:
    把n1时单独考虑,当n1时,返回函数值1,承认1是完数

题目2:使用函数输出指定范围内的Fibonacci数

1.本题PTA提交列表

2.设计思路

  • 第一步:定义函数int fib ( int n )用于返回第n项Fibonacci数,定义变量J存放循环次数,令number1=1为第一项数,number2=2为第二项数

  • 第二步:如果满足n1||n2的条件,返回函数值1,
    如果满足n>=3的条件,则令j=3,如果再满足j<=n的条件则运算sum=number1+number2(sum存放前两项和)
    number1=number2(number1存放sum前一项的数)
    number2=sum(把sum的值赋予number2,让number2存放前两项和的新的一项,再通过循环让sum求新的两项和)

  • 第三步:j++,如果仍然满足j<=n的条件,则执行第二步,否则执行第四步

  • 第四步:返回number2的值给函数

  • 第一步:定义函数void PrintFN ( int m, int n ),定义整型变量k存放循环次数,o判断是否有Fibonacci数,h配合t求第h项的Fibonacci数,t代替fib()

  • 第二步:令k=m,如果满足k<=n的条件,则执行第三步,否则执行第七步

  • 第三步:令h=1,如果满足h<=30,则执行下一步

  • 第四步:令t=fib(h),如果满足tk&&o0的条件,则令o=1,输出("%d",k),并使用continue语句重新开始一轮循环
    如果满足tk&&o1的条件,输出(" %d",k),并使用break语法跳出循环

  • 第五步:h++,如果满足h<=30的条件,则执行第四步,否则执行第六步

  • 第六步:k++,如果满足k<=n的条件,则执行第三步,否则执行第七步

  • 第七步:如果o==0,则输出No Fibonacci number

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

  • 问题:最开始打这题代码的时候,函数定义时定义了一个变量i用于判断第几项,结果后来定义了n判断第几项,没有改写原来变量i的地方,函数判断不了第一个输入的数,直接输出,导致答案部分正确
  • 解决方法:调试中发现,当判断Fibonacci数时,并没进去i>3的这个语句,及时改正为n>3,答案正确

    改正后:

题目3.求组合数

1.本题PTA提交列表

2.设计思路

  • 第一步:声明函数double fact ( int n )
  • 第二步:输入整型变量m,n ,用于从n个不同元素中取出m个元素的组合数
  • 第三步:定义双精度浮点型变量result用于输出最后结果
  • 第四步:输入m,n;
  • 第五步:运算result=fact(n)/(fact(m)fact(n-m)),就是求n!/m!(n-m)!
  • 第六步:保留0位小数输出输出result
  • 定义函数double fact ( int n )
  • 第一步:定义整型变量i存放循环次数与用于求阶层
  • 第二步:定义双精度浮点型变量sum存放n阶层的值
  • 第三步:令i=1
  • 第四步:如果满足i<=n的条件,那么运算sum=sum*i,i++,否则执行第六步
  • 第五步:如果仍然满足i<=n的条件,那么执行第四步 ,否则执行第六步
  • 第六步:返回函数值sum

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

  • 问题:答案错误,发现
  • 解决方法:回去重新审查代码,发现
    把sum的类型重新定义为double,答案正确

二、同学代码结对互评


  • 志坚同学的代码:
    我的代码:
  • 不同点:1.判断素数时,志坚用的条件是i<=sqrt(p),我的时i<=p,这里他对素数的判断更快速
    2.求分解式时,志坚用了一个嵌套循环,i为一个分解数,j为令一个分解数,分别让i=2 j=2~n,i=3 j=2~n,i=3 j=2~n............i=n j=2~n进行判断,满足i+jn&&prime(i)1&&prime(j)1的条件,输出n=p(i)+q(j)
    我利用了判断素数函数的返回值1和0,用了一个循环令一个分解数k从2到n,令一个分解数为n-k(不需要再定义一个变量),再直接判断kprime(k)+(n-k)prime(n-k)
    n(是素数时返回1再乘以本身得分解数本身,不是素数乘0为0没意义)的条件,满足输出n=p(k)+q(n-k)
    就省得再用一个循环去实现另一个分解数
  • 我认为我的代码更有优势,减少计算机的计算量,给出答案较快
  • 没有发现志坚同学的代码有错误

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

四、本周学习总结

1.你学会了什么?

  • 1.1C语言里有整型int 数据长度32位,短整型short int 数据长度16位,长整型long int 数据长度32位,无符号整型unsigned int 数据长度32位,无符号长整型unsigned long int 数据长度32位,
    字符型 char 数据长度8位,单精度浮点型float 数据长度32位,双精度浮点型double 数据长度64位
  • 1.2输入字符型数据时千万不要有一种习惯就是打上空格,除非你要用空格做些判断,否则空格也会被当做字符输入
  • 1.3自增运算符++运用为n++ 或++n,自减运算符--运用为n--或--n,前缀和后缀所代表的表达式值不一样
  • 1.4运算符优先级学会了看P326-P327的表格
  • 1.5课堂派里y*x++算错了,要x++这个表达式的值与y相乘,原先先算x++了,令值加了1再相乘

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

  • 二进制位逻辑运算符一点都不熟练,必须看着书慢慢一点一点推敲,碰到题目也不会用,课堂派里的最后一题也不会做,希望老师能多花点时间在这一块内容

3.3.循环结构考试总结

  • 第五题求单词长度做错了,第四题二进制前导的零没做。改正:第五题里再写个算法判断空格连续时输出单词长度就可以
  • 考试结果不满意,前20分钟就做完了前三道题,第四题会做,但是我先做了第五题,发现第五题有难度,硬是花了所有的时间去想这道题,结果忽略了第四道题
  • 改进:考试时会的题目一定要先做,做完会的题目再去做不会的题目,平时要再多花时间在C语言这门课上 ,要勤于动脑,不做一个推延的人
posted @ 2017-11-18 13:01  朱杰伟  阅读(763)  评论(4编辑  收藏  举报