11.16 C语言课程(数组)
特征
数组——一组类型相同的数
具有连续性。内存大小跟长度和连续性有关。
通过下标访问。
数组的初始化
一定是先定义,初始化,再使用。
- 全元素初始化
- 局部初始化
- 省略长度的初始化
Ps 数组的长度(或者说是规模定义)不能直接用常量(也就是在main函数里上int啥的)
一般需要在开头进行定义。
int xxx[?]={}
举例:费波纳茨数列
#include<stdio.h>
#define N 30
int main()
{
int i, fib[N] = { 0,1,1 };
int n;
do
{
printf("put n:");
scanf_s("%d",&n);
} while (n<1 || n>N - 1);
for (i = 3; i <= n; i++)
fib[i] = fib[i - 1] + fib[i - 2];
for (i = 1; i <= n; i++)
{
printf("%10d", fib[i]);
if ((i) % 5 == 0)//此处(i)指的是下标? 不清楚不管了暂时
printf("\n");
}
return 0;
}
二维数组
int A[N][N]={{1,4,7},{2,5,8},{3,6,9}};//二维数组的初始化
int D[N];
int i,j;
for(i=0,i<=n,i++)
{
for(j=0,j<=n,j++)
printf("%5d"A[i][j]);//初始化归初始化,还是要一条条访问
printf("\n");
}
for(i=0;i<N;i++)
printf("%5d",D[i]);
数组的算法
删除与添加
逻辑上对应的位置添加、删除元素
其后的元素向前或者向后顺延。
如果向前顺延,最后一位还是存在变量的,显示的时候可以将其忽略掉。
for (i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
printf("\n需要插入的数:\n");
scanf_s("%d", &x);
j = 0;
while (a[j] <= x)j++;
for (k = 10; k >= j; k--)
{ //比x大的元素后移
a[k + 1] = a[k];
}
a[j] = x;
判断最大值的子函数
int max(int a[],int n)
{
int i,max;
max=a[0];
for(i=1;i<n,i++)
if(a[i]>max)
max=a[i];
return max;
}
冒泡法比大小(排列)
宏观意义上就是循环思想的嵌套
将一个列表中的每相邻两个元素两两比大小
#include<stdio.h>
#define M 100
int main() {
int a[M] = { 1,78,63,5,14,79,36,45,1,45 };
int x, i, j, k, temp;
//先对无序的数组元素排序
for (i = 0; i < 10; i++) {
for (j = 0; j < 10 - i - 1; j++) {
if (a[j] > a[j + 1]) {
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
在嵌套的第二个for循环中,如果一个数最大,它将多次调换位置后移
而第一个大循环控制的是宏观的数组元素前移次数
第二个for循环的满足条件保证了下一次冒泡前上一次循环最后一个相对最大的元素位置不会改变