《C語言程序設計》課件-第6章 數(shù) 組_第1頁
《C語言程序設計》課件-第6章 數(shù) 組_第2頁
《C語言程序設計》課件-第6章 數(shù) 組_第3頁
《C語言程序設計》課件-第6章 數(shù) 組_第4頁
《C語言程序設計》課件-第6章 數(shù) 組_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

C語言程序設計智能工程學院“現(xiàn)場課程”

錄目錄CONTENTS

一維數(shù)組6.1

二維數(shù)組6.2在C語言中,一維數(shù)組是存儲相同數(shù)據(jù)類型元素的線性集合,需遵循“先定義、后使用”的原則,其核心操作包括定義、引用、初始化及實際應用。一維數(shù)組的定義方式為:類型說明符數(shù)組名[常量表達式];類型說明符:指定數(shù)組元素的數(shù)據(jù)類型,可使用int(整型)、float(單精度浮點型)、char(字符型)等基本數(shù)據(jù)類型,或結構體、枚舉等構造數(shù)據(jù)類型。例如floatscore[5]中,float表明數(shù)組score的元素均為單精度浮點數(shù)。數(shù)組名:用戶自定義的標識符,需遵循C語言變量命名規(guī)則(由字母、數(shù)字、下劃線組成,且首字符不能為數(shù)字),且不能與其他變量名重復。例如若已定義inta;,則floata[10];是錯誤的,會導致命名沖突。常量表達式:用于指定數(shù)組元素的個數(shù)(即數(shù)組長度),必須是常量或符號常量,不能是變量。例如:合法定義:#defineLEN5intarr[LEN+3];(符號常量與常量表達式結合);非法定義:intn=4;intarr[n];(變量n不能用于指定數(shù)組長度)。

6.1一維數(shù)組6.1.1一維數(shù)組的定義

6.1一維數(shù)組6.1.1一維數(shù)組的定義

提示數(shù)組元素類型統(tǒng)一性:同一數(shù)組的所有元素數(shù)據(jù)類型必須相同,例如intnum[6]的6個元素均為整型,無法存儲字符或浮點數(shù)。下標起始規(guī)則:數(shù)組下標從0開始,而非1。例如inta[5]包含的元素是a[0]、a[1]、a[2]、a[3]、a[4],共5個元素,不存在a[5]。內存分配特性:數(shù)組在內存中占據(jù)連續(xù)存儲空間,數(shù)組名代表存儲區(qū)的首地址(即數(shù)組名==&數(shù)組名[0]),且數(shù)組名是地址常量,不能被賦值或參與運算。例如inta[15]在VisualC++環(huán)境中,每個整型元素占4字節(jié),數(shù)組總內存大小為4*15=60字節(jié),元素地址依次為1000(a[0])、1004(a[1])……1060(a[14])。要數(shù)組引用即訪問數(shù)組中的單個元素,通過“數(shù)組名+下標”實現(xiàn),是數(shù)組操作的基礎。一維數(shù)組的引用格式:數(shù)組名[下標]

提示(1)下標可以是常量或常量表達式,如a[3],a[3+2]。(2)下標也可以是變量或變量表達式,如a[i],a[i+j],a[i++]。(3)引用時,下標值若不是整型,C系統(tǒng)會自動取整,如a[5.3]相當于a[5]。(4)下標值從0開始,而不是從1開始。(5)下標不能越限,即引用時的下標不能超過或等于定義時的下標值,如“inta[10];a[10]=4;”是錯誤的。

6.1一維數(shù)組6.1.2一維數(shù)組的引用【例6-1】輸入10個不同整數(shù)并求最小值?!締栴}分析】這里我們需要10個變量用來存儲這10個整數(shù),因此,可定義一個整型數(shù)組,包含10個數(shù)組元素。定義一個變量min用來存儲最小值,先將a[0]賦給min,然后將a[1]~a[9]逐個與min進行比較,如小于min,則將值賦給min,最后輸出min的值即為最小值。

6.1一維數(shù)組6.1.2一維數(shù)組的引用【參考代碼】#include<stdio.h>intmain(){inta[10];//定義存儲10個整數(shù)的數(shù)組inti,min;//輸入10個整數(shù)for(i=0;i<=9;i++){scanf("%d",&a[i]);//逐個引用數(shù)組元素賦值}//輸出10個整數(shù)for(i=0;i<=9;i++){printf("%4d",a[i]);//逐個引用數(shù)組元素輸出}//求最小值min=a[0];//初始化為第一個元素for(i=1;i<=9;i++){if(min>a[i]){min=a[i];//引用元素比較并更新最小值}}printf("\n最小值為%d\n",min);return0;}

