笔记5

一:数组初体验

生活中我们经常会用到容器,比如我们去超市购物需要使用购物袋装购买的商品。

同样我们在程序中也需要容器,只不过该容器有点特殊,它在程序中是一块连续的,大小固定并且里面的数据类型一致的内存空间,它还有个好听的名字叫数组。可以将数组理解为大小固定,所放物品为同类的一个购物袋,在该购物袋中的物品是按一定顺序放置的。

我们来看一下如何声明一个数组:

数据类型 数组名称[长度];

数组只声明也不行啊,看一下数组是如何初始化的。说到初始化,C语言中的数组初始化是有三种形式的,分别是:

1、 数据类型 数组名称[长度n] = {元素1,元素2…元素n};

2、 数据类型 数组名称[] = {元素1,元素2…元素n};

3、 数据类型 数组名称[长度n]; 数组名称[0] = 元素1; 数组名称[1] = 元素2; 数组名称[n-1] = 元素n;

我们将数据放到数组中之后又如何获取数组中的元素呢?

获取数组元素时: 数组名称[元素所对应下标];

如:初始化一个数组 int arr[3] = {1,2,3}; 那么arr[0]就是元素1。

注意:

1、数组的下标均以0开始;

2、数组在初始化的时候,数组内元素的个数不能大于声明的数组长度;

3、如果采用第一种初始化方式,元素个数小于数组的长度时,多余的数组元素初始化为0;

4、在声明数组后没有进行初始化的时候,静态(static)和外部(extern)类型的数组元素初始化元素为0,自动(auto)类型的数组的元素初始化值不确定。

二:数组的遍历

当我们去超市回来买了一堆东西,就想要是有个机器人能帮我把东西拿出来放好,就完美了。

那么在程序中,数组就可以采用循环的方式将每个元素遍历出来,而不用人为的每次获取指定某个位置上的元素,例如我们用for循环遍历一个数组:

img

数组遍历时要注意以下几点:

1、最好避免出现数组越界访问,循环变量最好不要超出数组的长度,比如:

img

2、C语言的数组长度一经声明,长度就是固定,无法改变,并且C语言并不提供计算数组长度的方法。

由于C语言是没有检查数组长度改变或者数组越界的这个机制,可能会在编辑器中编译并通过,但是结果就不能肯定了,因此还是不要越界或者改变数组的长度

三:数组作为函数参数

前面我们学过,变量可以当作参数是吧!这里数组也是可以当做函数的参数滴,啊?什么?你问数组咋当参数?请看下面知识。

数组可以由整个数组当作函数的参数,也可以由数组中的某个元素当作函数的参数:

1、整个数组当作函数参数,即把数组名称传入函数中,例如:

img

2、数组中的元素当作函数参数,即把数组中的参数传入函数中,例如:

img

数组作为函数参数时注意以下事项:

1、数组名作为函数实参传递时,函数定义处作为接收参数的数组类型形参既可以指定长度也可以不指定长度。

2、数组元素作为函数实参传递时,数组元素类型必须与形参数据类型一致

四:数组的应用(一)

话说,小明(咋又是他)班级年终考试成绩出来了,老师看着这一堆的数,犯愁了,我怎么找最高的分数呢。。。

那么有数组在就好办多了,我们可以将所有的成绩放到数组中,然后用数组排序一下,就可以找到最高的分了;话又说回来了,数组排序?数组咋排序?别着急往下看。

排序的方法呢有很多,这里小编给大家介绍一种比较经典且比较容易掌握的排序方法:冒泡排序

以升序排序为例冒泡排序的思想:**相邻元素两两比较,将较大的数字放在后面,直到将所有数字全部排序。**就像小学排队时按大小个排一样,将一个同学拉出来和后面的比比,如果高就放后面,一直把队伍排好。

班级成绩中,老师把前十名的挑出来了,用冒泡排序把分数排了一下

img

运行结果为

img

五:数组的应用(二)

当我们购物之后,拎着购物袋回到家,会一一检查购物袋中的物品看是否缺少或者都是想购之物。

