C语言博客作业--函数

时间:2024-01-11 12:57:20

一、PTA实验作业

题目1 (6-7)

(1).本题PTA提交列表

C语言博客作业--函数

(2)设计思路

设计第一个函数判断是否完数int factorsum( int number )

  • 定义sum、i;sum初始化归0,循环变量i
  • 若number=1,则sum=1
  • i=1,当i小于number时循环
  • 若number能被i整除,
  • sum+=i
  • 返回sum的值

设计第二个函数void PrintPN( int m, int n )逐行输出每个完数的因子累加形式的分解式

  • 标志变量flag=1,循环变量i
  • for (;m<=n;m++)
  • 若m等于1,
  • flag=0
  • 输出1 = 1\n
  • factorsum( m ) == m &&m !=1
  • flag=0
  • 输出m = 1;
  • 进入循环
  • i=2,当i小于m时循环,i++
  • m%i==0成立
  • 输出 + i的值
  • 当内循环结束时再输出换行符
  • 外循环结束
  • flag==1
  • 输出No perfect number
  • 函数结束

(3)调试问题及解决方法

  • C语言博客作业--函数

  • C语言博客作业--函数

  • 发现当number的值为1时会返回0,所以number=1时不会输出1 is a perfect number;并且1 = 1不输出,等于号后面的空格没有输出

  • 加入判断当number的值为1时返回1,循环中当m=1时输出1 = 1并换行

  • C语言博客作业--函数

  • 发现输出中的有的数字后边多了一个空格

  • 在printf语句中修改,并对判断输出条件修改

题目2(6-8)

(1).本题PTA提交列表

C语言博客作业--函数

(2)设计思路

设计第一个函数int fib( int n )实现输出第t个fib数

  • 定义循环变量i,Fibonacci数列初始两数a、b(全为1),count(a+b之和)
  • n==1||n==2
  • return 1
  • i=3,当i小于等于n时循环,i++
  • count=b+a
  • b=a
  • a=count
  • 循环结束
  • return count

设计第二个函数void PrintFN( int m, int n )实现一行中输出给定范围[m, n]内的所有Fibonacci数

  • 定义循环变量i,标志变量flag=0
  • 当m小于等于n时循环;m++
  • i=1,循环终止条件在循环中给出
  • m==fib (i) && flag==0,进入分支
  • m==1
  • 输出1 1
  • flag=1;
  • 回到第一个循环(break;
  • 若m不等于1,
  • 输出m,
  • flag=1,
  • 回到第一个循环
  • m==fib (i) && flag==1
  • 输出空格+m的值
  • 回到第一个循环
  • fib(i)>m
  • 回到第一个循环
  • i循环结束
  • flag==0
  • 输出No Fibonacci number

(3)调试问题及解决方法

  • C语言博客作业--函数

  • C语言博客作业--函数

  • 输出的数不正确,并且,当n等于1或2时,输出的值也不正确

  • 原因在于我没有把n=1、n=2的情况特殊判断,并且先交换了i、j、k的值,导致count=1时k就已经等于3

  • 解决方案:先提出n=1、n=2的情况,使当它们成立时返回1;再把和的式子放在后边来执行

  • C语言博客作业--函数

  • 输出可以,但是没有设定跳出条件,所以无限循环,且每个数字后都有一个空格,不符合题目要求,而且,当m=n=1时,输出的结果就不正确

  • 重新调整代码,调用之前定义的函数,当m等于fib(i)且flag=0时:若m等于1,就特殊输出,并且跳出i 的循环等等,就可以实现题目要求

题目3 (7-1)

(1).本题PTA提交列表

C语言博客作业--函数

(2)设计思路

设计实现组合数计算功能的函数double fact(int n)

  • 定义循环变量i,双精度变量result,并将其初始化为1
  • i=1;当i小于等于n时循环;i++
  • result=i*result;
  • i循环结束
  • return result;

主函数int main ()

  • 设计变量m、n
  • 输入m、n的值
  • n==0
  • 输出result = 1
  • 若n不为0,
  • 输出fact(n) / ( fact(m) * fact(n-m) )的值

(3)调试问题及解决方法

  • 用的是int而不是double,导致答案错误

  • C语言博客作业--函数

  • 由于没有对n=0做特殊处理,所以输出了result = 0这一错误答案,使n==0时输出result = 1即可

二、同学代码结对互评

1.同学互评照片

C语言博客作业--函数

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

  • 我的代码

  • C语言博客作业--函数

  • 他(黄泽彬)的代码

  • C语言博客作业--函数

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

1)不同在于对循环条件的确立,以及变量数的不同

2)他的优势在于能用较简洁的代码去实现题目要求的功能;而我多想了一些,将一些特殊情况单独处理,并且我是使用m作为循环变量,上限是n,他则另取一变量i,使i等于m,我认为可以将i用m取代,这样应该也是可以实现题目要求的;在内循环方面,他的条件是j<=0.5*i,而我的条件是i<m,计算量比他的多了许多。

3)我更喜欢他那种简洁且实用的风格

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

PTA排名

C语言博客作业--函数

四、本周学习总结

1.你学会了什么?

  • 整型、字符型、实型
  • 加与不加 '' 的字母、数字不相等;字符型变量可以与整型变量转换;转义字符中 \ 的应用;
  • ++n与n++、--n与n--的区别
  • 运算符的优先级的区别
  • 对合法浮点数的定义
  • 关系运算符运算顺序从左到右
  • 逗号运算符的运算顺序从左到右

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

  • 位运算符的应用;位逻辑运算符的使用:如位非运算的具体使用
  • 移位运算的三种方式的的实际应用

3.循环结构考试总结

(1)哪题做错了,怎么改?

7-3 二进制的前导的零

  • 开始思路错误,以为要先将十进制数转为二进制数再循环去末位得到位数,再用32减去得到的位数
  • 回去分析二进制和十进制之后发现只要使十进制数每次除2并使计数变量+1,最后得到的计数变量的值就是该十进制数转换成二进制之后的位数,再用32减去计数变量就能得到最后结果
  • 然后错在当十进制数为负数
  • 由于负数在转换为二进制数时需要进行反码,即1变成0、0变成1,所以此时应输出0
  • 以及当输入的数是0时,和负数一样做特殊处理,应输出32

7-5 单词长度

  • 第一次出错在于“空句子”和“开头结尾多空格”、“连续多空格”
  • 加入另一个字符串变量b,使其初始化为空格符,用来记入前一个字符;若前一个字符为空格,且现字符为空格,则不输出,解决“连续多空格”问题
  • 再加入标志变量flag,用来控制空格的输出,但是并没法解决问题
  • 在循环外加入判断,当b!=' '时输出字符个数,并且前面做对应修改,解决“空句子”问题
  • 用了各种各样的方法和语句尝试了两个多小时,不是“开头结尾多空格”问题就是“连续多空格”问题, 最后发现只要在原来的代码里的flag的判断中加入b!=' '的判断就可以实现

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

不满意,多做题多思考,锻炼对题目的灵敏感觉,学会灵活运用所学知识解决问题

(3)其他总结

  • 通过这次的考试,我发现我对循环语句的掌握还是不够,总是在一些细节的地方犯错;
  • 以及对于将其他语句同循环语句结合也是一般,经常的以为能把它们没有出错的结合起来就行了,对于这个过程中花费的时间不是很在意
  • 思路的差异是解题速度不同的原因之一,我应该要多锻炼自己的思路的可行性和严谨性,去观摩和学习大神的代码