第四天我們學習了一維數組。
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