C語言程序設計07(一維數(shù)組)_第1頁
C語言程序設計07(一維數(shù)組)_第2頁
C語言程序設計07(一維數(shù)組)_第3頁
C語言程序設計07(一維數(shù)組)_第4頁
C語言程序設計07(一維數(shù)組)_第5頁
已閱讀5頁,還剩168頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、C語言程序設計語言程序設計重慶郵電大學移通學院計算機系重慶郵電大學移通學院計算機系 宋文強宋文強C語言程序設計第第7章章 一維數(shù)組及其指針一維數(shù)組及其指針第第7章內(nèi)容章內(nèi)容一維數(shù)組一維數(shù)組一維數(shù)組的定義與初始化一維數(shù)組的定義與初始化 一維數(shù)組的引用一維數(shù)組的引用指向一維數(shù)組的指針指向一維數(shù)組的指針指針的運算指針的運算 指向一維數(shù)組的指針指向一維數(shù)組的指針 一維數(shù)組及其指針作函數(shù)參數(shù)一維數(shù)組及其指針作函數(shù)參數(shù)數(shù)組的概念數(shù)組的概念數(shù)組是一組有序數(shù)據(jù)的集合,通過方括號下標來數(shù)組是一組有序數(shù)據(jù)的集合,通過方括號下標來訪問每個元素。訪問每個元素。在在C語言中,數(shù)組具有以下特點:語言中,數(shù)組具有以下特點:

2、數(shù)組變量必須先定義后使用,同一數(shù)組中各元素的數(shù)據(jù)數(shù)組變量必須先定義后使用,同一數(shù)組中各元素的數(shù)據(jù)類型必須相同。類型必須相同。每個數(shù)組元素的作用相當于一個簡單變量,可以通過數(shù)每個數(shù)組元素的作用相當于一個簡單變量,可以通過數(shù)組下標來訪問組下標來訪問 數(shù)組的長度也是數(shù)組元素的個數(shù),必須在定義時給出數(shù)組的長度也是數(shù)組元素的個數(shù),必須在定義時給出常常量值量值,確定后不能改變,確定后不能改變 同一數(shù)組中的數(shù)組元素在內(nèi)存中的空間是連續(xù)分布的,同一數(shù)組中的數(shù)組元素在內(nèi)存中的空間是連續(xù)分布的,數(shù)組名代表首地址數(shù)組名代表首地址一維數(shù)組的定義一維數(shù)組的定義l 數(shù)組在使用前,必須先定義,并給出數(shù)組在使用前,必須先定義

3、,并給出數(shù)組名數(shù)組名、數(shù)據(jù)類型名數(shù)據(jù)類型名、數(shù)組長度數(shù)組長度和和維數(shù)維數(shù)。l 一維數(shù)組定義的一般格式為:一維數(shù)組定義的一般格式為: 數(shù)據(jù)類型數(shù)據(jù)類型 數(shù)組名整型常量表達式;數(shù)組名整型常量表達式; l 例:例: #define N 20 float aN; 可以存放可以存放20個個float數(shù)據(jù)數(shù)據(jù) int b10; 可以存放可以存放10個個int數(shù)據(jù)數(shù)據(jù)一維數(shù)組定義的說明一維數(shù)組定義的說明l “數(shù)據(jù)類型數(shù)據(jù)類型”說明符表示說明符表示數(shù)組元素具有的數(shù)據(jù)類型數(shù)組元素具有的數(shù)據(jù)類型,可以,可以是是int、 short、long、char、unsigned、float、double等數(shù)據(jù)類型。等數(shù)據(jù)類

4、型。l “數(shù)組名數(shù)組名”命名規(guī)則和變量名相同。命名規(guī)則和變量名相同?!皵?shù)組名數(shù)組名”惟一標識惟一標識該數(shù)組該數(shù)組,各數(shù)組元素均用數(shù)組名來訪問,它,各數(shù)組元素均用數(shù)組名來訪問,它是整個數(shù)組元是整個數(shù)組元素的首地址素的首地址。 l “整型常量表達式整型常量表達式”的值表示數(shù)組中所包含的的值表示數(shù)組中所包含的數(shù)組元素總數(shù)組元素總個數(shù)個數(shù),即,即數(shù)組的長度數(shù)組的長度,必須是,必須是常量常量和和符號常量符號常量,不能是變,不能是變量量l 數(shù)組名后面的數(shù)組名后面的一對方括號一對方括號“”表示該數(shù)組是表示該數(shù)組是一維數(shù)組一維數(shù)組,“整型常量表達式整型常量表達式”只能用方括號括起來。只能用方括號括起來。 l

5、數(shù)組的每個元素分別使用:數(shù)組的每個元素分別使用:數(shù)組名數(shù)組名0、數(shù)組名數(shù)組名1、數(shù)數(shù)組名組名整型常量表達式整型常量表達式-1表示。表示。 l 相同數(shù)據(jù)類型的數(shù)組可以在同一個相同數(shù)據(jù)類型的數(shù)組可以在同一個“數(shù)據(jù)類型數(shù)據(jù)類型”說明符下說明符下一起定義,用逗號一起定義,用逗號“,”隔開,如隔開,如double a5,b10。 一維數(shù)組的存儲一維數(shù)組的存儲l 同一數(shù)組中的數(shù)組元素在內(nèi)存中同一數(shù)組中的數(shù)組元素在內(nèi)存中的空間是連續(xù)的的空間是連續(xù)的,數(shù)組名代表該數(shù)組名代表該連續(xù)內(nèi)存空間的首地址連續(xù)內(nèi)存空間的首地址。l 假定數(shù)組假定數(shù)組 int a10; 在內(nèi)存中的在內(nèi)存中的起始地址為起始地址為3000,其存

6、儲情況,其存儲情況如圖所示:如圖所示: l 一維數(shù)組在內(nèi)存中一維數(shù)組在內(nèi)存中連續(xù)占用的字連續(xù)占用的字節(jié)數(shù)數(shù)組長度節(jié)數(shù)數(shù)組長度sizeof(數(shù)據(jù)(數(shù)據(jù)類型)類型)。l 如如int a10,數(shù)組,數(shù)組a的字節(jié)數(shù)為的字節(jié)數(shù)為10個元素個元素2B20B(假設機(假設機器字長為器字長為16位)。數(shù)組位)。數(shù)組a的長度的長度可以可以使用使用sizeof(a)獲得獲得。 300230033000300130043005a1a0a2a9一維數(shù)組的初始化一維數(shù)組的初始化l 在定義數(shù)組的同時,對數(shù)組元素進行賦值,稱之為數(shù)組的在定義數(shù)組的同時,對數(shù)組元素進行賦值,稱之為數(shù)組的初始化。一般形式為:初始化。一般形式為:

7、 數(shù)據(jù)類型數(shù)據(jù)類型 數(shù)組名整型常量表達式數(shù)組名整型常量表達式=常數(shù)常數(shù)1,常數(shù),常數(shù)2,常數(shù),常數(shù)n; a0=1內(nèi)存用戶數(shù)據(jù)區(qū)內(nèi)存用戶數(shù)據(jù)區(qū)a1=3a2=2593000300230043008a3=-1a4=-10300600000001000000001111011011111111000000110000000000000011000000011111111111111111其中:常數(shù)其中:常數(shù)1,常數(shù),常數(shù)2,常數(shù),常數(shù)n的數(shù)據(jù)的數(shù)據(jù)類型必須與前面指定的數(shù)據(jù)類型一致。類型必須與前面指定的數(shù)據(jù)類型一致。例:例: 一維數(shù)組初始化方法一維數(shù)組初始化方法全部賦值全部賦值:給出:給出“整型常量表達

8、式整型常量表達式”的值和各元素的全部常數(shù)初值。的值和各元素的全部常數(shù)初值。各常數(shù)初值之間用逗號分開,從第一個常數(shù)開始依次賦給各數(shù)組元各常數(shù)初值之間用逗號分開,從第一個常數(shù)開始依次賦給各數(shù)組元素。素。例如:例如:float b3= 2.18,3.14,89.0 ;全部賦值,缺省長度全部賦值,缺省長度:給出各元素的全部常數(shù)初值,可不給出:給出各元素的全部常數(shù)初值,可不給出“整整型常量表達式型常量表達式”的值,即不指定數(shù)組長度。的值,即不指定數(shù)組長度。例如:例如:int a= -10,20,28,-1,88 ;部分賦值部分賦值:給出:給出“整型常量表達式整型常量表達式”的值和前面部分數(shù)組元素的常的值

9、和前面部分數(shù)組元素的常數(shù)初值。這時后面沒有賦初值的元素,系統(tǒng)會自動賦以數(shù)初值。這時后面沒有賦初值的元素,系統(tǒng)會自動賦以0值或值或0值。值。例如:例如:int a5= -10,20,28 ;如果需要將數(shù)組的全部元素賦以如果需要將數(shù)組的全部元素賦以0值或值或0值,則可以在定義數(shù)組時值,則可以在定義數(shù)組時添加添加static關(guān)鍵字并給出關(guān)鍵字并給出“整型常量表達式整型常量表達式”的值。的值。例如:例如:static int a5;一維數(shù)組的引用一維數(shù)組的引用l 數(shù)組除了作為數(shù)組除了作為函數(shù)參數(shù)函數(shù)參數(shù)或或字符數(shù)組作為字符串字符數(shù)組作為字符串使用時可以整體使用時可以整體引用外,其它情況必須以引用外,其

10、它情況必須以數(shù)組元素數(shù)組元素的方式引用。的方式引用。l C提供了提供了下標下標、地址地址、指針指針三種方式三種方式引用數(shù)組元素引用數(shù)組元素,下標方式,下標方式用下標表示引用的數(shù)組元素,地址方式用地址表示引用的數(shù)組用下標表示引用的數(shù)組元素,地址方式用地址表示引用的數(shù)組元素,指針方式用指針變量表示引用的數(shù)組元素。元素,指針方式用指針變量表示引用的數(shù)組元素。l 下標引用數(shù)組元素的一般形式為:下標引用數(shù)組元素的一般形式為: 數(shù)組名下標;數(shù)組名下標; 其中,其中,下標下標可以是可以是整型常量整型常量、整型變量整型變量或或整型表達式整型表達式,表示對,表示對應數(shù)組元素在數(shù)組中的順序。應數(shù)組元素在數(shù)組中的順

11、序。下標的取值范圍為下標的取值范圍為0、1、數(shù)、數(shù)組元素總個數(shù)組元素總個數(shù)-1。 一維數(shù)組引用說明一維數(shù)組引用說明l 數(shù)組元素和普通基本型變量一樣數(shù)組元素和普通基本型變量一樣的使用,可出現(xiàn)在的使用,可出現(xiàn)在C語言表達式中的語言表達式中的任何地方。任何地方。如:如: int b10; b0=b5+b7-b2*3;又如:又如:int i15 , n=3; i0=-10; i5=6; in*4=9;l 每個每個數(shù)組元素數(shù)組元素與其它基本類型變量一樣與其它基本類型變量一樣有自己的地址有自己的地址,并,并用用“&”符符號獲取號獲取l C語言規(guī)定:語言規(guī)定:每個數(shù)組元素只能逐個引用每個數(shù)組元素只能逐個引用

12、,而不能一次引用整個數(shù)組,而不能一次引用整個數(shù)組l 引用數(shù)組元素之前,必須確保數(shù)組元素已經(jīng)被賦值引用數(shù)組元素之前,必須確保數(shù)組元素已經(jīng)被賦值,否則得到的是一,否則得到的是一個不確定的值個不確定的值l C語言不提供數(shù)組下標越界的保護語言不提供數(shù)組下標越界的保護。定義數(shù)組時用到的。定義數(shù)組時用到的“數(shù)組名數(shù)組名整型整型常量表達式常量表達式”和引用數(shù)組元素時用到的和引用數(shù)組元素時用到的“數(shù)組名數(shù)組名下標下標”是有區(qū)別的是有區(qū)別的一維數(shù)組的基本操作一維數(shù)組的基本操作輸入數(shù)組元素值:輸入數(shù)組元素值: for(i=0; i10; i+) scanf(%d, &ai); 輸出數(shù)組元素值:輸出數(shù)組元素值: f

