第四次课_数组与字符串 字符串

什么是数组

数组一种用来存储一个固定大小的相同类型元素顺序集合的数据结构
当我们需要使用到大量相同类型的变量,一般会使用数组
Ex:50个同学的身高

它有什么用

优点

  • 只需要一次声明
  • 查询便捷
  • 遍历简单

缺点

  • 大小确定后不能改变
  • 只能存储一种类型
  • 插入、删除效率低下

具体使用

声明

以五个整形变量为例

1
2
3
4
int a0,a1,a2,a3,a4;

int a[5];
//定义一个长度为5的整形数组

数组是从0开始,并用[]表示单独一个元素
a[5]中包含了a[0]-a[4]这5个元素

初始化

在c/c++中,可以一个个初始化数组,也可以一次性的初始化.

1
int a[5]={1,2,3,4,5};

分别为a中的五个元素赋值, 注意{}中的元素个数必须小于或等于数组声明时的长度.


同时,也可以不完全的赋值.如

1
int a[5]={1,2};

这条语句内只有两个元素,但是数组的长度却是5.
此时就是将数组的前两个元素分别进行了初始化,即a[0]=1,a[1]=2.
注意这种情况下默认其余元素的值为0.所以如果我们要定义一个全为0的数组,我们可以这样写

1
int a[5]={0};

有时可以省略数组长度直接初始化,如

1
int a[]={1,2,3,4,5};

这样创建的数组长度默认为初始化时元素的个数.


单个元素的赋值和普通变量的赋值是一样的

1
a[3]=4;

这里是将数组a的第四个元素赋为4
同样,数组元素的值也可以被赋给别的变量.比如:

1
int b=a[2];

实例

一般而言,数组与for循环一起使用.

1
2
3
4
5
6
7
8

int (){
int a[10];
for(int i=0;i<10;i++)scanf("%d",&a[i]);
for(int i=0;i<10;i++)printf("%d ",a[i]);
printf("n");
return 0;
}

上面是一个最简单的数组输入输出,定义一个长度为10的整形数组后,通过一个for循环对每一个a[i]进行输入或者输出.

注意

  • “int a[5]”和”a[5]”是不一样
    一个代表的a数组的定义,一个是代表的单个的变量a[5].
  • 使用数组时要避免数组越界,即下标超过数组长度
  • 一般数组长度定义要大于题目要求

二维数组

如果说一维数组是一根线的一维坐标,那二维数组就是x-y坐标轴.它一般在矩阵中使用,即n行m列的情况.

1
int a[5][5];

上面就是一个5行5列的二维数组,我们可以将其看成一个5X5的方阵.
二维数组的输入一般需要用到两个for循环.

1
2
3
4
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
scanf("%d",&a[i][j]);
//一个n行m列二维数组的输入.

字符串

字符串,即字符的数组.

1
char c[20];

一般称”abcdefg”这样的句子或者单词为字符串.
在字符串中最后一个字符为终止符,即’/0‘.但是字符串长度为所有字符数量,不包括终止符.

初始化

1
2
3
char c[30]="A String";
char str[30]={'A',' ','S','t','r','i','n','g'};
char s[]="A String";

上面两种都是正确的初始化方法,前两个字符串的长度都是8,而数组长度是30.但是因为最后终止符的原因,这个数组只能容纳长度最大为29的字符串.
而最后一个的数组长度默认为初始化时字符串长度加一,即9.

输入输出

在C++中,字符数组的输入与其他数组的输入有一些不同.

1
2
3
4
char str[30];
scanf("%s",str);
cin>>str;
gets(str);

当使用scanf的时候,str以指针传入,所以不需要&,同时也是使用%s.
但是因为scanfcin空格结束输入的特性,如果需要输入带有空格的字符串时就不能使用他们.这时就需要用到gets() 函数.
gets(str);,它的意思是读取一整行的字符,并将其赋值给str这个字符串.
另外还有cin.getline函数也可以..
M3qGVO.png


输出也就大同小异了,只需要知道puts函数,它的输出遇到’/0’即终止符时结束,并且会自动加上换行.

1
2
3
4
printf("%s/n",str);
puts(str);
cout<<str<<endl;
//这三个是一样的

以上就是数组与字符串了,其实数组就是更加灵活的变量而已.
总之,实践出真知,多做题,就会发现数组很简单