学习完数组总结

关于数组内容的介绍

一.什么是数组?
数组=数的集合 (用于存储多个相同类型数据的集合)
按输入顺序排列存储
定义格式:
类型标识符 数组名[常数表达式];

二.使用数组需注意:
①数组的类型实际上是指数组元素的取值类型。
②数组名的书写规则应符合标识符的书写规则。
③数组名不能和其它变量名重复。
④[ ]里的常量表达式用来规定数组的长度,也就是数组的元素个数。
但是,不能在[ ]里用变量来表示元素个数,可以用符号常数或者常量表达式。
⑤ 情况1 int a[5]; 常量,5个
情况2 a[5]=5; 常量,第5个
情况3 x=5;a[x]=5; 变量,第x个
⑥允许在同一类型说明中,说明多个数组和多个变量。

三.数组的分类:
⑴一维数组

定义一维数组

数组类型 数组名[数组长度]

int a[3];
char a[2];
一维数组的初始化
代码块

int a[3] = { 1, 2, 3 } ;        //a1与a2数组长度相同
int a2[] = { 1, 2, 3 };
//如果在定义时未给出数组长度,则以初始值中的元素个数决定

char a3[] = {'a','b','c'};       //数组长度为3,元素分别为'a','b','c'
char a4[] = { "abc" };       //数组长度为4,元素分别为'a','b','c','\0'

int a  [  ] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int sz = sizeof(a) / sizeof(a[0]);     //用sizeof求数组长度

//数组名单独在sizeof()的括号中时表示整个数组,sizeof以字节单位
注意:下标从0开始

⑵二维数组的定义,初始化和使用
定义二维数组
数组类型 数组名【行】【列】

int a1[2][3];
double [3][4];
二维数组的初始化

//没赋初始值的元素赋值为该数组类型的默认默认值。例:int 默认值为0
int a1[2][3] = {0};            //定义一个2行3列的二维数组
int a2[][3] = {1,2,3,4,5,6,};           //可以不给定行值,会自动根据初始值和列值计算出行值
int a3[2][3] = {1,2,3,4,5,6};           //a2和a3行列相同,对应元素值也相同
int a4[2][3] = {{1,2,3},{4,5,6}};        //各元素与a3中对应下标元素相同

