C语言博客作业--函数
一、PTA实验作业
题目1:使用函数输出一个整数的逆序数
1. 本题PTA提交列表
2. 设计思路
- 第一步:定义函数与形参即int reverse(int number)
- 第二步:定义变量 int x,result=0;
- 第三步:当number不等于0的时候,循环第四步到第七步。
- 第四步:x=number%10
- 第五步:当number大于10或者小于-10时,result=(result+x)*10
- 第六步:否则 result=result+x
- 第七步:number=number/10
- 第八步:返回result
3.本题调试过程碰到问题及PTA提交列表情况说明
- (1)虽然提交列表全对,但我在devc++中调试过,一开始我忘记判断number大于10或者小于-10,导致输出的逆序数会多一个0,即变成正确答案乘10,原因就是在逆序数的最后一位,我也是result=(result+x)*10,通过调试后发现问题,添加判断if(number>10||number<-10)答案正确
题目2:求组合数
1.本题PTA提交列表
2.设计思路
- 第一步:声明fact函数 double fact(int n);
- 第二步:定义变量 int m,n; double result;
- 第三步:输入m,n
- 第四步:调用fcat函数 result=fact(n)/(fact(m)*fact(n-m)),进入第六步
- 第五步:printf("result = %.0f",result)
- 第六步:定义函数double fact(int n)
- 第七步:定义变量int i;double result=1;
- 第八步:进入循环for(i=1;i<=n;i++) 循环第九步
- 第九步:result=result*i
- 第十步:返回result的值
3.本题调试过程碰到问题及PTA提交列表情况说明
- (1)一开始错误,输入 2 7时答案等于0.000000,通过调试,监控result,发现result参数定义错误,定义成了int,因为在fact函数中同名变量result它只是整数,而在主函数中它是double型的导致错误。
- (2)阶乘忘记给result初始化为1,导致输出结果为0
题目3:使用函数验证哥德巴赫猜想
1.本题PTA提交列表
2.设计思路
- 第一步:定义prime函数及形参即int prime(int p)
- 第二步:定义变量并初始化 int i,n;n=sqrt(p);
- 第三步:如果p为1,则返回0;
- 第四步:否则进入循环for(i=2;i<=n;i++)循环第四步
- 第五步:如果p能整除i,则返回0
- 第六步:return 1
- 第七步:定义Goldbach函数即void Goldbach(int n)
- 第八步:定义变量int q,p
- 第九步:进入循环for(p=2;p<=n;p++)循环第十步和第十一步
- 第十步:if(prime(p)==1),则q=n-p;
- 第十一步:if(prime(q)==1) 则printf("%d=%d+%d",n,p,q)并退出循环
3.本题调试过程碰到问题及PTA提交列表情况说明
- (1)输出许多形式为n=q+p的结果,通过调试监控n,p,q发现循环没有在输出一次数据后结束,在if里输出后添了一句break就正确了
- (2)忘记判断p是否为1,如果为1直接就不为素数
- (3)一开始Goldbach函数中for(q=1;q<=n;q++),q一开始初始化为1,但1显然不为素数导致错误
二、同学代码结对互评
1.同学互评照片
2.我的代码、互评同学代码截图
3.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?如果同学代码有错的也请帮忙指出来哪里出问题
- 思路不同
在判断Fibonacci数时,他和我使用了不同的方法,我是通过规律直接求出Fibonacci数,而他只能求出第二项之后的Fibonacci数,所以他在代码里直接添加了第一项的Fibonacci数在输出m到n区间内的Fibonacci数时,他用了嵌套循环,循环m到n间的每个数,判断它是不是Fibonacci数,是的话就输出。而我是先计算小于m的那个Fibonacci数,当Fibonacci数大于m小于n的时候就输出,我只用了一个while循环,他用了for的嵌套循环. - 喜好
我更喜欢我的代码,在判断Fibonacci数时我的做法更具有规律性和逻辑性,他是取巧,并且我的变量也比他少,更简洁。在输出m到n区间内的Fibonacci数时,他用两个循环我用一个,所以我的代码比较简洁易懂,不会看乱。
三、截图本周题目集的PTA最后排名
四、本周学习总结
1.你学会了什么?
1.1 C语言哪些数据类型?
有int型,float型,double型,char型,short型,long型,undesigned型,longlong型。
1.2 字符型数据需要注意地方?
要注意字符型数据只能保存一个字符,有的时候先输入一个数,再输入一个字符型数据很可能不成功,因为字符型数据很可能已经被保存为回车。
1.3 自增自减运算符?
n++,n的值加了1,但n++的值与原来的n相等。++n,n的值加了1,++n的值与现在的n相等。
n--,n的值减了1,但n--的值与原来的n相等。--n,n的值减了1,--n的值与现在的n相等。
1.4 运算符优先级?
其他内容
上周预习了函数,本周正式学习了函数,函数先声明再调用。声明格式 函数类型 函数名(形式参数表); 要记住函数声明是句c语言句子,所以结尾加;号。函数定义为函数类型 函数名(形式参数表){函数表现形式}。函数的用处就是1:函数是对数据的处理,不同函数有不同的功能,需要该功能时直接调用该函数,不用每次都堆叠一大堆的代码。2:函数可以把不同功能的代码独立到一个地方,减少耦合性,提高代码可重用性,增强程序的安全。3:函数可以方便代码重用,一个好的函数名可以让人一眼就知道这个函数实现的是什么功能,方便维护。
2.本周的内容,你还不会什么?
对于数据类型的了解还不够深刻,比如合法标识符的判定还没有完全记下来,还有许多关系式组合成的表达式,还是有点不太理解,还有位的运算,还有点不太理解。
3.循环结构考试总结
对于循环结构考试,我感到很难过,因为第一次上机考试我完成了,而第二次卡在了最后一题上,直到最后都没做出来,看到一班的那个同学只用了一半多一点的时间都完成了,而我最后都没完成,感到很受打击。我觉得我没完成的原因在于对于基础掌握的不够深刻,以及审题不够认真。比如素数的判断消耗了我一些时间,我认为这是很基础的,应该很快就做完,而判断二进制数前导0的个数的那道题,我在想负数这个情况时,想当然的认为二进制负数前导0的个数就是二进制正数前导0的数量减1,但其实负数由于第一位即符号位为1,它前导0的个数应该是0,导致我消耗了了蛮久时间在这题上。至于最后一题判断单词长度,我认为是一开始我边做边想,而不是有思路了再写,导致总是写着写着发现一些不对,然后增添或者删减代码进去,最后的结果就是导致这一题的代码连自己都看的不太懂,很复杂,而自己的心态也越来越乱,导致没做出来。