C语言--分支、顺序结构的小总结。
| 这个作业属于哪个班级 |
目录
| ---- | ---- | ---- |
| 这个作业的地址 |
目录
| 这个作业的目标 | 初步认识C语法,掌握数据表达、printf、scanf语法及分支结构内容 |
目录
0.目前我PTA两次作业的完成情况:
0.1顺序结构:
0.2分支结构:
1.本章学习内容的总结
1.1学习内容的总结:(这里不赘述在第一次作业中就完成的任务,将选择一些我认为的重点很难点来简述)
- 再次强调一遍科学命名的重要性,规范化使用就是变量名使用驼峰法,函数名使用帕斯卡命名法(首字母也要大写)。(老师的提醒,那就是学习C语言不是学习英语,所以命名的用词简洁明了就好。)
- 学习了内存方面的知识,知道了:
- float和int占据4个存储单元。
- double占据8个存储单元。
- char占据1个存储单元。
- 老师提到了一个点就是定义符号常量,这里我们抛出define但是先不拓展。define
- 学习了对一个程序的设计应该要从两个角度入手:(1.数据表达 2.流程控制 )去仔细拆解一道题目。
- 强化一下该记的数学函数: 1.sprt() 求方根。 2. fabs() 针对全数据类型的求绝对值。 3.pow() 幂函数。 4.exp() 指数函数。 5. log() 求以e为底数的对数函数。
- 无论是整型还是浮点数都可以设置字符长度,都是在小数点前。 eg.
%6.d
%6.f
- 设置从随机数中引出来的学习:
1.两个新的头文件。#include<stdlib.h>
#include<time.h>
2.获取随机数的程序如下:
深度思考srand(time(0)); //随机产生一个随机数。 =rand()%100 + 1; //输出这个平均数, %可以用来设置范围,此处为不超过一百的整数。
- 三种分支结构的性质:
1.单分支结构:适用于简单的分支情况。
2. 嵌套的if-else: 适用于多对象的分支,程序程序运行的过程中需要一种一种情况进行判断,效率在某种情况上,会比较低.
3. 级联的if-else: 适用于单层多情况的分支,程序运行的过程中不需要一种情况一种情况判断,效率会比较高,但是不利于处理分支情况很多种层次的情况.
小总结:提高效率的要点,是要在逻辑上就避免去执行不需要执行的语句. - 字符型数据的学习:(由于前面没有整理所以这里将会详细整理一下)
- 1.字符常量:
- 要用单引号来表示,如果没有加单引号的话就会变成常规的运算符。(此处针对运算符)
- 但凡被加上单引号的内容,无论默认是什么,都会被视为是字符。
3.一些特殊字符的表示可以用转义符“ \ ”来实现。
- 2.字符变量
1.字符变量的定义与赋值:
char character; //定义变量
character = 'a'; //字符的赋值
2.字符型数据再计算机的存储:
* 字符型数据需要转二进制,统一编码。
* ASCII码表。
* 字符型数据在计算机的内部都是用二进制编码来表示的。
* 声音,和图片都是二进制表示。
3.关于ASCII码表和字符的关系:
ASCII码表的定义原理。
()
ASCII码表是连续编译的,其中切记,数字 1 和 字符 '1',这两者是不一样的!!!,在ASCII码表的位置也不一样!!(其他数字同理。)
4.字符可以通过ASCII码表和整型相通:
(所以字符本身是可以比较大小的,其实比的就是ASCII码表对应的同一进制的数字大小)
测试结果显示:字符型的变量,如果进行数字赋值,那么这个变量它既存储了ASCII码表中该十进制数字所对应的字符,同时也存储了该十进制数字,两者是可以在一个变量中输出的。
-
- 字符型数据的输入和输出
1.用 %c 来存储字符数据。printf 和 scanf都一样。
2.输入的时候,操作数和运算符之间不能有空格,因为空格也是一个字符!!!,输入空格会被当成有效字符,进而导致程序错误!
3.详细如图:
- 字符型数据的输入和输出
4.独属于字符的输入和输出:
//输入
char ch;
scanf("%c",&ch);
或者
char ch;
ch = getchar();
//输出
printf("%c",ch);
putchar(ch); //输出变量
putchar('A'); //输出常量
- 4.其他拓展
字符的很多条件关系的成立背后靠的确是,ASCII码表背后进制数字的大小关系!!!
9. switch-case语句的升华: 要学会避免重复(将同样的部分可以利用case的连续性来缩减代码长度)
10. for语句和while语句的区别:
1. for语句更多的用于已知循环次数的情况
2. while语句则更适合不知道具体的循环次数的情况
1.2编程技巧的小总结:
- 可以定义一个变量来控制符号,即符号变量sign或者一些功能变量flag,这样的做法会比机械地使用数学方式来求更高效。
- 典型的案例是对于加减交错的情形的处理:使用sign变量会比引用pow去计算-1的奇偶指数下的不同结果会方便很多。
- 对浮点数的相等的判断不能直接用
==
,应该用 两个浮点数相减的结果小于一个无穷小的数来实现,效果会更好.
大概的代码如下:
if (numb1 - numb2 <= 0.00000000001)
- switch-case结构的语句可以利用好没有break情况下的连续执行语句的效果来进行庞大一常量条件的读取.比如各类字符量的统计那一道题目可以借鉴.
大概的代码如下:
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
- 避免由于if-else的匹配原则所带来的错误的方式:
1.使用大括号,制造一个复合语句
2. 增加一个空的else - 学会利用 temp 变量,设立一个temp变量,用来储存中间量可以在需要比大小的环境中让largest始终存放大的那一个数据,让smallest始终存放小一点的那一个数据.
if (largest < smallest)
{
temp = largest , largest = smallest , smallest = temp;
}
- 判断奇偶常用:
if(number%2 == 0)
- 求两个数的最大公约数用辗转相除法 \ 两个数的最小公倍数等于这两个数相乘后除以他们的最大公约数. 假设(M>N):
while (N != 0)
{
number = N;
N = M % N;
M = number;
gcd = M;
lcm = product / gcd;
}
- 解决输出一段数,要用空格隔开,而最后不要出现空格的办法是,最后的数独立一个输出,前面的数在数后面多输出一个空格。
1.3本章的学习体会:
==总得来说,这两周的学习有收获的地方,但也有很值得反思和思考的地方.==
* 先说有收获的地方吧,大概明白了线下学习的学习方式,不同于暑假线上 慕课+PTA的慢慢学习的过程,线下的学习节奏更快,需要更==专注的态度==和==更清晰的组织能力==,线下的模式将主要变成这样的样式:
1.[课前准备部分] 首先是在 课堂派上结合书本进行预习任务的完成,在预习的过程中多思考和完成笔记的记录(有点像是把看慕课和边整理笔记的时间放到这里来了), 然后是完成测试作业并做好思考的总结,相关笔记的整理.
2.[课上听课部分] 跟着老师的思路, 在自己的脑子中形成完整的知识框架, 巩固已经学会的知识点, 重点记录和研究自己还不太懂的部分.
3.[课后巩固部分] PTA平台保持刷题习惯,看超星平台的视频进行巩固和补充 {有时间的话 对可以拓展的点进行自行拓展和学习}
* 再说说存在危机的地方,那就是我在时间安排和管理上还不能让我很舒适地按照我想要的节奏学习C语言,没有那种很轻松的感觉,感觉我能跟得上目前的上课节奏的主要原因还是暑假的小段时间的自习,而不是说在学习的过程中,没有那种很舒适和顺畅的感觉,尤其是在编程思维上,我感觉自己迟钝了很多,第一次上机课的效果还算可以,但是第二次上机课的效果却有一点点糟糕,这让我有点焦虑和惶恐.很明显的一个地方就是,我可以肯定我对C语言程序设计的紧张感由于大量事情的冲击而有所松懈了,我得自己调整好,坚持以C语言程序设计为中心的大学课程学习,把握好时间安排,加大代码量的编写!
* 严格地来说这两周地代码量几乎为微!并且还主要集中在上机课.这是很严重的问题!
2.PTA实验作业
2.1前天是哪天
2.1.1数据处理:
- 数据表达:需要设置三个变量,year month day用来保存年月日这3个数字,数据类型为整型。
- 流程设计:
采用级联的if-else结构:
第一种情况是 年需要借位的情况,month==1 && day <= 2
第二种类型是 月份需要借位的情况:其中第一类是借位后为大月的情况 条件为 month为2 4 6 8 9 11且day <= 2时才会触发。
第二类时借位后为小月的情况 条件为 month为5 7 10 12且day <= 2时才会触发。
第三类是2月份的情况 条件为 month为3且day <= 2时才会触发。 并且需要事先判断该年年份是否为闰年。
最后就是剩下的比较简单的情况,直接就是day-2
2.1.2代码截图:
级联的if-else版本:
switch-case版本:
2.1.3 PTA提交列表及说明
一次过:这里要强调一下先思考再去写代码的至关重要性和高效性!
2.2单词长度
2.2.1数据处理:
数据表达:用一个字符变量op来存储字符;用一个整型变量count来计数。
流程设计:
2.2.2 代码截图:
(还存在一个 格式错误 没有找出来时间 花费太多了,脑子有点乱 暂时先到这里)
2.2.3PTA提交截图:
- 这里的多次提交可以分为两种类型的思路的交叉,原本的do-while结构能够满足10分的要求,但是对于 空句子 连续空格 和 开头结尾多空格的小细节不好处理。
于是改用 外部先输入一次加while结构 这样可以解决开头空格输入对do - while结构的逻辑性打击。这里插入一个关键点:如果使用while结构要注意循环内的赋值应该放在最后这也是解释我提交当中出现1分的情况的问题。
往后回到10分就是那三个问题的未解决。
改动了这两个地方:
第一 插入了一个判断在第一个输出的地方把连续空格所造成的结果会输出0的问题解决。
第二 将第二个输出的地方将条件从op == '.'
改成了count != 0
这也是为了解决连续空格问题。
尚未解决的疑问:不知道最后的关于开头结尾的空格的格式错误这个问题怎么解决。
这个疑问的解决,其实说的问题是在 . 和语句之前存在空格的话要怎么去解决。
好的办法是使用状态变量,直接采用让第一个输出和后面的输出分开来就可以解决问题。
但是这个过程下又会产生新的问题,那就是只有一个单词的测试点反而过不了了。
最终经过测试发现,是来自于循环外部的那个判断语句的问题,那个判断语句直接面对的是结尾是 . 的输出情况,在只打一个单词的情况下,也会有区别,所以也要有分支来提调节。
最后是,格式的错误中!不仅要考虑空格不计数,还要考虑换行也不计数!!
2.3单步调试解决 单词长度这道题,
2.3.1单步调试截图
调试到这里的代码可以完成这道题目的大体的要求
这里是发现了从do-while换成while时忘记该换输出语句的位置,导致了大错误!