0.展示PTA总分
1.本章学习总结
1.1学习内容总结
1.首先,我学到的是代码的一些基础的组成结构。比如说:编译预处理命令如#include<stdio.h>
,变量定义,输入输出函数,数学函数等等。
- 编译预处理命令:在调用库函数时,必须用#include命令将相应的头文件包含到源程序中。到目前为止,我们用的最多的是stdio.h,因为基本上都会用到输入输出,偶尔用到数学函数就需要math.h,课堂上拓展了一个随机数,涉及到stdlib.h,另提到了获取时间时需要用到的time.h。
- 变量、常量的定义:
int
用于定义整形变量,char
用于定义字符型变量,float
和double
用于定义浮点型变量,前者是单精度浮点型,后者是双精度浮点型,主要区别.是后者可用于存放更大的数。
变量定义很重要,它决定的是性质,如果定义错了,就等于从源头上出错了。需要注意的是,整形变量的四则运算得到的结果只能是整数。.如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.阅读代码
(这段代码和我们的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的嵌套,用的很熟练而且恰到好处,条件分类也很明确,我原本看到题目的时候就一脸懵,但是慢慢看完它的代码,就有了一种恍然大悟的感觉,原来可以用数字的递增递减来实现换向,很是巧妙。