6.1一維數(shù)組6.1.2一維數(shù)組的引用【運行結果】程序運行結果如圖所示?!境绦蛘f明】由于不能對數(shù)組整體進行(讀取)操作,只能對數(shù)組的元素進行操作,因此,如果要輸入或輸出a[0]到a[9]的所有數(shù)據(jù),需要用到循環(huán)語句,讓循環(huán)變量從0到9循環(huán),從而輸入或輸出數(shù)組中的每個數(shù)。

6.1一維數(shù)組6.1.2一維數(shù)組的引用數(shù)組初始化是在定義數(shù)組時直接為元素賦初值,可減少程序運行時的賦值操作,提升效率,初始化在編譯階段完成。初始化格式:類型說明符

數(shù)組名[常量表達式]={數(shù)值1,數(shù)值2,...,數(shù)值n};初始化規(guī)則:(1)部分元素初始化:若{}中數(shù)值個數(shù)少于數(shù)組長度,未賦值元素自動為0(整型數(shù)組)、0.0(浮點型數(shù)組)或'\0'(字符數(shù)組)。例如inta[5]={1,2,3};,則a[0]=1、a[1]=2、a[2]=3、a[3]=0、a[4]=0。(2)禁止整體賦值:不能直接給數(shù)組整體賦單一值,需逐個指定元素值。例如inta[5]=1;是錯誤的,正確寫法為inta[5]={1,1,1,1,1};。(3)省略長度初始化:若{}中包含全部元素的初值,可省略數(shù)組長度,系統(tǒng)會根據(jù)數(shù)值個數(shù)自動確定長度。例如inta[]={1,2,3,4};,數(shù)組a的長度為4。(4)如果花括號{}中數(shù)值的個數(shù)多于數(shù)組元素的個數(shù),編譯時將提示語法錯誤。數(shù)值個數(shù)限制:{}中數(shù)值個數(shù)不能超過數(shù)組長度,否則編譯報錯。例如inta[3]={1,2,3,4};是非法的。

6.1一維數(shù)組6.1.3一維數(shù)組的初始化【例6-2】生成斐波那契數(shù)列前10項?!締栴}分析】根據(jù)題意,以f[n]表示第n項,其規(guī)律為f[n]=f[n-2]+f[n-1],如此構成的數(shù)列為:f[0]=1,f[1]=1,f[2]=2,f[3]=3,…,f[n]=f[n-2]+f[n-1]。

6.1一維數(shù)組6.1.4一維數(shù)組應用舉例【參考代碼】#include<stdio.h>intmain(){intf[10],i;f[0]=1;f[1]=1;//初始化前兩項for(i=2;i<10;i++){f[i]=f[i-1]+f[i-2];//計算后續(xù)項}//輸出(每5項換行)for(i=0;i<10;i++){if(i%5==0)printf("\n");printf("%6d",f[i]);}return0;}

6.1一維數(shù)組6.1.4一維數(shù)組應用舉例【運行結果】程序運行結果如圖所示?!境绦蛘f明】很多數(shù)列問題都可以用類似于上述計算斐波納契數(shù)列的方法,用數(shù)組來進行存儲和計算。

6.1一維數(shù)組6.1.4一維數(shù)組應用舉例【例6-3】給定任意n個整數(shù),按由小到大次序對其進行排序,并輸出結果?!締栴}分析】排序方法有很多,如交換排序法、冒泡排序法、選擇排序法、插入排序法等,本例將采用常用的冒泡法來實現(xiàn)。

6.1一維數(shù)組6.1.4一維數(shù)組應用舉例冒泡排序(BubbleSort)是一種簡單的交換排序算法,核心思想是通過相鄰元素兩兩比較,將較大的元素逐步“冒泡”到數(shù)組末尾,每完成一輪循環(huán),就確定一個最大元素的最終位置。經(jīng)過n-1輪循環(huán)(n為元素個數(shù)),即可實現(xiàn)數(shù)組的升序排序。以數(shù)組arr[5]={8,3,1,5,2}(n=5)為例,升序排序的具體過程如下:第1輪循環(huán)(確定最大元素8的位置):比較arr[0]與arr[1](8和3):8>3,交換

數(shù)組變?yōu)閧3,8,1,5,2}比較arr[1]與arr[2](8和1):8>1,交換