13、or(i=0; i10; i+) printf(%d, ai); 一維數(shù)組的基本操作一維數(shù)組的基本操作求最大值求最大值max#include void main() int a8=35,12,44,97,65,70,32,28; int i, max; max=a0; for(i=1; i=7; i+) if(maxai) max=ai; printf(最大值最大值=%dn, max);一維數(shù)組的基本操作一維數(shù)組的基本操作求最小值求最小值min#include void main() int a8=35,12,44,97,65,70,32,28; int i, min; min=a0; for

14、(i=1; iai) min=ai; printf(最小值最小值=%dn, min);一維數(shù)組的基本操作一維數(shù)組的基本操作求最大值求最大值max 及及max在數(shù)組中的位置在數(shù)組中的位置#include void main() int a8=35,12,44,97,65,70,32,28; int i, p=0, max; max=a0; for(i=1; i=7; i+) if(maxai) max=ai; p=i; printf(最大值最大值=%d,是數(shù)組中的第,是數(shù)組中的第%d個元素個元素n, ap, p);一維數(shù)組的基本操作一維數(shù)組的基本操作求最小值求最小值min 及及min在數(shù)組中的位

15、置在數(shù)組中的位置#include void main() int a8=35,12,44,97,65,70,32,28; int i, p=0, min; min=a0; for(i=1; iai) min=ai; p=i; printf(最小值最小值=%d,是數(shù)組中的第,是數(shù)組中的第%d個元素個元素n, ap, p);一維數(shù)組的基本操作一維數(shù)組的基本操作求數(shù)組元素的累加和求數(shù)組元素的累加和sum#include void main() int a8=35,12,44,97,65,70,32,28; int i, sum=0; for(i=0; i=7; i+) sum+=ai; printf

16、(累加和累加和 sum=%dn, sum);課堂練習課堂練習已知跳水運動員的成績由已知跳水運動員的成績由8位裁判各自打分,去掉位裁判各自打分,去掉一個最高分,去掉一個最低分,剩下的裁判打分一個最高分,去掉一個最低分,剩下的裁判打分計算平均,即為運動員的最終成績。計算平均,即為運動員的最終成績。編寫程序,計算已經(jīng)保存在數(shù)組編寫程序,計算已經(jīng)保存在數(shù)組score 中的運動中的運動員最終成績。員最終成績。課堂練習課堂練習已知某教學班有學生已知某教學班有學生30人,考試成績保存在數(shù)組人,考試成績保存在數(shù)組score 中。編寫程序,分別統(tǒng)計及格和不及格人中。編寫程序,分別統(tǒng)計及格和不及格人數(shù)。數(shù)。及格及

17、格(60=score)不及格不及格(60)的人數(shù)分別有多少,并在屏幕上輸出。的人數(shù)分別有多少,并在屏幕上輸出。#include #include void main() int score30; int i, s1=0, s2=0; for(i=0; i30; i+) scorei=71*rand()/32767+30;printf(%5d, scorei);printf(n);for(i=0; i=60)s1+;elses2+;printf(及格人數(shù):及格人數(shù):%dn, s1);printf(不及格人數(shù):不及格人數(shù):%dn, s2);已知某教學班有學生已知某教學班有學生30人,考試成績保存在

18、數(shù)組人,考試成績保存在數(shù)組score 中。編寫程序,分別統(tǒng)計如下成績段中。編寫程序,分別統(tǒng)計如下成績段優(yōu)優(yōu)(=90)良良(80=score90)中中(70=score80)及格及格(60=score70)不及格不及格(a1,則交換;,則交換; 然然后比較第二個數(shù)與第三個數(shù);后比較第二個數(shù)與第三個數(shù); 依次類推,直至第依次類推,直至第n-1個數(shù)和第個數(shù)和第n個數(shù)比較為個數(shù)比較為止止第一趟排序過后,最大的數(shù)被安置在最后一個元素位置上;第一趟排序過后,最大的數(shù)被安置在最后一個元素位置上; (2)對前)對前n-1個數(shù)進行第二趟冒泡排序,結(jié)果使次最大的數(shù)被安置在第個數(shù)進行第二趟冒泡排序,結(jié)果使次最大的數(shù)

19、被安置在第n-1個元素位置;個元素位置; (3)重復上述過程,共經(jīng)過)重復上述過程,共經(jīng)過n-1趟冒泡排序后,排序結(jié)束。趟冒泡排序后,排序結(jié)束。 冒泡法在第一趟比較中要進行冒泡法在第一趟比較中要進行n-1次兩兩比較,在第次兩兩比較,在第j趟比較中要進行趟比較中要進行n-j次比較。次比較。冒泡排序第冒泡排序第1趟第趟第1次比較次比較65724189377554814966哪個大?要不要交換?哪個大?要不要交換?冒泡排序第冒泡排序第1趟第趟第2次比較次比較65724189377554814966哪個大?要不要交換?哪個大?要不要交換?冒泡排序第冒泡排序第1趟第趟第3次比較次比較6541728937

20、7554814966哪個大?要不要交換?哪個大?要不要交換?冒泡排序第冒泡排序第1趟第趟第4次比較次比較65893741727554814966哪個大?要不要交換?哪個大?要不要交換?冒泡排序第冒泡排序第1趟第趟第5次比較次比較65897541723754814966哪個大?要不要交換?哪個大?要不要交換?冒泡排序第冒泡排序第1趟第趟第6次比較次比較65895441723775814966哪個大?要不要交換?哪個大?要不要交換?冒泡排序第冒泡排序第1趟第趟第7次比較次比較65898141723775544966哪個大?要不要交換?哪個大?要不要交換?冒泡排序第冒泡排序第1趟第趟第8次比較次比較

