学期:2024-2025-1 学号:20241303 《计算机基础与程序设计》第七周学习总结

作业信息

这个作业属于哪个课程 <班级的链接>(如2024-2025-1-计算机基础与程序设计
这个作业要求在哪里 <作业要求的链接>(如2024-2025-1计算机基础与程序设计第七周作业
这个作业的目标 <写上具体方面>计算机科学概论(第七版)第8章 并完成云班课测试,《C语言程序设计》第6章并完成云班课测试
作业正文 ... 本博客链接

教材学习内容总结

《计算机科学概论(第七版)》第8章

  1. 抽象数据类型
    • 抽象数据类型是对数据及对数据操作的封装,用户只需要关心其逻辑特性而不必了解具体的实现细节。它提供了一种更高层次的数据抽象方式,使得程序的设计和理解更加容易。
  2. 数据结构
    • :是一种具有特殊操作规则的线性表,遵循“后进先出”(LIFO)的原则。就像一个堆叠的盘子,最后放上去的盘子最先被拿走。在计算机程序中,栈常用于函数调用、表达式求值等场景,例如在程序调用函数时,函数的参数、局部变量等信息会被压入栈中,函数执行结束后再从栈中弹出。
    • 队列:也是一种线性表,但遵循“先进先出”(FIFO)的原则。类似于排队买票,先来的人先买到票。队列在计算机系统中常用于任务调度、消息传递等场景,比如操作系统中的任务队列,按照任务到达的先后顺序进行处理。
    • 列表:是一种常见的数据结构,可以分为数组实现的列表和链式实现的列表。数组实现的列表在内存中是连续存储的,访问元素的速度较快,但插入和删除元素的操作比较耗时;链式实现的列表则是通过节点之间的链接来存储数据,插入和删除元素相对较方便,但访问元素需要遍历链表。
    • :是一种分层的数据结构,具有根节点、子节点和叶节点等概念。二叉树是树的一种特殊形式,每个节点最多有两个子节点。二叉树有三种遍历方式,分别是前序遍历(先访问根节点,再遍历左子树,最后遍历右子树)、中序遍历(先遍历左子树,再访问根节点,最后遍历右子树)和后序遍历(先遍历左子树,再遍历右子树,最后访问根节点)。
    • :图是由节点(顶点)和边组成的数据结构,可以分为有向图和无向图。图在现实生活中有很多应用,比如社交网络中的人际关系图、地图导航中的道路图等。
  3. 参数传递:介绍了形参和实参的区别。形参是在函数定义时指定的参数,仅在函数内部有效,用于接收调用函数时传递的实际参数的值;实参是在调用函数时传递给函数的具体数值或变量。
  4. 子程序:子程序是一段可以被其他程序调用的代码模块,它可以提高代码的复用性和可维护性。通过将一些常用的功能封装成子程序,在程序的不同部分可以多次调用,减少了代码的重复编写。

《C 语言程序设计(第四版)》第六章:

一、函数的基本概念

函数是 C 语言程序的基本组成模块,它将一个较大的程序任务分解为若干个较小且相对独立的子任务,每个子任务由一个函数来实现。这样可以提高程序的可读性、可维护性和可复用性。一个函数由函数头和函数体两部分组成。函数头包含函数的返回类型、函数名和参数列表(形式参数);函数体则包含了在函数被调用时执行的一系列语句,用花括号括起来。

二、函数的定义

函数定义的一般形式为:
返回类型 函数名(形式参数列表)
{
声明部分
语句部分
}

例如:

int max(int x, int y)
{
    int z;
    if (x > y)
        z = x;
    else
        z = y;
    return z;
}

这里定义了一个名为 max 的函数,它接受两个 int 类型的参数 xy,在函数体中比较这两个参数的大小,将较大的值赋给变量 z,并通过 return 语句返回 z 的值。

三、函数的声明

函数声明的作用是把函数的名字、函数类型以及形参类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查。函数声明可以在主函数之前,也可以在主函数内部,但在调用函数之前。其一般形式为:
返回类型 函数名(参数类型列表);

例如:int max(int, int);

如果函数在主函数之前定义,则可以不进行声明,因为编译系统在编译主函数之前已经知道了函数的相关信息。

四、函数的参数传递

  1. 值传递
    在函数调用时,将实参的值复制一份传递给形参。形参和实参分别占用不同的内存单元,对形参的修改不会影响实参的值。例如:
#include <stdio.h>

void swap(int a, int b)
{
    int temp;
    temp = a;
    a = b;
    b = temp;
    printf("在 swap 函数中:a = %d, b = %d\n", a, b);
}

int main()
{
    int x = 3, y = 5;
    swap(x, y);
    printf("在 main 函数中:x = %d, y = %d\n", x, y);
    return 0;
}

在这个例子中,swap 函数试图交换两个参数的值,但由于是值传递,在 swap 函数中对 ab 的修改不会影响到 main 函数中的 xy

五、函数的返回值

函数可以返回一个值给调用它的函数。返回值的类型由函数定义时的返回类型指定。在函数体中使用 return 语句返回值,return 语句后面可以跟一个表达式,该表达式的值就是函数的返回值。当函数执行到 return 语句时,函数立即结束并将返回值带回调用处。如果函数不需要返回值,则将返回类型定义为 void。例如:

double average(int a, int b)
{
    return (double)(a + b) / 2;
}

这个函数计算两个整数的平均值并以 double 类型返回。

六、函数的嵌套调用

C 语言中函数可以嵌套调用,即一个函数在执行过程中可以调用另一个函数。例如:

#include <stdio.h>

int f1(int x)
{
    return x * x;
}

int f2(int x)
{
    return f1(x) + 1;
}

int main()
{
    int a = 3;
    printf("结果:%d\n", f2(a));
    return 0;
}

在这个例子中,main 函数调用 f2 函数,f2 函数又调用 f1 函数来完成特定的计算。

七、函数的递归调用

函数直接或间接调用自身称为递归调用。递归函数通常包含两个部分:递归部分和终止条件。递归部分用于将问题不断分解为规模更小的子问题;终止条件用于在问题规模足够小时停止递归,防止无限递归。例如计算阶乘的递归函数:

int factorial(int n)
{
    if (n == 0 || n == 1)
        return 1;
    else
        return n * factorial(n - 1);
}

在计算 n 的阶乘时,不断调用自身计算 n - 1 的阶乘,直到 n 为 0 或 1 时停止递归。

八、变量的作用域和生存期

  1. 作用域

    • 局部变量:在函数内部或复合语句内部定义的变量称为局部变量,其作用域仅限于定义它的函数或复合语句内部。
    • 全局变量:在函数外部定义的变量称为全局变量,其作用域从定义位置开始到源文件结束,可以被多个函数共享。但过多使用全局变量可能会导致程序的可读性和可维护性变差,并且容易引起命名冲突等问题。
  2. 生存期

    • 动态存储变量:局部变量属于动态存储变量,在函数调用时分配内存空间,函数执行结束时释放内存空间。
    • 静态存储变量:使用 static 关键字修饰的局部变量或全局变量属于静态存储变量。静态局部变量在函数第一次调用时初始化,其生存期延长至整个程序运行期间,但作用域仍局限于函数内部;静态全局变量的作用域限制在定义它的源文件内,生存期为整个程序运行期间。

通过对函数相关知识的深入理解和掌握,可以编写出结构更加清晰、功能更加强大且易于维护的 C 语言程序。

基于AI的学习

代码调试中的问题和解决过程

问题:输入1个字符,若为字母,输出"Character",若为数字,输出"Number",否则输出"Not character or number"。
解决方法:寻找AI的帮助,了解到了新的知识
调用新的函数

#include<stdio.h>
 #include<ctype.h>
 int main()
{
char a;
scanf("%c",&a);
if(isalpha(a))
printf("character");
else if(isdigit(a))
printf("number");
else
printf("not character or number");
return 0;
}

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第五周 900/1500 1/2 20/30
第六周 1100/1600 1/4 18/38
第七周 1300/1800 1/7 22/60
第八周 1300/1300 0/9 30/90
posted @ 2024-11-10 11:49  段蕾  阅读(7)  评论(0编辑  收藏  举报