首页 > 编程语言 >2024-2025-1 20241328 《计算机基础与程序设计》第八周学习总结

2024-2025-1 20241328 《计算机基础与程序设计》第八周学习总结

时间:2024-11-17 21:29:43浏览次数:1  
标签:解释器 函数 int 代码 2024 2025 返回值 20241328 输入

2024-2025-1 20241328 《计算机基础与程序设计》第八周学习总结

作业信息

课程 2024-2025-1-计算机基础与程序设计
作业要求 2024-2025-1计算机基础与程序设计第八周作业
作业目标 功能设计与面向对象设计,面向对象设计过程,面向对象语言三要素,汇编、编译、解释、执行
作业正文 2024-2025-1 20241328 《计算机基础与程序设计》第八周学习总结

教材学习内容总结

7.1 函数的定义

概念:
函数是程序的基本模块,用于完成特定任务。
将重复的代码封装在函数中,提高代码复用性。
语法:
返回值类型 函数名(参数列表) {
// 函数体
return 返回值;
}
注意事项:
每个函数都有一个函数名,用来调用函数。
函数必须在使用前声明或定义。

7.2 函数的声明和调用

函数声明:
也称为函数原型,通常写在 main 函数前。
格式:
返回值类型 函数名(参数类型列表);
作用:告诉编译器函数的返回值和参数信息。
函数调用:
在程序中通过调用语句执行函数的功能。
传递实参给形参,实参的值不会因函数调用而改变(值传递)。

7.3 参数传递

值传递:
默认情况下,C语言的函数通过值传递,形参接收实参的副本。
示例:
void swap(int x, int y) {
int temp = x;
x = y;
y = temp;
}
实参在函数外部不会被改变。
地址传递(指针参数):
通过传递地址改变实参的值。
示例:
void swap(int *x, int *y) {
int temp = *x;
*x = *y;
*y = temp;
}

7.4 函数的返回值

单个返回值:
函数通过 return 返回值,返回值类型由函数的声明决定。
无返回值:
使用 void 类型表示函数无返回值。
示例:
int sum(int a, int b) {
return a + b;
}

7.5 局部变量与全局变量

局部变量:
定义在函数内部,仅在该函数内有效。
生命周期:函数调用时创建,函数结束时销毁。
全局变量:
定义在所有函数外部,整个程序都可以访问。
生命周期:程序运行期间。
变量作用域:
局部变量的作用域在函数内。
全局变量作用域在文件内。

7.6 递归函数

递归的定义:
函数调用自身,直接或间接地实现问题的逐步分解。
递归的要素:
基本情况:递归结束的条件。
递归调用:简化问题。
示例:
int factorial(int n) {
if (n == 1)
return 1;
return n * factorial(n - 1);
}
递归的优缺点:
优点:代码简洁,适合分治问题。
缺点:可能导致栈溢出,效率较低。

7.7 函数的嵌套与嵌套调用

一个函数可以调用另一个函数。
调用顺序:
以栈的形式管理函数的调用和返回,后调用的先执行完毕。
示例:
int square(int x) {
return x * x;
}

int sum_of_squares(int a, int b) {
return square(a) + square(b);
}

7.8 函数指针(如果有提及)

定义:
函数指针用于存储函数的地址。
声明与使用:
返回值类型 (*指针名)(参数类型列表);
示例:
int add(int a, int b) {
return a + b;
}

int (*pFunc)(int, int) = add;

学习要点

理解函数的基本语法。
掌握递归的设计,避免无穷递归。
熟悉函数参数传递机制,特别是值传递和地址传递的区别。
通过函数实现代码模块化和程序结构优化。

基于AI的学习

AI与我:苏格拉底式对话挑战

问题1:什么是汇编语言,为什么它在现代计算机系统中仍然重要?

:汇编语言是介于机器语言和高级语言之间的一种低级语言,使用助记符表示指令,是机器码的可读版本。它的重要性在于:

  1. 接近硬件:汇编语言能够直接操控寄存器、内存和硬件设备,非常适合需要精确控制硬件的场景。
  2. 性能优化:在性能关键的应用中,汇编可以实现更高效的代码,因为开发者可以避开编译器的抽象层并利用特定处理器的指令集。
  3. 系统编程:如操作系统内核、驱动程序和嵌入式系统,汇编语言常用来编写底层代码。
  4. 调试与反汇编:在软件调试和安全分析中,理解汇编语言有助于查看程序的反汇编代码,分析其行为。

问题2:如果汇编语言如此接近硬件,为什么我们还需要高级语言?

:高级语言提供了更高的抽象层次,极大地简化了程序开发的复杂性,原因如下:

  1. 开发效率:高级语言的语法更接近自然语言,便于开发者快速编写和调试代码。
  2. 跨平台性:高级语言通过编译器或虚拟机屏蔽了硬件差异,使得同一段代码能够在多个平台运行。
  3. 代码维护:高级语言更易于阅读、理解和维护,降低了开发成本。
  4. 生产力提升:高级语言内置了丰富的库和框架,使得开发者能专注于业务逻辑而非底层细节。

尽管高级语言在效率上稍逊,但现代编译器的优化已缩小了这一差距。


问题3:高级语言是如何通过编译器将代码转换为低级语言的?

:编译器的转换过程可以分为以下主要阶段:

  1. 词法分析:将源代码分解为基本的词法单元(Token),如关键字、变量名、操作符等。
  2. 语法分析:检查代码的结构是否符合语言的语法规则,并构造语法树。
  3. 语义分析:验证语法树中的语义是否正确,比如变量类型匹配、作用域解析等。
  4. 中间代码生成:生成与具体硬件无关的中间表示,如三地址码。
  5. 优化:优化中间代码以提高性能或减少内存使用。
  6. 目标代码生成:将优化后的中间代码转换为特定硬件的机器代码或汇编代码。

现代编译器还可以进行多层次优化(如循环展开、寄存器分配等)来进一步提高生成代码的效率。


问题4:解释器和编译器的区别是什么?为什么有些语言使用解释器?

:解释器和编译器的主要区别在于代码的处理方式:

  • 编译器:将源代码一次性翻译为目标代码(如机器码),然后执行。生成的程序可以独立运行。

    • 优点:运行速度快(预编译)、独立性强。
    • 缺点:编译耗时长,调试复杂。
  • 解释器:逐行翻译并立即执行源代码,无需生成独立文件。

    • 优点:启动快,适合动态调试和快速开发。
    • 缺点:运行效率较低。

某些语言(如 Python、JavaScript)选择解释器的原因包括:

  1. 动态特性:语言的动态性(如动态类型、动态绑定)更适合通过解释实现。
  2. 快速开发:解释器支持交互式编程,便于调试和测试。
  3. 灵活性:解释器允许运行时修改代码行为,例如动态加载模块或脚本。

问题5:如果解释器效率低,为什么现代语言如 JavaScript 仍然依赖解释器?

:现代语言(如 JavaScript)虽然依赖解释器,但它们也采用了即时编译(JIT)等技术来提升效率:

  1. 混合模式:JavaScript 引擎(如 V8)在解释代码的同时,识别热点代码并将其即时编译为机器码,极大提高执行速度。
  2. 动态优化:解释器可以在运行时根据实际代码行为优化执行路径,而静态编译无法做到。
  3. 灵活性要求:JavaScript 的动态特性(如动态类型、闭包)需要运行时的解释能力。

因此,虽然解释器起到了基础作用,但现代语言通过技术融合大幅弥补了解释的效率缺陷。


问题6:那么,虚拟机(VM)如何结合编译和解释的优势?

