首页 > 代码库 > 第十四章 数组

第十四章 数组

第十四章 数组

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是关键????????????????

本章总结: