C語言程序設計 課件 (張惠濤 ) 西電 第4章 數組_第1頁
C語言程序設計 課件 (張惠濤 ) 西電 第4章 數組_第2頁
C語言程序設計 課件 (張惠濤 ) 西電 第4章 數組_第3頁
C語言程序設計 課件 (張惠濤 ) 西電 第4章 數組_第4頁
C語言程序設計 課件 (張惠濤 ) 西電 第4章 數組_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第四章數組數組64.1一維數組4.2二維數組4.3字符數組4.4數組程序舉例數組6在使用C語言進行程序設計過程中,我們使用數組把具有相同類型的若干變量按有序的形式組織起來,這些按一定順序排列的同類型數據元素的集合稱為數組。在C語言中,數組屬于構造數據類型,它可以被分解成若干個數組元素,而這些數組元素可以是基本數據類型,也可以是構造類型。按數組元素的類型劃分,數組可分為數值數組、字符數組、指針數組、結構體數組等多種類型。本章主要介紹數值數組以及字符數組的定義及使用方法。4.1一維數組4.1.1一維數組的定義在C語言中規(guī)定,數組必須先定義再使用。一維數組定義方式為:

類型說明符數組名[整形常量或常量表達式];其中:類型說明符是int、char、float、double等基本數據類型以及構造數據類型。數組名是用戶定義的數組標識符,其命名規(guī)則與基本變量名一致。常量表達式使用中括號括起來,表示數據元素的個數,也稱為數組的長度,可以是一個大于等于1的整數、符號常數或常量表達式。例如:intarr[5];//定義數組名為arr、每個元素類型都是整型、共有5個元素的數組#defineLEN100//定義宏常量LEN,其值為100floatarr1[LEN],arr2[LEN+10];//可以使用符號常數和常量表達式來定義數組charch[8];//定義數組名為ch、每個元素類型都是字符型、共有8個元素的數組4.1一維數組4.1.1一維數組的定義對于數組定義應注意以下幾點:數組名的書寫規(guī)則應符合標識符的書寫規(guī)定,在前面章節(jié)已做介紹;數組名不能與其它變量名相同,例如對于intarr,arr[5];系統(tǒng)會報錯;數組的類型代表了其中每個元素的值類型,即同一個數組,其元素數據類型均相同;中括號中常量表達式表示數組元素的個數,但其下標從0開始計算,因此intarr[5];定義完成后,其元素分別為arr[0],arr[1],arr[2],arr[3],arr[4];中括號中可以是符號常數或常量表達式,但不能是變量。//正確示例#defineLEN100main(){inta[LEN],b[LEN+100];……}//錯誤示例main(){intlen=100;inta[len],b[len+100];……}4.1一維數組4.1.2一維數組的初始化數組初始化賦值,也可簡稱為初始化,是指在定義的同時給數組元素賦予初值。數組初始化在編譯階段進行,這樣的程序運行時間短,執(zhí)行效率高。初始化賦值的形式為:類型說明符數組名[整形常量或常量表達式]={值1,值2,……值n};其中,使用大括號將數據值集合括起來,而{}中的數據值即為若干元素的初值,各值之間用逗號間隔。例如:intarr[5]={10,11,12,13,14};//其中arr[0]到arr[4]的值分別為10,11,12,13,144.1一維數組4.1.2一維數組的初始化C語言對數組的初始化還有以下幾點說明:可以只給部分元素賦初值當大括號中值的個數少于元素總個數時,只給靠左面的部分元素賦值,例如:intarr[5]={10,11,12};表示只給arr[0]到arr[2]分別賦值10,11,12,而后2個整形元素自動賦值0。只能給元素逐個賦值,不能給數組整體賦值例如:給5個元素全部賦值為1,只能寫為intarr[5]={1,1,1,1,1};而不能寫為:intarr[5]=1;給全部元素初始化賦值時,數組元素的個數可以不寫例如:intarr[5]={10,11,12,13,14};可寫為:intarr[]={10,11,12,13,14};4.1一維數組4.1.3一維數組元素的引用C語言規(guī)定數組必須先定義后使用,且只能逐個引用數組元素而不能一次引用所有元素,這是因為數組元素,也被稱為下標變量,是組成數組的基本單元,而每個數組元素就是一個變量,其使用方法與同類型的變量一樣。數組元素的表示形式為:數組名[下標]其中下標可以是整型常量或變量表達式,這與定義時的常量表達式不同。例如intarr[5]={10,11,12,13,14};使用arr[2],a[i+j],a[i++](其中i,j都是整形變量)引用上述數組的元素都是正確的形式。4.1一維數組4.1.3一維數組元素的引用例4.1數組的定義與元素引用#include<stdio.h>#defineLEN5voidmain(){inti,arr1[LEN];intarr2[5]={10,11,12,13,14};arr1[0]=0;arr1[1]=1;arr1[2]=2;arr1[3]=3;arr1[4]=4;for(i=0;i<=4;i++)printf("%d",arr1[i]);