:虚拟机通过执行字节码实现了解释器和编译器的结合,其工作方式如下:

  1. 字节码执行

    • 源代码首先被编译为字节码,这是一种中间语言,便于跨平台运行。
    • 虚拟机解释这些字节码指令,逐步翻译为机器指令。
  2. 即时编译(JIT)

    • 虚拟机监测代码执行的热点,将频繁执行的字节码即时编译为机器码。
    • 热点代码的机器码存储在内存中,避免重复解释。
  3. 跨平台支持

    • 虚拟机在不同平台上提供统一的运行时环境,屏蔽底层差异。
    • 例如,Java 的 JVM 和 .NET 的 CLR 都通过虚拟机实现了跨平台的目标。

问题7:总结一下,在汇编、编译、解释、执行的过程中,核心的平衡点是什么?

:核心的平衡点在于:

  1. 效率与灵活性

    • 汇编语言提供最高的硬件效率,但开发效率低。
    • 高级语言和解释器提供更高的开发效率,但牺牲了一定的运行性能。
    • JIT 和动态优化技术帮助在性能和灵活性之间取得平衡。
  2. 跨平台性与性能

    • 字节码和虚拟机通过标准化接口实现跨平台支持。
    • 静态编译和机器码优化能确保关键任务的高效执行。
  3. 开发成本与硬件利用

    • 高级语言降低开发和维护成本,适合大规模软件开发。
    • 对性能要求极高的场景(如嵌入式系统)仍依赖汇编语言和底层优化。

通过这些机制,我们能够实现代码的抽象性、便携性和高性能的有机结合。


评价总结

过程评价

这次苏格拉底式挑战帮助我们通过提问与回答的互动,逐步深入汇编、编译、解释与执行的核心机制。从基础概念到现代语言技术的结合应用,层层递进,逻辑清晰。

收获与总结

  1. 汇编语言:硬件近距离接触工具。
  2. 编译器和解释器:性能与灵活性的关键技术。
  3. 虚拟机与JIT:跨平台支持与动态优化的核心。
  4. 现代平衡:技术融合使开发效率与运行效率并存。

这种对话形式不仅强化了对语言底层机制的认知,也体现了技术演进中的思维权衡与设计智慧。

上周考试错题总结

我:怎么判断一个整数变量输入的是不是整数
ChandlerAi
如果输入的不是整数,scanf 在 C 语言中会出现问题,因为它不能正确解析非整数输入。为了处理这种情况,您可以通过检查 scanf 的返回值来判断用户输入是否符合预期。scanf 会返回成功读取的输入项数量,如果返回值不为 1,说明输入的内容不是一个整数。
这里是改进后的代码,它会处理输入不是整数的情况:
c

include <stdio.h>

int main() {
int x;
int result;

// 提示用户输入
printf("请输入一个整数: ");

// 读取整数,并检查输入是否有效
result = scanf("%d", &x);

// 如果scanf返回值不为1,说明输入的不是一个整数
if (result != 1) {
    printf("输入无效!请输入一个整数。\n");
    // 清空输入缓冲区,防止后续输入继续出错
    while (getchar() != '\n'); // 读取直到遇到换行符
} else {
    // 判断是否是正整数
    if (x > 0) {
        printf("该整数是正整数。\n");
    } else {
        printf("该整数不是正整数。\n");
    }
}

return 0;

}
c

解释:

scanf("%d", &x):用于读取一个整数并存储到 x 变量中。
result = scanf("%d", &x):scanf 返回成功读取的输入项数量,如果输入有效,则返回 1。如果输入的内容不是整数,它将返回 0 或更大(表示失败)。
if (result != 1):如果 scanf 返回值不是 1,说明输入的不是有效的整数。此时会输出错误提示,并使用 getchar() 循环清空输入缓冲区,以防止后续输入继续出错。
如果输入有效整数,程序会继续判断它是否为正整数。

示例:

输入 10,输出 该整数是正整数。
输入 -5,输出 该整数不是正整数。
输入 abc,输出 输入无效!请输入一个整数。

这种处理方式可以保证程序不会因为输入无效的数据而崩溃,并且会给用户适当的反馈。

