2022-2023-1 20221320 《计算机基础与程序程序设计》第七周学习总结
学期(2022-2023-1) 学号(20221320) 《计算机基础与程序设计》第七周学习总结
作业信息
<班级的链接>2022-2023-1《计算机基础与程序设计》
<作业要求的链接>2022-2023-1《计算机基础与程序设计》
<这个作业的目标>
学习重点知识:
- 数组与链表
- 基于数组和基于链表实现数据结构
- 无序表与有序表
- 树
- 图
- 子程序与参数
学习任务:
- 加入云班课,参考本周学习资源
- 计算机科学概论第8章 并完成云班课测试
- 《C语言程序设计》第6章并完成云班课测试
作业正文
教材学习内容总结
《计算机科学概论》第八章:主要学习了栈,队列和列表,二叉树,图这几个抽象结构的运行方式,细节上主要讲述了在二叉检索树中搜索,构造二叉检索树,输出二叉检索树中的数据,图算法中的深度优先搜索,广度优先搜索,单元最短路搜索,子程序中形参分别是值参和引用参数时调用单元分别将实参的什么传递给子程序,以及两种参数传递方式的区别。
《C语言程序设计》第六章:10月10日的课上重点讲了三种循环语句(for,while,do-while)的使用及其使用原则,指出了在使用循环控制的基本结构时应首先明确的几点:初始化条件,测试条件,循环体,循环变量增值条件,区分了当性循环与直到型循环的不同,强调了在for语句后面加“;”即空语句,可以作为一种延时操作,而在while语句后面加“;”则是使循环进入死循环,指出逗号运算符是顺序求值运算符,之后进行了猜数游戏的程序编写和改进,使其可以生成任意数组,改定猜测次数,并且允许用户进行是否继续猜数的选择,之后学习了嵌套循环求阶乘之和,并且给出了通过寻找累加求和的规律来舍弃嵌套循环的操作。10月12日的课上重点讲了递推法的本质、特点、应用,指出了有正向递推和反向递推的两种方法,之后用猴子吃桃问题和兔子理想化繁衍的问题指出运用递推时最重要的是明确初始状态和递推规律。然后讲了穷举法,指出穷举法解决问题的两个基本要素是确定穷举对象和穷举范围与判断条件,用百鸡问题中不定方程的使用来演示穷举法的应用。之后学习了转移控制的三个语句,break语句,continue语句和goto语句,在韩信点兵的例题中进行了使用,顺便学习了exit(0)函数和巧用标志变量结束循环,最后学习了结构化程序设计顺序、选择、循环三种基本结构的特点是只有一个入口,只有一个出口,无不可达语句,无死循环,尽量避免使用goto语句,采用自顶向下,逐步求精的模块化程序设计方法。
教材学习中的问题和解决过程
- 问1:在标记控制循环中对标记变量在循环外赋值以帮助程序进入循环,为什么在循环内对该标记值输入数值之前的赋值对现在的输入没有影响?
- 答1:
我:汪老师,这里在输入num 的值之前给num 赋值为1对接下来的输入num 值为什么没有影响呢?
汪老师:因为进入循环后,就重新输入了num的值,所以num=1,就是为了能正常进入循环。
我:那在循环外赋给num的值为什么进入循环内就消失了,在循环内可以重新给他赋值
我:还是说在循环内赋的值把在循环外赋的值给覆盖了
汪老师:对,循环内读的值把循环外赋的值覆盖了。
我:好滴,谢谢老师。 - 问2:基于数组的实现和链式实现有什么区别?
- 答2:基于数组的实现通过地址查找内容,比链式实现通过节点间的指针或链接查找内容更加容易。但是链式实现在插入内容时不用像基于数组实现一样将插入位置后的内容从最后一位起依次向后挪动来腾出插入位置的空间,只需要在某一节点插入内容后在节点后加上指向下一节点的链接或指针就可以了,因此链式实现在插入内容上比基于数组的实现更加容易。
- 问3:使用递归算法输出二叉检索树中的数据时为什么在一个左子树输出完成后没有return语句就自动返回到该子树的根输出右子树?
- 答3:对递归算法的定义还不够理解,书上152页指出递归算法使用一个选择语句来确定是否重复算法来调用一遍或停止这一过程,而不是使用一个循环语句执行一个算法。所以递归算法不需要return语句返回,也不需要使用循环语句返回,当算法执行到不符合选择的条件时,算法会自动返回。
代码调试中的问题和解决过程
-
-
网站上的答案:
#include<stdio.h>
#include <stdlib.h>
int main()
{
int year, month, n;
printf("Input year,month:");
n = scanf("%d, %d", &year, &month);
if (n != 2 || year < 1)
{
printf("Input error!\n");
exit(0);
}
switch (month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
printf("31 days\n");
break;
case 2:
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
printf("29 days\n");
else
printf("28 days\n");
break;
case 4:
case 6:
case 9:
case 11:
printf("30 days\n");
break;
default:
printf("Input error!\n");
exit(0);
}
if (month >= 3 && month <= 5)
printf("The season is spring\n");
else if (month >= 6 && month <= 8)
printf("The season is summer\n");
else if (month >= 9 && month <= 11)
printf("The season is autumn\n");
else
printf("The season is winter\n");
return 0;
}
网上的参考答案明显在使用case语句时更加简洁,省略了重复的printf语句,并且使用exit(0)函数对当非法字符的输入时的程序进行了强有效的终止。这些点都是我在写程序时没有注意的,值得学习。
上周考试错题总结 -
判断题
1 分
简单
The general case of a recursive solution determines when the recursion stops.
正确答案: 错误
你的作答: 正确
原因与理解情况:书上152页下方的原文是“每个递归算法至少有两种情况:基本情况和一般情况。基本情况是答案已知的情况;一般情况则是调用自身来解决问题的更小的版本和解决方案。因为一般情况下解决的问题是原始问题越来越小的版本,所以程序最终达到基本情况,即答案是已知的,所以递归停止。”所以本题说基本情况决定递归的结束是错的,应该是一般情况。 -
判断题
1 分
简单
Infinite recursion occurs because there is no general case.
正确答案: 错误
你的作答: 正确
原因与理解情况:书上152页下方的原文是“每个递归算法至少有两种情况:基本情况和一般情况。基本情况是答案已知的情况;一般情况则是调用自身来解决问题的更小的版本和解决方案。因为一般情况下解决的问题是原始问题越来越小的版本,所以程序最终达到基本情况,即答案是已知的,所以递归停止。”所以本题说无限递归的发生是因为没有一般情况是错的,应该是基本情况。
其他(感悟或思考)
自己觉得对教材内容的学习总结要在老师教学完成或自己看完书后马上书写,这样对自己的记忆更有助其加深,避免了不必要的遗忘。学习总结不要总是拖在最后一刻才来写,尽量在周五前完成,给自己的周末留足学习其他内容的时间,而不是在那段时间赶作业。做一下纸质的学习计划更有利于自己学习进度的推进。
学习进度条
博客量(新增/累计) | 代码行数(新增/累计) | |
---|---|---|
目标 | 70 | 3000 |
第一周 | 2/2 | 0/0 |
第二周 | 1/3 | 300/300 |
第三周 | 6/9 | 250/550 |
第四周 | 1/10 | 50/600 |
第五周 | 3/13 | 100/700 |
第六周 | 1/14 | 100/800 |
第七周 | 1/15 | 300/1100 |
总计 | 15 | 1100 |
学习时间(新增/累计) | 重要成长 | |
---|---|---|
目标 | 300 | |
第一周 | 10/10 | 开始学习写博客 |
第二周 | 20/30 | 学习如何自主预习,初识信息安全专业 |
第三周 | 20/50 | 各种进制表数方法 |
第四周 | 15/65 | 逻辑电路 |
第五周 | 10/75 | 博客排版和编辑走上正轨 |
第六周 | 10/85 | 解决问题的Polya新思想 ,选择结构 |
第七周 | 20/105 | 抽象数据类型,循环结构 |