數(shù)組變?yōu)閧3,1,8,5,2}比較arr[2]與arr[3](8和5):8>5,交換

數(shù)組變?yōu)閧3,1,5,8,2}比較arr[3]與arr[4](8和2):8>2,交換

數(shù)組變?yōu)閧3,1,5,2,8}結果:最大元素8移動到末尾(arr[4]),后續(xù)循環(huán)無需再處理arr[4]。

6.1一維數(shù)組6.1.4一維數(shù)組應用舉例第2輪循環(huán)(確定次大元素5的位置):比較arr[0]與arr[1](3和1):3>1,交換

→{1,3,5,2,8}比較arr[1]與arr[2](3和5):3<5,不交換比較arr[2]與arr[3](5和2):5>2,交換

→{1,3,2,5,8}結果:次大元素5移動到arr[3],后續(xù)循環(huán)無需處理arr[3]。第3輪循環(huán)(確定第三大元素3的位置):比較arr[0]與arr[1](1和3):1<3,不交換比較arr[1]與arr[2](3和2):3>2,交換

→{1,2,3,5,8}結果:第三大元素3移動到arr[2],后續(xù)循環(huán)無需處理arr[2]。第4輪循環(huán)(確定第四大元素2的位置):比較arr[0]與arr[1](1和2):1<2,不交換結果:第四大元素2位置確定(arr[1]),剩余arr[0]自然是最小元素。

6.1一維數(shù)組6.1.4一維數(shù)組應用舉例#include<stdio.h>intmain(){intn;//存儲整數(shù)的個數(shù)inti,j,temp;//i:控制循環(huán)輪數(shù);j:控制每輪比較次數(shù);temp:交換元素的臨時變量//1.輸入整數(shù)的個數(shù)n(需確保n≥1,否則無排序意義)printf("請輸入整數(shù)的個數(shù)n:");scanf("%d",&n);if(n<=0){printf("輸入的個數(shù)無效,請輸入正整數(shù)!\n");return1;//異常退出,返回非0值表示程序出錯}//2.定義數(shù)組并輸入n個整數(shù)intarr[n];printf("請輸入%d個整數(shù)(用空格分隔):\n",n);for(i=0;i<n;i++){scanf("%d",&arr[i]);//逐個輸入整數(shù)到數(shù)組}

【參考代碼】

6.1一維數(shù)組6.1.4一維數(shù)組應用舉例//3.冒泡排序核心邏輯(升序)for(i=0;i<n-1;i++){//外層循環(huán):控制總輪數(shù)(n-1輪)//內層循環(huán):控制每輪比較次數(shù)(第i輪比較n-1-i次,末尾i個元素已排好序)for(j=0;j<n-1-i;j++){if(arr[j]>arr[j+1]){//若前一個元素>后一個元素,交換兩者temp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp;}}}//4.輸出排序后的結果printf("按從小到大排序后的結果:\n");for(i=0;i<n;i++){printf("%d",arr[i]);//逐個輸出排序后的數(shù)組元素}printf("\n");return0;}

6.1一維數(shù)組6.1.4一維數(shù)組應用舉例【運行結果】程序運行結果如圖所示?!境绦蛘f明】輸入或者輸出數(shù)組中的元素需要用循環(huán)語句逐個輸入或輸出。

6.1一維數(shù)組6.1.4一維數(shù)組應用舉例二維數(shù)組可理解為“數(shù)組的數(shù)組”,元素按“行優(yōu)先”連續(xù)存儲,適用于存儲表格、矩陣等二維數(shù)據(jù)(如學生多門課程成績、矩陣運算)。二維數(shù)組的定義與一維數(shù)組相似,其一般形式為:類型說明符數(shù)組名[常量表達式1][常量表達式2];常量表達式1:表示“行數(shù)”,常量表達式2:表示“列數(shù)”,總元素個數(shù)=行數(shù)

×

列數(shù)。示例:intmat[2][3]表示2行3列的整型矩陣,共2×3=6個元素,分別是:mat[0][0]、mat[0][1]、mat[0][2](第1行),mat[1][0]、mat[1][1]、mat[1][2](第2行)。內存存儲規(guī)則:二維數(shù)組在內存中按“行優(yōu)先”線性存儲(先存完第1行,再存第2行)。例如intmat[2][3]的存儲順序:mat[0][0]→mat[0][1]→mat[0][2]→mat[1][0]→mat[1][1]→mat[1][2]