那么应用到程序中,可以使用数组查找功能,看看是否存在该数据,如果存在并返回该元素的下标。数组元素的查找也有很多查找方式,但是我们这里可以最简单的方式,通过遍历实现数组元素的查找。

比如以下程序实现在指定数组中查找指定元素的功能,如果找到该元素返回该元素的下标,否则返回-1:

img

六:字符串与数组

字符串是神马?字符串就是由多个字符组合而成的一段话。

在C语言中,是没有办法直接定义字符串数据类型的,但是我们可以使用数组来定义我们所要的字符串。一般有以下两种格式:

1、char 字符串名称[长度] = “字符串值”;

2、char 字符串名称[长度] = {‘字符1’,‘字符2’,…,‘字符n’,’\0’};

注意:

1、[]中的长度是可以省略不写的;

2、采用第2种方式的时候最后一个元素必须是’\0’,’\0’表示字符串的结束标志;

3、采用第2种方式的时候在数组中不能写中文

在输出字符串的时候要使用:printf(“%s”,字符数组名字);或者puts(字符数组名字);。例如:

img

运行结果为

img

七:字符串函数

常用的字符串函数如下:

img

使用字符串函数注意以下事项:

1、strlen()获取字符串的长度,在字符串长度中是不包括‘\0’而且汉字和字母的长度是不一样的。比如:

img

2、strcmp()在比较的时候会把字符串先转换成ASCII码再进行比较,返回的结果为0表示s1和s2的ASCII码相等,返回结果为1表示s1比s2的ASCII码大,返回结果为**-1表示s1比s2的ASCII码小**,例如:

img

3、strcpy()拷贝之后会覆盖原来字符串且不能对字符串常量进行拷贝,比如:

img

4、strcat在使用时s1与s2指的内存空间不能重叠,且s1要有足够的空间来容纳要复制的字符串,如:

img

八:多维数组

多维数组就好比去超市买东西,用购物袋把所买商品分类存放,然后将所有的购物袋放到一个大的购物袋中,这样就形成了一个多维数组了。

多维数组的定义格式是:

数据类型 数组名称[常量表达式1][常量表达式2]…[常量表达式n];

例如:img这样定义了一个名称为num数据类型为int二维数组。其中第一个[3]表示第一维下标的长度,就像购物时分类存放的购物;第二个[3]表示第二维下标的长度,就像每个购物袋中的元素。

我们可以把上面的数组看作一个3×3的矩阵,如下图:

img

多维数组的初始化与一维数组的初始化类似也是分两种:

1、数据类型 数组名称[常量表达式1][常量表达式2]…[常量表达式n] = {{值1,…,值n},{值1,…,值n},…,{值1,…,值n}};

2、数据类型 数组名称[常量表达式1][常量表达式2]…[常量表达式n]; 数组名称[下标1][下标2]…[下标n] = 值;

多维数组初始化要注意以下事项:

1、采用第一种始化时数组声明必须指定列的维数。因为系统会根据数组中元素的总个数来分配空间,当知道元素总个数以及列的维数后,会直接计算出行的维数

2、采用第二种初始化时数组声明必须同时指定行和列的维数。

以下程序中的主方法中分别定义名为arr1和arr2的两行两列的二维整型数组。arr1使用第一种初始化,arr2使用第二种初始化。分别给arr1和arr2数组元素初始化为10,20,30,40。第一行元素为10和20,第二行元素为30和40。

#include <stdio.h>

void print(int arr[2][2])
{
int i,j;
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
printf("%d “,arr[i][j]);
}
printf(”\n");
}
}

int main()
{
//使用第一种方式初始化方式声明并初始化二维数组arr1
int arr1[2][2]={{10,20},{30,40}};
print(arr1);

printf("*****\n");

//使用第二种方式初始化方式声明并初始化二维数组arr2
int arr2[2][2];
arr2[0][0]=10;
arr2[0][1]=20;
arr2[1][0]=30;
arr2[1][1]=40;
print(arr2);
return 0;    

}

九:多维数组的遍历

