C语言博客作业--函数
一、PTA实验作业
题目1:使用函数输出一个整数的逆序数
1. 本题PTA提交列表
2. 设计思路
reverse函数(int number):
1.int n,i,number1,number2=0//n控制第一个循环,i控制第二个循环,number1存放number数据来,number2来存放逆序数
2.number1 = number//把数字赋值给number1求number的位数,避免改变number的值
3.for n=1 to number1!=0 执行4.
4.n++;number1=number1/10;
5.while number%10=0时执行6.7.
6.if number==0 break;//考虑输入0时进入死循环
7.number=number/10;n--;//若个位为零先丢掉个位
8.for i=1 to i<=n执行9.10.11
9.int unit;
10.unit=number/pow(10,(i-1))//逐步丢掉个位
11.number2=unit%10*pow(10,n-i-1) +number2;//累加算出逆序数
12.return number2;
3.本题调试过程碰到问题及PTA提交列表情况说明。
- 在提交前有遇到计算数字位数不正确的问题 解决办法:在算位数的循环里输出了n的值用于找错,最后发现是结束条件应该为number1!=0;
- 提交后未满分提示输入0时错误 解决办法:在丢个位的步骤七循环中写一个条件判断number==0时break跳出该语句。
题目2:使用函数输出指定范围内的完数
1. 本题PTA提交列表
2. 设计思路
factorsum函数(int number):
1.int i,sum=0;//i控制循环 sum来把每个因子累加
2.if (number==1) return 1//先把特殊情况1列出去
3.else 执行4.5.
4for i=1 to i<=(number/2) i++//逐个求number因子
5. if ((number/i)==(double)number/i) sum=sum+i;
6.return sum;
PrintPN函数(int m;int n):
1.int i,k,y=0;//i控制第一层循环(找到区间内的完数),k控制第二层循环 y=0来标记是否有完数产生
2.for i=m to i<=n i++{
3. if (factorsum(i)==i){
4.y=1;//有完数产生就改变y的值
5.printf("%d =",i);
6.if (i==1) {printf(" %d",i);printf("\n");}//1时的特殊情况
7.else{
8.for k=1 to k<(i/2) k++){//将该完数分解
9.if (k==1) printf(" %d ",k);
10.else if (i/k==(double)i/k) printf("+ %d ",k);}
11.printf("+ %d",i/2);
12.printf("\n");
}
}
}
}
3.if (y==0) printf("No perfect number") ;
3.本题调试过程碰到问题及PTA提交列表情况说明。
- 多种错误中首先是没考虑无完数的情况 解决办法:用开头定义一个y=0;中间如果产生一个完数就赋值y=1来实现。
题目3:求组合数
1. 本题PTA提交列表
2. 设计思路
- 定义整型变量n,m(n<=n)
- 输入n,m
- 输出 result的值,result=fact(m)/(fact(n)*fact(m-n))
- 定义浮点型函数fact(double n)
- 定义浮点型变量i,result,i控制变量,result用来存放累乘的值
- 返回result的值。
3.本题调试过程碰到问题及PTA提交列表情况说明。
- 数据类型不符 解决办法:同学提醒把函数类型改为double
二、同学代码结对互评
1.同学互评照片。
2.我的代码、互评同学代码截图
3.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?如果同学代码有错的也请帮忙指出来哪里出问题。
- 不同:
刘博涵的函数是直接将m,n带到一个函数中进行组合数的总运算,而我的函数是只进行累乘的运算再在输出里面用公式fact(m)/(fact(n)*fact(m-n)输出结果 - 优势:
刘博涵同学代码在输出部分就不需要在进行运算了,而我的还需要进行。
我的代码比较简洁,函数内进行的运算比较简单 - 更喜欢自己的代码,因为总体看起来简洁,同时也没有那么多循环,更易懂。
三、截图本周题目集的PTA最后排名。
四、本周学习总结
1.你学会了什么?
1.1 C语言哪些数据类型?
整型、字符型、实型
1.2 字符型数据需要注意地方?
- 输入输出均不同
- 要注意在scanf输入的语句中空格的加入可能会被字符型数据拾取
- 单引号‘’的运用
1.3 自增自减运算符?
- a=++n 表示n=n+1 a=n
- a=n++ 表示a=n n=n+1
- a=--n 表示n=n-1 a=n
- a=n-- 表示a=n n=n-1
1.4 运算符优先级?
从高到低排列:逻辑运算符、算术运算符、关系运算符、逻辑运算符、条件表达式、赋值运算符、逗号运算符
1.5 C语言哪些表达式?课堂派哪里做错,做错的请在这里分析原因?
- 算术表达式、赋值表达式、关系表达式、逻辑表达式、条件表达式
- 第二题下列程序段输出结果为 __。
int x=1, y=012;
printf(“%d”,y*x++);
错选24 正确10 原因:不知道y=012是八进制的表达 也不知道单独的x++的值
第四题表达式8>6>3的值是
错选1 正确0 原因:不知道(8>6)=1 然后(1>3)=o
2.本周的内容,你还不会什么?
- 优先级还需要再巩固
- 进制间的转换需要再学习
- 位运算符不懂
3.循环结构考试总结
1.哪题做错了,怎么改?
第四题错了 第五题没做。
负数部分答案错误 应该在之前判断是否为负数,若为负数输出0。
2.考试结果满意么,怎么改进?
不满意,应该多学习满分同学,提高自己的编程量。此次考试会做的都是一遍就能写出来(前三题),用时也较少,但就是不会做的后两题毫无头绪,导致一直到最后提交时间也没有能做出来,最后一题甚至连思路都没有,还是自己不能完成题目的要求。