学期(2024-2025-1) 学号(20241311) 《计算机基础与程序设计》第六周学习总结
作业信息
这个作业属于哪个课程 | <班级的链接>(如2024-2025-1-计算机基础与程序设计) |
---|---|
这个作业要求在哪里 | <作业要求的链接>(如2024-2025-1计算机基础与程序设计第六周作业) |
这个作业的目标 | <写上具体方面> |
作业正文 | ... 本博客链接 |
教材学习内容总结
以下是《C语言程序设计》第五版第五章的学习总结:
一、算法相关
- 算法的概念与特性
- 算法具有明确性,即每个步骤都清晰、无歧义;有限性,在有限步骤内结束并给出结果;有输入(算法开始所需的初始数据或条件)和输出(算法执行完毕后的结果)等特点。
- 算法的描述方式有多种,自然语言是用普通语言描述算法的每一步骤;流程图通过图形化方式表示算法的步骤和流程;伪代码是介于自然语言和编程语言之间的描述方式,易于理解且便于编程实现;编程语言则是直接用编程语言实现算法以便计算机执行。
- 关系运算符与关系表达式
- 关系运算符(比较运算符):关系表达式是用关系运算符把两个表达式联系起来的式子。关系表达式成立其值为真(用1代表),否则为假(用0代表)。例如“n%2!=0”可表示n为奇数。
二、条件语句相关
- 单分支控制的条件语句
- 单分支选择结构常用于比较大小类程序。例如通过判断“if(a > b)”来确定最大值,如代码示例:
#include <stdio.h>
int main(void) {
int a, b, max;
printf("Input a, b:");
scanf("%d, %d", &a, &b);
if (a > b)
max = a;
if (a = b)
max = b;
printf("max=%d\n", max);
return 0;
}
- 当问题所需考虑的方面不止一种简单情况时,单分支结构可能不适用。
- 双分支控制的条件语句
- 双分支结构使用“if - else”语句。例如:
#include <stdio.h>
int main(void) {
int a, b, max;
printf("Input a, b:");
scanf("%d, %d", &a, &b);
if (a > b)
max = a;
else
max = b;
printf("max=%d\n", max);
return 0;
}
- 多分支控制的条件语句
- 这种语句允许根据多个条件判断执行不同的代码块。在这中间会涉及到条件运算符(C语言唯一的三元运算符),例如“表达式1?表达式2:表达式3”,可用于求取两数的最大值等操作。
通过第五章的学习,对C语言中的算法描述、关系运算以及不同分支结构的条件语句有了更深入的理解,这些内容是编写复杂逻辑程序的重要基础。
计算机科学概论第七版第五章学习总结
操作系统基础
- 操作系统的角色
系统软件与应用软件:系统软件如操作系统,直接与硬件交互,管理计算机资源;应用软件解决具体问题,运行于操作系统之上。
操作系统(Operating System, OS):最基本的系统软件,管理计算机资源并为用户和其他软件提供交互界面。 - 资源管理
内存管理:涉及多道程序设计、内存分配与回收、地址转换等。
进程管理:包括进程创建、执行、同步、通信和调度。
CPU调度:决定哪个进程可以访问CPU以便执行。 - 批处理与分时系统
批处理系统:无用户交互,作业成批处理。
分时系统:多用户同时使用计算机,系统快速在用户作业间切换。
数据结构基础 - 数据结构的重要性
数据组织方式:影响算法效率,合理的数据结构选择可以提高性能。 - 线性与非线性数据结构
线性数据结构:如数组、链表,数据元素之间存在一对一关系。
非线性数据结构:如树、图,数据元素之间存在一对多或多对多关系。 - 常见数据结构
数组:连续存储的相同类型数据元素集合。
链表:由节点组成的数据结构,节点包含数据和指向下一个节点的指针。
栈和队列:先进后出和先进先出的数据结构。
树和图:层次和网络结构的数据组织方式。
编程语言基础 - 编程语言的发展
低级语言到高级语言:从机器语言到C、Java等高级语言的发展。 - 编程范式
面向过程、面向对象、函数式编程:不同的编程范式适用于不同的问题解决和程序设计。
教材学习中的问题和解决过程(先问 AI)
(一个模板:我看了这一段文字 (引用文字),有这个问题 (提出问题)。 我查了资料,有这些说法(引用说法),根据我的实践,我得到这些经验(描述自己的经验)。 但是我还是不太懂,我的困惑是(说明困惑)。【或者】我反对作者的观点(提出作者的观点,自己的观点,以及理由)。 )
- 问题1:如何使用预处理器创建条件编译代码?
- 问题1解决方案:在C语言中,预处理器提供了一系列的指令,允许在编译之前对代码进行处理,其中包括条件编译。条件编译可以让开发者根据不同的条件包含或排除代码块,这在处理不同平台兼容性或功能开关时非常有用。以下是如何使用预处理器创建条件编译代码的基本方法:
#ifdef
和#ifndef
指令
#ifdef 标识符
:如果宏(标识符)已经定义,则编译下面的代码块。#ifndef 标识符
:如果宏(标识符)没有定义,则编译下面的代码块。
#ifdef DEBUG
printf("Debug information: variable x = %d\n", x);
#endif
#ifndef RELEASE
printf("Release mode is not active.\n");
#endif
#if
和#endif
指令
#if 条件
:如果条件为真(非零),则编译下面的代码块。#elif
:类似于C语言中的else if
,用于多个条件的判断。#else
:如果前面的#if
或#elif
条件都不满足,则编译#else
下的代码块。
#if defined(UNIX)
// UNIX-specific code here
#elif defined(WINDOWS)
// Windows-specific code here
#else
#error "Unknown operating system"
#endif
#define
指令
#define 标识符
:定义一个宏(标识符),在预处理阶段,预处理器会将代码中所有出现的该标识符替换为特定的值或代码。
#define USE_FEATURE_X
#if defined(USE_FEATURE_X)
// Code that uses feature X
#endif
#undef
指令
#undef 标识符
:取消定义一个宏(标识符)。
#define DEBUG
#ifdef DEBUG
// Debug-specific code
#endif
#undef DEBUG
#ifndef DEBUG
// Code that does not use debug features
#endif
#pragma
指令
#pragma
是一种特定于编译器的预处理指令,可以用来实现编译器特定的条件编译。
#pragma once // Prevents multiple inclusions of the same header file
#ifdef _MSC_VER // Microsoft Visual C Compiler
// Microsoft-specific code
#elif defined(__GNUC__) // GNU Compiler Collection
// GCC-specific code
#endif
使用这些预处理器指令,你可以创建灵活的条件编译代码,以适应不同的编译环境和需求。
- 问题2:结构体和联合(Union)有什么区别?
- 问题2解决方案:结构体(struct)和联合(union)在C语言中都是复合数据类型,它们用于将多个不同类型的数据项组合成一个单一的类型。尽管它们有相似之处,但它们之间存在一些关键的区别:
结构体(struct)
- 内存分配:结构体为每个成员分配独立的内存空间。结构体的总大小是所有成员大小的总和,同时还要满足对齐要求。
- 成员访问:结构体的所有成员可以同时存在,并且可以被同时访问。
- 内存效率:由于每个成员都有其自己的内存空间,结构体可能不如联合那样节省空间。
- 使用场景:结构体适用于需要保存多个不同类型数据项的情况,且这些数据项需要同时被访问。
联合(Union)
- 内存分配:联合的所有成员共享同一块内存空间。无论联合有多少个成员,只分配足够的内存来存放最大的那个成员。
- 成员访问:在任何时候,联合只能存储一个成员的值。对一个成员的访问会覆盖其他成员的值。
- 内存效率:由于所有成员共享内存空间,联合在空间利用上比结构体更高效,特别是在只需要访问一个成员时。
- 使用场景:联合适用于当多个数据项不需要同时被访问,且只关心其中一个数据项的大小时。
总结
- 占用空间:结构体为每个成员分配空间,而联合只分配足够的空间给最大的成员。
- 数据持久性:结构体的所有成员值都可以持久保存,而联合的成员值在新的赋值后会被覆盖。
- 访问限制:结构体可以同时访问所有成员,联合在任何时刻只能访问一个成员。
选择使用结构体还是联合取决于具体的应用需求。如果需要存储多个数据项并且它们都需要被独立访问,结构体是更好的选择。如果只需要在任何时刻存储一个数据项,并且想要节省空间,则联合是更合适的选择。
- ...
基于AI的学习
我正在学习用于单分支控制的知识点请你以苏格拉底的方式对我进行提问,一次一个问题
Kimi(moonshot-v1-128k)
当然可以,让我们以苏格拉底式的提问法来探讨单分支控制的知识点。
问题1:你能告诉我什么是单分支控制结构吗?
表示当条件p成立时,执行A操作,否则执行b操作;如果b操作为空则不执行
Kimi(moonshot-v1-128k)
问题2: 那么,你能否描述一下,在编程中我们如何表达这种“当条件P成立时执行A操作”的逻辑?
if(表达式p)语句a
Kimi(moonshot-v1-128k)
问题3: 很好,你已经描述了条件成立时执行的操作。那么,如果条件P不成立时,我们通常希望程序做些什么呢?
不执行任何操作直接执行后面的语句
Kimi(moonshot-v1-128k)
问题4: 我明白了,如果条件P不成立,程序将不执行任何操作并继续执行后续的语句。那么,你能描述一下在这种情况下,程序的控制流程是如何变化的吗?
跳过该语句执行下一步
Kimi(moonshot-v1-128k)
问题5: 你提到了“跳过该语句执行下一步”,这是否意味着在单分支控制结构中,如果条件不满足,程序会忽略掉if语句块中的代码,直接执行if语句块之后的代码?
是
Kimi(moonshot-v1-128k)
问题6: 既然如此,你能给我一个简单的例子来说明这种单分支控制结构是如何在实际代码中工作的吗?
if(a>b)max=a;该语句中如果满足a>b则将a的值赋值
Kimi(moonshot-v1-128k)
问题7: 非常好,你提供了一个实际的例子。那么,如果a不大于b,根据你的代码,会发生什么呢?max会被赋什么值?
无如何值
Kimi(moonshot-v1-128k)
问题8: 既然当a不大于b时,max不会被赋予任何值,那么在这种情况下,我们如何确保max总是被赋予一个确定的值,无论a和b的关系如何?
再加一个语句
Kimi(moonshot-v1-128k)
问题9: 我明白了,你提到了“再加一个语句”。那么,这个额外的语句应该放在if语句的哪里,以确保无论a和b的关系如何,max都能被正确赋值?
后面
Kimi(moonshot-v1-128k)
问题10: 那么,你能否具体说明这个额外的语句应该是什么,以及它如何确保max在任何情况下都被赋值?
一个新的if语句
Kimi(moonshot-v1-128k)
问题11: 很好,你提到了使用一个新的if语句。那么,这个新的if语句应该如何编写,以确保当a不大于b时,max也能被正确赋值?
if(a<=b)max=b
Kimi(moonshot-v1-128k)
问题12: 现在我们有两个if语句,一个处理a > b的情况,另一个处理a <= b的情况。那么,这样设计的目的是什么?我们为什么不能只用一个if语句来实现同样的功能?
为了使全部情况max都有确定的值;一个语句只能表示单分支
Kimi(moonshot-v1-128k)
问题13: 你正确地指出了一个if语句只能处理单分支的情况,并且通过两个if语句确保了max在所有情况下都有确定的值。那么,如果我们想要更简洁地处理这种情况,有没有其他控制结构可以只用一个条件判断来实现同样的功能?
双分支语句if else
代码调试中的问题和解决过程
- 问题1:使用scanf函数时报错
- 问题1解决方案:未使用取地址符&
- 问题2:函数冗余,重复代码多
- 问题2解决方案:修改多分支语句的表达,精简语句
- ...
代码托管
(statistics.sh脚本的运行结果截图)
上周考试错题总结
无
其他(感悟、思考等,可选)
菜就多练
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 | |
第二周 | 300/500 | 2/4 | 18/38 | |
第三周 | 500/1000 | 3/7 | 22/60 | |
第四周 | 300/1300 | 2/9 | 30/90 | |
第五周 | 1000/1300 | 2/9 | 30/90 | |
第四周 | 1000/1300 | 2/9 | 30/90 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:XX小时
-
实际学习时间:XX小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)
参考资料
- 《计算机科学概论(第七版)》
- ...