printf("%d",arr2[0]);printf("%d",arr2[1]);printf("%d",arr2[2]);printf("%d",arr2[3]);printf("%d",arr2[4]);}4.1一維數組4.1.3一維數組元素的引用例4.2數組元素可以當做普通變量來使用#include<stdio.h>#defineLEN5voidmain(){inti,arr1[LEN];intarr2[5]={10,11,12,13,14};for(i=0;i<5;i++)arr1[i]=arr2[i]*2;for(i=4;i>=0;i--)printf(“%d\n”,arr1[i]);}4.1一維數組4.1.4一維數組程序舉例例4.3使用數組來實現求5個整數中的最大值#include<stdio.h>voidmain(){inti,max;//定義整型變量i當計數器變量,max存儲最大值intarr[5];printf("請輸入5個整數:\n");for(i=0;i<5;i++)scanf("%d",&arr[i]);//使用scanf函數進行動態(tài)賦值max=arr[0];for(i=1;i<5;i++)if(arr[i]>max)max=arr[i];printf("數組中最大的整數是%d\n",max);}4.1一維數組4.1.4一維數組程序舉例【例4.4】使用數組為當前數組賦值#include<stdio.h>voidmain(){inti,j,arr1[5]={1,2,3,4,5},arr2[5]={0};printf("\n數組arr2所有元素的初始值為:\n");for(i=0;i<5;i++)printf("%-5d",arr2[i]);for(i=0;i<5;i++)arr2[i]=arr1[i];printf("\n數組arr2在被arr1賦值后所有元素的值為:\n");for(i=0;i<5;i++)printf("%-5d",arr2[i]);}4.2二維數組4.2.1二維數組的定義二維數組定義的一般形式是:類型說明符數組名[常量表達式1][常量表達式2]其中常量表達式1表示第一維下標的長度,常量表達式2則表示第二維下標的長度。例如:inta[5][5];定義了一個5行5列的數組,數組名為a,其下標變量的類型與一維數組一樣,均為整型。該數組的下標變量共有5×5個,即:a[0][0],a[0][1],a[0][2],a[0][3],a[0][4]a[1][0],a[1][1],a[1][2],a[1][3],a[1][4]a[2][0],a[2][1],a[2][2],a[2][3],a[2][4]a[3][0],a[3][1],a[3][2],a[3][3],a[3][4]a[4][0],a[4][1],a[4][2],a[4][3],a[4][4]4.2二維數組4.2.1二維數組的定義二維數組定義的一般形式是:

類型說明符數組名[常量表達式1][常量表達式2]其中常量表達式1表示第一維下標的長度,常量表達式2則表示第二維下標的長度。例如:inta[5][5];定義了一個5行5列的數組,數組名為a,其下標變量的類型與一維數組一樣,均為整型。該數組的下標變量共有5×5個,即:a[0][0],a[0][1],a[0][2],a[0][3],a[0][4]a[1][0],a[1][1],a[1][2],a[1][3],a[1][4]a[2][0],a[2][1],a[2][2],a[2][3],a[2][4]a[3][0],a[3][1],a[3][2],a[3][3],a[3][4]a[4][0],a[4][1],a[4][2],a[4][3],a[4][4]二維數組在概念上是二維的,但是,實際的硬件存儲器卻是連續(xù)編址的,也就是說存儲器單元是按一維線性排列的。在C語言中,二維數組是按行排列的。4.2二維數組4.2.2二維數組的初始化二維數組在定義的同時也可以進行初始化操作,使數組中若干元素獲得相應的值。二維數組初始化也是在編譯階段進行,這樣的程序運行時間短,執(zhí)行效率高。二維初始化賦值的形式為:

類型說明符數組名[整形常量或常量表達式1][整形常量或常量表達式2]={值1,值2,……值n};實際上,二維數組初始化時可按行分段賦值,也可按行連續(xù)賦值。例如對于數組a[4][3]:按行分段賦值可寫為:inta[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};按行連續(xù)賦值可寫為:inta[4][3]={1,2,3,4,5,6,7,8,9,10,11,12};這兩種初始化的結果是完全相同的,但推薦分段賦值的方法,這樣層次清晰,不容易出錯。4.2二維數組4.2.2二維數組的初始化例4.5二維數組初始化可以使用不同的形式#include<stdio.h>voidmain(){inti,j,a[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};intb[4][3]={{1,2,3,4,5,6,7,8,9,10,11,12};printf(“\n數組a初始化之后各元素的值依次為:\n”);for(i=0;i<4;i++)for(j=0;j<3;j++)printf(“%-4d”,a[i][j];printf(“數組b初始化之后各元素的值依次為:\n”);for(i=0;i<4;i++)for(j=0;j<3;j++)printf(“%-4d”,b[i][j];)}4.2二維數組4.2.3二維數組元素的引用二維數組的元素也稱為雙下標變量,二維數組中各元素的表示形式為:

