C博客作业01--分支、顺序结构
0.展示PTA总分
1.本章学习总结
1.1学习内容总结
a.算术运算、赋值运算、关系运算和逻辑运算
-
1.在算术运算中求余运算符不能用于实型数据的计算,如
100%4
(√),100%4.0
(×)。 -
2.双目运算符两侧操作数的类型要相同,如:10/2,1/3,,运算结果分别为5,0;若类型不同系统自动进行类型转换,使他们具有相同类型,然后再进行运算,如:10.0/4时,应先转换为10.0/4.0,这样算出值为2.5。在许多编程题目中,运算时类型转换是一个经常出现而又不经意会被人忽视的点,故在进行编程时,对操作数类型应把握好,对所求结果的类型应明确。
-
3.赋值运算中的“=”,与关系运算符
==
,具有不同含义,=
,代表赋值,如:a=2
,为将2赋值给a,a==2
,则是a的值本身就为2,“=”,一般用于代码开头对函数进行赋值,以方便后续代码的运行,且运算符左边必须是一个变量,而==
,则多用于逻辑语句中的判断条件;关系运算符主要运用于逻辑运算中。
b.常量、变量和数据类型
-
1.在程序运行过程中,气质不能被改变的量称为常量,其值可以改变得称为变量,如:100为整型常量,111.11就是实型常量,而一些初始定义的值,如系统或人为定义的num等可以改变值得称为变量。
-
2.C语言中最常用的数据类型包括
int
(整型),char
(字符型),float
(单精度浮点型),double
(双精度浮点型),其中float
与double
都是浮点型,二者的区别在于double
型数据占用空间更大,精度更高,取值范围更大,在学习编程中,若无具体说明一般选择double
型,方便我们计算。 -
3.C语言中变量的含义和数学中变量的含义不同,。C语言中的变量代表保存数据的存储单元,而数学中的变量代表未知数。
c.scanf的调用与常用数学函数
-
1.对于不同的数据类型scanf的调用符号不同,
int
——%d
,double
——%lf
,floa
t——%
f,char
——%c
,在进行调用时,需注意,调用间以什么分隔,输入数据就应输入什么符号,如scanf(“%d,%d”)
应输入4,5。 -
2.常用数学函数有:
平方根函数:sqrt(x)
;
绝对值函数:fabs(x)
;
幂函数:pow(x,n)
;
指数函数:exp(x)
;
以e为底的对数函数log(x)
;
d.选择结构语句
-
1.if类语句中
if-else
语句不需要每个分支都判断,但是else
内再嵌套if else
,阅读性比较差,容易出错;
if语句每个分支都要去判断,执行效率比较低;
else—-if
语句找到满足的条件执行相应分支,无需每个分支都去判断;
故if类语句中else—if
语句它的逻辑结构更清晰,相较其他两个来说执行起来更符合人们的预期,使用最广; -
2.
switch
语句与if
类语句相同,都能实现多分支结构但是if-else
需要判断过个分支,而switch
只进入满足条件分支,无需比较其他分支;
switch语句效率更高; -
3.
switch
语句只能处理等值条件判断的情况,case
后只能是常量。而if选择结构的限制,特别适合某个变量处于某个连续区间时的情况;
switch
语句判断的值必须是整型,if
判断整型数和浮点数都可以;
e.for
类型的循环结构
-
1.
for
语句中,用两个分号分隔三个表达式,但for
的后面没有分号,因为for
与其后的循环体语句合起来作为一条完整的语句; -
2.
for
语句中不要随意加分号,若for()
;则不执行接下来的循环体语句,对于for
语句,我们一般在了解循环条件,结束条件后才选择使用,若条件不清晰,则一般选择while
语句;
f.老师补充知识点
- 1.
for
语句中,若想最后一个数据不带空格可引入flag
; - 2.在猜数类题目中,若想电脑随机产生数字,可加入
rand()
:生成0—0*7fff的随机数,若想限制随机数在一个范围,如100以内,则输入rand()%100
; - 3.若想每次都改变随机数,则可输入
srand(time(0))
生成不同随机种子; - 4.对于字符型变量,在
%c
中空格为有效字符; - 5.驼峰命名法:当变量名或函5名是由一个或多个单词连结在一起,第一个单词以小写字母开始;第二个单词后的首字符都采用大写字母;
- 6.除0问题:
除数为0,容易引发异常;
浮点数不和0比较,容易误差,故需要比较时一般取无限接近0的数,如:if(value<=0.0000001)
;
1.2本章学习体会
- 随着题目的往后扩展,每一题的代码量也越来越多,而且不局限于对一种语句的使用,特别是在一些较为复杂的题目中,for的循环语句与if的选择语句的嵌套使用可以解决许多复杂问题,而对于scanf的使用也越来越灵活,虽然题目越来越灵活但是我自己却越来越头疼,相较于其他人我对各种语句的联合使用会很吃力,而且有时会误解题目的意思,但是C语言依旧是很有意思的东西;
- 对于c语言的学习,动手实际操作是最重要的,不管你对理论有多理解,不实际操作永远不会知道自己究竟能达到什么水准,不知道自己存在什么错误,想要学好C语言,知道很重要,动手也很重要,只有当你去见识各种各样的题目、代码,去一步步调试发现代码的错误,会对代码进行改编,你才会有真正的进步;
代码量:830~900;
2.PTA实验作业
2.1 7-5最佳情侣身高差
2.1.1数据处理
-
数据表达:N:查询客户数;i:第i名客户;high:客户身高;sex:性别;其中N,i都是整型变量,high是浮点型变量,sex是字符型变量
-
数据处理:
for(i=1;i<=N;i++)
;high=high*1.09
;high=high/1.09
;在确定N后进入循环结构,通过确定sex来选择进入哪一个high的计算,一直重复直到i的值大于N;
2.1.2代码截图
2.1.3本题可扩展功能
- for语句可以用switch语句替换,自我感觉switch语句用起来比一开始的if语句舒服
- 在我代码提交末尾有一个
sex = getchar()
,这句代码的作用是吸收空格,因在%c中空格为有效字符,若不将空格吸收,则代码提交会出现错误,而这句代码就是为了将空格有效化
2.1.4PTA提交列表及说明
- 从我的提交列表就能看出部分正确出现次数特别多,除了一开始因为空格多少以及换行问题导致的答案错误外,其他的问题全部是由部分正确引起;
我的部分正确中只有最小N才是正确的,其他的都是答案错误,中间的多次修改都没有用,所以这道题被我冷落了几天,一直到学姐出现;
学姐看完我的代码后使用多个printf
进行调试后发现,for循环能够进入但是无法进行循环,且循环语句中第一部分能够进入,第二部分却无法进入,多次调试后学姐灵机一动,想到了空格这个问题,之后用了那句吸收空格的代码后提交终于答案正确,感谢学姐。
2.2 7-10计算天数
2.2.1数据处理
- 数据表达:year:年份;month:月份;date:日期;sum:天数总和;所有数据都是整型变量
- 数据处理:
year%400== 0 || year%4==0&&year%100!=0
通过这个来判断是否是闰年,以便后续sum的统计,而sum是通过我们自己计算输入;
2.2.2代码截图
2.2.3本题可扩展功能
- 本题是一道很经典的选择结构题,而选择结构中我们最熟悉的就是if类与switch语句,所以这道题同样可以使用switch语句来实现,而switch语句在输入过程中比if类方便很多,至少不用在意大括号,而其他的方法我有听过可以用数组,但是我不了解数组
2.2.4PTA提交列表及说明
这道题真的很让我头疼所以那道于龙的题我至今没打好,首先是对于闰年的判断,那两个判断条件就让我的提交一直没过关,其次就是天数问题,我的月份输入是从一月开始,所以最后输出天数一直不对,特别是期间我一直不知道自己哪里有错,最后是最后的输出,我一直是直接输出sum,没有加上date,这三个原因让我每次调试输入值时一直不对,后面经过提点才发现,sum的统计天数是针对之前的天数,而输出没有加上date,一直都是这个月之前的所有天数,改完后的我终于舒了口气但是于龙太难了,以及后面的提交全是我改完代码的重新提交
2.3 7-7猜数字游戏
2.3.1数据处理
- 数据表达:N:猜测的最大次数;guessNum:猜测的数字;num:输入的数字;i:已经猜测的次数;
- 数据处理:本题的大部分数据都是调用,其中guessNum与num来比较大小,i用while语句进行:
while (i>=0){i++;}
;
2.3.2代码截图
2.3.3本题可扩展功能
- 之前上课时我们有学过由计算机随机产生不同数字来增加猜测的乐趣,同样这道题我们可以让电脑出数字,我们来猜
(电脑出数字方法见上面老师补充知识点);
同时这道题有明显提到num的取值,所以负数百分百比猜测数小,所以我觉得我们在改编时可以试试新玩法,比如若输入负数,则将猜测数取负值后与负数比较大小,这样比较大小刚好相反,更有趣味性。
2.3.4PTA提交列表及说明
- 这道题一开始我尝试过用for来实现,但是存在一个问题,不知道到底要猜多少次,所以结束条件不明确,最后我选择了while语句;这道题的一个限制条件就是,第几次猜对,不同范围猜对输出内容不同,而一开始我没有想到
i++
,以致于我陷入了循环修改代码中,这道题的关键就是解决题目限制,比如超出N次猜对后,输入负数,每一个限制都是这道题的评判条件,最后是这道题题输出的大小写以及换行,当解决这些后,你会发现这道题很简单,当我改用while,加上i++后,后续问题基本迎刃而解,这道题主要感谢室友的提醒,让我发现我的这些问题
3.阅读代码
首先这段代码是我在ACM中找到的为数不多的C语言代码,在大部分C++中它能让我看懂的地方最多
- 这段代码是想实现对间谍信息的破译,其中乱码部分以矩阵排列,通过破译翻译乱码的意思
- 亮点:这段代码的一个亮点就是对于循环与选择的嵌套使用,因为这道题的复杂所以对循环要求很高,不仅如此因为要翻译乱码,对各个数据精度要求很高,所以我觉得他的处理方法很强;
while中的if,if中的for环环相扣,我觉得这段代码的布局就是它最大的亮点