6.2二維數(shù)組6.2.1二維數(shù)組的定義同一維數(shù)組一樣,二維數(shù)組也要先定義后引用。其引用的格式為:數(shù)組名[下標1][下標2]需同時指定行和列下標,且均不能越界。示例:mat[1][2]表示訪問第2行第3列的元素(行/列下標均從0開始),若mat[2][3]中引用mat[2][1],則行下標越界(合法行下標0~1)。

6.2二維數(shù)組6.2.2二維數(shù)組的引用二維數(shù)組初始化有“整體賦值”和“按行賦值”兩種方式,推薦按行賦值(結構清晰,不易出錯),二維數(shù)組的初始化有兩種方法:(1)整體賦值:類型說明符

數(shù)組名[行數(shù)][列數(shù)]={值1,值2,...,值n};(按行優(yōu)先順序賦值),例如:intx[2][3]={1,2,3,4,5,6};初始化結果是:x[0][0]=1,x[0][1]=2,x[0][2]=3,x[1][0]=4,x[1][1]=5,x[1][2]=6。(2)按行賦值:類型說明符

數(shù)組名[行數(shù)][列數(shù)]={{行1值1,行1值2},{行2值1,行2值2},...};(每行初值用{}包裹)。例如:定義了二維數(shù)組x[2][3],可以把數(shù)組x看成是具有兩個元素的一維數(shù)組,其元素是x[0]和x[1];而每個元素x[0]和x[1]又都是具有三個元素的一維數(shù)組;如圖所示。因此,二維數(shù)組的初始化也可以分解成多個一維數(shù)組的初始化,例如:intx[2][3]={{1,2,3},{4,5,6}};

6.2二維數(shù)組6.2.3二維數(shù)組的的初始化

名師點睛對于二維數(shù)組的初始化賦值還有以下幾點說明:(1)可以只對部分元素賦初值,未賦初值的元素自動取0值。例如:intx[2][2]={{1},{2}};表示對每一行的第一列元素賦值,未賦值的元素取0值。賦值后各元素的值為:x[0][0]=1,x[0][1]=0,x[1][0]=2,x[1][1]=0。(2)如果對全部元素賦初值,第一維長度可以不給出。例如,二維數(shù)組x[2][3]的初始化過程可寫成:intx[][3]={1,2,3,4,5,6};系統(tǒng)會根據(jù)數(shù)據(jù)總個數(shù)和第二維的長度計算出第一維的長度。數(shù)組總共有6個元素,每行3列,顯然可以確定行數(shù)為2。

6.2二維數(shù)組6.2.3二維數(shù)組的的初始化【例6-4】求一個3*3矩陣的兩條對角線元素之和(注意:兩條對角線交叉點處的元素只計算一次)?!締栴}分析】利用雙重for循環(huán)控制輸入二維數(shù)組,將兩個下標一致的元素(即其中一條對角線上的元素)累加到result1;將兩個下標不一致、但它們的和等于2的元素(即另一條對角線上并不在交叉點處的元素)累加到result2,最后將result1、result2相加得到最后的結果并輸出。

6.2二維數(shù)組6.2.4二維數(shù)組應用舉例【參考代碼】#include<stdio.h>intmain(){ inta[3][3]; /*定義3*3矩陣*/ inti,j,sum,result1=0,result2=0; /*定義變量*/ for(i=0;i<3;i++) /*外循環(huán)*/ { printf("輸入一行:"); /*輸出提示信息*/ for(j=0;j<3;j++) /*內循環(huán)*/ { scanf("%d",&a[i][j]); /*逐行輸入矩陣*/ if(i==j) /*如下標相同,則累加到result1*/ result1+=a[i][j]; if(i+j==2&&i!=j) /*如下標不同且和為2,則累加到result2*/ result2+=a[i][j]; } } sum=result1+result2; /*將result1和result2相加*/ printf("sum=%d\n",sum); /*輸出結果*/}

6.2二維數(shù)組6.2.4二維數(shù)組應用舉例【運行結果】程序運行結果如圖所示。

6.2二維數(shù)組6.2.4二維數(shù)組應用舉例【例6-5】一個學習小組有6個人,每個人有3門課(數(shù)學、語文和英語)的考試成績,如表所示。求每門課的平均分和每個人的平均分。課程王笑李鵬吳欣張平趙明張曉娜數(shù)學859384859586語文7995958010098英語809193759790【問題分析】可設一個二維數(shù)組a[3][6]存放6個人3門課的成績。再設一個一維數(shù)組v[3]存放每門課的平均分,設一

溫馨提示

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

評論

0/150

提交評論