21、65894941723775548166哪個大?要不要交換?哪個大?要不要交換?冒泡排序第冒泡排序第1趟第趟第9次比較次比較65896641723775548149哪個大?要不要交換?哪個大?要不要交換?冒泡排序第冒泡排序第1趟第趟第9次比較過后次比較過后65668941723775548149第第1趟比較結(jié)束,最大值元素趟比較結(jié)束,最大值元素“沉底沉底”冒泡排序第冒泡排序第2趟第趟第1次比較次比較6689723775548149哪個大?要不要交換?哪個大?要不要交換?6541冒泡排序第冒泡排序第2趟第趟第2次比較次比較6689413775548149哪個大?要不要交換?哪個大?要不要交換?6

22、572冒泡排序第冒泡排序第2趟第趟第3次比較次比較6689416575548149哪個大?要不要交換?哪個大?要不要交換?7237冒泡排序第冒泡排序第2趟第趟第4次比較次比較6689416537548149哪個大?要不要交換?哪個大?要不要交換?7275冒泡排序第冒泡排序第2趟第趟第5次比較次比較66894165378149哪個大?要不要交換?哪個大?要不要交換?727554冒泡排序第冒泡排序第2趟第趟第6次比較次比較66894165378149哪個大?要不要交換?哪個大?要不要交換?725475冒泡排序第冒泡排序第2趟第趟第7次比較次比較6689416537哪個大?要不要交換?哪個大?要不要

23、交換?7254758149冒泡排序第冒泡排序第2趟第趟第8次比較次比較4989416537哪個大?要不要交換?哪個大?要不要交換?7254758166冒泡排序第冒泡排序第2趟第趟第8次比較結(jié)束次比較結(jié)束49894165377254756681第第2趟比較結(jié)束,次最大值元素趟比較結(jié)束,次最大值元素“沉底沉底”冒泡排序第冒泡排序第3趟第趟第1次比較次比較49894165377254756681哪個大?要不要交換?哪個大?要不要交換?冒泡排序第冒泡排序第3趟第趟第2次比較次比較4989417254756681哪個大?要不要交換?哪個大?要不要交換?6537冒泡排序第冒泡排序第3趟第趟第3次比較次比較

24、49894137657254756681哪個大?要不要交換?哪個大?要不要交換?冒泡排序第冒泡排序第3趟第趟第4次比較次比較4989413765756681哪個大?要不要交換?哪個大?要不要交換?7254冒泡排序第冒泡排序第3趟第趟第5次比較次比較4989413765756681哪個大?要不要交換?哪個大?要不要交換?5472冒泡排序第冒泡排序第3趟第趟第6次比較次比較894137656681哪個大?要不要交換?哪個大?要不要交換?54727549冒泡排序第冒泡排序第3趟第趟第7次比較次比較894137654981哪個大?要不要交換?哪個大?要不要交換?54727566冒泡排序第冒泡排序第3趟

25、第趟第7次比較結(jié)束次比較結(jié)束89413765498154726675第第3趟比較結(jié)束,趟比較結(jié)束,3個大值元素個大值元素“沉底沉底”冒泡排序第冒泡排序第4趟第趟第1次比較次比較8965498154726675哪個大?要不要交換?哪個大?要不要交換?4137冒泡排序第冒泡排序第4趟第趟第2次比較次比較8965498154726675哪個大?要不要交換?哪個大?要不要交換?3741冒泡排序第冒泡排序第4趟第趟第3次比較次比較894981726675哪個大?要不要交換?哪個大?要不要交換?37416554冒泡排序第冒泡排序第4趟第趟第4次比較次比較894981546675哪個大?要不要交換?哪個大?

26、要不要交換?37416572冒泡排序第冒泡排序第4趟第趟第5次比較次比較8981546675哪個大?要不要交換?哪個大?要不要交換?3741657249冒泡排序第冒泡排序第4趟第趟第6次比較次比較8981544975哪個大?要不要交換?哪個大?要不要交換?3741657266冒泡排序第冒泡排序第4趟第趟第6次比較結(jié)束次比較結(jié)束89815449753741656672冒泡排序第冒泡排序第5趟第趟第1次比較次比較89815449753741656672哪個大?要不要交換?哪個大?要不要交換?冒泡排序第冒泡排序第5趟第趟第2次比較次比較89815449753741656672哪個大?要不要交換?哪個

27、大?要不要交換?冒泡排序第冒泡排序第5趟第趟第3次比較次比較89815449753741656672哪個大?要不要交換?哪個大?要不要交換?冒泡排序第冒泡排序第5趟第趟第4次比較次比較8981547537416672哪個大?要不要交換?哪個大?要不要交換?6549冒泡排序第冒泡排序第5趟第趟第5次比較次比較8981547537414972哪個大?要不要交換?哪個大?要不要交換?6566冒泡排序第冒泡排序第5趟比較結(jié)束趟比較結(jié)束89815475374149726566冒泡排序第冒泡排序第6趟第趟第1次比較次比較89815475374149726566哪個大?要不要交換?哪個大?要不要交換?冒泡排

28、序第冒泡排序第6趟第趟第2次比較次比較89815475374149726566哪個大?要不要交換?哪個大?要不要交換?冒泡排序第冒泡排序第6趟第趟第3次比較次比較8981753741726566哪個大?要不要交換?哪個大?要不要交換?5449冒泡排序第冒泡排序第6趟第趟第4次比較次比較8981753741723966哪個大?要不要交換?哪個大?要不要交換?5465冒泡排序第冒泡排序第6趟比較結(jié)束趟比較結(jié)束89817537417249665465冒泡排序第冒泡排序第7趟第趟第1次比較次比較89817537417249665465哪個大?要不要交換?哪個大?要不要交換?冒泡排序第冒泡排序第7趟第趟