數組名[下標1][下標2]其中下標1和下標2應為整型常量或整型表達式。在C語言中,二維數組與一維數組一樣,也必須先定義后使用,且只能引用每一個元素而不能整體引用。例如:執(zhí)行完語句inta[4][3]={1,2,3,4,5,6,7,8,9,10,11,12};之后a[0][1]表示數組0行1列的元素,其值為2。4.2二維數組4.2.4二維數組程序舉例例4.6設計一個簡單的程序,統(tǒng)計學生語文、數學、英語三門課程的總分及平均分,具體如下表所示。課程語文數學英語總分平均分Alice808590

Bob908894

Clinton867892

可設一個二維數組a[3][5]存放3位同學三門課的成績、總分及平均分。根據數組的定義、初始化及引用方法,將總分及平均分計算并保存到相應的數組元素中。由于分數可能有小數,故將數組定義成單精度型。4.2二維數組4.2.4二維數組程序舉例#include<stdio.h>voidmain(){inti,j;//其中i,j為計數器floattotal=0,aver=0;//total表示總分,aver表示平均分,將兩者均初始化為0floatscore[3][5]={{80,85,90},{90,88,94},{86,78,92}};for(i=0;i<3;i++){for(j=0;j<3;j++){total+=score[i][j];}score[i][3]=total;score[i][4]=total/3.0;total=0;}printf(“3位同學的成績表打印如下:\n”);printf(“語文

數學

英語

總分

平均分\n”);for(i=0;i<3;i++){for(j=0;j<5;j++)printf(“%-8.2f”,score[i][j]);printf(“\n”);}}4.3字符數組4.3.1字符數組的定義形式與前面介紹的數值數組相同,字符數組定義的一般形式為:一維數組: char數組名[整型常量或整型常量表達式];二維數組: char數組名[整型常量或整型常量表達式1][整型常量或整型常量表達式2];例如:charc[5];//定義一維字符數組,其最大容量為5個字符,元素下標從0到4charc[4][3];//定義二維字符數組,其包含的元素第一個下標從0到3、第二個下標從0到2本節(jié)重點講述一維字符數組,讀者可參考二維數組的基礎知識來理解多維字符數組。4.3字符數組4.3.2字符數組的初始化字符數組也允許在定義時作初始化賦值,不過每個值需要使用單引號‘’引起來。例如讓字符數組存儲hello這個單詞:charc[6]={‘h’,‘e’,‘l’,‘l’,‘o’};賦值后各元素的值如表所示。其中c[5]未賦值,而系統(tǒng)自動為其賦予0值。當對全體元素賦初值時也像前面普通數組一樣,可以省去長度。例如:charc[]={‘h’,‘e’,‘l’,‘l’,‘o’};注意,這時數組c的長度不再是6,而是自動定為5。c[0]c[1]c[2]c[3]c[4]‘h’‘e’‘l’‘l’‘o’4.3字符數組4.3.3字符數組的引用與其他基本類型的數組相同,字符數組也必須先定義后使用,且只能逐個引用數組元素而不能一次引用所有元素,而每個字符數組元素就是一個字符變量,其使用方法與字符變量相同。字符數組元素的表示形式為:

