0.展示PTA总分



1.本章学习总结

1.1学习内容总结

1.首先,我学到的是代码的一些基础的组成结构。比如说:编译预处理命令#include<stdio.h>,变量定义输入输出函数数学函数等等。

  • 编译预处理命令:在调用库函数时,必须用#include命令将相应的头文件包含到源程序中。到目前为止,我们用的最多的是stdio.h,因为基本上都会用到输入输出,偶尔用到数学函数就需要math.h,课堂上拓展了一个随机数,涉及到stdlib.h,另提到了获取时间时需要用到的time.h。
  • 变量、常量的定义
    int用于定义整形变量,char用于定义字符型变量,floatdouble用于定义浮点型变量,前者是单精度浮点型,后者是双精度浮点型,主要区别.是后者可用于存放更大的数。
    变量定义很重要,它决定的是性质,如果定义错了,就等于从源头上出错了。需要注意的是,整形变量的四则运算得到的结果只能是整数。.如int a=1/3*3;原本它得到的应该是1,但由于它的类型是整形,电脑按顺序计算1/3会得到0,再将0*3赋给a,得到的结果就是0。正确的做法是把a定义为浮点型变量,或者把分子改写成1.0。(后一种做法的根据是,系统在计算不同类型的数据时,会自动进行类型转换,使他们具有相同的类型,然后再运算)
  • 输出函数printf("")在使用时,输出的内容是双引号内的内容。要注意的是,输出时用到的格式控制说明需要与变量类型相对应,如整形用%d,浮点型用%f,字符型用%c。
  • 输入函数scanf("")使用时要避免出现普通字符,以免出错。如:scanf("a=%d",&a);这时候我们不可以只给一个数,a=也必须原样输入。
  • 数学函数
    1. sqrt(x)是平方根函数。如:sqrt(9)的计算结果为3。
    2.fabs(x)是绝对值函数。如:fabs(-3) 的计算结果为3。
    3. pow(x,n)是幂函数。如:pow(2,3)的计算结果为8。
    4.exp(x)是指数函数,如:exp(x)的计算结果为7.389056。
    5.log(x)是以e为底的对数函数。如log(4)的计算结果为1.386294。
    ......注意事项过多,懒得不便一一列出。

2.if-else语句

  • 一般格式为
if(表达式)
{
    语句一;
}
else
{
    语句二;
}

如计算分段函数
y=x+1,x>0;x+2,x<0;

int x;
int y;
if(x>0)
{
y=x+1;
}
else
{
y=x+2;
}
return 0;
}

需要注意的是,用到除法时,要判断除数是否为0,还有类似解决年份问题时,要判断闰年,等等。

3.使用多分支结构

  • 1.else-if语句
if(表达式1)
{
语句1
}
else if(表达式2)
{
语句2;
}
...
else if(表达式n-1)/*else与离它最近的、没有与其他else匹配过的if相匹配*/
{
语句n-1;
}
else
{
语句n;
}/*每个语句最好都加上大括号,不论语句段包含的是几条命令,避免出错*/
  • 2.switch-case语句
switch(表达式)/*表达式和常量表达式一般为整形或字符型,但所有的常量表达式都不能相等*/
{
case 常量表达式1:语句段1;break;/*常量表达式不可以是一个条件判断句;语句段也可以为空,*/
case 常量表达式2:语句段2;break;/*break用来跳出循环*/
...
case 常量表达式n:语句段n;break;
default:
语句段n+1;break;/*default语句可省,如果省略了它,当表达式的值与常量表达式都不符时,就什么都不执行*/
}
  • 二者的区别.:
    else-if语句可用于范围判断,而switch语句只能用于离散值的判断。switch语句都可用else-if替换,反过来却不行。但switch语句更直观,思路更清晰。

4.循环结构

  • 1.for循环
for(表达式1;表达式2;表达式3)
循环体语句

for语句的执行流程:

  • 表达式1
  • 表达式2
  • 循环体语句
  • 表达式3
  • 若表达式3为真,则跳回表达式1,继续循环,若为假,则结束循环。
    需要注意的是,for语句后不可随意加分号,加了分号,系统读取的for的循环体语句为空,程序会出错。

5.拓展

  • 随机数:
rand()%100; /*生成2位数的随机数*/
  • 格式控制
printf("%04d",x);          /*控制输出为四位数,不够在前补0*/
printf("%-04d",x);        /*控制输出为四位数,不够在后补0*/

1.2本章学习体会

  • 通过这两周的学习,我最大的感受是,打代码真的需要很大的耐心,也需要我很细心,各方面因素都必须考虑到。最开始的时候呢,因为接触的代码比较简单,觉着打代码好像也没有那么难,然后现在,我发现,完全不是这样的好嘛!!一旦考虑的条件多了,我的代码就会变得超级超级可怕长。害。最痛苦的是,我写了那么长的一串代码,提交的时候,它显示我是错误的。

    然后就需要我不断地调试,修改,调试,修改...这就需要很大的耐心了,而且,在修改的时候会意识到,格式规范真的很有帮助的,自己看的也比较清楚。而且,一旦我把它改对了,成就感超强的有没有!还有就是,同一个问题,其实可以有很多不同的写法,而写出来的代码,也需要不断改进,不断完善,直到没有任何漏洞,趋于完美。
  • 关于我的代码量,我也不晓得该怎么算,不算平常修改、调试的那些东西,只算pta提交显示正确里的,第一个题集有157行,第二个题集有321行,加起来就是478行,然后还有偶尔会刷的,暑假的那个2840的题集,9月份有209行,能明确的有687行。(好像,有点少,)9月份按15天算,大概一天的代码量在46行。

