第8章 数组
一、知识点总结
一维数组
1、数组定义:
类型标识符 数组名[常量表达式]={值,值,…}
一组具有相同类型的变量的集合。
一个数组在内存中占一片连续的存储单元。
直接对a的访问,就是访问此数组的首地址。
2、▲数组大小必须是值为正的常量,不能为变量。
例:int n;int a[n];×
3、数组下标从0开始。
4、一维数组初始化:
数组定义在主函数之外,起初始值为0;定义在主函数之内,起初始值是随机的。
5、使两个数组值相等的方法:
①列举赋值:b[0]==a[0] b[1]==a[1]...②循环赋值
③数组a复制k个元素到数组b:mencpy(b,a,sizeof(int)*k)
数组a全部复制到数组b:mencpy(b,a,sizeof(a))
使用mencpy函数要包含头文件cstring。
6、容错处理:保证输入在合法范围之间
7、Fibonacci数列:
求其数列1,1,2,3,5,8,......的第k个数,即
F1=1 (n=1)
F2=1 (n=2)
Fn=Fn-1+Fn-2 (n>=3)
8、数组的排序:
①选择排序:
for(j=0;j<n-1;j++)
{
l=j;
for(i=1;i<n;i++)
if(a[l]<a[i])
l=I;
if(l!=j) i=a[l],a[l]=a[j],a[j]=i;
}
②插入排序:
l= i-1;temp=a[i];
while(l>=0&&a[l]>temp)
{
a[l+1]=a[l];
l--;
}
a[l+1]=temp;
③冒泡排序:
for (int j=1; j<=n-1; ++j) //冒泡法排序
for (int i=1; i<=n-j; ++i) //两两相比较
if (a[i]<a[i+1]) //比较与交换
{t=a[i]; a[i]=a[i+1]; a[i+1]=t;}
9、折半查找用于有序序列中查找指定元素。
10、sort函数
头文件为#include <algorithm>
默认的sort函数是按升序排。
sort(a,a+n); //两个参数分别为待排序数组的首地址和尾地址
二维数组
数据类型 数组名[常量表达式1] [常量表达式2] ;
字符数组和字符串数组
1、第一个元素同样是从ch1[0]开始,而不是ch1[1]。
具体格式如下:
[存储类型] char 数组名[常量表达式1]…
2.字符数组的赋值
①用字符初始化数组
例如:char chr1[5]={‘a’,‘b’,‘c’,‘d’,‘e’};
字符数组中也可以存放若干个字符,也可以来存放字符串。
两者的区别是字符串有一结束符(‘\0’)。
字符串是一维数组,但是一维字符数组不等于字符串。
②用字符串初始化数组
用一个字符串初始化一个一维字符数组,可以写成char chr[5]=“abcd”;
③数组元素赋值
3、字符常量和字符串常量的区别
①两者的定界符不同,字符常量由单引号括起来,字符串常量由双引号括起来。
②字符常量只能是单个字符,字符串常量则可以是多个字符。
③可以把一个字符常量赋给一个字符变量,但不能把一个字符串常量赋给一个字符变量。
④字符常量占一个字节,而字符串常量占用字节数等于字符串的字节数加1。增加的一个字节中存放字符串结束标志‘\0’。例如:字符常量‘a’占一个字节,字符串常量“a”占二个字节。
4、字符串的输入
(1)scanf语句
格式:scanf(“%s”,字符数组名);
说明:①系统会自动在输入的字符串常量后添加‘\0’标志,因此输入时,仅输入字符串的内容即可。
②输入多个字符串时,以空格分隔。
(2)gets语句
格式:gets(字符数组名);
说明:使用gets只能输入一个字符串。读入的是一整行,包括空格。
5、字符串的输出
(1)printf语句
格式:printf(“%s”,字符数组名);
(2) puts语句
格式:puts(字符串名称);
说明:puts语句输出一个字符串和一个换行符。对于已经声明过的字符串a,printf(“%s\n”,a)和 puts(a)是等价的。
6、字符串处理函数
strlen(字符串名) 计算字符串的长度,终止符’\0’不算在长度之内
strlwr(字符串名) 将字符串中大写字母换成小写字母
二、感受
这一章节的题目做起来明显感觉很吃力、很费劲。本打算着一天能做一道数组题,但是计划总是赶不上变化,没做几道就做不下去了?,因为每道题都会做很久才能AC。就算很快想到解题的思路,但是运行时总会出现错误,就在纠错的路上一去不复返?。这也让我意识到了做题一定要考虑全面,从而训练出缜密的思考方式。