首页 > 代码库 > 第十四章 数组
第十四章 数组
第十四章 数组
1. 什么是数组
三要素:数组类型 数组名 下标
2. 数组元素
3. 数组下标越界
一旦越界程序就会报错
4. 倒序输出
5. 将数组的下标定义为常量以便于修改
6. 手动操作数组元素
7. 数组的初始化
空间不够报错,多了用0补
①
②
字符数组的初始化
char array[10]={“hello”}
等价于char array[10]= “hello”
char array[10]={‘h‘,‘e‘,‘l‘,‘l‘,‘o‘,’\0’};
不等价于char array[10]={‘h‘,‘e‘,‘l‘,‘l‘,‘o‘};
char array[]={‘h‘,‘e‘,‘l‘,‘l‘,‘o‘};占用5个字节
char array[]={‘h‘,‘e‘,‘l‘,‘l‘,‘o‘,’\0’};占用6个字节
char array[]=”hello”;占用6个字节
空间不够报错,多了用\0补
char a[3]={‘a’,’b’,’c’} //没有错误
char a[3]=”abc” //报错 overland 字符串数组系统自动加\0
8. 求平均考试成绩
total=total+girl[i];
9. 兔子繁殖问题
rabbit[13]={1,1};
for(n=2;n<13;n++)
{
rabbit[n]= rabbit[n-1]+ rabbit[n-2];
cout<<rabbit[n]<<endl;
}
10. 数字排序问题
for(int i=0;i<5;i++) //气泡法
{
for(int j=0;j<5-i;j++)
{
if(a[j]<a[j+1])
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
选择法:
for(j=0;j<5;j++) //一轮下来最小的数已经在最下面了,所以每比较一轮就可以减少一次比较
{
min=j;
for(i=j+1;i<6;i++) //此处与其气泡法有两点不同j+1, 6;
{
if(a[i]<a[min])
{
t=a[i];
a[i]=a[min];
a[min]=t;
min=i;
}
}
}
11. 数组在内存中的分布
下标越界,C++不提供报错。只有靠程序员自己时时注意。
12. 数组名
数组名代表的是第一个元素的地址
int a[4]={1,2,3,4}
//int *a=&a[0]; //系统自动生成一个指向数组第一个元素的指针
13. 数组名与函数
☆14. 传递与接收
接收的三种方法:
①void a(int x[]) //被调用函数的声明
②void a(int *x) //被调用函数的声明
③void a(int x[30]) //被调用函数的声明
15. 将数组传递给函数
folat Average(const float *,int ) //指针的声明
16. 求数组所有元素的和
17. 用递增法查找数据
int find(int m,int a[],int n)
{
for(int i=0;i<n;i++)
{
if(a[i]==m)
return i;
}
return n;
}
18. 用二分法来查找数据
//用于排序好的数组(且不能有相同大小的数字)
int find(int m,int a[],int n)
{
int s=0,l=n-1,i;
while(s<=l)
{
i=(s+l)/2;
if(a[i]==m)
return i;
if(a[i]<m) //数组递增时用< 递减时用>
s=i+1;
else l=i-1;
}
return n;
}
19. 判断数组是否按照顺序排列
bool check(int a[],int n)
{
for(int i=1;i<n;i++) //此处的i=1是重点因为这里只是比较前 //后数列的大小
if(a[i]<a[i-1])
return false;
return ture;
}
20. 判断数组排列方式然后执行不同的函数
int check(int a[],int n) //返回的可以是任意值
21. 数组在对象中的传参
22. 对象数组
23. 在对象数组中初始化成员变量
area one[4]={area(10,10),area(13,34),area(20,30),area(40,40)};
24. 堆中对象
for(int i=0;i<10000;i++)
{
area *pone=new area(i,2*i);
}
//在堆中存放一个area类的对象,并用area类的指针pone来指向它,然后初始化该对象的两个成员的值
这个程序只能保存最后一个对象的地址,所以前面的产生了内存泄露
25. 指针数组
解决办法
area *one[10000]; //声明一个由10000个指向类area的指针组成的数组,即指针数组(存放指针的数组)
for(int i=0;i<10000;i++)
{
area *pone=new area(i,2*i);
one[i]=pone;
cout<<one[i]->get()<<endl;
}
//由于这个数组元素保存的是堆中对象的内存地址,所以必须用成员指针运算符->来访问该对象的成员函数,((*one[i]).get())
//表示是利用指针的一次间接访问
26. 堆中对象数组
area *one=new area[10000]; //声明了一个由10000个area对象组成的数组,通过调用new操作符把整个数组创建在堆区中
one[i].set(i,i*2); //设置堆中每个对象的参数
delete []one; //删除数组中的每个对象
☆总结:
对象数组,指针数组,堆中对象数组
27. 枚举常量与数组
enum day{Monday=1,Tuesday,Wendesday,Thursday,Firday,Saturday,Sunday} //enum 是关键字,day 是类型
enum weekl
{sun,mon,tue=5,wed,thu,fri,sat};
则枚举常量的初值如下:sun值为0,mon值为1,tue值为5, wed值为6,thu值为7,fri值为8,sat值为9。
枚举变量:
enum color
{red,yellow,blue}c_l;
c_l=yellow; //正确,将值为1的枚举常量yellow赋予枚举型变量c_1
c_l=1; //错误,不能直接将整型常量赋予枚举型变量
c_l=(enum color)l; //正确,先将l强制转换成枚举型常量yellow再赋值
28. 多维数组
29. 多维数组的初始化
30. 定义字符数组
31. 二维数组输出图形
32. 字符串数组
33. 字符串的输入问题
34. strcat函数
Char:strncat(ch1,ch2,3);//将ch2的头三个字符连接到ch1后;
String:str1.append(str2,3,1);//将str2的下标为3的头1个字符连接到str1中
35. strcpy函数
先清除a中的所有字符,再将b中的所有字符(包括空字符)复制到a中
另外string还有自己的赋值函数assign
str1.assign(str2,3,1);//将字符串str2下标为3开始的头1个字符赋给str1
cout<<str1<<endl;//输出:c
36. strcmp函数
if(strcmp(str1,str2)>0)//(string compare)
如果 str1小于 str2,返回负数;如果 str1大于 str2,返回正数;二者相等则返回0。
37. strupr函数
转化为大写字
38. strlwr函数
转化为小写字
39. strlen函数 sizeof关键字的区别
strlen(string length),sizeof(测容量)
40. 打印杨辉三角形
#include "iostream"
#include<iomanip>
using namespace std;
int main()
{
const int n=10;
int a[n][n];
for(int i=0;i<n;i++)
{
for (int m=0;m<2*(n-i-1);m++)
{
cout<<" ";
}
for(int j=0;j<=i;j++)
{
if(j==0||j==i)
a[i][j]=1;
else
a[i][j]=a[i-1][j-1]+a[i-1][j];
cout.width(4);
cout.fill(‘_‘);
cout<<a[i][j];
//放后面有区别
/*cout.width(4);
cout.fill(‘_‘);*/
//cout<<a[i][j]<<setw(4);//这个需要加头文件
}
cout<<"\n\n";
}
cout<<" "<<"1"<<endl;//说明一个空格占一个字节
}
41. 重载数组下标操作符
char& operator[](int o);//此处&一定要用,因为返回的的是一个数组元素????????????
return size[length-1];//此处的length-1是关键????????????????
本章总结: