第四天我们学习了一维数组。
1.数组的定义: 类型修饰符 数组名 = {初始值1, 初始值2, 初始值3, ..};
例如: int array[10] = {0};
int array[ ] = {9, 5, 8, 1, 0};
char string[ ] = {'i', 'P', 'h', 'o', 'n', 'e', '6'};
char string[ ] = "iPhone5";
// 注意: 数组下标(索引)的取值范围从0 ~ 元素个数 - 1;
// 注意: int array[ ] = {0}; 此定义可以,但无意义
// 注意:定义数组时,数组长度不能是变量,只能是常量或常量表达式
// 注意:在C语言中,数组为一个整体,不能直接参与运算
2.当想要遍历数组时,使用循环语句
3.练习3.生成2个数组,每个数组都有10个元素,元素取值范围20-40之间,数组对应元素相加,放到另外⼀一个数中。
// 定义两个数据源数组
int src1[10] = {0};
int src2[10] = {0};
//定义目标数组
int dest[10] = {0};
for (int i = 0; i < 10; i++) {
//元素取值范围20~40之间
src1[i] = arc4random() % (40 - 20 + 1) + 20;
//如果同时为两个元素个数相同的数组赋值,可以写在一个循环中
src2[i] = arc4random() % (40 - 20 + 1) + 20;
//将对应元素相加,存放在目标数组中
dest[i] = src1[i] + src2[i];
}
4.// 冒泡排序
int array[10] = {0};
printf("改变前:");
for (int i =0; i < 10; i++) {
// 给数组一个随机值,取值范围是0 ~ 20
array[i] = arc4random() % (20 -0 + 1) + 0;
printf("%d ", array[i]);
}
printf("\n");
//通常情况下,排序默认按照升序排列
//整个过程需要9次(数组元素个数-1)
for (int j =0; j < 10 -1; j++) {
//将最大值推到数组的最后一个位置,比较次数为元素个数-1次
//优化:将比较次数减少,减少的次数由j决定
for (int i =0; i < 10 -1 - j; i++) {
// 需要判断,前面的是否大于后面
if (array[i] > array[i+1]) {
// 如果前面大于后面元素,则交换位置
int temp = array[i];
array[i] = array[i +1];
array[i +1] = temp;
}
}
}
printf("改变后:");
for (int i =0; i< 10; i++) {
printf("%d ", array[i]);
}
printf("\n");
// 选择排序
printf("排序前:\n");
int array[10] = {0};
// 随机10个20~40的元素并打印
for (int i = 0; i < 10; i++) {
array[i] = arc4random() % (40 - 20 + 1) + 20;
printf("%d ", array[i]);
}
printf("\n");
// 一共10个元素选择10 - 1次最小值即可
for(int i = 0;i < 10 - 1;i++){
// min最小的元素所在的位置
int min = i;
// 判断最小的元素所在的位置
for(int j = i + 1; j < 10; j++){
if( array[min] > array[j]){
min = j;
}
}
// 如果最小的元素不在第i位的时候交换
if (min != i) {
int temp = array[min];
array[min] = array[i];
array[i] = temp;
}
}
printf("排序后:\n");
// 打印排序后的数组
for (int i = 0; i < 10; i++) {
printf("%d ", array[i]);
}
printf("\n");
// 注意:对于字符串,有一个快捷的输出方式,就是以%s为转移字符进行输出
// 注意:输出字符串时,表达式写数组名(就是字符数组的名字,并且不能加括号)
// 注意:%s后面的表达式需要给地址,用&符号取出元素在内当中的地址
// 注意:数组名代表的就是首元素的地址,可以近似的理解为string与 &string[0]恒等
6.字符数组函数的使用
(1)字符串长度函数测试
printf("字符串长度函数测试:\n");
// %lu是无符号长整型
char string[] = "iPhone";
// 用sizeof计算的是内存所占空间大小
printf("sizeof = %lu\n",sizeof(string));
//测试求字符串长度的函数(系统自带)
// strlen的参数需要写地址(1.可以直接写数组名 2.写&string[0])
// strlen的返回结果为字符串的长度,类型为unsigned long
unsigned long lenght = strlen(&string[0]);
printf("length = %lu\n", lenght);
(2)字符串拷贝函数测试
printf("字符串拷贝函数测试:\n");
// strcpy(dest, src) 从src拷贝到dest
//需要注意的地方 目标数组的容量一定要大于等于数据源数组的长度
//两个参数都需要写地址
char dest[7] = {0};
strcpy(dest, string);
printf("%s\n", dest);
(3)字符串拼接函数测试
printf("字符串拼接函数测试:\n");
// strcst(dest, src);
//需要注意的地方:注意目的数组的空间一定要大于等于两个数组之和
char apple[12] ="Apple";
strcat(&apple[0], &string[0]);
printf("%s\n", apple);
(4)字符串比较函数测试
printf("字符串比较函数测试:\n");
// strcmp(<#const char *#>, <#const char *#>)
// 字符串最后一位不同,将'4' - '5' = -1
printf("%d\n",strcmp("iPhone4","iPhone5"));
// 字符中间不同,将'P' - 'p' = -32 ;之后直接执行break;
printf("%d\n",strcmp("iPhone4","iphone5"));
// 字符长度不同,将第一个最后一位'\0' - 第二个最后一位'5' = 0 - 53 = -53
printf("%d\n",strcmp("iPhone","iPhone5"));
// 需要记住的是:字符串比较函数是基于ASCII码表来比较的
// 常用的ASCII码值 : 'A'-65; 'a'-97; '0'-48