作业信息
|这个作业属于哪个课程|https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP|
|这个作业要求在哪里|https://www.cnblogs.com/rocedu/p/9577842.html#WEEK08|
|这个作业的目标|功能设计与面向对象设计,面向对象设计过程,面向对象语言三要素,汇编、编译、解释、执行|
|作业正文| https://www.cnblogs.com/118qa/p/18550511 |
教材学习内容总结
本周我们学习了数组,以下是对数组相关知识的总结。
数组的定义
数组是一组相同类型元素的集合。在 C 语言中,定义数组的基本语法是数据类型 数组名[数组大小];。例如int arr[5];,这里定义了一个名为arr的整型数组,它可以存储 5 个整数。
数组的下标从 0 开始。对于上述arr数组,其有效下标范围是 0 - 4。可以通过arr[0]、arr[1]等来访问数组中的各个元素。
数组的初始化
可以在定义数组时进行初始化。例如int a[3]={1,2,3};,这样就将数组a的三个元素分别初始化为 1、2、3。
如果初始化时提供的初始值个数少于数组大小,剩余的元素会被自动初始化为 0(对于数值类型)。如int b[5]={1,2};,此时b[2]、b[3]和b[4]的值都为 0。
也可以不指定数组大小,让编译器根据初始化的值个数来确定数组大小。例如int c[]={4,5,6};,这里编译器会自动将数组c的大小确定为 3。
一维数组的操作
访问元素:可以通过下标来访问数组中的元素,并且可以对元素进行赋值、读取等操作。例如:
int array[3];
array[0]=10;
int value = array[0];
遍历数组:通常使用循环来遍历数组。最常见的是使用for循环,例如:
int arr[5] = {1, 2, 3, 4, 5};
for(int i = 0; i < 5; i++){
printf("%d ", arr[i]);
}
二维数组
定义:二维数组可以看作是一个矩阵,其定义语法为数据类型 数组名[行数][列数];。例如int matrix[3][4];定义了一个 3 行 4 列的二维整型数组。
初始化:可以在定义时初始化二维数组。例如int two_d[2][3]={{1,2,3},{4,5,6}};,这里将two_d数组的第一行初始化为 1、2、3,第二行初始化为 4、5、6。
访问元素:通过两个下标来访问二维数组中的元素,例如two_d[1][2]访问的是第二行第三列的元素(注意下标从 0 开始)。
遍历二维数组:一般使用嵌套的循环。外层循环控制行数,内层循环控制列数。例如:
for(int i = 0; i < 2; i++){
for(int j = 0; j < 3; j++){
printf("%d ", two_d[i][j]);
}
printf("\n");
}
字符数组与字符串
字符数组是用来存储字符的数组。例如char str[6];可以存储 6 个字符。
字符串是以 '\0'(空字符)结尾的字符数组。在 C 语言中,有两种常见的初始化字符串的方式。一种是使用字符常量初始化,如char s1[] = "Hello";,编译器会自动在字符串末尾添加 '\0'。另一种是逐个字符初始化,例如:
char s2[6];
s2[0]='H'; s2[1]='e'; s2[2]='l'; s2[3]='l'; s2[4]='o'; s2[5]='\0';
常用的字符串处理函数有strcpy(字符串复制)、strcat(字符串连接)、strcmp(字符串比较)等。但使用这些函数时要注意字符数组的大小,避免缓冲区溢出。
数组作为函数参数
数组名作为函数参数时,实际上传递的是数组的首地址。例如
void printArray(int arr[], int size){
for(int i = 0; i < size; i++){
printf("%d ", arr[i]);
}
}
int main(){
int a[3]={1,2,3};
printArray(a, 3);
return 0;
}
在函数内部对数组元素的修改会影响到原始数组。因为函数接收到的是数组的存储地址,通过这个地址可以访问和修改数组中的实际元素。
教材学习中的问题和解决过程
问题:如何将数组与函数联系在一起?
AI:数组作为函数参数传递
传递方式:在 C 语言中,数组名作为函数参数时,实际上传递的是数组的首地址。这意味着函数可以通过这个地址访问和修改数组中的元素。例如,定义一个函数来打印整型数组的元素:
注意事项:在函数参数列表中,int arr[]和int *arr是等价的声明方式,都表示接收一个指向整型的指针。这种方式使得函数能够高效地访问数组,因为不需要复制整个数组的内容到函数中。但是,这也意味着在函数内部对数组元素的修改会影响到原始数组。
函数返回数组(不常见且有一定限制)
直接返回数组是不允许的:在 C 语言中,函数不能直接返回一个数组。因为数组名是一个指针常量,它代表数组的首地址,函数结束后,其内部的局部数组的存储空间会被释放,返回的数组地址可能会指向无效的内存区域。
返回指针指向数组:可以返回一个指针,这个指针指向一个在函数外部定义的数组或者是通过动态内存分配(如malloc函数)在堆上创建的数组。例如:
注意内存管理:当返回一个指针指向动态分配的数组时,需要在合适的时候(通常是在不再使用数组后)使用free函数来释放内存,以避免内存泄漏。
利用数组和函数实现特定功能
排序功能:可以编写一个函数来对数组进行排序。例如,实现简单的冒泡排序函数:
查找功能:编写一个函数在数组中查找特定元素。例如,线性查找函数:
问题:多维数组如何使用?
AI:二维数组的定义与初始化
定义:二维数组可以看作是一个矩阵,它的定义语法是数据类型 数组名[行数][列数];。例如,int matrix[3][4];定义了一个 3 行 4 列的二维整型数组。这个数组可以用来存储 3 组,每组 4 个整型数据。
初始化:
按行初始化:可以在定义时按行对二维数组进行初始化。例如,int two_d[2][3] = {{1, 2, 3}, {4, 5, 6}};,这里将two_d数组的第一行初始化为 1、2、3,第二行初始化为 4、5、6。
逐个元素初始化(不推荐用于大型数组):也可以逐个元素地进行初始化,如int another[2][3]; another[0][0]=1; another[0][1]=2;等,但这种方式比较繁琐,尤其是对于大型数组。
部分初始化:如果初始化时提供的初始值个数少于数组元素总数,剩余的元素会被自动初始化为 0(对于数值类型)。例如,int partial[3][3] = {{1, 2}, {3}};,第一行初始化为 1、2、0,第二行初始化为 3、0、0,第三行全部为 0。
二维数组元素的访问
访问单个元素:通过两个下标来访问二维数组中的元素,第一个下标表示行,第二个下标表示列,并且下标都是从 0 开始。例如,在上述two_d数组中,two_d[1][2]访问的是第二行第三列的元素(也就是 6)。
遍历二维数组:
使用嵌套循环:一般使用嵌套的for循环来遍历二维数组。外层循环控制行数,内层循环控制列数。例如:
应用场景示例:在处理矩阵运算(如矩阵加法、乘法)或者图像处理(处理图像像素矩阵)等场景中,这种遍历方式非常有用。例如,两个二维数组matrix1和matrix2相加,结果存储在result数组中,可以这样实现:
三维数组及更高维数组
定义与初始化:
定义:三维数组的定义语法为数据类型 数组名[层数][行数][列数];。例如,int three_d[2][3][4];定义了一个三维数组,它可以看作是 2 个二维数组,每个二维数组是 3 行 4 列。
初始化:初始化方式与二维数组类似,但需要更多的嵌套括号来表示各维度。例如,int cube[2][2][2] = {{{1, 2}, {3, 4}}, {{5, 6}, {7, 8}}};。
元素访问与遍历:
访问单个元素:通过三个下标来访问三维数组中的元素,例如three_d[1][2][3],第一个下标表示层,第二个表示行,第三个表示列。
遍历:使用三层嵌套的循环来遍历三维数组。一般外层循环控制层数,中间层循环控制行数,内层循环控制列数。例如:
应用场景:在一些科学计算(如三维空间数据建模)或者高级数据存储(如存储 RGB 颜色空间的图像数据,其中第三维可以表示颜色通道)等场景中会用到三维数组。更高维数组的使用场景相对较少,但在一些复杂的数学模型或者数据存储结构中可能会出现。
基于AI的学习
其他
本周我们进行了测试,让我认识到,对于编程的知识漏洞还有很多,需要继续加油。