29、第2次比較次比較8981753772665465哪個大?要不要交換?哪個大?要不要交換?4149冒泡排序第冒泡排序第7趟第趟第3次比較次比較8981753772664165哪個大?要不要交換?哪個大?要不要交換?4954冒泡排序第冒泡排序第7趟比較結(jié)束趟比較結(jié)束89817537726641654954沒有元素交換,排序完成沒有元素交換,排序完成2022年4月14日星期四71例例7.7程序程序#include #define SIZE 30void sort(int array,int n);int main() int aSIZE,n,i; printf(Input student numbe

30、r: ); scanf(%d,&n); /* 輸入學生人數(shù)輸入學生人數(shù) */ printf(Input %d score: n,n); for(i=0; in; i+) scanf(%d,&ai); /* 輸入成績輸入成績 */ printf(n); sort(a,n); /* 冒泡法排序冒泡法排序 */ printf(The sorted score: n); /* 輸出數(shù)據(jù)輸出數(shù)據(jù) */ for(i=0; in; i+) if(i%15=0) printf(n); printf(%4d ,ai); /* 輸出排序后的成績輸出排序后的成績 */ return(0);/* 冒泡法排序函數(shù)冒泡法

31、排序函數(shù) */void sort(int array,int num) int i,j,t; for(j=0; jnum-1; j+) for(i=0; iarrayi+1) t=arrayi; arrayi=arrayi+1; arrayi+1=t; 2022年4月14日星期四72例例7.8 選擇排序選擇排序【例例7.8】用選擇排序法對一個班用選擇排序法對一個班30個學生的個學生的C語言語言成績成績按升序排名。按升序排名。 分析問題:分析問題: 選擇法的思想是選擇法的思想是將相鄰的兩個數(shù)進行比較,記錄最小值的將相鄰的兩個數(shù)進行比較,記錄最小值的下標,最后再將最小值與第一個數(shù)交換。下標,最后再

32、將最小值與第一個數(shù)交換。 選擇法的排序過程選擇法的排序過程如下:如下: (1)首先通過)首先通過n-1次比較,從次比較,從n個數(shù)中找出最小數(shù)的下標,個數(shù)中找出最小數(shù)的下標,通過下標找到對應的元素并與第一個數(shù)交換通過下標找到對應的元素并與第一個數(shù)交換第一趟選擇排第一趟選擇排序,結(jié)果最小的數(shù)被安置在第一個元素位置上;序,結(jié)果最小的數(shù)被安置在第一個元素位置上; (2)再通過)再通過n-2次比較,從剩余的次比較,從剩余的n-1個數(shù)中找出關(guān)鍵字個數(shù)中找出關(guān)鍵字次小的數(shù)據(jù)下標,將它與第二個數(shù)交換次小的數(shù)據(jù)下標,將它與第二個數(shù)交換第二趟選擇排序;第二趟選擇排序; (3)重復上述過程,共經(jīng)過)重復上述過程,共

33、經(jīng)過n-1趟排序后,排序結(jié)束。趟排序后,排序結(jié)束。 選擇排序第選擇排序第1趟第趟第1次比較次比較65724189377554814966哪個更?。磕膫€更?。?最小值元素下標最小值元素下標選擇排序第選擇排序第1趟第趟第2次比較次比較65724189377554814966哪個更???哪個更???0 2最小值元素下標最小值元素下標選擇排序第選擇排序第1趟第趟第3次比較次比較65724189377554814966哪個更???哪個更???2最小值元素下標最小值元素下標選擇排序第選擇排序第1趟第趟第4次比較次比較65724189377554814966哪個更小?哪個更???2 4最小值元素下標最小值元素下標選擇

34、排序第選擇排序第1趟第趟第5次比較次比較65724189377554814966哪個更?。磕膫€更???4最小值元素下標最小值元素下標選擇排序第選擇排序第1趟第趟第6次比較次比較65724189377554814966哪個更???哪個更小?4最小值元素下標最小值元素下標選擇排序第選擇排序第1趟第趟第7次比較次比較65724189377554814966哪個更?。磕膫€更???4最小值元素下標最小值元素下標選擇排序第選擇排序第1趟第趟第8次比較次比較65724189377554814966哪個更小?哪個更小?4最小值元素下標最小值元素下標選擇排序第選擇排序第1趟第趟第9次比較次比較657241893775

35、54814966哪個更???哪個更???4最小值元素下標最小值元素下標選擇排序第選擇排序第1趟比較后交換元素趟比較后交換元素657241893775548149664最小值元素下標最小值元素下標選擇排序第選擇排序第2趟第趟第1次比較次比較37724189657554814966哪個更小?哪個更?。? 2最小值元素下標最小值元素下標選擇排序第選擇排序第2趟第趟第2次比較次比較37724189657554814966哪個更???哪個更???2最小值元素下標最小值元素下標選擇排序第選擇排序第2趟第趟第3次比較次比較37724189657554814966哪個更???哪個更???2最小值元素下標最小值元素下標選擇

36、排序第選擇排序第2趟第趟第4次比較次比較37724189657554814966哪個更小?哪個更???2最小值元素下標最小值元素下標選擇排序第選擇排序第2趟第趟第5次比較次比較37724189657554814966哪個更小?哪個更???2最小值元素下標最小值元素下標選擇排序第選擇排序第2趟第趟第6次比較次比較37724189657554814966哪個更???哪個更小?2最小值元素下標最小值元素下標選擇排序第選擇排序第2趟第趟第7次比較次比較37724189657554814966哪個更小?哪個更???2最小值元素下標最小值元素下標選擇排序第選擇排序第2趟第趟第8次比較次比較377241896575

