C语言博客作业--函数

一、PTA实验作业

题目1:6-3 使用函数判断完全平方数

本题要求实现一个判断整数是否为完全平方数的简单函数。
函数接口定义:

int IsSquare( int n );
其中n是用户传入的参数,在长整型范围内。如果n是完全平方数,则函数IsSquare必须返回1,否则返回0。

1. 本题PTA提交列表

2. 设计思路

  • 第一步:main()函数运行到:if ( IsSquare(n) ),开始调用函数 IsSquare( int n );
  • 第二步:定义变量i表示完全平方数;
  • 第三步:先考虑输入的整数n,如果n=0或n=1,均符合条件,即return 1;
  • 第四步:输入i的表达式:i=sqrt(n);
  • 第五步:如果满足:i*i==n,即为完全平方数,return 1;
  • 第六步:否则 return 0;

3.本题调试过程碰到问题及PTA提交列表情况说明

  • 本题代码虽然就几行,但在于写的时间比较长,有很多错误,一是对于函数的理解还不够深,就把主函数里面的条件搬下来运行,导致编译就已经发生错误;

  • 二是在思路上少了很多细节方面没有考虑到,比如:n=1跟n=0时的情况,导致部分正确;



  • 调试过程中发现当i==1时,不满足return 1的条件,直接跳到return 0,执行不了100的情况,变换思路,定义专门变量i,数学公式;



题目2:7-1 求组合数

本题要求编写程序,根据公式
​​算出从n个不同元素中取出m个元素(m≤n)的组合数。
建议定义和调用函数fact(n)计算n!,其中n的类型是int,函数类型是double。
输入格式:
输入在一行中给出两个正整数m和n(m≤n),以空格分隔。
输出格式:
按照格式“result = 组合数计算结果”输出。题目保证结果在double类型范围内。

1. 本题PTA提交列表

2. 设计思路

  • 第一步:函数fact( )自定义声明 ;
  • 第二步:定义变量m,n用于存放两个正整数,double result存放结果;
  • 第三步:main()函数运行到求组合数,即:result=fact(n)/(fact(m)*fact(n-m))这里时,开始调用函数fact( );
  • 第四步:进入被调用函数,重新定义新变量i:实现循环条件,double product:变量product用于存放阶乘的结果;
  • 第五步:prodct初始值为1.0,保证类型一致;
  • 第六步:进入循环,求阶乘;
  • 第七步:返回运算结果;

3.本题调试过程碰到问题及PTA提交列表情况说明

  • 编程题,一开始程序本身就存在错误,在大体注意了函数步骤后,在调用函数执行某个内容时候不能够正确写出来,我一开始思路是把fact(n)、fact(m)、fact(n-m)三个值分别用函数计算出来后再代入总组合数公式,写出来的太复杂,同学看了后指出说对函数还是不理解,没有把函数作用弄明白,函数fact( )作用就是计算阶乘:

  • 在调用函数上形参的定义上弄错,导致编译出错,本题其他基本没有大问题:

题目3:6-6 使用函数输出水仙花数

水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:
​​本题要求编写两个函数,一个判断给定整数是否水仙花数,另一个按从小到大的顺序打印出给定区间(m,n)内所有的水仙花数。
函数接口定义:

int narcissistic( int number );
void PrintN( int m, int n );
函数narcissistic判断number是否为水仙花数,是则返回1,否则返回0。
函数PrintN则打印开区间(m, n)内所有的水仙花数,每个数字占一行。题目保证100≤m≤n≤10000。

1. 本题PTA提交列表

2. 设计思路

  • 第一步:main()函数运行到:if ( narcissistic(m) ),开始调用函数int narcissistic( int number );
  • 第二步:定义变量i用于循环,count存放幂的次数,x来计算出每一位的值,sum存放各个位数之和;
  • 第三步:当n!=0时,进行求数的位数循环,得到count的值;
  • 第四步:计算count的每一个对应的明确值,用for()循环实现,并计算出总的sum之和;
  • 第五步:如果满足:i*i==n,即为完全平方数,return 1;
  • 第六步:将sum与原来给出的数相比,看是否相等,若等即满足水仙花条件,return1;否则 return0;
  • 第七步:调用void PrintN( int m, int n )函数,在满足水仙花条件下进行从从小到大的顺序打印出水仙花数;
  • 第八步:返回主函数;

3.本题调试过程碰到的问题及PTA提交列表情况说明

  • 写完程序显示编译错误,检查发现对于幂值没有进行求值,只是求了位数,修改后,在DEV-C上运行不出来,不知道原因,弄个新的正确程序上去编译运行是可以的,但对此程序还是没有解决;

  • 就自己思路上来说,写到调用第二个函数时候,不知道怎么编写,后来看同学代码懂得了得新定义变量用以循环实现(m,n)之间的一个个水仙花数;

二、同学代码结对互评

1.同学互评照片

2.我的代码、互评同学代码截图

3.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?如果同学代码有错的也请帮忙指出来哪里出问题

  • 代码量,我的相对较为复杂,把当n<0跟n>0两种情况分开写,两个人互相品评后知道是自己的代码不太简洁,当n<0的时候直接使用返回值会简便很多,而我说明我在对 return 的使用上不够;我也总喜欢多定义变量来存放东西,再代入公式什么的,这样明显不需要,这是看了她的代码后意识到的另一点;
  • 在思路上我顺着来,在理解上会更容易看懂,加上注释她没有很好的标注,可读性较差;但相对来说我会倾向喜欢她的代码,简易;
  • 她的能简便敲写代码的想法值得我再后续写程序中加以改变运用;她需要注意加注释的问题;

