C语言博客作业--函数
一、PTA实验作业
题目一:6-6 使用函数输出水仙花数
1. 本题PTA提交列表
2. 设计思路
- 1定义函数narcissistic( int number )
- 2定义局部变量sum用于存放计算个个位数的次方结果,sum=0,n=number留有最早的number值,end做为每次取余得到的个位数
- 3当number为三位数时
- 4若number/10!=0进入循环5
- 5end=number%10,sum=pow(end,3)+sum,number=number/10
- 6对最高位不满足循环条件的剩余number值sum=pow(number,3)+sum
- 7当number为四位数时
- 8若number/10!=0进入循环9
- 9end=number%10,sum=pow(end,4)+sum,number=number/10
- 10对最高位不满足循环条件的剩余number值sum=pow(number,4)+sum
- 11如果sum=n,返回1,否则0
- 1定义函数void PrintN( int m, int n )
- 2定义局部变量i用于循环
- 3i=m+1;i<n,i++循环调用上述函数判断是否符合水仙花数,是的话输出
3.本题调试过程碰到问题及PTA提交列表情况说明
一开始编辑时忘了number的改变性,导致最后的sum与number没有可比性,错误
改正之后发现输出的数据中没有370,调试后发现自己的条件使其没有进入循环
改正后输出正确,但是放到pta上答案错误,自己根据提示调试发现自己的数据输出有局限性
调整思路后,重新修改编写后部分正确
后发现自己题意没有理解好,当number四位数时要四次方,修改增加后正确
题目二:6-7 使用函数输出指定范围内的完数
1. 本题PTA提交列表
2. 设计思路
- 1定义函数factorsum( int number )
- 2定义局部变量j用于循环,.sum存放因子和,sum=0
- 3当number=1时返回1
- 4j=1;j<=number/2;j++循环5
- 5若number%j==0,则sum=sum+j
- 6返回最终sum的值
- 1定义函数void PrintPN( int m, int n )
- 2定义局部变量k,j用于循环,k做为所要完数,j做为所要因子
- 3k=m;k<=n;k++,循环4,5,6
- 4若k==factorsum(k),输出“k =”,当k=1时直接再输出“ 1”
- 5j=1;j<=k/2;j++,循环6
- 6若k%j==0,输出“ j”,当j<k/2时输出“ +”
- 7每一轮循环结束输出“\n''
- 8若j==1&&m!=1,则输出No perfect number
3.本题调试过程碰到问题及PTA提交列表情况说明
发现输出没有换行,多输出了No的不满足部分
调整后输出感觉相同
pta部分正确,调试修改后发现自己题意理解不够,继续修改
pta显示格式错误
调试发现自己多了空格,改正后正确
题目三:7-1 求组合数
1. 本题PTA提交列表
2. 设计思路
- 1定义整型变量m,n存放输入的两个变量,浮点型变量result存放最后结果
- 2输入m,n的值
- 3调用函数 result=fact(n)/(fact(m)*fact(n-m))
- 4输出result的值
- 1定义函数fact(int n)
- 2定义局部变量i用于循环,浮点型变量product用于存放阶乘的结果,product=1
- 3i=1;i<=n;i++循环4
- 4 product=product*i;
- 5返回product的值
3.本题调试过程碰到问题及PTA提交列表情况说明
###一开始编写后提交发现部分正确,对于错误点考虑m=n/2的情况不太理解,自己改了一些不必要的地方, ###最后发现是由于自己对product的定义为整型的问题,当阶乘书数太大就不正确
二、同学代码结对互评
1.同学互评照片
2.我的代码、互评同学代码截图
林岑的代码
我的代码
3.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?如果同学代码有错的也请帮忙指出来哪里出问题
(1)我的思路是利用取余得个位的方式,先计算位数,再利用已知位数不停把个位的数乘上10的某个次方变成高位逆序,最后考虑末位0的问题
(2)林岑的思路也有用到取余得个位的方式,但是她比较巧妙的利用循环, k=k*10+m把原先个位的数跟着循环升高位,输出逆序
(3)我的代码比较容易想到与入手,容易理解,但是很繁琐,不适用,林岑的代码比较简洁,用法也很巧妙,也避开一些假设讨论,在同一个循环语句中同时达到自己想要的效果,简洁明了。
(4)我喜欢林岑的代码风格
三、截图本周题目集的PTA最后排名
四、本周学习总结
1.你学会了什么?
1.1 C语言哪些数据类型?
整型
- 有符号:int; short[ int ](范围 [-32768,32767] );long[ int ]
- 无符号(自然数):unsigned[ int ];unsigned short [ int ] (范围 [0.65535] ) ;unsigned long [ int ]
字符型
- char
- 可以用整数来表示字符 ch='A'等价于ch=65
实型
- float(有效数字7~8位)
- double(有效一般15~16)
-
数值精度和取值范围是两个不同的概念
实型常量
- 浮点表示法(实数的小数形式)
必须有小数点
- 科学计数法(实数的指数形式)
e前有数据,e后整数
1.2 字符型数据需要注意地方?
- 'a'和'A',0和'0'不同
- 整型变量和字符型变量的定义和值都可以相互交换
1.3 自增自减运算符?
- ++n的运算顺序是:先执行n=n+1,在将n的值做为表达式++n的值
- n++的运算顺序是:先将n的值做为表达式n++的值,在执行n=n+1
-
自增自减运算符的运算对象只能是变量,不能是常量或表达式。3++或++(i+j)非法
1.4 运算符优先级?
- 赋值运算符,条件表达式,与!,单目的算术运算符为右结合
- 双目的算术运算符与关系运算符,逻辑运算符与逗号运算符为左结合
1.5 C语言哪些表达式?课堂派哪里做错,做错的请在这里分析原因?
- 算术表达式, 赋值表达式,关系表达式,逻辑表达式,条件表达式,逗号表达式
自己在算时认为算aa=9,a=a-a=3-9,a=a+a=3-6
实际应为aa=9,a=a-a=3-9,a=a+a=-6-6=-12
自己在答这道题时认为‘1’与1不同,就认为不能确定,但即使是'1',字符常量之间也是有数值差量可以转化。
1.6 其他内容?
- 十进制的首位数字不能是0,八进制的首位数字必须是0,十六进制首位必须要有前缀0x或0X
- 强制类型转换
(类型名)表达式;
int(3.8)得到3 - 位运算 (二进制位运算)
符号:&,|,^,-,<<,>>
2.本周的内容,你还不会什么?
- 对于自增自减运算符的使用与计算不够熟练,容易出错
- 字符类型的使用,输出输入
- 运算符的优先级与结合性计算也易出错
- 进制之间的转换计算
- 对于一些不常用的表达式的理解不够
3.循环结构考试总结
1.哪题做错了,怎么改?
- 第二题字符的使用自己不够熟练,在定义与字母的转换增加上不熟练,自己在考试时是利用调试工具了解到A的数值65再利用字符与数值的转换关系得出正确。
现在知道应该定义char ch='A',利用ch=ch+1得到后面字母 - 第四道题二进制的计算,0的个数自己一开始思绪比较乱,编写的程序复杂也不正确,随后自己以除二的方式去考虑它的实际有效位数,再利用总的减去求得
2.考试结果满意么,怎么改进?
- 不满意
- 自己应该多接触不同的题型,锻炼自己的思维能力
- 在编写程序时要思考好再编写,减少自我混乱
- 提高自我的查错能力,尽量自己思考找出运行失误之处
3.其他总结
- 在打代码时要注意空格与换行问题,要格式准确
- 对于空格问题也可以利用Dev-C++调试看出
- 自己的预习要更透彻,课本要看仔细些