數組:
什么是數組:變量的組合,是一種批量定義變量的方式。
定義:類型 數組名[數量];int arr[5];
使用:數組名[下標];下標:從零開始,范圍:0~數量-1。
遍歷:與for循環配合,使用循環變量i當作數組的下標。
初始化:類型 數組名[數量] = {1,2,3,4,5,...};1、數組與普通變量一樣默認值是隨機的,為了安全要對進行初始化。2、這種初始化語法只能在定義數組時使用,而且必須使用常量初始化。3、初始化數據過多,編譯器會丟棄并產生警告。4、初始化數據不夠,編譯器則會補0。5、初始化數組時長度可以省略,編譯器會自動統計數據的個數然后告訴數組。sizeof(arr)/sizeof(arr[0]) = 數組的長度
練習1:定義一個長度為10的數組并初始化,計算出最大值,最小值以及平均值。
#include <stdio.h>int main(int argc,const char* argv[])
{int arr[10] = {1,9,0,7,6,5,3,4,8,2};int max = arr[0] , min = arr[0];float sum = arr[0];for(int i=1; i<10; i++){if(arr[i] > max){max = arr[i];}if(arr[i] < min){min = arr[i];}sum += arr[i];}printf("%d %d %g\n",min,max,sum/10);}
練習2:定義一個長度為10的數組并初始化,進行升序排序。
for(int i=0; i<x-1; i++)
{
for(int j=i+1; j<x; j++)
{
if(i < j)
{
swap i j;
}
}
}
#include <stdio.h>int main(int argc,const char* argv[])
{int arr[10] = {1,9,0,7,6,5,3,4,8,2};for(int i=0; i<9; i++){for(int j=i+1; j<10; j++){if(arr[i] > arr[j]){int t = arr[i];arr[i] = arr[j];arr[j] = t;}}}for(int i=0; i<10; i++){printf("%d ",arr[i]);}
}
數組越界
越界:為了程序的運算效率是不會檢查數組的下標。
數組越界的后果:
1、一切正常。
2、段錯誤
3、臟數據
練習3:定義一個長度為10的數組并初始化,找出數組中第二個大的值。
#include <stdio.h>int main(int argc,const char* argv[])
{int arr[10] = {20,19,0,7,6,5,3,4,38,2};int max = arr[0]>arr[1]?arr[0]:arr[1];int max2 = arr[0]>arr[1]?arr[1]:arr[0];for(int i=2; i<10; i++){if(arr[i] > max){max2 = max;max = arr[i];}else if(arr[i] > max2){max2 = arr[i];}}printf("%d %d\n",max,max2);
}
二維數組:
一維數組相當于把變量排成一排,通過編號訪問。
二維數組相當于把變量排成矩陣,通過行號和列號訪問。
定義:類型 數組名[行數][列數];int arr[3][5];[0,0][0,1][0,2][0,3][0,4][1,0][1,1][1,2][1,3][1,4][2,0][2,1][2,2][2,3][2,4]
使用:數組名[行下標][列下標]行下標:0 ~ 行數-1列下標:0 ~ 列數-1
遍歷:需要與雙層for循環配合,外層循環負責遍歷行,內層循環負責遍歷列。for(int i=0; i<3; i++){for(int j=0; j<5; j++){printf("%d ",arr[i][j]);}printf("\n");}
初始化:類型 數組名[行數][列數] = {{第一行},{第二行},{第三行}};
練習4、定義一個5*5的數組,找出其中的最小值下標,計算周的和是多少。
#include <stdio.h>int main(int argc,const char* argv[])
{int arr[5][5] = {{-1,3,5,7,9},{0,2,4,6,8},{1,2,13,4,5},{6,7,8,9,0},{4,5,6,7,8}}; int min_x = 0 , min_y = 0;for(int i=0; i<5; i++){for(int j=0; j<5; j++){if(arr[i][j] < arr[min_x][min_y]){min_x = i;min_y = j;}}}int sum = 0;min_x>0 && (sum+=arr[min_x-1][min_y]); // 上min_x<4 && (sum+=arr[min_x+1][min_y]); // 下min_y>0 && (sum+=arr[min_x][min_y-1]); // 左min_y<4 && (sum+=arr[min_x][min_y+1]); // 右min_x>0 && min_y>0 && (sum+=arr[min_x-1][min_y-1]); // 左上min_x>0 && min_y<4 && (sum+=arr[min_x-1][min_y+1]); // 右上min_x<4 && min_y>0 && (sum+=arr[min_x+1][min_y-1]); // 左下min_x<4 && min_y<4 && (sum+=arr[min_x+1][min_y+1]); // 右下printf("sum=%d\n",sum);
}
變長數組:
定義數組時使用變量當作它長度,在代碼編譯期間數組的度是不確定的,當執行到數組的定義語句時它的長度才家有確定下來,一旦確定就無法更改了。優點:可以根據實際情況來確定數組長度達到節約內存目的。
缺點:不可以初始化
#include <stdio.h>int main(int argc,const char* argv[])
{int n = 0;// 數組長度可以 變化printf("請輸入數組的長度:");scanf("%d",&n);int arr[n] = {};printf("%d\n",sizeof(arr)/sizeof(arr[0]));
}
練習5:顯示N層楊輝三角形。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
#include <stdio.h>int main(int argc,const char* argv[])
{int n = 0;printf("請輸入n的值:");scanf("%d",&n);int arr[n][n];for(int l=0; l<n; l++){arr[l][0] = 1;arr[l][l] = 1;for(int c = 1; c<l; c++){arr[l][c] = arr[l-1][c]+arr[l-1][c-1];}}for(int i=0; i<n; i++){for(int j=0; j<=i; j++){printf("%d ",arr[i][j]);}printf("\n");}
}
下期:
進制轉換、原反補
函數
類型限制:const static volatile register extern
指針
字符串
堆內存管理