三、截图本周题目集的PTA最后排名

四、本周学习总结

1.你学会了什么?

1.1 C语言哪些数据类型?

  • 基本的数据类型有:整型,如:int, 长整型long[int], 短整型short[int],unsigned[int];字符型:char,浮点型:单精度float和双精度double;

1.2 字符型数据需要注意地方?

  • 注意不同类型的数据采用不同的格式控制字符,如:int型使用%d,float和double都使用%f,double输入格式控制说明必须用%lf;输出长整型在格式控制说明中 加限定词l(long首字母);
  • 不同类型的数据可以混合运算,但数据首先要转换成同一类型,再运算;
  • scanf()函数输入时候变量名前面需要加 &;

1.3 自增自减运算符?

  • 作用是使变量值加1或减1,- -n 和 n- -都相当于n= n -1,++n 和 n ++都相当于n= n+1;但是++n 是先执行n = n+1,再将n 的值赋给++n,而n++是先把n赋值给n++,再执行n = n+1;
  • 注意它们的对象只能是变量,不能是常量或表达式;

1.4 运算符优先级?

顺序由高到低 : 逻辑运算符:!;
算术(单目)运算符: ++,--,+,-,* ;
(双目):+,- ,%;
关系运算符:< ,<=,>,,>=,
逻辑运算符 :&&,
||,
条件表达式:?:;
赋值运算符:=,+=,- =,* =,/ =,%= ;
逗号运算符:,;

1.5 C语言哪些表达式?课堂派哪里做错,做错的请在这里分析原因?

  • 赋值表达式:变量 = 表达式;(若两侧的数据类型不同,将会把右侧的类型自动转换成左侧类型,再给变量进行赋值);
  • 关系表达式:它的值反映关系运算的结果,其值是 1 或 0 ,类型是整型;
  • 逻辑表达式:用逻辑运算符将关系表达式或逻辑量连接起来的式子,如:(x>=3)&&(x<=5);
  • 条件表达式:一般形式是:表达式1?表达式2:表达式3 ;
  • 逗号表达式:表达式1,表达式2,表达式3·····表达式n;
  • 课堂派里面关于整型变量相除的题目,比如课堂派第六题,x = 10 / 4,我的答案一开始是2.5,做平常的运算处理,错误;
  • 还有就是给定一些表达式求最后结果的选择题,涉及到运算符的优先顺序,对它们各自的关系不熟悉,就容易出错;

1.6 其他内容?

  • 就函数这一整章来说:懂得了使用函数能明显减少代码量,而且函数也可以方便代码重用,增强了安全性;
  • 函数定义:用以完成不同的功能,都可实现一个计算,得到明确计算结果; 函数调用:从main()函数开始,遇到函数调用主函数停止运行,先去执行相应的函数,等完成后返回主函数,继续从暂停地方开始运行; 函数声明与函数定义之间的区别:函数声明是一条C语句,可跟分号,而函数定义不行,写法顺序:函数声明 -- 函数调用 -- 函数定义;
  • 实参与形参以及它们之间的辨别区分,实参与形参一一对应,数量相同,程序运行到函数调用时实参的值依次传给形参实现参数传递;

2.本周的内容,你还不会什么?

  • 不会数据类型里面提及的二进制数转换及如何用代码表示出来;
  • 还有字母的递增方法,A,B,C ·····;
  • 对运算符的使用优先级还不熟悉,当运算符混合使用且多了后就会容易出错,类似课堂派里的一些题目就出错的很多:如:若a为int类型,且其值为3,则执行完表达式a+= a-= a*a 后,a的值是(?); 最后答案为-12;我的答案是-3;说明运算顺序出错了; 设x、y、t均为int型变量,则执行语句:x=y=3; t= ++x || ++y; 后,y的值为__,我的答案原来为4,现在觉得算出来是3,但不知道答案正不正确;

3.循环结构考试总结

1.哪题做错了,怎么改

  • 有试着写出程序的题中做错就是那道 7-4 小于m的最大的10个素数,这里面对判断素数的条件没弄清楚,在循环的那个地方会想用嵌套循环,就是想定义两个变量,
    一个循环外面m的递减,另一个进行内部判断素数;但是从这里开始就出现错误了,这样的话,for内的循环条件及循环内的代码都不知道怎么表示出来,事实上只
    需要一个大循环,完成对m的递减,然后对就是素数考虑的不够周全,导致错误,判断素数应该用 m % i==0;

2.考试结果满意么,怎么改进?

  • 对这次考试结果不满意,改进方法最好的就是多打代码,多看代码,多思考锻炼逻辑思维,遇到问题多提出求解,寻找自己学习C语言的方法跟其他人的差异,
    努力改正并试着用这个写写算法;

3.其他总结

  • 这次的上机考试跟上次情况差不多,没有太多提高,说明对这循环结构上明显存在很大问题,循环需要加强;
  • 编程能力强的人,有的人在动手敲的时候有先写写算法,这样会在编程开始后不容易卡壳,可以试试,渐渐养成写伪代码或算法的习惯;
原文地址:https://www.cnblogs.com/78tian/p/7828978.html