⑶字符和字符串数组

  1. 字符数组的定义格式
    [存储类型]char 数组名[常量表达式]
    例如: char a[5];
    char a[5][5];
    2.字符数组的赋值
    例如: char a[5]={'a,‘b’,‘c’,‘d’,‘e’}
    初始值表中的每个数据项是一个字符,用字符给数组a的各个元素初始化。当初始化个数少于元素个数时,从首字母开始赋值,剩余元素默认为空字符。
    例如: char sss[5]="abcd";

一个字符串实际上就是一个字符数组,与普通字符数组不同的是,字符串的结尾有一个字符\0,表示字符串的结束。
字符常量和字符串常量的区别:
①前者由单引号,后者由双引号扣起来。
②前者只能是单个字符,后者可以是多个字符。
③字符常量占一个字节,而字符串常量等于字符串的字节数加1。增加的一个字节中存放字符串结束标志’\0’。

c语言中,字符串数组的输入输出可以有两种方式。
1.逐个字符输入输出。用格式符”%c”输入或输出 一个字符。

for(int i=0;i<6;i++)
printf("%c",c[i]);
2.将整个字符串一次输入或输出。用”%s”格式符。如:

char c[ ]={“China”};
printf("%s\n",c);
注意事项:
1.输出字符中,不包括结束符‘\0’;
2.用“%s”格式符输出字符串时,printf语句中的输出项时字符数组名,而不是数组元素名,如下是不对的:printf(“%s”,c[0]);
3.如果一个字符数组中包含一个以上’\0’,则,遇到第一个’\0’就停止输出
4.输入一个字符串:scanf(”%s”,c);
scanf中输入项c是已经定义的字符数组名,输入的字符串应该短于已定于的字符数组长度。
5.利用scanf输入多个字符串时,应该在输入时以空格分隔。

四.关于数组的计算
1.sizeof(数组名)—— 数组名在此时表示整个数组,sizeof(数组名)表示计算整个数组的长度,单位为字节 。
2.&a——数组名在此时表示整个数组 ,&a表示取出整个数组的地址,其值与与数组首个元素地址相同,但性质不同 。
3.所有遇到的数组名都是首元素的地址。
4.如果要从数组a复制k个元素到数组b,可以:memcpy(b,a,sizeof(int)*k)
如果数组a和b都是浮点型,复制时:memcpy(b,a,sizeof(double)*k)
数组a全部复制到数组b中,memcpy(b,a,sizeod(a))
5.memset(a,0,sizeof(a)) 把数组a清零
使用memset和memcpy函数要包含头文件cstring
6之前提到数组是用来处理大量的相同类型的数据,而处理数据最经常的操作有排序和查找。
排序的基本方法:交换法排序,插入排序,选择法排序,冒泡排序……
查找的基本方法:线性查找(顺序查找),折半查找…冒泡排序
①冒泡排序:
一组数据a[1]、a[2]、……a[n]。首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。再比较a[2]与a[3]的值,若a[2]大于a[3]则交换两者的值,否则不变。再比较a[3]与a[4],最后比较a[n-1]与a[n]的值。这样处理一轮后,a[n]的值一定是这组数据中最大的。再对a[1]a[n-1]以相同方法处理一轮,则a[n-1]的值一定是a[1]a[n-1]中最大的。再对a[1]~a[n-2]以相同方法处理一轮,依此类推。共处理n-1轮后a[1]、a[2]、……a[n]就以升序排列了。

②选择排序:
一组数据a[1]、a[2]、……a[n]。首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。再比较a[1]与a[3]的值,若a[1]大于a[3]则交换两者的值,否则不变。再比较a[1]与a[4],最后比较a[1]与a[n]的值。这样处理一轮后,a[1]的值一定是这组数据中最小的。再将a[2]与a[3]a[n]以相同方法比较一轮,则a[2]的值一定是a[2]a[n]中最小的。再将a[3]与a[4]~a[n]以相同方法比较一轮,依此类推。共处理n-1轮后a[1]、a[2]、……a[n]就以升序排列了。
③插入排序
一组升序排列数据a[1]、a[2]、……a[n],一组无序数据b[1]、b[2]、……b[m],需将二者合并成一个升序数列。首先比较b[1]与a[1]的值,若b[1]大于a[1],则跳过,比较b[1]与a[2]的值,若b[1]仍然大于a[2],则继续跳过,直到b[1]小于a数组中某一数据a[x],则将a[x]a[n]分别向后移动一位,将b[1]插入到原来a[x]的位置这就完成了b[1]的插入。b[2]b[m]用相同方法插入。(若无数组a>b[1],可将b[1]当作n=1的数组a)

④选择排序

for(i=0;i<n;i++)
   {
       k=i;
       for(j=i+1;j<n;j++)
         {
           if(A[j]<A[k])
               k=j;
         
       if(i!=k)
         {
           A[i]=A[i]+A[k];  ↘
           A[k]=A[i]-A[k];(用这种想法不需要再一变量也能实现两两交换数据)
           A[i]=A[i]-A[k];}
    }

①线性查找:
线性查找元素就是使用查找键逐个与数组元素进行比较以实现查找。
②折半查找:
先对数据进行排序,然后取位于数组中间的元素,将其与查找键进行比较。
如果它们的值相等,则查找键被找到,返回数组中间的下标。否则,将查找的区间缩小为原来区间的一半,在一半的数组元素里查找。

int left = 0;     (数据左端)
int right = length - 1;     (数据右端)
int mid;       (数据中)
while (left <= right) 
 {

    mid = (left + right) / 2;   (更新中间值)

    //查找成功
    if (a[mid] == key)
    {
        cout << mid;
        return;
    }

    //若还没有找到,改变左右区间继续寻找
    if (a[mid] < key)
        left = mid + 1;
    if (a[mid] > key)
        right = mid - 1;

}

五.学习完数组的感受
㈠ 数组的知识是用来解决大量的相同类型数据(排序,查找,按要求赋值,按要求输出)
㈡ 数组起的最大作用就是让数据有了他们的存储空间。
㈢ 字符串的优势在于输入、输出和赋初值,输入输出不需要使用循坏。字符数组需要用循环依次输出每个字符。
㈣ 虽然学习了编码知识有段时间了,但还是要提一下,注意细节,防止粗心出现代码错误,还有就是注意代码区的美观,好方便检查。

六.数组的应用
代码区:
①蛇形填充

include<iostream>
#include<cmath>
using namespace std;
int main()
{
	int n,a[12][12],x=1,y=1;
	cin>>n;
	int sum,m,k,i=1;
	for(sum=2;sum<=2*n;++sum)
	  {
		  k=n-abs(n+1-sum);
		  m=0;
		  do
		    {
				a[x][y]=i;++i;++m;
				if(sum%2==0&&sum!=2&&m!=k)
				  {--x;y=sum-x;}
				if(sum%2!=0&&sum!=2&&m!=k)
				  {++x;y=sum-x;}
			}while(m<k);
			if(sum%2==0)
			   {if(sum<=n)++y;else++x;}
			if(sum%2!=0)
			  {if(sum<=n)++x;else++y;}
		}
		for(x=1;x<=n;++x)
		  {
			  for(y=1;y<=n;++y)
			    {
					cout<<a[x][y]<<" ";
			    }
				cout<<endl;
		  }
		  return 0;
}

②变幻的矩阵

#include<iostream>
using namespace std;
int main()
{
	int n,x,y,u=0,k1=0,k2=0,k3=0,k4=0;cin>>n;
	char a[15][15],c[15][15],d[12][12],e[12][12],f[12][12];
	for(x=1;x<=n;++x)
	  {
		  for(y=1;y<=n;++y)
		    {
				cin>>a[x][y];
		     }
	   }
	 for(x=1;x<=n;++x)
	  {
		  for(y=1;y<=n;++y)
		    {
				cin>>c[x][y];
				if(c[x][y]==a[x][y])
				     {++k1;}
				d[x][y]=a[n+1-x][n+1-y];
				 if(d[x][y]==c[x][y])
					 {++k2;}
				e[x][y]=a[n+1-y][x]; 
				if(c[x][y]==e[x][y])
				    {++k3;}
				f[x][y]=a[y][n+1-x];
				if(f[x][y]==c[x][y])
				    {++k4;}
		
		     }
	   }
		 if(k1==n*n)
		   {cout<<"4";++u;}
		 if(k2==n*n)
		  {cout<<"3";++u;}
		 if(k3==n*n)
		   {cout<<"1";++u;}
		 if(k4==n*n)
		   {cout<<"2";++u;}
		if(u==0)
		  cout<<"5";
		 return 0;
}
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力的clz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值