37、54814966哪個更?。磕膫€更???2最小值元素下標最小值元素下標選擇排序第選擇排序第2趟比較后交換元素趟比較后交換元素377241896575548149662最小值元素下標最小值元素下標選擇排序第選擇排序第3趟第趟第1次比較次比較374172896575548149662哪個更?。磕膫€更?。孔钚≈翟叵聵俗钚≈翟叵聵诉x擇排序第選擇排序第3趟第趟第2次比較次比較374172896575548149662哪個更???哪個更小?4最小值元素下標最小值元素下標選擇排序第選擇排序第3趟第趟第3次比較次比較374172896575548149664哪個更小?哪個更小?最小值元素下標最小值元素下標選擇排

38、序第選擇排序第3趟第趟第4次比較次比較374172896575548149664哪個更???哪個更小?6最小值元素下標最小值元素下標選擇排序第選擇排序第3趟第趟第5次比較次比較374172896575548149666哪個更小?哪個更?。孔钚≈翟叵聵俗钚≈翟叵聵诉x擇排序第選擇排序第3趟第趟第6次比較次比較374172896575548149666哪個更?。磕膫€更???8最小值元素下標最小值元素下標選擇排序第選擇排序第3趟第趟第6次比較次比較374172896575548149668哪個更小?哪個更小?最小值元素下標最小值元素下標選擇排序第選擇排序第3趟比較后交換元素趟比較后交換元素374172

39、896575548149668最小值元素下標最小值元素下標選擇排序第選擇排序第4趟第趟第1次比較次比較374149896575548172663哪個更小?哪個更???4最小值元素下標最小值元素下標選擇排序第選擇排序第4趟第趟第2次比較次比較374149896575548172664哪個更???哪個更?。孔钚≈翟叵聵俗钚≈翟叵聵诉x擇排序第選擇排序第4趟第趟第3次比較次比較374149896575548172664哪個更?。磕膫€更???6最小值元素下標最小值元素下標選擇排序第選擇排序第4趟第趟第4次比較次比較374149896575548172666哪個更?。磕膫€更小?最小值元素下標最小值元素下標選

40、擇排序第選擇排序第4趟第趟第5次比較次比較374149896575548172666哪個更???哪個更???最小值元素下標最小值元素下標選擇排序第選擇排序第4趟第趟第6次比較次比較374149896575548172666哪個更???哪個更?。孔钚≈翟叵聵俗钚≈翟叵聵诉x擇排序第選擇排序第4趟比較后交換元素趟比較后交換元素374149896575548172666最小值元素下標最小值元素下標選擇排序第選擇排序第5趟第趟第1次比較次比較374149546575898172664哪個更???哪個更???最小值元素下標最小值元素下標選擇排序第選擇排序第5趟第趟第2次比較次比較3741495465758981

41、72664哪個更???哪個更小?最小值元素下標最小值元素下標選擇排序第選擇排序第5趟第趟第3次比較次比較374149546575898172664哪個更小?哪個更?。孔钚≈翟叵聵俗钚≈翟叵聵诉x擇排序第選擇排序第5趟第趟第4次比較次比較374149546575898172664哪個更?。磕膫€更小?最小值元素下標最小值元素下標選擇排序第選擇排序第5趟第趟第5次比較次比較374149546575898172664哪個更小?哪個更???最小值元素下標最小值元素下標選擇排序第選擇排序第5趟比較后不用交換元素趟比較后不用交換元素374149546575898172664最小值元素下標最小值元素下標選擇排序

42、第選擇排序第6趟第趟第1次比較次比較374149546575898172665哪個更小?哪個更?。孔钚≈翟叵聵俗钚≈翟叵聵诉x擇排序第選擇排序第6趟第趟第2次比較次比較374149546575898172665哪個更???哪個更???最小值元素下標最小值元素下標選擇排序第選擇排序第6趟第趟第3次比較次比較374149546575898172665哪個更小?哪個更小?8最小值元素下標最小值元素下標選擇排序第選擇排序第6趟第趟第4次比較次比較374149546575898172668哪個更?。磕膫€更???9最小值元素下標最小值元素下標選擇排序第選擇排序第6趟比較后交換元素趟比較后交換元素3741495

43、46575898172669最小值元素下標最小值元素下標選擇排序第選擇排序第7趟第趟第1次比較次比較374149546566898172756哪個更???哪個更?。?最小值元素下標最小值元素下標選擇排序第選擇排序第7趟第趟第2次比較次比較374149546566898172757哪個更?。磕膫€更???8最小值元素下標最小值元素下標選擇排序第選擇排序第7趟第趟第3次比較次比較374149546566898172758哪個更小?哪個更???最小值元素下標最小值元素下標選擇排序第選擇排序第7趟比較后交換元素趟比較后交換元素374149546566898172758最小值元素下標最小值元素下標選擇排序第選擇

44、排序第8趟第趟第1次比較次比較374149546566728189757哪個更???哪個更???最小值元素下標最小值元素下標選擇排序第選擇排序第8趟第趟第2次比較次比較374149546566728189759哪個更?。磕膫€更?。孔钚≈翟叵聵俗钚≈翟叵聵诉x擇排序第選擇排序第8趟比較后交換元素趟比較后交換元素374149546566728189759最小值元素下標最小值元素下標選擇排序第選擇排序第9趟比較趟比較374149546566727589818哪個更???哪個更???9最小值元素下標最小值元素下標選擇排序第選擇排序第9趟比較后交換元素趟比較后交換元素374149546566727589819

45、最小值元素下標最小值元素下標2022年4月14日星期四127例例7.8程序程序#include #define SIZE 30void sort(int array,int num);int main() int aSIZE,i,n; printf(Input student number: ); scanf(%d,&n); /* 輸入學生人數(shù),輸入學生人數(shù),n要求小于要求小于SIZE */ printf(Input %d score: n,n); for(i=0; in; i+) scanf(%d,&ai); /* 輸入成績輸入成績 */ printf(n); sort(a,n); /* 選