數組名[下標]以數組初始化時,以charc[]={‘h’,‘e’,‘l’,‘l’,‘o’};為例,可使用c[1]來引用‘e’;c[1+3]來引用’o’,其與c[4]等價;c[i]來引用其中任一值,其中i為整型變量,且0≤i≤4。4.3字符數組4.3.3字符數組的引用例4.7字符數組初始化及元素引用#include<stdio.h>voidmain(){inti;charc[]={‘h’,‘e’,‘l’,‘l’,‘o’};printf(“數組中的元素值為:\n”);for(i=0;i<5;i++)printf(“%c”,c[i]);}4.3字符數組4.3.4字符串和字符串結束標志C語言使用一個字符數組來存放一個字符串,并且前面章節(jié)介紹字符串常量時,已說明字符串總是以'\0'作為串的結束標記。因此把一個字符串存入數組時,也把結束符'\0'存入數組,并以此標志該字符串的結束。有了'\0'標志后,就不必使用字符數組長度來判斷字符串的長度了,在使用循環(huán)語句對字符串數組進行相關操作時,只需隨時檢測‘\0’即可。4.3字符數組4.3.5字符數組的輸入輸出1、使用格式符“%c”逐個輸入或輸出一個個字符;例如:inti;charc[10]={‘\0’};for(i=0;i<9;i++)scanf(“%c”,&c[i]);這里使用循環(huán)語句逐個地輸入每個字符,同理也可用printf語句逐個的輸出字符串。2、使用格式符“%s”一次性輸入或輸出整個字符串,所以在采用字符串方式后,字符數組的輸入輸出將變得簡單方便。例如:inti;charc[10]={‘\0’};scanf(“%s”,c);printf(“%s”,c);這里用printf函數和scanf函數一次性輸出輸入一個字符數組中的字符串,而不必使用循環(huán)語句逐個地輸入輸出每個字符。4.3字符數組4.3.5字符數組的輸入輸出例4.9使用字符串對字符數組進行初始化#include<stdio.h>voidmain(){charc[]="hello\nworld";printf("%s\n",c);}4.3字符數組4.3.5字符數組的輸入輸出例4.10使用%s格式符對字符數組進行輸入和輸出#include<stdio.h>voidmain(){charc[20];printf("請輸入一個英文單詞:\n");scanf("%s",c);printf("%s",c);}4.3字符數組4.3.5字符數組的輸入輸出例4.11使用%s格式符進行字符串輸入時,空格及后面符號不會被輸入#include<stdio.h>voidmain(){charc[20];printf("請輸入一個字符串:\n");scanf("%s",c);printf("%s",c);}4.3字符數組4.3.6字符串處理函數C語言提供了豐富的字符串處理函數,大致可分為字符串的輸入、輸出、合并、復制、比較、求長度、大寫轉小寫、小寫轉大寫等。使用這些字符串函數,可使編程效率大大提高,而在使用前應包含頭文件"stdio.h"和"string.h"。課本中介紹了編程中最常用的字符串函數,其中puts()、gets()在"stdio.h"中定義,而strcat()、strcpy()、strcmp()、strlen()在"string.h"中定義。注意:在有些常用的編程軟件中不寫含頭文件"stdio.h"和"string.h"的語句,程序也能執(zhí)行,那是因為編譯器默認做了引用正確頭文件的工作。

這部分例題請參考課本內容。4.4數組程序舉例例4.20使用數組,將10個整數“4,8,19,20,83,12,987,34,49,71”按照由小到大的順序排序并輸出。分析:本例采用冒泡排序的算法來編寫程序。#include"stdio.h"voidmain(){ inta[10]={4,8,19,20,83,12,987,34,49,71}; inti,j,temp; for(i=0;i<9;i++) for(j=9;j>i;j--) if(a[i]>a[j]) { temp=a[i]; a[i]=a[j]; a[j]=temp; } for(i=0;i<10;i++) printf("%-5d",a[i]);}4.4數組程序舉例例4.21將以下3組,每組10個整數存入3行10列的二維數組中,將其中的每一行進行從小到大的排序并按行輸出:第一組為“4,8,19,20,83,12,987,34,49,71”,第二組為“4,8,1,23,876,345,44,79,123,-5”,第三組為“-34,56,-333,90,3,76,1,-1,22,-340”。分析:基于【例4.20】的算法思路,只需要再設置一個變量來分別訪問二維數組的每一行,而每一行還使用“冒泡排序”法即可。4.4數組程序舉例#include"stdio.h"voidmain(){ inta[3][10]={ {4,8,19,20,83,12,987,34,49,71}, {4,8,1,23,876,345,44,79,123,-5}, {-34,56,-333,90,3,76,1,-1,22,-340} }; inti,j,k,temp; for(k=0;k<3;k++) for(i=0;i<9;i++) for(j=i+1;j<=9;j++) if(a[k][i]>a[k][j])

{ temp=a[k][i]; a[k][i]=a[k][j]; a[k][j]=temp; } for(k=0;k<3;k++)

{ for(i=0;i<10;i++) printf("%-8d",a[k][i]); printf("\n"); }}4.4數組程序舉例例4.22輸入10個英文單詞按字母順序排列輸出。分析:10個英文單詞可由一個二維字符數組來存儲。C語言中規(guī)定可以把二維數組看成多個一維數組,因此該程序可以按10個一維數組處理,而每個一維數組就是一個英文單詞字符串,再用字符串比較函數比較各一維數組的大小,并使用前面“冒泡排序”法,最后輸出結果即可。#include"string.h"voidmain(){ chars[10][20]; chartemp[20]; inti,j; for(i=0;i<10;i++) gets(s[i]); for(i=0;i<9;i++) for(j=i+1;j<=9;j++) if(strcmp(s[i],s[j])==1){ strcpy(temp,s[i]); strcpy(s[i],s[j]); strcpy(s[j],temp);

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論