标签:解释器,函数,int,代码,2024,2025,返回值,20241328,输入
From: https://www.cnblogs.com/caimjblog/p/18551155

相关文章

  • 2024-2025-1 20241304 《计算机基础与程序设计》第8周学习总结
    2024-2025-120241304《计算机基础与程序设计》第8周学习总结作业信息|这个作业属于哪个课程|<2024-2025-1-计算机基础与程序设计)|>|-- |-- ||这个作业要求在哪里|<作业要求的链接>(如2024-2025-1计算机基础与程序设计第八周作业)||这个作业的目标|<学习目标功能设计与面......
  • 2024-2025-1 20241325 王向龙 《计算机程序与设计》第八周学习总结
    2024-2025-120241325《计算机基础与程序设计》第8周学习总结这个作业属于哪个课程2024-2025-1-计算机基础与程序设计这个作业要求在哪里如2024-2025-1计算机基础与程序设计第八周作业这个作业的目标功能设计与面向对象设计>面向对象设计过程面向对象语言三要素......
  • scratch绘制八个正方形 2024年9月scratch四级真题 中国电子学会 图形化编程 scratch四
    目录scratch绘制八个正方形一、题目要求1、准备工作2、功能实现二、案例分析1、角色分析2、背景分析3、前期准备三、解题思路1、思路分析2、详细过程四、程序编写五、考点分析六、推荐资料1、入门基础2、蓝桥杯比赛3、考级资料4、视频课程5、python资料s......
  • NOIP2024加赛5
    暴力操作(opt)拜谢丁真首先题目有一个很明显的性质:我们肯定只会对前\(\cfrac{n+1}{2}\)个数进行操作使它变小。最后的答案很明显没看出来具有二分答案的性质,考虑怎么check。实则就是要判断前\(\cfrac{n+1}{2}\)个数是否都能\(\lemid\)。我们可以方便的找出\(a_i\)变......
  • 2025年前端面试准备html篇
    时光飞逝,一晃已经工作了10年了,2014年一个人背着书包拉着箱子,下火车去做637路公交车的场景历历在目,637路公交车从起点坐到终点,开启了工作的第一站,这趟已经在路上行驶了10年的列车,经历多了多次上车与下车,这10年互联网高速的发展,有幸赶上这个时代,个人也得到了很大的成长。感谢,感......
  • 2024-2025-1 20241411《计算机基础与程序设计》第八周学习总结
    作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP/这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK08这个作业的目标功能设计与面向对象设计,面向对象设计过程,面向对象语言三要素,汇编、编译、解释、执行......
  • 2024-2025-1 20241427 《计算机基础与程序设计》第8周学习总结
    作业信息这个作业属于哪个课程[2024-2025-1-计算机基础与程序设计]这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK08这个作业的目标功能设计与面向对象设计,面向对象设计过程,面向对象语言三要素,汇编、编译、解释、执行作业正文https://......
  • 2024-2025-1 20241319 《计算机基础与程序设计》第八周学习总结
    作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK08这个作业的目标功能设计与面向对象设计面向对象设计过程面向对象语言三要素汇编、编译、解释、执行作业正文https:/......
  • 2024-2025-1 20241327 《计算机基础与程序设计》第八周学习总结
    作业信息|2024-2025-1-计算机基础与程序设计)||--|-|2024-2025-1计算机基础与程序设计第八周作业)||快速浏览一遍教材计算机科学概论(第七版),课本每章提出至少一个自己不懂的或最想解决的问题并在期末回答这些问题|作业正文|https://www.cnblogs.com/shr060414/p/18440575|教......
  • 2024-2025-1 20241316 《计算机基础与程序设计》第八周学习总结
    2024-2025-120241316《计算机基础与程序设计》第八周学习总结作业信息这个作业属于哪个课程[2024-2025-1-计算机基础与程序设计](https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP)这个作业要求在哪里2024-2025-1计算机基础与程序设计第八周作业(https://www.......