THE FORTH DAY LEARNING (数组 C语言)
数组
数组: 用于存储多个相同数据类型的数据的有序队列
数组定义的格式
数据类型数组名[元素个数] = {元素1, 元素2, 元素3,...}
/*
整型数组
int a[5] = {1, 2, 3, 4, 5};
浮点型数组
float b[3] = {1.5, 3.5, 4.7};
定义数组常见的问题
1.数组越界
int c[3] = {1, 2, 3, 4};
2.定义数组时, 数组的元素的个数省略, 元素的个数由赋值的个数决定
int d[] = {1, 2, 3, 4};
int e[] = {1};
int f[] = {};//空数组, 无意义
3.定义数组时, 没有赋值, 默认为0
int g[3] = {1,2};
int h[3] = {1};
int i[3] = {0};
//sizeof: 用于计算数据类型或表达式返回值所占的字节数
//sizeof(表达式或类型);
计算数据类型所占的字节数
sizeof返回的结果类型是 unsigned long
printf("int: %lu\n",sizeof(int));
printf("short: %lu\n",sizeof(short));
printf("long: %lu\n",sizeof(long));
printf("float: %lu\n",sizeof(float));
printf("double: %lu\n",sizeof(double));
printf("char: %lu\n",sizeof(char));
计算变量所占的字节数
int j = 10;
printf("j: %lu\n",sizeof(j));
//计算数组所占的字节数
//数组所占字节数 = 元素所占字节数 * 元素个数
int k[5] = {1, 2, 3};
printf("k: %lu",sizeof(k));
*/
/*
数组的使用
数组是一个整体, 不能直接参与运算
int a1[3] = {1, 2, 3};
int a2[3] = {3, 2, 1};
//a2 = a1;//error
访问数组元素
因为数组是有序的, 可以通过元素在数组中的位置(下标), 访问数组元素
小标从0开始
格式: 数组名[下标]
int array[5] = {10, 11, 12, 13 , 14};
printf("%d\n", array[1]);
下标范围: [0, 元素个数 - 1]
//printf("%d\n", array[5]);//越界
打印数组的每一个元素
遍历数组: 依次访问数组的每一个元素
for (int i = 0; i <= 4; i++) {
printf("array[%d] = %d\n", i, array[i]);
}
修改数组的某个元素
array[2] = 20;
定义数组和访问数组的元素的区别
1.定义数组必须有数据类型, 数组名[元素个数]; 访问数组元素没有数据类型, 数组名[下标]
2.定义数组时, 元素个数可以省略;访问数组元素时, 下标不能省略
*/
/*
定义一个具有20个元素的整型数组,每个元素的取值范围是
30-70之间,求数组元素的和。
int i = 0, sum = 0, a[20] = {0};
for (i = 0; i < 20; i++) {
a[i] = arc4random() % 41 + 30;//随机数(41=(70-30)+1)
printf("%d ",a[i]);
sum += a[i];
}
printf("\n");
printf("sum = %d\n",sum);
*/
/*
复制一个数组,即两个数组容量一样,把其中一个数组中的
元素复制到另外一个数组中。
int i = 0, a[20] = {0}, b[20] = {0};
printf("\n数组a:\n");
for (i = 0; i < 20; i++) {
a[i] = arc4random() % 41 + 30;//随机数(41=(70-30)+1)
printf("%d ",a[i]);
}
printf("\n数组b:\n");
for (i = 0; i < 20; i++) {
b[i] = a[i];
printf("%d ", b[i]);
}
*/
/*
//生成2个数组,每个数组都有10个元素,元素取值范围20-40 之间,数组对应元素相加,放到另外一个数组中。
int i = 0, a[10], b[10], c[10];
printf("数组a:");
for (i = 0; i < 10; i++) {
a[i] = arc4random() % 21 + 20;
printf("%d ",a[i]);
}
printf("\n数组b:");
for (i = 0; i < 10; i++) {
b[i] = arc4random() % 21 + 20;
printf("%d ",b[i]);
}
printf("\n数组c:");
for (i = 0; i < 10; i++) {
c[i] = a[i] + b[i];
printf("%d ",c[i]);
}
*/
数组排序: 对数组中的数据, 按照从小到大(从大到小)的方法排列
比较常用的排序方法: 冒泡排序, 选择排序, 希尔排序等等
冒泡排序: 相邻两个数比较, 如果不符合条件, 就交换两个元素, 每一趟比较结果就能确定一个数的位置, 直到数组的元素都是有序就结束
冒泡排序比较的趟数 = 数组元素个数 - 1
/*
int a[5] = {10, 2, 8, 9, 4};
冒泡排序的代码实现
//外层循环控制比较的趟数
for (int i = 0; i < 5 - 1; i++) {
//内层循环控制比较的次数
for (int j = 0; j < 5 - 1 - i; j++) {
//比较相邻两个元素, 比较条件决定最终结果
if (a[j + 1] < a[j]) {
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
for (int i = 0; i < 5; i++) {
printf("%d ", a[i]);
}
交换两个变量的值
int a1 = 10;
int a2 = 20;
借助使用第三个变量,变量的数据类型由前两个变量决定
int temp;
temp = a1;
temp存放谁的值, 就先修改谁
a1 = a2;
a2 = temp;
*/
/*
随机产生10个[20, 40]数,并对10个数从小到大排序
1.创建10个元素的数组
2.随机为每个元素赋值
3.遍历数组, 并打印数组
4.对数组使用冒泡排序
5.输出最终结果
int array[10] = {0};
for (int i = 0; i < 10; i++) {
array[i] = arc4random() % 21 + 20;
printf("%d ", array[i]);
}
for (int i = 0; i < 10 - 1; i++) {
for (int j = 0; j < 10 - 1 - i; j++) {
if (array[j] > array[j + 1]) {
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
printf("\n排序结果:\n");
for (int i = 0; i < 10; i++) {
printf("%d ", array[i]);
}
*/
/*
字符数组
char string[6] = {'i', 'P', 'h', 'o', 'n','e'};
字符数组, 又叫字符串
char string1[6] = "iphone";
注: 这两种写法是完全等价的
整型数组没有赋值, 默认为0
int a[5] ={1, 2, 3};
字符数组没有赋值, 默认为'\0'
char s[5] = {'i'};
字符数组的使用
printf("%c\n", string[3]);//访问数组元素
string1[1] = 'B';//数组元素的修改
打印字符数组的每一个元素
for (int i = 0; i < 6; i++) {
printf("%c", string[i]);
}
printf("\n");
用%s打印字符数组, 遇到'\0'就结束
printf("%s\n", string);
string[4] = '\0';
printf("%s", string);
*/
定义一个安全的字符串(字符数组)的做法: 保证最后一个元素是'\0'
char str1[] = {'1', 'i', 'P', 'h', 'o', 'n','e', '\0'};
char str2[] = "2iPhone";//""最后有一个'\0',8个元素
char str3[8] = {'3', 'i', 'P', 'h', 'o', 'n','e', '\0'};
char str4[8] = "4iPhone";//'\0'申请不到空间
元素个数
//str1: 7, 不是安全字符串
//str2: 8, 是安全字符串
//str3: 7, 不是安全字符串
//str4: 7, 不是安全字符串
printf("%s\n", str1);
printf("%s\n", str2);
printf("%s\n", str3);
printf("%s\n", str4);
*/
字符数组(字符串)的常用函数
/*
strlen(字符串)
计算字符串长度
遇到一个'\0'就结束, '\0'不计入长度
char string[10] = "I love U";
unsigned long length = strlen(string);
printf("%lu ", length);
*/
strcpy(字符串1, 字符串2)
字符串拷贝
把字符串2中的每一个字符拷贝到字符串1中, 直到字符串2遇到'\0'结束
注: 字符串1要足够的大, 防止越界
char str1[10] = "I miss";
char str2[10] = "you";
strcpy(str1, str2);
printf("%s\n", str1);
printf("%s\n", str2);
*/
strcat(字符串1, 字符串2)
字符串的拼接
从字符串1的第一个'\0'开始, 把字符串2的每一个元素拼接到字符串1中, 直到字符串2遇到'\0'结束
char str1[10] = "I love ";
char str2[10] = "you";
strcat(str1, str2);
printf("%s\n", str1);
printf("%s\n", str2);
*/
strcmp(字符串1, 字符串2)
字符串比较
字符串1中每一个元素和对应位置上的字符串2的元素的ACSII值相减, 如果为0, 就继续比较; 如果不为0, 就停止比较, 返回差值; 当对应的元素都为'\0'时, 比较结束, 返回结果0
char str1[10] = "ABC";
char str2[10] = "AAF";
int result = strcmp(str1, str2);
printf("result = %d\n", result);