一、PTA实验作业
题目1. 使用函数判断完全平方数
1. 本题PTA提交列表(要提交列表,不是结果)
2. 设计思路(此处用流程图最好)
1.主函数
- (1)定义变量n存放用户传入的参数
- (2)输入数据n
- (3)调用函数IsSquare(n)
- (4)如果 ( IsSquare(n) ) ,输出"YES\n"
- (5)否则,输出"NO\n"
2.IsSquare函数
- (1)定义循环变量i=0
- (2)如果i*i==n,返回1
- (3)i++
- (4)循环2,3,直到不满足i<=n
- (5)否则,返回0
3.本题调试过程碰到问题及解决办法
①判断n是否为完全平方数时使用sqrt( )的方法,devc提示错误
②换一种方法,使用for循环的方法,n为100时,输出为No,经过调试发现问题
③为了防止else语句影响if语句,把else语句移到循环外,devc提示else语句缺少与之匹配的if语句,于是想到去掉else效果也是一样的
④PTA提示缺少n=0和n=1的考虑,于是修改代码,发现0也为完全平方数(涨知识!!!!!)
题目2. 使用函数输出水仙花数
1. 本题PTA提交列表(要提交列表,不是结果)
2. 设计思路(此处用流程图最好)
1.主函数
- (1)定义变量m,n
- (2)输入数据m,n
- (3)调用narcissistic函数,如果narcissistic(m),输出("%d is a narcissistic number\n", m)
- (4)调用PrintN函数,输出(m,n)内的水仙花数
- (5)调用narcissistic函数,如果narcissistic(n),输出("%d is a narcissistic number\n", n)
2.narcissistic函数
- (1)bit存放个位数字,i存放指数,item存放每个位上数字的N次幂,sum存放水仙花数 ,N存放位数
- (2)定义number1=number,number2=number,赋值N=0,sum=0
- (3)判断数字为几位数(N):
当number1!=0时,循环number1=number1/10;N++ - (4)计算每个位上的数字的N次幂之和:
当number2!=0时,循环
bit=number2%10(取个位数字 )
item=pow(bit,N)(计算个位数字的N次幂 )
number2=number2/10;
sum=sum+item;(累加个位数字的N次幂 ) - (5)如果number==sum,返回1
- (6)否则,返回0
3.PrintN函数
- (1)m++
- (2)循环:当m<=n时,调用narcissistic函数,如果narcissistic(m)==1,输出m;m++
3.本题调试过程碰到问题及解决办法
本题初步代码如下
①经过第一个while语句判断数字位数N后,number的值变为0,因此无法进入第二个while语句。
②再定义一个number1=number,用number1进行第一个while语句判断数字位数N,此时进入第二个while语句时number=153。第二个while语句结束后,进入if语句,发现与第一个问题一样,经过第二个循环后number=0,sum=153,number≠sum,此处错误。
改正后代码如下
③if语句中用break跳出循环,调试时发现一直在循环,没有输出内容,于是改成printf使m可以输出,但输出时发现多了一个153。
④思考多了一个153,是否与循环中赋值m=100有关,但一时不清楚m的值应该怎么改,于是改为while语句,改完后发现答案中还是多了153。
⑤再次理解题目,发现m的值不应该从100开始而是从输入的m开始,且范围为开区间,因此m应从m=m+1开始。
题目3.求组合数
1. 本题PTA提交列表(要提交列表,不是结果)
2. 设计思路(此处用流程图最好)
1.主函数
- (1)定义整型变量m,n分别存放两个正整数,浮点型变量result存放结果
- (2)输入数据m,n
- (3)调用函数fact(n),result=fact(n)/(fact(m)*fact(n-m));
- (4)输出result = 组合数计算结果
2.fact函数
- (1)定义变量i为循环变量,result为结果
- (2)赋值result=1,i=1
- (3)result=result*i
- (4)i++
- (5)重复3,4,直到不满足i<=n
- (6)返回result的值
3.本题调试过程碰到问题及解决办法
①result类型为double型,但是没有控制小数个数导致错误
改正后
二、同学代码结对互评
1.互评同学名称
戴洁
2.我的代码、互评同学代码截图
我的代码
int factorsum( int number )
{
int sum=1,i;
for(i=2;i<number;i++){
if(number%i==0)//如果number能被一个数整除
sum=sum+i;//累加完数因子
}
return sum;//返回完数
}
void PrintPN( int m, int n )
{
int i,j,number,count=0;
if(m==1&&n==1) {//如果m=n=1
printf("1 = 1\n");
return ;}
for(i=m;i>=m&&i<=n;i++){
if ( factorsum(i) == i ){//如果i为完数
if(i==1) printf("1 = 1\n");//i为1时
else printf("%d =",i); //i不为1时
count++;
for(j=1;j<i;j++){
if(i%j==0){//如果j为完数因子
printf(" %d",j);//输出j
if(j==i/2) printf("\n");//如果j为完数的二分之一,输出回车
else printf(" +");//否则输出“ +”
}
}
}
}
if(count==0)//如果给定区间内没有完数
printf("No perfect number");
}
同学的代码
int factorsum( int number ){
int number1,k;
int sum = 0;
number1=number;
if(number1==1){
sum=1;
return sum;
}
for(k=1;k<number1;k++){
if(number1%k==0){
sum=sum+k;
}
}
if(sum==number)
return sum;
}
void PrintPN( int m, int n ){
int number2;
int q;
int x=0;
for(number2=m;number2<=n;number2++){
if(number2==1){
printf("1 = 1\n");
x++;
}
if(number2>1){
if(factorsum(number2)==number2){
x++;
printf("%d = 1",number2);
for(q=2;q<number2;q++){
if(number2%q==0)
printf(" + %d",q);
}
printf("\n");
}
}
}
if(x==0){
printf("No perfect number");
}
}
3.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?如果同学代码有错的也请帮忙指出来哪里出问题。
不同:
①factorsum函数中,我的代码是定义sum=1,让循环直接从i=2开始,如果i=1则不进入循环直接返回sum的值。戴洁同学是另外定义一个number1=number,先判断如果number1=1,让sum=1,返回sum,再通过循环找出完数sum,如果sum=number,返回sum。
②PrintPN函数中,输出表达式的部分我的代码是先判断如果i是完数先输出“i=”,再循环判断 j 如果是完数因子输出 j ,如果 j= i / 2,输出回车,否则输出“+”;戴洁的代码是先判断如果一个数是完数就先输出number2=1,再循环判断如果q是完数因子,就输出+q,否则输出回车。
各自优势:
①factorsum函数中,相同效果下我的代码比较简洁,戴洁的代码显得有点繁琐,我更喜欢我的代码。
②PrintPN函数中,在输出表达式的部分戴洁同学的代码更清晰简洁,我更喜欢她的代码。
三、截图本周题目集的PTA最后排名
PTA排名
PTA提交列表
四、本周学习总结
1.你学会了什么?
1.1 C语言哪些数据类型?
- 整型:
[有符号]整型——int
[有符号]短整型——short [int]
[有符号]长整型——long [int]
无符号整型——unsigned [int]
无符号短整型——unsigned short [int]
无符号长整型——unsigned long [int] - 字符型:字符型——char
- 实型(浮点型):
单精度浮点型——float
双精度浮点型——double
1.2 字符型数据需要注意地方?
- C语言中字符不但可以写成字符常量的形式,还可以用相应的ASCII码表示。例如:设ch是字符常量,字符型常量A的ASCII码值是65,则ch='A'和ch=65等价
- 转义字符形式上由多个字符组成,但它是字符常量,只代表一个字符
- ASCII字符集中多有的字符都可以用转义字符表示。例如:\102表示ASCII码是八进制数102的字符,即字母'B'
1.3 自增自减运算符?
++n(--n)的运算顺序:先执行n=n+1(n=n-1),再将n的值作为表达式++n(--n)的值
n++(n--)的运算顺序:先将n的值作为表达式n++(n--)的值,再执行n=n+1(n=n-1)
注:自增自减运算符的运算对象只能是变量,不能是常量或表达式。
1.4 运算符优先级?
优先级从高到低:
逻辑运算符:
!
算数运算符:
++ -- + - *(单目)
* / %(双目)
+ -(双目)
关系运算符:
< <= > >=
== !=
逻辑运算符:
&&
||
条件运算符:
?:
赋值运算符:
= += -= *= /= %=
逗号运算符:
,
1.5 C语言哪些表达式?课堂派哪里做错,做错的请在这里分析原因?
表达式
- 算术表达式
- 赋值表达式:
简单形式:变量=表达式
一般形式:变量 赋值运算符 表达式 - 关系表达式
- 逻辑表达式
- 条件表达式:
一般形式:表达式 1 ? 表达式2 : 表达式 3 - 逗号表达式:
一般形式:表达式 1 ,表达式 2 ,…,表达式 n
课堂派
x++是将x的值作为表达式x++的值,因此y * x++应该为10 * 1
1.6 其他内容?
①转义字符中\ddd是13位八进制整数多代表的字符,\xhh是12位十六进制整数所代表的字符。例如:\x41表示ASCII码是十六进制数41的字符,即字母'A'。
②十进制整数由正、负号和09组成,首位数字不能是0;八进制整数由正、负号和07组成,首位数字必须是0;十六进制数整数由正、负号和09、af或A~F组成,首位数字前必须有前缀0x或0X。
③判断整数的类型,后缀 l 或 L 表示long型常量;后缀 u 或 U 表示unsigned型常量;后缀 l 和 u 或 L 和 U表示unsigned long型常量。
④整数类型格式控制说明
2.本周的内容,你还不会什么?
①本周内容主要是一些需要记和理解的知识点,还需要多应用并记住,比如运算符的优先级和结合性以及各种数据类型对应的输入输出形式
②自动类型转换,强制类型转换以及位运算部分还不是很熟悉。
3.循环结构考试总结(全部同学都要写)
1.哪题做错了,怎么改?
最后一题“单词长度”没有做出来。
2.考试结果满意么,怎么改进?
不满意。
① 二进制一题因为对此知识点不是很熟悉所以花了较长的时间。课后对于还不熟悉的知识点还得再多次复习。
②单词长度一题没有做出来。
3.其它总结。
①考试时电脑上devc的调试需要建工程,因为不知道如何建工程且对使用printf语句检查错误点不熟悉,因此考试时查错都是通过自己看找错,耽误时间。于是考后向同学了解的建工程的方法。
②对于没有做出来的题目,目前还没再次拿出来做一遍,会尽快再做一遍。对于调试了很多次才对的题目,我认为应该记住错误点过一段时间把题目拿出来再做一遍看是否对该题的解法能做到真正的理解。