六:数组
一:数据类型
1.int a[10]
//想要知道一个标识符对应的数据类型,去掉标识符,剩下就是它对应的数据类型
//eg:a
所谓代表的类型,就是int[10]
这种类型(是一个数组,包含10个int
型变量的数组)
2.数组特点:1.连续性:开辟的是一片连续空间 2.有序性:元素是按照顺序存储的 3.单一性:数据类型是单一性
引用数组元素:a [偏移量] //[ ]表示数组下标的运算 偏移量:相对第一个元素的位置
下标的范围 //0~N-1
int a[10] = {1,2,3,4,5,6,7,8,9,10};
for(int i=0;i<10;i++)
{
printf("a[%d] = %d\n",a[i],a[i]);
}
3.数组的给值 int a[10] = {1,2,3,4,5,6,7,8,9,10}
//全部初始化
int a[10] = {1,2,3,4,5}
//部分初始化,挨个给到前面的元素,后面补零
int a[10] = {0}
或int a[10] = { }
//全是零 int a[10]
//没有初始化,随机给值
int a[10] = {1,2,3,4,5}
//定义时,数组长度省略,对应初始化的值即是实际数组长度
可变数组给值 //此时不能初始化
int n;
scanf("%d",&n);
int a[n] ;//不能初始化
printf("sizeof(a) = %ld\n",sizeof(a));
二:判断数组长度
int a[] = {1,2,3,4,5,6};
int len = sizeof(a)/sizeof(int);
三:赋值
1.赋值问题(不能整体赋值) //能赋值的是数组中的单个元素
int a[10];
a = {1,2,3,4,5,6};//不可以
a[0] = 1;//可以
2.通过scanf
手动赋值
int a[10];
int len = sizeof(a)/sizeof(int);
int i = 0;
for(i=0;i<len;i++)
{
scanf("%d",&a[i]);//每个都要手动输入,系统不自动补零
}
for(i=0;i<len;++i)
{
printf("a[%d] = %d\n",i,a[i]);
}
四:寻找数组中的最大值
int a[10];
int i = 0;
for(i=0;i<10;++i)
{
scanf("%d",&a[i]);
}
int max = a[0];
for(i=1;i<10;i++)
{
if(a[i] > max)
{
max = a[i];
}
}
int second = 0x80000000;//要把second设为范围的最小值 1000 0000
for(i=1;i<10;i++)
{
if(a[i] > second && a[i] != max)
{
second = a[i];
}
}
printf("max =%d\n",max);
printf("second =%d\n",second);
五:数组逆序
int a[10] = {1,2,3,4,5,6,7,8,9,10};
int len = sizeof(a)/sizeof(int);
int t = 0;
for(int i=0;i<len;i++)
{
printf("%d ",a[i]);
}
putchar('\n');
for(int i=0;i<len/2;i++)
{
t = a[len-i-1];
a[len-i-1] = a[i];
a[i] = t;
}
for(int i=0;i<len;i++)
{
printf("%d ",a[i]);
}
putchar('\n');
int i = 0;//同上
int j = len - 1;
for(;i<j;)
{
t = a[i];
a[i] = a[j];
a[j] = t;
++i;
--j;
}
七:数组排序
一:选择排序
给合适的位置选择合适的数
本质上就是当前位置与此后的所有位置上的数值比较,外层循环走完一趟,即此位置与其他位置的数值比较完成,定位这趟的最小值或最大值,此后的每一趟,之前定位的数值就可以不用比较,具体看升序还是降序,以此类推。
int a[10] = {7,9,5,4,3,8,1,6,2,10};
int len = sizeof(a)/sizeof(int);
int t = 0;
int i = 0;
int j = 0;
for(i=0;i<len;i++)
{
printf("%d ",a[i]);
}
putchar('\n');
for(i= 0;i<len-1;i++)//控制当前位置
{
for(j = i+1;j<len;j++)//控制当前位置寻找最小值的过程
{
if(a[j] < a[i])
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
for(int i=0;i<len;i++)
{
printf("%d ",a[i]);
}
putchar('\n');
二:冒泡排序
相邻两个元素,两两比较,小的在前,大的在后
//本质就是走一趟,在这一趟中两两比较(交叉向后),最后每一趟的最大值留在最后,此后循环一趟,但是由于上一趟最大值已经定位,所以这一趟的比较次数会减少一次,以此类推
for(i=1;i<len;++i)//控制趟数
{
for(int j=0;j<len-i;j++)//控制一趟比较的次数
{
if(a[j] > a[j+1])
{
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}