7、C語言:數組

數組的概念

數組是一組有序的類型相同的數據的集合,這些數據稱爲數組的元素

一維數組

  • 定義
    語法格式:類型說明符 數組名[正整型常量表達式]
    類型說明符指定數組的類型,數組名和變量名命名規則相同
    方括號內是數組的長度,下標或方括號的個數稱爲數組的維度
    數組元素的類型稱爲數組的基類型
    不允許使用變量對數組大小進行定義,數組的說明語句必須在可執行語句之前
  • 初始化
    1)對全部元素初始化:int a[5]={1,2,3,4,5};int a[] ={1,2,3,4,5};,即對全部元素賦值可以不指定長度
    2)對部分元素賦值,其他按0處理:int a[9] = {1,2};,這樣a[0]=1,a[1]=2,其他元素爲0
    3)一維數組賦值的個數不能超過數組長度
  • 一維數組的引用
    1)一次只能引用單個數組元素,不能一次引用整個數組
    2)數組名是數組的首地址,即a[0]的地址,是一個地址常量
    3)數組元素是一個數值,引用數組元素時,根據首地址和下標自動計算元素的實際地址
    4)不能直接數組a = 數組b的方式賦值,因爲數組b只是一個地址,並不是實際的值
    5)要讓一個數組賦值給另一個數組要逐個元素賦值或使用循環賦值
  • 程序實例
    1)利用數組計算斐波那契數列的前20個數,並以每行5個輸出
    #include<stdio.h>
    int main(){
    	int F[20],i;
    	F[0] = F[1] = 1;
    	for (i=2;i<20;i++){
    		F[i] = F[i-1]+F[i-2];
    	}
    	for (i=0;i<20;i++){
    		if(i%5==0){
    			printf("\n");
    		}
    		printf("%6d",F[i]);
    	}
    	return 0;
    }
    
    2)隨機輸入6個整型數字,利用冒泡排序法排序
    #include<stdio.h>
    int main(){
    	int a[6],i,j,tmp,p;
    	for(i=0;i<6;i++){
    		scanf("%d",&a[i]);
    	}
    	printf("\n");
    	for(i=0;i<6-1;i++){
    		for(j=1;j<6-i;j++){
    			if(a[j-1]>a[j]){
    				tmp = a[j];
    				a[j] = a[j-1];
    				a[j-1] = tmp;
    			}
    		}
    	for(p=0;p<6;p++){
    		printf("%d ",a[p]);
    	}
    	printf("\n");
    	}
    	return 0;
    }
    }
    

二維數組

  • 定義
    語法格式:類型說明符 數組名[正整型常量表達式][正整型常量表達式]
    二維數組在內存中按行的順序存放
    其他定義條件與一維數組相同
  • 初始化
    1)分行給二維數組賦值:int a[2][3] = {{2,3,1}, {1,2,3}};
    2)全部元素按順序賦值:int a[2][3] = {2,3,1,1,2,3};int a[ ][3] = {2,3,1,1,2,3};,即第一個下標可以省略
    3)對部分元素賦值:int a[2][3] = {{1},{0,1},{0,0,1}};int a[2][3] = {{1},{},{0,0,1}};int a[2][3] = {{5,6},{7,8}};int a[2][3] = {5,6,7,8};
  • 二維數組的引用
    1)數組名是數組的首地址,即a[0][0]的地址,是一個地址常量
    2)數組名是常量,不能對其賦值
  • 程序實例
    將一個矩陣a={{1,2,3},{4,5,6}}轉置存到另一個矩陣b中
    #include<stdio.h>
    int main(){
    	int a[][3] = {{1,2,3},{4,5,6}};
    	int b[2][3],i,j;
    	for(i=0;i<2;i++){
    		for(j=0;j<3;j++){
    			b[j][i] = a[i][j];
    		}
    	}
    	for(i=0;i<3;i++){
    		for(j=0;j<2;j++){
    			printf("%d ",b[i][j]);
    		}
    		printf("\n");
    	}
    	return 0;
    }
    

字符數組與字符串

  • 定義
    C語言用字符數組存放字符串
    語法格式:char 數組名[正整型常量表達式]
    字符串實際佔有存儲單元的數量等於字符串長度+1,因爲還要存一位結束符 \0
    在這裏插入圖片描述
  • 初始化
    1)用單個字符對字符數組初始化
    char ch[6] = {'C','H','I','N','A','\0'};
    初值個數少於數組長度時,系統會自動添加結束符
    初值個數(包括結束符)等於數組長度時,定義時可以省略長度
    初值個數超過數組長度時,會報錯
    2)用字符串常量對字符數組初始化
    char ch[6] = "china";char ch[] = "china"
    長度爲n的數組,只能存n-1個字符,剩下的一位要給結束符
    char d[12]="How are you";等價於char d[12] = {'H','o','w','' ','a','r','e',' ' ,'y','o','u','\0'};
    在循環結構中可以用結束符來控制循環

字符數組的輸入和輸出

  • puts輸出字符串函數、使用printf和%s輸出字符串
    puts函數輸出後會自動換行,而printf不會
    #include<stdio.h>
    int main(){
    	char a[] = "book";
    	printf("%s",a);
    	puts(a);
    	return 0;}
    
  • gets輸入字符串函數、使用scanf和%s輸出字符串
    gets可以接收空格,scanf不能
    使用scanf時數組名前不用&號
    &號的含義是取地址,而數組名本身就有代表地址的意思
    #include<stdio.h>
    int main(){
    	char a[12];
    	gets(a);  //輸入How are you
    	puts(a);  //輸出How are you
    	scanf("%s",a); //輸入How are you
    	puts(a);	   //輸出How
    	return 0;}
    
    在這裏插入圖片描述
  • 字符串處理函數,需要<string.h>
    1)strcat(字符數組1, 字符數組2):連接兩個字符串
    2)strcpy(字符數組1, 字符數組2):將2拷貝到1中,1的長度應大於2
    3)strlen(字符數組):返回數組的長度(不包括\0)
    4)strlwr(字符數組):將大寫字符串變爲小寫字符串
    5)strmp(字符數組1, 字符數組2):字符串的比較
    1. 比較兩個字符串第一個不同字符的ACSII碼的大小
    2. 如果全部字符都相等,返回0
    3. 如果有不相等的,返回該位置字符的ACSII碼之差
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章