学期(2022-2023-1) 学号(20221320) 《计算机基础与程序设计》第九周学习总结
作业信息
各项要求 | 具体内容 |
---|---|
<班级的链接> | 2022-2023-1-计算机基础与程序设计 |
<作业要求的链接> | 2022-2023-1计算机基础与程序设计第九周作业 |
作业的目标 | 1.学习目标: 操作系统责任、内存与进程管理、分时系统、CPU调度、文件、文件系统、文件保护、磁盘调度 |
作业的目标 | 2.学习任务:加入云班课,参考本周学习资源、计算机科学概论第10,11章 并完成云班课测试、《C语言程序设计》第8章并完成云班课测试 |
作业的目标 | 3.参考上面的学习总结模板,把学习过程通过博客(随笔)发表,博客标题“学年 学号 《计算机基础与程序设计》第九周学习总结”,博客(随笔)要通过作业提交,截至时间本周日 23:59。 |
作业正文 |
教材学习内容总结
《计算机科学概论》第十、十一章:第十章介绍了计算机操作系统,说明了计算机的操作系统的两个主要责任是管理计算机的资源(如内存和输入输出设备),并提供人机交互的界面,因为操作系统采用多道程序设计,程序将竞争CPU的访问,所以操作系统必须执行内存管理(了解主存中载有多少个程序以及它们的位置的动作),因为正在被执行的程序有可能被打断,所以操作系统还要执行进程管理(了解活动进程的信息的动作)。分时操作可以可以创建虚拟机的假象。逻辑地址(对一个储存值的引用,是相对于他的程序的)通过地址联编与物理地址(主存储设备中的真实地址)相映射。区别固定分区和动态分区:固定分区是把内存分成特定数目的分区以载入程序的内存管理法,动态分区是根据容纳程序的需要对内存分区的内存管理方法。CPU 各种调度方法的处理:先进先出算法,短进程优先算法,时间片轮转调度算法,虚拟轮转法,优先级算法。第十一章介绍了文件系统和目录,文件系统是操作系统为他管理文件提供的逻辑视图,目录是文件的有名分组,文本文件和二进制文件其实都是以二进制的形式储存的,只是文本文件用的是字符表示法,二进制文件用的是通过定义特制的二进制格式表示数据。操作系统通过文件的扩展名来识别文件的类型文件保护的设置有三类:Owner,Group,World.可以通过这样的方式来对用户对文件的操作进行限制,进而可以保护文件。详见下图。
目录树是展示文件系统的嵌套目录组织结构。有两种路径指定一个特定的文件:绝对路径和相对路径。磁盘调度的方法有FCFS,SSTF,SCAN三种。
《C语言程序设计》第八章:10.24的课上汪老师讲解了递归函数的调用方法,仔细分析了递归函数的调用与回推的过程,并强调了递归层数太多易导致栈空间溢出,后果很严重,程序会被异常中止,最后用下图总结了递归函数的使用方法。
之后讲解了变量的作用域和储存类型,局部变量与全局变量作用域的不同。局部变量(Local Variable)的作用域的特点:1.有效范围仅为该语句块(函数,复合语句)2.仅能由语句块内的语句访问,退出语句块时释放内存,不再有效存储类型决定为变量分配内存的方式,以及变量的生存期。全局变量(Global Variable)的作用域:有效范围是从定义变量的位置开始,到本程序结束.下图是在随机存储器中程序各部分的储存分区
其中静态存储区中的变量:与程序 “共存亡”,动态存储区中的变量:与语句块“共存亡”。如何声明变量的储存类型:auto(自动变量)(无需在数据类型前单独说明)static(静态变量)extern(外部变量)register(寄存器变量)(无需在数据类型前单独说明)最后讲解了模块化程序设计的优点:便于复用(构建新的软件系统可以不必每次从零做起。直接使用已有的经过反复验证的软构件,组装或修改后成为新的系统。提高软件生产效率和程序质量)和分解模块的过程:自顶向下(Top-down)、逐步求精(Stepwise refinement)的程序设计方法(先全局后局部,先整体后细节,先抽象后具体)由不断的自底向上修正所补充的自顶向下的程序设计方法。
在10.26的课上汪老师讲述了一种全新的变量概念--数组:一组具有相同类型的变量的集合,他是一种顺序存储,随机访问的顺序表结构。接下来细讲了数组的各部分组成与定义,以及如果输入数组的数超过了数组的容量会有严重的后果:由于编译程序不检查数组下标值是否越界,一旦下标越界,将访问数组以外的空间,那里的数据是未知的,不受我们的掌控,如果被意外修改,可能会带来严重后果:对其他储存单元造成破坏。现总结只是要点:
- 数组的定义和特性:
一批具有同名的同属性的数据就组成了一个数组
数组是一组有序数据的集合。数组中的各数据的排列是有一定规律的。
数组中的每一个元素都属于同一个数据类型。 - 怎么定义一维数组?
一般形式:类型符 数组名【常量表达式】; - 数组的注意事项有哪些?
1.定义数组时,我们要指定数组中元素的个数,方括号中的常量表达式用来表示元素的个数,即数组长度。我们要注意:a[4]指的是a[0],a[1],a[2],a[3],指的是这4个值,没有a[4]。
2.c语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。
比如:int n,scanf(”%d”,&n); int a[n];
3.如果在被调用的函数(不包括主函数)中定义数组,其长度可以是变量或非常量表达式。
比如:void func(int n){int a[2*n];}这是合法的,在调用func函数时,形参n从实参得到值。这种情况叫做“可变长数组”。
4.一维数组的初始化方式有哪些?
在定义数组时对全部数组元素赋予初值。比如
int a[10]={0,1,2,3,4,5,6,7,8,9};
可以给数组中的一部分元素赋值。例如:
int a[10]={0,1,2,3,4};
如果想使一个数组中全部元素值为0,可以写成
int a[10]={0};
在对数组元素赋值的时候,可以不指定数组长度,
Int a[]={1,2,3,4,5};
如果数组长度和赋值个数不一样,会自动初始化为0
int a[10]={1,2,3,4,5}; 前面5个元素被赋值,后面5 个元素被初始化为0.如果是字符型数组,那后面的讲会被赋值为’\0‘,如果是指针型数组,则初始化为null,即空指针。
教材学习中的问题和解决过程
- 问题1:书上对于内存管理的最佳匹配,最先匹配,最差匹配的解释不太清楚,做云班课的作业是有一些问题。
- 问题1解决方案:查阅文章的链接:计算机四级 最先适应法、最佳适应法、下次适配法、最差适配法
分析:
1.首先分析是不是最差适配法,最差适配法意思是首先找到最大的内存空间进行分配,
对于请求的5K存储空间,首先找到地址200K容量为56K的地方进行分配,然后剩余51K。
再对请求的15K进行分配,找到最大的空间,也就是刚才剩余的51K进行分配,然后再剩余36K。
再对请求的30K分配,找到最大的内存为刚才剩余的36K进行分配,结果剩余6K。
很显然,这个例子中不是最差适配法,可以排除掉。
2.再来分析最先适配法,最先适配法是按顺序查找内存表,找到第一个满足申请长度的空间进行分配。
首先对于5K的请求,找到地址10K容量15K的地方分配掉,
然后对于15K的请求,找到地址130K,容量25K的地方分配掉。
最后对于30K的请求,找到地址200K容量56K的地方进行分配。
很显然,这个例子中不是最先适配法,可以排除掉。
3.下次适配法,是从上次分配的位置开始开始查找下一个满足要求的空闲区。
对于5K的请求,找到地址10K容量15K的地方进行分配
对于15K的请求,接着上次找的位置后面,找到地址130K容量25K位置分配,剩余10K
对于30K的请求,找到地址200K容量56K的地方进行分配,剩余26K。
显示此方法也不符合上述分配后的结果。
4.最佳适配法总是查找到第一个满足要求的最小空间进行分配
对于5K的请求,找到地址95K容量5K的地方分配
对于15K的请求,找到地址10K容量为15K的地方进行分配
对于30K的请求,找到地址200K容量56K的地方进行分配 - 问题2:对于一个空白区内是否可以放两个进程书上没有相应的解释,做云班课作业时有一定障碍。
- 问题2解决方案:发现网上有两种说法:有说可以放两个进程的右方为文章链接计算机四级 最先适应法、最佳适应法、下次适配法、最差适配法,有说只能放一个进程的,右方是文章链接[存储器管理之分区存储管理],具体正确的还有望老师和助教解答(http://t.csdn.cn/umWm6)
代码调试中的问题和解决过程
- 问题1:不知道如何设计一个函数来求素数
- 问题1解决方案:
#include<stdio.h>
int a(int n)
{
int i;
for (i = 2; i <= (n - 1)/2; i++)
{
if(n % i == 0)
return (0);
}
return (1);
}
看到答案才知道自己之前想复杂了,写了50多行都没有把函数写出来。
- 问题2:在c语言中如何实现辗转相除法
- 问题2解决方案:
数学计算公式gcd(a,b) = gcd(b,a mod b)
具体操作:
假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里得算法,是这样进行的:
1997 ÷ 615 = 3 (余 152)
615 ÷ 152 = 4(余7)
152 ÷ 7 = 21(余5)
7 ÷ 5 = 1 (余2)
5 ÷ 2 = 2 (余1)
2 ÷ 1 = 2 (余0)
至此,最大公约数为1
以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数,所以就得出了 1997 和 615 的最大公约数 1。
#include <stdio.h>
int main()
{
int a,b,c;
printf("请输入:");
scanf("%d%d",&a,&b);
if(a<b)
{
c = a;
a = b;
b = c; //确保a≥b
}
while(b != 0)
{
c = b;
b = a%b; //辗转相除:相比第一种思路大大提高了代码的效率(第一种求最大公因数的算法是枚举)
a = c;
}
printf("最大公约数为:%d",a);
return 0;
}
有时候知道某个问题的数学原理但是把它写成代码就有点困难了。
上周考试错题总结
*错题1:单选题
1 分
简单
Which of the following paradigms is based on the mathematical concepts of symbolic logic?
A. Imperative (or procedural)
B. Functional
C. Logic
D. Object-oriented
正确答案: C
你的作答: A
原因:书上说“逻辑编程是基于数理逻辑的原则”,故选C
理解情况:书上说“逻辑编程是基于数理逻辑的原则”,故选C
其他(感悟、思考等)
暂无
学习进度条
博客量(新增/累计) | 代码行数(新增/累计) | 学习时间(新增/累计) | 重要成长 | |
---|---|---|---|---|
目标 | 70 | 3000 | 300 | |
第一周 | 2/2 | 0 | 10/10 | 开始学习写博客 |
第二周 | 1/3 | 300/300 | 20/30 | 学习如何自主预习,初识信息安全专业 |
第三周 | 6/9 | 250/550 | 20/50 | 各种进制表数方法 |
第四周 | 1/10 | 50/600 | 15/65 | 逻辑电路 |
第五周 | 3/13 | 100/700 | 10/75 | 博客排版和编辑走上正轨 |
第六周 | 1/14 | 100/800 | 10/85 | 解决问题的Polya新思想 ,选择结构 |
第七周 | 1/15 | 300/1100 | 20/105 | 抽象数据类型,循环结构 |
第八周 | 2/17 | 150/1250 | 20/125 | 函数的定义,不同范型的编程语言 |
第九周 | 1/18 | 300/1550 | 20/145 | 数组,函数,操作系统,文件系统和目录 |