2.PTA实验作业

2.1c03-单循环结构 7.7猜数字游戏

2.1.1数据处理

数据表达:

  • int randomNumber; 定义了一个整形变量,用于存放被猜的数。
  • int N;定义了一个整形变量,用于存放限制猜测的次数。
  • int number;定义了一个整数,用于存放输入的猜测数。
  • int frequency; 定义了一个整数,用于存放已猜的次数。

数据处理:

  • 首先用while语句,判断输入的猜测数是否大于0且在限制的猜测次数之内,如果满足条件,进入while循环,不满足则不执行while的循环语句。
  • while语句里嵌套了else-if语句,来解决猜错的情况,其中else语句又嵌套了else-if语句,来解决猜对的各种情况。
  • 最后用了一个if的条件句,来满足猜测数<0或猜测次数超过限制的情况。

2.1.2代码截图


2.1.3 本题可扩展功能

可以将while改写为do-while

2.1.4 PTA提交列表及说明


一开始我忽略了超过N次需要输出Game Over,后来在修改过程中又看到题目的输入样例输入了超过N次的数,但那个时候没有意识到超过N次后输出的数是无效的,然后就因为理解错误,导致后面的编写错误。就觉着,明明我的输入输出和题目都一样,程序也能跑,可还是错。到最后,理解了题意之后,才发现这题没有我想象的那么复杂。


2.2 c02-选择结构 7-6出租车计价

2.2.1 数据处理

数据表达:

  • double mieage;定义了一个双精度浮点型变量,用于存放出租车的里程。
  • int time;定义了一个整型变量,用于存放等待时间。
  • double cost;定义了一个双精度浮点型变量,用于存放价格。
  • int fare;定义了一个整型变量,用于存放原价的整数部分。
  • double decial;定义了一个双精度浮点型变量,用于存放原价的小数部分。
    数据处理:
  • 输入数据之后,用了else-if语句,来计算不同里程的不同价格。
  • 然后用了一个if的条件句,来判断是否需要进位,即做到四舍五入。

2.2.2 代码截图


2.2.3 本题可扩展功能

关于四舍五入:
在上图我的做法是将价格的整数和小数部分分开,然后判断小数是否大于0.5,再决定是否进位。
简单的做法是直接将价格定义为double,然后在输出的时候设定宽度限制,如下图:

2.2.4 PTA提交列表及说明

这个表,就已经说明了我当时内心的,烦躁,害。前几个是因为我将价格定义为双精度浮点型变量,最后将它强制转换为整型,后来发现这样不太行,就改成了我提交时用的方法,只是我得到小数部分时,用的是原价的整数部分减去原价,两个数搞混了,,改了几次,连续3天呐,都是错的。然后就求助大佬了。后面提交正确的时候,我就有一种终于解脱了超级开心的感觉。


2.3 c02-选择结构 7-12判断一个三位数是否为水仙花数

2.3.1 数据处理

数据表达:

  • int N;定义了一个整形变量,用于存放这个三位数。
  • int bit;定义了一个整形变量,用于存放个位上的数。
  • int ten;定义了一个整形变量,用于存放十位上的数。
  • int hundred;定义了一个整形变量,用于存放百位上的数。
    数据处理:
  • 首先利用除法和求余得到个位、十位、百位上的数。
  • 然后用else-if的语句,若输入的数不是三位数,输出Invalid Value!,然后判断这个三位数是否为水仙花数。

2.3.2 代码截图

2.3.3 本题可扩展功能

可改写为输出所有符合条件的为3位数的水仙花数。如下:

2.3.4 PTA提交列表及说明


我选这一题,主要是想说明,我也没有天天被虐,是的,我也相信希望我未来的代码,都能这样一次过。


3.阅读代码

ACM题库解题大全-poj3752 字母旋转游戏

(这段代码和我们的c有一点不一样,它是c++。)

  • 功能:简而言之就是按顺时针方向按顺序输出26个字母。
  • 分析:
    • 1.它定义了i表示行,j表示列,tot表示输出数的个数,m和n分别为读入的行和列的要求。
    • 2.首先它用了for循环的镶嵌,初始化了整个二维数组,使它们为0;
    • 3.i、j、tot都从0开始,使用了一个while循环判断输入是否结束。
    • 4.while语句中嵌套了if条件句,第一个while表示按顺序输入第一行的字母,所以i不变,j每次加1;第二个while表示输入最后一列字母,所以j不变,i加1;以此类推。其实它的i+和j+就是往下、往右的意思,对应的i-和j-就是往上、往左的意思,实际上是在控制填充数的方向。
    • 5.到输出的数=N-1时,其实已经输出了所有的数,因为是从0开始的,0也包括在内。
    • 6.最后用for按顺序输出二维数组。
  • 优点:
    • 二维数组初始化,不易出错。
    • 定义字符型变量
    • 数据表达、数据处理分块,便于后期修改、调试。
    • 虽然不是按照我认为规范的方式写的代码,但是写的也很整齐,阅读较方便。
    • 它条理清晰,思路也比较容易让人理解,特别是while和while、while和if的嵌套,用的很熟练而且恰到好处,条件分类也很明确,我原本看到题目的时候就一脸懵,但是慢慢看完它的代码,就有了一种恍然大悟的感觉,原来可以用数字的递增递减来实现换向,很是巧妙。