C语言博客作业--函数
2017-11-18 22:47
681 查看
一、PTA实验作业
题目1:6-4 400~499 中4出现的次数
1. 本题PTA提交列表
2. 设计思路(此处用流程图最好)
1.定义变量count存放输入数字中4的个数,循环变量i。2.如果x%4==0那么count++。
3.x=x/10,将X的末尾数字去掉好进行下一次循环.
4.返回count的值。
3.本题调试过程碰到问题及PTA提交列表情况说明。
这题看起来挺简单的,可是调试输出的值却很奇怪。解决办法:调试时发现程序直接跳过了x=x/10那条语句去执行count++,后来将这两个语句的前后位置调换一下就正确了。
题目2:6-5 使用函数输出一个整数的逆序数
1. 本题PTA提交列表
2. 设计思路(此处用流程图最好)
1.定义两个变量n表示取余后的个位数,sum表示逆序数 。2.给sum赋初值sum=0;并重复以下步骤。
3.n=number%10;取出number的个位数, sum=sum*10+n;//计算出逆序数 。
4.number=number/10;将number中已经被取余的个位数舍去,好让下一次循环时取出的个位数与上一次取出的不相同。
5.返回sum的值。
3.本题调试过程碰到问题及PTA提交列表情况说明。
1.一开始使用了课本上那道逆序数的思想,可是每次都只能逆序输出一个数,所以pta上就是显示当输入1时正确,是部分正确。用devc调试发现我的函数确实也只循环了一次就跳出循环了。
解决办法:经过调试有发现是for循环中的条件错了,可是如果继续用for循环我没办法确定循环条件,所以就改用while循环,之后就可以正常进行循环。
2.改用while循环之后确实while可以正常循环几次,但是输出的还是只有一个数。
解决办法:经过调试之后知道了return只能返回一个值,所以每次返回的数值都是最后退出循环的那个数,后来去百度以后知道可以在return之前用一个变量来存放逆序数,然后经过计算后再将整个逆序数一起用return返回。所以后来新加了一个变量sum,用sum=sum*10+n;来计算逆序数,之后就正确了。
题目3:6-6 使用函数输出水仙花数
1. 本题PTA提交列表
2. 设计思路(此处用流程图最好)
1.对于第一个函数:定义变量i,j为循环变量,digit存放将number取余得到的余数,count存放number的位数,one存放digit的count次方的值,power存放输入number的值,sum存放digit的count次方之和,flag。2.赋初值count=0;power=number
3.当number>0时,power=power/10;count++,计算出number的位数,重复以下步骤。
4.digit=power%10;power=power/10;one=pow(digit,count);sum=sum+one;计算出digit的count次方之和。
5.如果得到的sum==number,则flag=1;否则flag=0;
6.返回flag的值。
7.对于第二个函数:定义一个循环变量i
8.如果i满足第一个函数的条件,即if(narcissistic(i)==1)则输出i的值。
9,重复步骤8,直到i不在区间(m,n)内,退出循环。
3.本题调试过程碰到问题及PTA提交列表情况说明。
1.在写第二个函数PrintN打印开区间(m, n)内所有的水仙花数时,程序中的return语句一直被devc提示语法错误,无法编译运行。解决办法:刚开始我以为是我的返回变量有问题,可是不管我将return中的变量换成哪一个都无法通过运行,最后我去百度才知道要将return换成printf才可以,换了以后就可以运行了。
2.不管输入的m,n的值为多少,最后程序总是把(m,n)区间内的所有值都不加判断的全部输出
后来用devc调试发现number的值在我的第一个循环里被除成了0,无法赋值给下一个number,导致下一个循环时无法进行正常的条件判断。
解决办法:之后我用了另一个数power来代替number,刚开始在第二个循环前加上power=number但是函数没有返回值,后来在第一个循环前也加上这句赋值语句后就输出正确了。
二、同学代码结对互评
1.同学互评照片。
2.我的代码、互评同学代码截图(此处截图核心代码就好,不一定截图全部代码,图上指明是谁的代码。)
我的代码···
int factorsum( int number ){
int i,sum=0;
if(number==1)
return 1;
for(i=1;i<=number/2;i++)
if(number%i==0)//判断i是否是number的因子
sum=sum+i;//累加所有因子
if(sum==number)
return number;
return 0;
}
void PrintPN( int m, int n ){
int i,flag=0,j;
for(i=m;i<=n;i++){
if(factorsum( i )==i){//判断i是否为完数
flag=1;
printf("%d = 1",i);//每个数都有公因子1,所以直接将1当因子输出
for(j=2;j<=i/2;j++){
if(i%j==0)//判断j是否是i的因子
printf(" + %d",j);
}printf("\n");
}}
if(flag==0)//i不是完数时
printf("No perfect number");}
···
同学的代码
···
int factorsum( int number ){
int i,sum=0;
if(number==1)
return 1;
for(i=1;i<=number/2;i++)
if(number%i==0)
sum=sum+i;
if(sum==number)
return number;
return 0;
}
void PrintPN( int m, int n ){
int i,j,count;
count=0;
for(i=m;i<=n;i++)
{
if(factorsum(i) == i){
count++;
printf("%d = ",i);
if(i==1)
printf("%d\n",i);
for(j=1;j<=i/2;j++)
{
if(i%j==0&&j<i/2)
printf("%d + ",j);
if(j==i/2)
printf("%d\n",j);
}
}
}
if(count==0)
printf("No perfect number");
}
···
3.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?如果同学代码有错的也请帮忙指出来哪里出问题。
我的代码只用了两次循环而同学的用了三次循环,但是基本思路好像是差不多的。我更喜欢自己的代码,同学的代码因为循环次数多了要讨论的情况也多,这样错误率更大,而且同学的代码都没有注释,可读性差。三、截图本周题目集的PTA最后排名。
四、本周学习总结
1.你学会了什么?
1.1 C语言哪些数据类型?
整型int,短整型short[int],长整型long[int],无符号整型unsigned[int],无符号短整型unsigned short [int],无符号长整型unsigned long [int],字符型char,单精度浮点型float,双精度浮点型double。1.2 字符型数据需要注意地方?
1.整型变量和字符型变量的定义和值都可以相互交换。2.‘a'与'A'是不同字符型常量,’0‘与0是不同类型常量。
3.转义字符如 \n ,\,等虽然形式上有多个字符组成但是它只代表一个字符,它的使用方法与其他字符型常量相同。
1.3 自增自减运算符?
1.n++,++n,n--,--n都可以让n加1或者减12.++n与n++,的运算顺序不一样,++n是先执行n=n+1,然后将n的值作为表达式++n的值。n++是先将n的值作为表达式n++的值,再执行n=n+1。
3.自增运算符和自减运算符的对象都只能是变量,不能是常量或者表达式。
1.4 运算符优先级?
1.运算符优先级不同执行顺序不同,优先级越高越先执行。2.运算符优先级大致可分为初等运算符,单目运算符,算术运算符,移位运算符,关系运算符,位逻辑运算符,逻辑运算符,三目运算符。
3.运算时要注意运算符的结合方向是从左到右还是从右到左。
1.5 C语言哪些表达式?课堂派哪里做错,做错的请在这里分析原因?
表达式有算术表达式,赋值表达式,关系表达式,逻辑表达式,条件表达式,逗号表达式。课堂派上有一题(j=3;j++)那个时候预习不仔细,不知道j++与++j不相同所以就以为输出j的值是4,现在明白了。a+= a-= a*a 这题也是,不知道运算符还有执行顺序,后来用devc运行出了答案,可是不知道答案到底是怎么来的,上课老师讲解之后就明白了。
1.6 其他内容?
以前将一个负数转为正数都是用if(number<0) number=-number。现在学会了另一种方式:a=number<0?-m:m。也可以实现负数转化为正数。2.本周的内容,你还不会什么?
1.我一直觉得很奇怪,明明有记得函数里的值只能返回,并且每次都只能返回一个值,不可以输出,可是为什么水仙花数那题第二个打印某区间内所有水仙花数那个函数不可以用return返回而需要printf输出?2.n++和++n,到底是谁可以将累加的值赋给表达式,一直弄混。
400~499 中4出现的次数那题中为什么x=x/10在count++的前面时程序会直接跳过x=x/10,到现在我也不是很懂。