C语言函数作业
一、PTA实验作业
题目1:6-5 使用函数输出一个整数的逆序数
1. 本题PTA提交列表
2. 设计思路
- 1、定义flag(用来储存number的每一位数);n(用来避免number为负数的情况);result(存放转为逆序数后的结果)
- 2、如果number=0,结果直接返回0
- 3、如果number小于0,n= - number;否则,n=number
- 4、当n大于0时,result=result*10(乘以10以便下一步将独立出来的flag加上去);flag=n%10(将n的每一位独立出来);result=result+flag(依次累加转换出逆序数);n=n/10(n退一位以便进行下一步计算)
- 5、当n小于0时,退出循环
- 6、如果number小于0,result= - result;否则,result=result
- 7、结果返回result
3.本题调试过程碰到问题及PTA提交列表情况说明。
- 1、
第一次做的时候没有考虑number为负数的情况,输入题目样例后发现错误,才把number为负数的情况加进去
- 2、
第二次忘了number为负数,输出的result也应该是个负数,在最后面加上判断(如果number为负则result转为负,否则不变)
题目2:6-6 使用函数输出水仙花数
1. 本题PTA提交列表!
2. 设计思路
- 一、判断水仙花数的函数
- 1、定义sum=0(储存输入数据每一位数的幂的和);flag(将输入数据每一位数独立出来);count=0(计算输入数据的位数);n(此函数内用到两次循环,第一次循环会对输入数据产生影响,所以要用一个中间数据来过渡)
- 2、令n=number
- 3、当n大于零时,n=n/10,count++(计算number位数)
- 4、再次将number的值赋给n
- 5、当n大于零时,flag=n%10(拿出number的每一位数);sum=sum+pow(flag,count)(累加number每一位数的幂的和);n=n/10(n后退一位)
- 6、如果sum=number,结果返回1(真),否则,返回0(假)
- 二、打印m到n间(不包括m和n)所有水仙花数
- 1、定义i
- 2、for(i=m+1;i<n;i++) , f(narcissistic(i)) ;printf("%d\n",i) (运用上面的函数判断i是不是水仙花数,是就输出)
3.本题调试过程碰到问题及PTA提交列表情况说明。
-1、
第一次做没有用n来过渡,导致number在第一次循环结束后值变了,无法进入第二次循环
- 2、还有一个小失误,那就是没有注意到题目说的开区间(m,n),所以第二个函数我一开始是包括m和n的,如果m或n是水仙花数的话就与题意不符合了,多亏同学提醒发现错误
题目3:7-1 求组合数
1. 本题PTA提交列表!
2. 设计思路
- 1、定义m和n
- 2、输入m和n
- 3、输出结果,其中调用函数fact()来计算阶乘
- 4、定义函数double fact (int n)
- 5、定义sum=1.0
- 6、for(int i=1;i<=n;i++),sum累乘以i
- 7、结果返回sum
3.本题调试过程碰到问题及PTA提交列表情况说明。
- 1、这题很简单,但我在函数定义中的sum一开始忘了给初值,导致结果出错
- 2、一开始定义sum的时候定义成int类型了= =
二、同学代码结对互评
1.我的代码、互评同学代码截图
- 我的代码
- 佳亮同学代码
int factorsum( int number ){
int i,sum=0;
if(number==1)return 1;
for(i=1;i<=number-1;i++){
if(number%i==0)sum=sum+i;
}
return sum;
}
void PrintPN( int m, int n ){
int k,q,flag=0;
for(k=m;k<=n;k++){
if(factorsum(k)==k){
printf("%d = 1",k);
for(q=2;q<=k-1;q++){
if(k%q==0)printf(" + %d",q);
}
putchar('\n');
flag=1;
}
}
if(flag==0)printf("No perfect number");
}
2.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?
- 1、我们的主要区别在第一个函数,第一个函数我的sum=1,直接进入循环;佳亮同学sum=0,要判断是不是1再进入循环
- 2、我觉得我的第一个函数的代码会比较好,它可以少一步判断,如果sum=1,不进入循环直接返回sum的值
- 3、还有,循环条件其实不用到number-1,因为一个数不可能被比它的二分之一大的数整除(本身除外),所以循环条件到达number/2即可
三、截图本周题目集的PTA最后排名。
四、本周学习总结
1.你学会了什么?
- 1、学会了函数的使用以及数据类型的一些细节知识,尤其是自增自减运算符和优先级的相关知识(没上课前对此不是很理解,运用也不熟练)
- 2、字符型变量可以与整型变量互换,例如将大写字母换成小写,只需ch(假设这个变量名为ch)-‘A’+‘a’即可
- 3、自增自减的前缀后缀区别很大,例如m=n++;得到的m值为原来n的值,而n此时的值为原值+1
- 4、运算符有优先级之分,优先级高先计算,同级运算符有左右哪边先结合之分
- 5、C语言有算术表达式,赋值表达式,关系表达式,逻辑表达式,条件表达式,逗号表达,位运算以及其他运算;课堂派上第五题做错了,那只是一个简单的计算,但是我没注意到他要的是值
- 6、本周上机考试,遇到了行末不要有空格的题目,对于这种题目,一开始我并不知道怎么让行末没有空格,后来经过思考,我发现可以引入一个变量,用来判断输出的数,如果输出的是最后一个数,
那么就只输出数不要空格
2.本周的内容,你还不会什么?
- 1、感觉对于题目有时会把它想得很复杂,导致没有思路,例如上机考试第四题前导零,我以为要把输入的数转成二进制才能去判断,但不会转换,所以完全没有思路;后来舍友告诉我,完全不需要这么做,再经过老师对数据类型的课的讲解后,我觉得我的确想太多了- -
3.循环结构考试总结
1、哪题做错了,怎么改?
- 1、第四题,这题如上面所讲,完全是想太多= =
- 2、第五题,没有处理好题目输出要求中的行末不能有空格,处理方法如上面所讲引入变量判断要不要空格
2.考试结果满意么,怎么改进?
- 不满意,第四题题目理解不到位,很失望;最关键的还是最后一题,原本有时间处理完的,但是前三题多多少少有些小失误耽误了时间,拖延了我做题速度,这点很郁闷,或许要避免小失误的发生就得多打代码把!
3.其他总结。
- 要想做得更好,要多多练习!!!
- 舍友都比我厉害,可以向他们请教(两个100的都是舍友= =)!!!