作业信息
这个作业属于哪个课程 | <班级的链接>(如2024-2025-1-计算机基础与程序设计) |
---|---|
这个作业要求在哪里 | <作业要求的链接>(如2024-2025-1计算机基础与程序设计第七周作业 |
这个作业的目标 | <写上具体方面>计算机科学概论(第七版)第8章 并完成云班课测试,《C语言程序设计》第6章并完成云班课测试 |
作业正文 | ... 本博客链接 |
教材学习内容总结
《计算机科学概论(第七版)》第8章
- 抽象数据类型:
- 抽象数据类型是对数据及对数据操作的封装,用户只需要关心其逻辑特性而不必了解具体的实现细节。它提供了一种更高层次的数据抽象方式,使得程序的设计和理解更加容易。
- 数据结构:
- 栈:是一种具有特殊操作规则的线性表,遵循“后进先出”(LIFO)的原则。就像一个堆叠的盘子,最后放上去的盘子最先被拿走。在计算机程序中,栈常用于函数调用、表达式求值等场景,例如在程序调用函数时,函数的参数、局部变量等信息会被压入栈中,函数执行结束后再从栈中弹出。
- 队列:也是一种线性表,但遵循“先进先出”(FIFO)的原则。类似于排队买票,先来的人先买到票。队列在计算机系统中常用于任务调度、消息传递等场景,比如操作系统中的任务队列,按照任务到达的先后顺序进行处理。
- 列表:是一种常见的数据结构,可以分为数组实现的列表和链式实现的列表。数组实现的列表在内存中是连续存储的,访问元素的速度较快,但插入和删除元素的操作比较耗时;链式实现的列表则是通过节点之间的链接来存储数据,插入和删除元素相对较方便,但访问元素需要遍历链表。
- 树:是一种分层的数据结构,具有根节点、子节点和叶节点等概念。二叉树是树的一种特殊形式,每个节点最多有两个子节点。二叉树有三种遍历方式,分别是前序遍历(先访问根节点,再遍历左子树,最后遍历右子树)、中序遍历(先遍历左子树,再访问根节点,最后遍历右子树)和后序遍历(先遍历左子树,再遍历右子树,最后访问根节点)。
- 图:图是由节点(顶点)和边组成的数据结构,可以分为有向图和无向图。图在现实生活中有很多应用,比如社交网络中的人际关系图、地图导航中的道路图等。
- 参数传递:介绍了形参和实参的区别。形参是在函数定义时指定的参数,仅在函数内部有效,用于接收调用函数时传递的实际参数的值;实参是在调用函数时传递给函数的具体数值或变量。
- 子程序:子程序是一段可以被其他程序调用的代码模块,它可以提高代码的复用性和可维护性。通过将一些常用的功能封装成子程序,在程序的不同部分可以多次调用,减少了代码的重复编写。
《C 语言程序设计(第四版)》第六章:
一、函数的基本概念
函数是 C 语言程序的基本组成模块,它将一个较大的程序任务分解为若干个较小且相对独立的子任务,每个子任务由一个函数来实现。这样可以提高程序的可读性、可维护性和可复用性。一个函数由函数头和函数体两部分组成。函数头包含函数的返回类型、函数名和参数列表(形式参数);函数体则包含了在函数被调用时执行的一系列语句,用花括号括起来。
二、函数的定义
函数定义的一般形式为:
返回类型 函数名(形式参数列表)
{
声明部分
语句部分
}
例如:
int max(int x, int y)
{
int z;
if (x > y)
z = x;
else
z = y;
return z;
}
这里定义了一个名为 max
的函数,它接受两个 int
类型的参数 x
和 y
,在函数体中比较这两个参数的大小,将较大的值赋给变量 z
,并通过 return
语句返回 z
的值。
三、函数的声明
函数声明的作用是把函数的名字、函数类型以及形参类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查。函数声明可以在主函数之前,也可以在主函数内部,但在调用函数之前。其一般形式为:
返回类型 函数名(参数类型列表);
例如:int max(int, int);
如果函数在主函数之前定义,则可以不进行声明,因为编译系统在编译主函数之前已经知道了函数的相关信息。
四、函数的参数传递
- 值传递:
在函数调用时,将实参的值复制一份传递给形参。形参和实参分别占用不同的内存单元,对形参的修改不会影响实参的值。例如:
#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
函数中对 a
和 b
的修改不会影响到 main
函数中的 x
和 y
。
五、函数的返回值
函数可以返回一个值给调用它的函数。返回值的类型由函数定义时的返回类型指定。在函数体中使用 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 时停止递归。
八、变量的作用域和生存期
-
作用域:
- 局部变量:在函数内部或复合语句内部定义的变量称为局部变量,其作用域仅限于定义它的函数或复合语句内部。
- 全局变量:在函数外部定义的变量称为全局变量,其作用域从定义位置开始到源文件结束,可以被多个函数共享。但过多使用全局变量可能会导致程序的可读性和可维护性变差,并且容易引起命名冲突等问题。
-
生存期:
- 动态存储变量:局部变量属于动态存储变量,在函数调用时分配内存空间,函数执行结束时释放内存空间。
- 静态存储变量:使用
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 |