C语言博客作业--函数
一、PTA实验作业
题目1. 使用函数输出水仙花数
1. 本题PTA提交列表
2. 设计思路
一、narcissistic( )函数
- 第一步:定义整型变量 count=0,i,t,h,s,sum=0;sum用于计算每个数的因数和,count用于计算输入number的位数
- 第二步:令h=numberh=h/10,count加一,直到h=0
- 第三步:s=1h=h/10,count加一,直到h=0
- 第四步:令h=number
- 第五步:令t=h%10; ;进行循环for(i=1;i<=count;i++){s=s*t;},sum=sum+s,h=h/10
- 第六步,重复步骤五,直到h=0
- 第六步:如果sum=number,返回1,否则,返回0
二、void PrintN( )函数
- 第一步:定义循环变量 j
- for(j=m+1;j<n;j++) {
if(narcissistic(j))如果满足第一个函数,即如果j为水仙花数,输出j
3.本题调试过程碰到问题及PTA提交列表情况说明。
发现没有输出后面的水仙花数,然后调试也没有发现什么问题,我就一直看程序,发现sum没有初始化,将sum=0,再运行一下答案就对了。后来我发现调试没有发现问题是因为,题目中给的范围是153到400.我调试了一下发现153这个数字经过第一个函数之后就开始154经过第二个循环,我觉得要循环两百多次就没有继续,没有发现是没有将第一个函数开始的时候sum赋值为0,那么153后面测试的数字就当然不可能实现sum==number,所以运行时就只有第一个数字输出来了。
题目2. 使用函数输出指定范围内的完数
1. 本题PTA提交列表
2. 设计思路
一、int factorsum( int number )函数
- i定义整型变量 i,sum=0;
if(number1)返回 1 到主函数;
循环for(i=1;i<number;i++){
if(number除以 i 等于0){
sum=sum+i;加上约数 i}
}
循环结束后判断 if(sumnumber)返回number的值;
否则返回 0;
二、void PrintPN( int m, int n )函数
{
定义整型变量 t , j , flag=0;
进行循环for(t=m;t<=n;t++) {
调用第一个函数if (factorsum(t)等于t ){
令flag=1; 输出 t,输出1
进行循环for(j=2;j<t;j++){
if( t 能够被 j 整除) 输出+ j
}
结束循环后,换行
if(flag不等于1) 输出No perfect number
3.本题调试过程碰到问题及PTA提交列表情况说明。
- 开始的时候是输出的%d+ 导致分解之后最后面多了一个加号,后来思考了好久修改为+%d,因为每一个数的分解都有1就在最前面输出了1,这样就解决了加号的问题,可是提交还是一分,运行出下图结果
不管是不是完数后面都跟上了No perfect number,一直改不对,也是没有想过会返回错值,题目要求
可是我返回是,是完数就返回1,不是完数就返回0,如果是1也返回1,重新审题后,把
if(factorsum(t)1)改成了if(factorsum(t)t)就答案正确了。
题目3. 求组合数
1. 本题PTA提交列表
2. 设计思路
一、主函数
- 第一步:定义m , n
- 第二步:输入m,n
- 第三步:调用fact函数,计算fact(n)/(fact(m)*fact(n-m),输出结果并四舍五入到整数位
二、fact()函数
- 定义整型变量 i ,浮点型变量t=1.0
循环for(i=1;i<=n;i++)
累乘 t = t * i 得到 t 的阶乘
返回 t
3.本题调试过程碰到问题及PTA提交列表情况说明。
开始真的是傻傻的以为可以放在一起运算,完全摸不着头脑
后来改成了printf("result = %.0f",fact(n)/(fact(m)*fact(n-m)));但是下面我写了double fact(int n),double fact(int m),double fact(int n,int m)分别计算,最后问了一下同学这道题的思路,就把三个fact()改成一个就正确了。
二、同学代码结对互评
1.同学互评照片。
2.我的代码、互评同学代码截图
梁才玉的代码
我的代码
3.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?
- 不同:(1)才玉的计算了数字的位数之后才计算,我的是先判断数字的正负才开始进行计算的
(2)循环方面,才玉用do-while语句,饿直接用的while语句
(3)计算方面,才玉用的是幂次方,并且每循环一次指数count减去 1 ,我用的累乘,累加。 - 我更喜欢我的代码。
三、截图本周题目集的PTA最后排名。
PTA排名
提交列表截图
四、本周学习总结
1.你学会了什么?
1.1 C语言哪些数据类型?
1.2 字符型数据需要注意地方?
- %c也会吸收空格和回车,输入时要注意。输入数据间用空格还是逗号要和scanf函数里的控制格式一致。
- getchar()和putchar()一次只能吸收一个字符
- 单个字符用%c,字符串用%s,同时字符串不能加&符号。
1.3 自增自减运算符?
- n++的值为n原来的值,但是n的值已经在原来的值上加了1; ++n的值为原来n的值加上1的值,n的值也已经在原来的值上加了1
- n--的值为n原来的值,但是n的值已经在原来的值上减掉了1; --n的值为原来n的值减掉1的值,n的值也已经在原来的值上减掉了1
1.4 运算符优先级?
1.5 C语言哪些表达式?课堂派哪里做错,做错的请在这里分析原因?
- 算术表达式,赋值表达式,逗号表达式,关系表达式,逻辑表达式。
- 课堂派
这一题原来不清楚一个浮点型和一个整型要按照哪一边的,感觉应该是浮点型的,但是打出来运行之后答案是2,我就深信不疑了,后来答案错误之后才发现double x了,但是输出的时候用了%d,以前好几次也是这样,这次真的是要记住了!
这道题错是因为我对符号的优先级还不太懂,然后当时对进制也不会,不知道0x是十六进制的,但是后来上课完就理清了。
2. 本周的内容,你还不会什么?
- 感觉自己对函数的变量的使用还不会,形参实参经常搞乱,最开始还以为一个函数有3个不同的形参就要写三次一样的函数,不一样的形参
- 对位运算还不是很懂
3. 循环结构考试总结
3.1. 哪题做错了,怎么改?
前面两题20分钟就写完了,一直在写这题,判断素数的地方总感觉自己不对,心里没底,因为原来如果有素数判断都是翻书的,印象不够深刻。判断了之后运行一直没有输出,当时电脑上的devc++是调试不了的,我就一直盯着看,没有输出,所以我就改括号的位置,改了好久,还是运行不出来,提交PTA也不对,一直耗在那里,后来在最后几分钟的时候,突然间意识到素数是从2开始算的,吧i=1改成了i=2就对了。
3.2. 考试结果满意么,怎么改进?
- 不满意。感觉还是不够细心吧,就括号和赋初始值的问题,耗了那么久,导致后面两题才写一点就结束考试了。还是要细心一点,合理安排做题时间,还有就是要充分吸收平时作业 里的解题方法和思路,这样考试的时候就快得多了。