在超市买东西回来后,就算是东西再多,再怎么分类,我们还是要拿出来看一下所买的商品的。

多维数组也是存在遍历的,和一维数组遍历一样,也是需要用到循环。不一样的就是多维数组需要采用嵌套循环,如:遍历输出int num[3][3] = {{1,2,3},{4,5,6},{7,8,9}};

img

注意:多维数组的每一维下标均不能越界

任务

现有三行三列的二维数组int arr[3][3] = {{1,2,3},{4,5,6},{7,8,9}};,编写程序实现计算对角线元素之和。

在代码编辑器中

第9-14行补全代码

运行结果为:对角线元素之和是:25

#include <stdio.h>
int main()
{
int arr[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int i,j;
int sum=0;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
if((i+j)%2==0)
sum+=arr[i][j];
}

}
printf("对角线元素之和是:%d\n",sum);
return 0;    

}

十:综合练习

在一个长度为10的整型数组里面,保存了班级10个学生的考试成绩。要求编写5个函数,分别实现计算考试的总分,最高分,最低分,平均分和考试成绩降序排序。

#include <stdio.h>
#include <stdlib.h>
#define N 10

int cmp(const void *a,const void *b){
return (int)b - (int)a;
}

int Sum(int score[]){
int s = 0,i;
for(i = 0 ; i < N ; i++)
s += score[i];
return s;
}

int Max(int score[]){
return score[0];
}

int Min(int score[]){
return score[N-1];
}

double Avg(int s){
return (s + 0.0) / N;
}

int main()
{
int score[N]={67,98,75,63,82,79,81,91,66,84};
int i,sum;
sum = Sum(score);
qsort(score,N,sizeof(int),cmp);//sort it
printf(“Total score : %d\n”,sum);
printf(“Max score : %d\n”,Max(score));
printf(“Min Score : %d\n”,Min(score));
printf(“Average score : %f\n”,Avg(sum));
printf("\n成绩排序:\n");
for(i = 0 ; i < N ; i++)
{
printf(“Rank %d’s score : %d\n”,i+1,score[i]);
}
return 0;
}

ntf(“Total score : %d\n”,sum);
printf(“Max score : %d\n”,Max(score));
printf(“Min Score : %d\n”,Min(score));
printf(“Average score : %f\n”,Avg(sum));
printf("\n成绩排序:\n");
for(i = 0 ; i < N ; i++)
{
printf(“Rank %d’s score : %d\n”,i+1,score[i]);
}
return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
深度学习笔记v5是一本关于深度学习的学习资料,下面我将用300字来回答有关这本笔记的内容。 深度学习是机器学习领域的一个重要分支,它主要研究模拟人脑神经网络的算法和模型,用于实现复杂的学习任务。深度学习在图像识别、语音识别和自然语言处理等领域取得了很多重要的突破,成为了人工智能领域的热点研究方向。 深度学习笔记v5中,首先介绍了深度学习的基本概念和原理。笔记详细解释了神经网络结构、前向传播、反向传播以及梯度下降等基本概念和算法。这些内容帮助读者理解深度学习的基本原理和工作机制。 接着,笔记介绍了常用的深度学习框架,如TensorFlow和PyTorch。这些框架提供了丰富的工具和函数,使得深度学习的开发变得更加简单和高效。笔记详细介绍了如何使用这些框架进行模型训练和评估。 此外,笔记还包含了一些深度学习的经典应用案例。这些案例涵盖了图像分类、目标检测、语音识别等多个领域。通过这些案例,读者可以深入了解深度学习在实际问题中的应用,并学习如何利用深度学习解决现实世界中的复杂任务。 最后,笔记还提供了大量的代码示例和练习题,帮助读者巩固所学的知识。通过实践,读者可以更好地理解深度学习的原理和应用。 总而言之,深度学习笔记v5是一本系统而全面的学习资料,适合对深度学习感兴趣的读者。通过阅读这本笔记,读者可以了解深度学习的基本概念和原理,掌握常用的深度学习框架,以及应用深度学习解决实际问题的方法。希望这本笔记能够对读者在深度学习领域的学习和研究有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值