46、擇法排序選擇法排序 */ printf(The sorted numbers: n); for(i=0; in; i+) printf(%d ,ai); /* 輸出數(shù)據(jù)輸出數(shù)據(jù) */ return(0);/* 選擇法排序函數(shù)選擇法排序函數(shù) */void sort(int array,int num) int i, j, k, t; for(i=0; inum-1; i+) k=i; for(j=i+1; jnum; j+) if(arrayjarrayk) k=j; if(i!=k) t=arrayi; arrayi=arrayk; arrayk=t; 指針的運算指針的運算 l 指針變量本身是

47、一個變量,可以參加某些運算。指針變量本身是一個變量,可以參加某些運算。l 但指針的本質(zhì)是一個地址,其運算具有一些特別但指針的本質(zhì)是一個地址,其運算具有一些特別的性質(zhì),的性質(zhì),不能用普通變量運算規(guī)則來作為指針運不能用普通變量運算規(guī)則來作為指針運算的規(guī)則算的規(guī)則。l 指針運算除了指針運算除了“&”和和“*”運算符之外,通常還有運算符之外,通常還有+、-、+、-和和關(guān)系運算關(guān)系運算。l 其中其中+、+代表指針前移,代表指針前移,-、-代表指針后移。代表指針后移。指針的賦值運算指針的賦值運算 l 在引用指針變量之前,一定要對其進行賦值在引用指針變量之前,一定要對其進行賦值,使其有明確,使其有明確的指向

48、。指針的賦值運算包括:的指向。指針的賦值運算包括:l 賦空值賦空值:使指針變量指向一個空值,這時指針變量不指向任何變量:使指針變量指向一個空值,這時指針變量不指向任何變量 在在stdio.h文件中定義了:文件中定義了: #define NULL 0 (用(用NULL表示表示0)。)。 定義定義int *p=NULL; 相當于相當于int *p; p=NULL;表示表示p不指向任何變不指向任何變量,而是指向地址為量,而是指向地址為0的內(nèi)存單元,這時的內(nèi)存單元,這時p稱之為稱之為空指針空指針。l 賦地址值賦地址值:將一個變量的地址值賦給一個指針變量將一個變量的地址值賦給一個指針變量,使該指針變量,

49、使該指針變量指向地址對應的變量,這時兩個變量必須是一樣的數(shù)據(jù)類型。如:指向地址對應的變量,這時兩個變量必須是一樣的數(shù)據(jù)類型。如:int a,*p; p=&a; l 賦指針變量值賦指針變量值:相同數(shù)據(jù)類型的指針變量可以相互賦值相同數(shù)據(jù)類型的指針變量可以相互賦值,這時,這時兩個兩個指針變量指向同一個變量的存儲空間指針變量指向同一個變量的存儲空間。如:。如:int a,*p,*q; p=&a; q=p; 這時,指針變量這時,指針變量p和和q都指向變量都指向變量a指針的自增自減運算指針的自增自減運算l 指針變量的自增自減運算指針變量的自增自減運算:對指針變量的自增:對指針變量的自增(+)自減()自減(

50、-)運算,表示使該指針變量指向后)運算,表示使該指針變量指向后一個變量或前一個變量。如:一個變量或前一個變量。如:int a,*p; 自增運算:自增運算:p+; +p; 自減運算:自減運算:p-; -p; l 兩個指針變量相減運算兩個指針變量相減運算:兩個數(shù)據(jù)類型相同的指:兩個數(shù)據(jù)類型相同的指針變量之間可以進行減法(針變量之間可以進行減法(-)運算,其差為整型)運算,其差為整型數(shù)據(jù),表示兩個指針變量地址之間能夠存放的指數(shù)據(jù),表示兩個指針變量地址之間能夠存放的指針變量所指的數(shù)據(jù)類型的數(shù)據(jù)個數(shù)。針變量所指的數(shù)據(jù)類型的數(shù)據(jù)個數(shù)。l 任何兩個指針變量之間均不能進行加法運算任何兩個指針變量之間均不能進行

51、加法運算。指針變量加(或減)一個整數(shù)的運算指針變量加(或減)一個整數(shù)的運算 l C語言規(guī)定,一個指針變量語言規(guī)定,一個指針變量p加(或減)一個整數(shù)加(或減)一個整數(shù)n并不是簡單地將指并不是簡單地將指針變量的原值加(或減)一個整數(shù),而是將該指針變量的原值(是一針變量的原值加(或減)一個整數(shù),而是將該指針變量的原值(是一個地址)和它指向的變量所占用的內(nèi)存單元字節(jié)數(shù)相加(或減)。個地址)和它指向的變量所占用的內(nèi)存單元字節(jié)數(shù)相加(或減)。l 如如p+n或或p-n(p是指針變量,是指針變量,n是整數(shù)),代表的地址計算是是整數(shù)),代表的地址計算是p+L*n或或p-L*n(L為指針變量所指向的數(shù)據(jù)類型所占內(nèi)

52、存的字節(jié)數(shù))。為指針變量所指向的數(shù)據(jù)類型所占內(nèi)存的字節(jié)數(shù))。l 如果有如果有int a,b,c,*p;,假定變量;,假定變量a、b、c連續(xù)分配內(nèi)存空間,則連續(xù)分配內(nèi)存空間,則指針加(減)法運算如圖所示。指針加(減)法運算如圖所示。3001p=&ap+1p+230033005468a=4b=6pc=84683001p=&ap-1p+130033005a=4b=6pc=8例例7.1 計算學生的平均成績計算學生的平均成績 程序?qū)崿F(xiàn)程序?qū)崿F(xiàn)解法一解法一#include #define N 15int main() int aN; /* 定義一維數(shù)組定義一維數(shù)組a存放存放15門課程成績門課程成績 */

53、int average, sum, i; for(i=0; iN; i+) scanf(%d, &ai); /* 給每門課程成績賦值給每門課程成績賦值 */ sum=0; /* 累加和變量累加和變量sum */ for(i=0; iN; i+) sum=sum+ai; /* 累加每個成績值累加每個成績值 */ average=sum/N; /* 求平均成績求平均成績 */ for(i=0; iN; i+) printf(%4d, ai); /* 輸出每門課程成績輸出每門課程成績 */ printf(nAverage=%dn, average); /* 輸出平均成績輸出平均成績 */程序?qū)崿F(xiàn)程序

