//一维数组:
#include<stdio.h>
int main(int argc, char *argv[])
{
/* ******************************************************* *
* 啥是数组
* int a[4];
* 怎么用
* 定义
* 初始化
* 赋值与引用
* 遍历
* 数组名含义
* 排序
* 冒泡
* 选择
* 字符数组与字符串
* ******************************************************* */
/* 定义*************************************************** */
//<存储类型> <数据类型> 变量名;
//<存储类型> <元素数据类型> 数组名[元素个数] //数组的类型实际是由 元素数据类型 + [元素个数]组成
//int a[5];
//数组名符合标识符定义
//数据类型用来说明元素的类型,数组的类型由元素类型+元素个数
//数组元素的个数 定义时必须是常量或常量表达式
//int i = 5;
//i++;
//int b[i]; //数组的大小在编译的时候确定,而变量在运行时才有值,
#define N 5
int aa[N];
int a[5]; //a实际可以看成 int [5]; 类型
char a0[5];
/* 初始化
* 定义的同时对变量或数组元素赋值 ************************* */
int b[5 ] = {1, 3, 5, 7, 9, }; //全部初始化
int bb[10] = {1, 3, 5, 7, }; //部分初始化,没有初始化的部分自动清0
char bc[10] = {1, 65, 'B'}; // 部分初始化,没有初始化的部分自动清零(二进制0,即'\0')
int bd[6] = {1, 3, 0, 0, 9, 11,};
int bf[] = {1, 3, 9, 11};
int be[100] = {
[0] = 1,
[1] = 3,
[98] = 1,
[99] = 3,
}; //指定元素初始化,没有初始化的部分自动清零
/* 赋值与引用
* 对数组的元素赋值求和取值
* 不可以对数组整体赋值,如果在初始化时没有值,后面只能通过单个赋值的方法进行赋值
* ********************************************************* */
int c[6];
c[0] = 1;
c[4] = 9, c[5] = 11; //对元素赋值,不会影响其他元素
//c[6] = 13; //数组不做越界检查,对于越界的元素访问可能造成不可以预知错误,越界可以读,尽量不要写
int i;
i = 0;
c[i] = 9;
scanf("%d", &c[0]);
for (i=0; i<6; i++)
{
scanf("%d", &c[i]); //int a0; scanf("%d", &a0)
printf("%d\n", c[i]);
}
int ca[6]; //[]数组定义固定格式
ca[2] = 5; //引用变量时, []是变址运算符 a[i] == *(a+i) == *(i+a) == i[a];
2[ca] = 5;
i = 3;
ca[i] = 6;
i[ca] = 6;
/* 遍历 *************************************************** */
int d[10] = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};
for (i=0; i<10; i++)
{
printf("%d\n", d[i]);
printf("%d\n", d[9-i]);
}
for (i=9; i>=0; i--)
{
printf("%d\n", d[i]);
}
/* 数组名含义 *************************************************************************** *
* #define N 5
* int a[N];
* 1.代表整个数组:&a, sizeof(a)
* &a 得到整个数组的地址
* sizeof(a) 得到整个数组的字节大小 //20
*
* 2.代表数组第一个元素的地址 即 a==&a[0],是一个地址常量,不可以自加,不可以对数组名赋值
* sizeof(a+0); // 4, 此时代表地址,不代表整个数组,地址是4个字节
* a++; //error
* a = {1, 3, 5, 7, 9}; //不可以对数组名赋值,数组名是地址常量
* a[5] = {1, 3, 5, 7, 9,};//a[5]是元素,且还是个越界的元素,同样不是对整个数组赋值
* ***************************************************************************************** */
int arr[5] = {1, 2, 3, 4, 5, };
arr[0] = 2, arr[1] = 4, arr[2] = 6, arr[3] = 8, arr[4] = 10;
return 0;
}
//最大值:
//V0.
#include<stdio.h>
#define N 10
int main(int argc, char *argv[])
{
int a[N] = {1, 3, 5, 9, 10, 222, 4, 6, 8, 7};
int i;
int max;
max = a[0]; //假设 a[0]最大
for (i=0; i<N; i++)
{
if (a[i]> max)
{
max = a[i];
}
}
printf("max=%d\n", max);
}
//V1.
#include<stdio.h>
#define N 10
int main(int argc, char *argv[])
{
int a[N] = {1, 3, 5, 9, 10, 2, 4, 6, 8, 7};
int i;
int t;
t = 0; //假设第一个是最小值
for (i=0; i<N; i++)
{
if (a[t] < a[i])
{
t = i;
}
}
printf("微臣已经找打最小值下标是:%d==>%d\n", t, a[t]);
return 0;
}
//V2.
#include<stdio.h>
#define N 10
int main(int argc, char *argv[])
{
int a[N] = {7, 3, 5, 9, 10, 2, 4, 1, 8, 6};
int i;
for (i=0; i<N; i++)
{
if (a[i]> a[0])
{
int t;
t = a[i];
a[i] = a[0];
a[0] = t;
}
}
printf("%d\n", a[0]);
}
//V3.
#include<stdio.h>
#define N 10
int main(int argc, char *argv[])
{
int a[N] = {1, 5, 3, 9, 6, 7, 10, 2, 4, 8,};
int j;
for (j=0; N-1; j++)
{
if (a[j] > a[j+1])
{
int t;
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
printf("%d\n", a[9]);
return 0;
}
//V4.
#include<stdio.h>
#define N 10
int main(int argc, char *argv[])
{
int a[10] = {1, 5, 3, 9, 6, 7, 10, 2, 4, 8,};
int i;
for (i=1; i<N; i++)
{
if (a[i-1]>a[i])
{
int t;
t = a[i-1];
a[i-1] = a[i];
a[i] = t;
}
}
printf("%d\n", a[9]);
return 0;
}
//冒泡排序:
//V1.
#include<stdio.h>
#define N 10
/* -->基本冒泡思想 */
int main(int argc, char *argv[])
{
int a[N] = {5, 1, 3, 9, 10, 2, 4, 6, 8, 7};
int i, j;
for (i=0; i<N-1; i++) //内层循环每执行一次,就会排序好一个数,N个数,排序N-1次就够了,最后一个一定是最小值
{
for (j=0; j<N-1; j++) //两两比较,大的值放后面, N个数,比较N-1次, (i=0;j<N-1)正好N-1次
{
if(a[j] > a[j+1])
{
int t;
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
for (i=0; i<N; i++)
{
printf("%3d", a[i]);
}
printf("\n");
}
//V2.
#include<stdio.h>
#define N 10
/* 优化冒泡排序 */
int main(int argc, char *argv[])
{
int a[N] = {5, 8, 3, 9, 10, 6, 2, 4, 1, 7};
int i, j;
for (i=0; i<N-1; i++) //内层循环每执行一次,就会排序好一个数,N个数,排序N-1次就够了,最后一个一定是最小值
{
// i的值每加一次,说明已经有i个数排序好,还剩下N-i个数没排序,
// 在N-i个数中两两比较找最大值,比较N-i-1次即可找到N-i个数中的最大值
for (j=0; j<N-i-1; j++)
{
if(a[j] > a[j+1])
{
int t;
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
for (i=0; i<N; i++)
{
printf("%-3d", a[i]);
}
printf("\n");
}
//V3.
#include<stdio.h>
#define N 10
/*带标志位判断 的冒泡 */
int main(int argc, char *argv[])
{
int a[N] = {5, 1, 3, 9, 10, 2, 4, 6, 8, 7};
int i, j;
for (i=0; i<N-1; i++) //内层循环每执行一次,就会排序好一个数,N个数,排序N-1次就够了,最后一个一定是最小值
{
// i的值每加一次,说明已经有i个数排序好,还剩下N-i个数没排序,
// 在N-i个数中两两比较找最大值,比较N-i-1次即可找到N-i个数中的最大值
for (j=0; j<N-i-1; j++)
{
if(a[j] > a[j+1])
{
int t;
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
}
void fun(void)
{
int a[N] = {5, 1, 3, 9, 10, 2, 4, 6, 8, 7};
int i, j;
int flag;
for (i=0; i<N-1; i++)
{
flag = 0; //判断所有N-i数中,有没有交换,所以在之前将flag重新赋值为0
for (j=0; j<N-i-1; j++)
{
if (a[j]>a[j+1])
{
int t;
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
flag = 1; //在N-i个数中,发生任何一次交换,就就说明,还没排好
}
}
if (0==flag) //如果N-i个数中,一次交换都没有发生,flag=1不会被执行,说明排序已经完成,提前扑街
{
break;
}
}
}
//字符冒泡:
#include<stdio.h>
#define N 10
int main(int argc, char *argv[])
{
char a[N] = {'Z', 'B', 'D', 'a', 'c', 100, 'm', 'M', 'N', 'J'};
int i,j;
for (i=0; i<N; i++)
{
for (j=0; j<N-i-1; j++)
{
if (a[j]>a[j+1])
{
int t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
printf("%s\n", a);
}
//选择排序:
//V0.
#include<stdio.h>
#define N 10
int main(int argc, char *argv[])
{
int i, j;
int a[N] = {7, 6, 5, 4, 3, 2, 1, 8, 9, 10};
/* ************** 选择 ****************** */
for (i=0; i<N-1; i++)
{
for (j=i+1; j<N; j++)
{
if (a[i]>a[j]) //if (a[j]>a[j+1])
{
int t;
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
/* ************************************* */
for (i=0; i<N; i++)
{
printf("%3d", a[i]);
}
printf("\n");
}
//V1.
#include<stdio.h>
#define N 10
/* --> 选择排序 ****************** */
int main(int argc, char *argv[])
{
int i, j;
int a[N] = {7, 6, 5, 4, 3, 2, 1, 8, 9, 10};
/* 选择的基本思想是将当前i指向的元素和后面每一个元素比较,然后将最小值放在i指向的位置
* N个数排序N-1次即可 ************* */
for (i=0; i<N-1; i++)
{
//j从i后一个数(i+1)开始比较,一直比较到最后一个元素(所以j<N);比较的次数为 N-(i+1) ==N-i-1次
for (j=i+1; j<N; j++)
{
if (a[i]>a[j])
{
int t;
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
return 0;
}
//V2.
#include<stdio.h>
#define N 10
/* --> 存放下标的选择排序 */
int main(int argc, char *argv[])
{
int i, j;
int k;
int a[N] = {7, 6, 5, 4, 3, 2, 1, 8, 9, 10};
//k 用来存放最小值下标
for (i=0; i<N-1; i++)
{
k = i; //假设i指向的数最小,
for (j=i+1; j<N; j++)
{
if (a[k]>a[j])
{
k = j; //原来j指向的数才小
}
}
if (k != i)
{
int t;
t = a[k];
a[k] = a[i];
a[i] = t;
}
}
for (i=0; i<N; i++)
{
printf("%-3d", a[i]);
}
printf("\n");
}
//二维数组:
#include<stdio.h>
int main(int argc, char *argv[])
{
/*定义
* <存储类型> int a[行下标][列下标] */
int aa[3][4];
int ab[4][3];
/* 初始化 */
int ba[3][4] = {{1, 3, 5, 7}, {2, 4, 6, 8,}, {9, 11, 13, 15,},};
int ba1[4][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}};
int bb[3][4] = { 1, 3, 5, 7, 2, 4, 6, 8, 9, 11, 13, 15 };
int bb1[4][3] = { 1, 3, 5, 7, 2, 4, 6, 8, 9, 11, 13, 15 };
int bc[3][4] = {
{1, 3, 5, 7},
{2, 4, 6, 8},
{9, 11, 13, 15},
};
int bd[3][4] = { 1, 3,
5, 7, 2, 4, 6, 8, 9,
11, 13, 15,
};
int be[][4] = {{1, 3, 5, 7}, {2, 4, 6, 8}, {9, 11, 13, 15},}; //可以省略一维下标
int bf[][4] = {{1, 3, 5, 7}, {2, 4, 6, 8}, {9, 11, },}; //可以省略一维下标,
int bg[][4] = { 1, 3, 5, 7, 2, 4, 6, 8, 9, };//部分初始化,未初始化的部分为0
int ca[3][4] = {1, 3, 5, 7, 9}; //从前向后初始化,部分初始化,未初始化为0
int cb[3][4] = {{1, 3}, {5, 7}, {9 ,11}}; //对每一行的 前两个数初始化
int cc[3][4] = { //指定行初始化
[0] = {1, 3, 5, 7},
[1] = {1, 3, 5, 7},
[2] = {1, 3, 5, 7},
};
int ccd[100][100] = {0}; //定义数组,里面全是0
int cd[100][100] = //指定元素初始化
{
[0][0] = 1,
[0][1] = 2,
[99][98] = 1,
[99][99] = 2,
};
int ce[100][100] = //先指定行,再指定行中的某一个
{
[0] = {
[0] = 1,
[1] = 2
},
[99] = {
[0] = 1, //99行第一个元素初始化为1,最后一个初始化为2,没有初始化的部分自动为0
[99] = 2,
},
};
int ce1[100][100] = //先指定行,再指定行中的某一个
{
[0] = {1, 2},
[99] = {1, 0, 2},
};
/* 赋值 引用 */
int da[3][5];
da[0][0] = 1;
da[0][1] = 2;
printf("%d\n", da[0][0]);
printf("%d\n", da[0][1]);
/* 数组名
* int a[N]; 元素a[0], 一维数组名 a
*
* int a[M][N]; 元素a[0][0], 一维数组名 a[0],a[1],a[2].. 二维数组名 a
* 二维数组名:
* 1.代表整个二维数组
* sizeof(数组名) ==>整个数组大小
* &(数组名) ==>整个数组地址
*
* 2.对于二维数组来说,每一个元素都是一个一维数组, 数组名中放在第一个一维数组地址 &a[0]
* 除了上面的情况,都是代表&a[0] 即 a == &a[0]
*
* sizeof(a) ==>4*M*N;
* sizeof(a[0]) ==> 4*N;
* sizeof(a[0]0]) ==> 4
*
* PS:二维数组名同样是一个地址常量,
* 不可以整体引用,不可以被赋值,不可以自加
* ************************************************ */
/*遍历 */
/* 鞍点 */
}
//二维数组求最大值:
#include<stdio.h>
int main(int argc, char *argv[])
{
#define M 4
#define N 5
int a[M][N] = {
9, 11, 19, 52, 13,
2, 8, 18, 23, 6,
10, 12, 22, 61, 14,
66, 3, 17, 27, 5,
};
int i, j;
int min, k;
int x, y;
for (j=0; j<N; j++) //j控制列
{
x = 0; //假设j列中,x=0行最小
for (i=0; i<M; i++) //拿j列中,每一行与x=0这行比较
{
if (a[x][j] > a[i][j]) // j 列中,x指向的行与 i指向的行比较
{
x = i;
}
}
printf("%d\n", a[x][j]);
}
for (y=0; y<N; y++) //iy控制列
{
min = a[0][y]; //假设y列中,0行最小
for (x=0; x<M; x++) //x控制行
{
if (min > a[x][y]) //找到更小的
{
min = a[x][y];
}
}
printf("%d\n", min);
}
}
//V2.行最大。
#include<stdio.h>
int main(int argc, char *argv[])
{
#define M 4
#define N 5
int a[M][N] = {
9, 11, 19, 52, 13,
2, 8, 18, 23, 6,
10, 12, 22, 61, 14,
66, 3, 17, 27, 5,
};
int i, j;
int y;
for (i=0; i<M; i++)
{
y = 0;
for (j=0; j<N; j++)
{
if (a[i][y] < a[i][j])
{
y = j;
}
}
printf("%d\n", a[i][y]);
}
int max;
for (i=0; i<M; i++)
{
max = a[i][0];
for (j=0; j<N; j++)
{
if (max < a[i][j])
{
max = a[i][j];
}
}
printf("%d\n", max);
}
}
//遍历:
#include<stdio.h>
int main(int argc, char *argv[])
{
#define M 4
#define N 5
int a[M][N] = {
1, 3, 5, 7, 9,
2, 4, 6, 8, 10,
11, 13, 15, 17, 19,
12, 14, 16, 18, 20,
};
int i, j;
for (i=0; i<M; i++) // 控制着行
{
for (j=0; j<N; j++) //j控制列
{
printf("%-3d", a[i][j]);
}
printf("\n");
}
for (j=0; j<N; j++) //j控制列
{
for (i=0; i<M; i++) //i控制行
{
printf("%-3d", a[i][j]);
}
printf("\n");
}
for (i=0; i<N; i++) //i控制列
{
for (j=0; j<M; j++)
{
printf("%-3d", a[j][i]);
}
printf("\n");
}
return 0;
}
//输出百分号:
#include<stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int i;
int j;
// >>>1.0-9%
printf("Downloading.....\n");
printf(">>>>>");
for (i=0; i<=100; i++)
{
printf("\b\b>>%d", i);
for (j=0; j<10&&i!=100; j++)
{
printf(".%d%%",j); //99.6%
usleep(100000);
fflush(stdout);
printf("\b\b\b");
}
if (i<50)
{
usleep(10000);
}
else if (i<98)
{
usleep(50000);
}
else
{
sleep(2);
}
}
printf("Completed\n");
}
//鞍点
//v1.先自己尝试着做一遍,再读V2……
#include<stdio.h>
#define M 4
#define N 5
/* 找行最大值,列最小值
* 先找到每一行最大值所在列,存放在y中.
* 在找到y列中最小值所在行,存放在x中,
* 如果x == i, 说明是同一行同一列,即鞍点
* ************************************ */
int main(int argc, char *argv[])
{
int a[M][N] = {
9, 11, 19, 52, 13,
2, 8, 18, 23, 6,
10, 12, 22, 61, 14,
66, 3, 17, 27, 5,
};
int i, j, k;
int x, y;
return 0;
}
//V2.
#include<stdio.h>
#define M 4
#define N 5
int main(int argc, char *argv[])
{
int a[M][N] = {
9, 11, 19, 52, 13,
2, 8, 18, 23, 6,
10, 12, 22, 61, 14,
66, 3, 17, 27, 5,
};
int i,j, k;
int y, x;
for (i=0; i<M; i++)
{
y = 0; //y存放i行最大值所在列,默认第一列为最大值
for (j=0; j<N; j++)
{
if (a[i][y] < a[i][j])
{
y = j;
}
}
printf("第%d行最大值所在列是%d \n", i, y);
x = 0; // x存放y列最小值所在行,默认第一行为最小值
for (k=0; k<4; k++)
{
if (a[x][y] > a[k][y])
{
x = k;
}
}
printf("第%d列最小值所在行是%d \n\n", y, x);
if (x == i)
{
printf("=========================\n");
printf("sadlle Point:%d\n", a[x][y]);
}
}
}
//VV
#include<stdio.h>
#define A 2
#define B A+3
#define add(a, b) a+b
#define __Farsight__ //空宏
#define qqId_1324318389yuema
#define Linux
#define M 4
#define N 5
#include <unistd.h>
int main(int argc, char *argv[])
{
int a[M][N] = {
9, 11, 19, 52, 13,
2, 8, 18, 23, 6,
10, 12, 22, 61, 14,
66, 3, 17, 27, 5,
};
int i, j;
int x,y;
for (i=0; i<M; i++) //控制行
{
printf("\n咱家正在搜寻%d行......\n", i);
y = 0; //假设在i行中, y = 0列最大
for (j=0; j<N; j++) //i行中,y指向的列和后面j指向的所有列比较
{
if (a[i][y] < a[i][j]) //i行中, y指向列和j指向的列比较
{
y = j;
}
}
printf("在%d行中,最大值所在列 y=%d\n", i, y);
printf("正在y=%d列搜寻最小值所在行......\n", y);
x = 0; //假设在 y 列中, x = 0 行最小
for (j=0; j<M; j++) // y 列中, x指向的最小行 和 后面 j指向的所有行比较
{
if (a[x][y] > a[j][y]) //y列中, x指向的行 和 j 指向的行 比较
{
x = j;
}
}
printf("在y=%d列找到最小值所在行 x=%d\n", y, x);
if (x==i)
{
printf("x=%d == i=%d\n", x, i);
printf("朕乃天赐鞍点:a[%d][%d]=%d\n", x, y, a[x][y]);
break;
}
}
return 0;
}
Linux C学习第六天(数组)