54、實現(xiàn)解法二解法二l 本例還可以使用函數(shù)方式來實現(xiàn)??梢远x一個本例還可以使用函數(shù)方式來實現(xiàn)??梢远x一個int add(int array,int n)函數(shù)來求函數(shù)來求15門課程成績門課程成績的總和,函數(shù)的返回值就是總和值。的總和,函數(shù)的返回值就是總和值。l 程序中程序中sum=add(a,N);語句實現(xiàn)函數(shù)的調(diào)用,函語句實現(xiàn)函數(shù)的調(diào)用,函數(shù)的返回值賦給數(shù)的返回值賦給sum變量。變量。l 主調(diào)函數(shù)中主調(diào)函數(shù)中sum=add(a,N);語句的語句的a表示數(shù)組名,表示數(shù)組名,作為實際參數(shù)傳遞給被調(diào)函數(shù)。作為實際參數(shù)傳遞給被調(diào)函數(shù)。l int add(int array,int n)函數(shù)定義中的函數(shù)

55、定義中的array表示表示需要傳入數(shù)組的形參名。需要傳入數(shù)組的形參名。 程序?qū)崿F(xiàn)程序?qū)崿F(xiàn)解法二(續(xù))解法二(續(xù))/* LT7_1A.c */#include #define N 15int add(int array,int n);int main() int aN; /* 定義一維數(shù)組定義一維數(shù)組a存放存放15門課程成績門課程成績 */ int average,sum,i; for(i=0;iN;i+) scanf(%d,&ai); /* 給每門課程成績賦值給每門課程成績賦值 */ sum=add(a,N); /* 累加每個成績值并將函數(shù)的返回值總和賦給累加每個成績值并將函數(shù)的返回值總和賦給

56、sum */ average=sum/N; /* 求平均成績求平均成績 */ for(i=0;iN;i+) printf(%4d,ai); /* 輸出每門課程成績輸出每門課程成績 */ printf(nAverage=%dn,average); /* 輸出平均成績輸出平均成績 */ return(0);本例程序涉及到一維數(shù)組的定義、初始化、引用、一維數(shù)組作本例程序涉及到一維數(shù)組的定義、初始化、引用、一維數(shù)組作函數(shù)參數(shù)等知識點。函數(shù)參數(shù)等知識點。/* 累加每個成績值累加每個成績值 */int add(int array,int n) int i,s; s=0; for(i=0;in;i+) s=

57、s+arrayi; return(s);程序?qū)崿F(xiàn)程序?qū)崿F(xiàn)解法三解法三l 本例程序還可以用指針來完成。本例程序還可以用指針來完成。l int *p; 語句定義了一個指針變量語句定義了一個指針變量p,它可以指向任何一個同,它可以指向任何一個同類型的變量,通過該指針變量可以訪問其指向的對應變量類型的變量,通過該指針變量可以訪問其指向的對應變量l p=a; 語句完成指針變量語句完成指針變量p指向數(shù)組變量指向數(shù)組變量a,這時,通過指針,這時,通過指針變量變量p就可以訪問數(shù)組就可以訪問數(shù)組a的各元素了。的各元素了。l for(;pa+N;p+) scanf(“%d”,p); 語句給每個數(shù)組元素賦語句給每個

58、數(shù)組元素賦值,值,p第第1次指向數(shù)組次指向數(shù)組a的第的第1個元素,通過個元素,通過p+使使p指向數(shù)組指向數(shù)組a的下一個元素。的下一個元素。l for(p=a;pa+N;p+) sum=sum+*p; 語句實現(xiàn)數(shù)組各元素語句實現(xiàn)數(shù)組各元素值的累加,值的累加,*p表示表示p當前所指向的數(shù)組元素值。當前所指向的數(shù)組元素值。 程序?qū)崿F(xiàn)程序?qū)崿F(xiàn)解法三(續(xù))解法三(續(xù))/* LT7_1B.c */#include #define N 15int main() int aN; /* 定義一維數(shù)組定義一維數(shù)組a存放存放15門課程成績門課程成績 */ int *p; /* 定義整型數(shù)據(jù)指針變量定義整型數(shù)據(jù)指針變

59、量 */ int average,sum,i; p=a; /* 整型指針變量整型指針變量p指向整型數(shù)組指向整型數(shù)組a */ for(;pa+N;p+) scanf(%d,p); /* 給每門課程成績賦值給每門課程成績賦值 */ sum=0; /* 累加和變量累加和變量sum */ for(p=a;pa+N;p+) sum=sum+*p; /* 累加每個成績值累加每個成績值 */ average=sum/N; /* 求平均成績求平均成績 */ for(p=a;pa+N;p+) printf(%4d,*p); /* 輸出每門課程成績輸出每門課程成績 */ printf(nAverage=%dn,a

60、verage); /* 輸出平均成績輸出平均成績 */ return(0);兩個指針變量的關(guān)系運算兩個指針變量的關(guān)系運算l 兩個指針變量之間的關(guān)系運算是比較兩個指針變量所指向兩個指針變量之間的關(guān)系運算是比較兩個指針變量所指向的地址關(guān)系,其運算符有的地址關(guān)系,其運算符有=、!=、=。l 比較運算結(jié)果為真(比較運算結(jié)果為真(1)或假()或假(0)。)。l p+、p-、+p、-p和和p-=n、p+=n、p=p+n、p=p-n(這(這里里n表示整型數(shù)據(jù),表示整型數(shù)據(jù),p為指針變量)等運算的結(jié)果仍為指針。為指針變量)等運算的結(jié)果仍為指針。 l 指針變量的加或減運算,只對具有連續(xù)存儲單元的相同數(shù)指針變量的

溫馨提示

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

最新文檔

評論

0/150

提交評論