實用C語言程序設(shè)計教程 第5章 數(shù)組和矩陣_第1頁
實用C語言程序設(shè)計教程 第5章 數(shù)組和矩陣_第2頁
實用C語言程序設(shè)計教程 第5章 數(shù)組和矩陣_第3頁
實用C語言程序設(shè)計教程 第5章 數(shù)組和矩陣_第4頁
實用C語言程序設(shè)計教程 第5章 數(shù)組和矩陣_第5頁
已閱讀5頁,還剩216頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第5章構(gòu)造數(shù)據(jù)——

數(shù)組和矩陣C語言程序設(shè)計ProgramminginC

——學(xué)習(xí)任何語言都是需要花費很多努力,但堅持不要放棄。C語言程序設(shè)計-第5章數(shù)組和矩陣1、理解C語言中數(shù)組的本質(zhì)及其在內(nèi)存的存儲結(jié)構(gòu)2、應(yīng)用數(shù)組表示同類型批量數(shù)據(jù)3、掌握循環(huán)和數(shù)組結(jié)合的基本操作4、理解數(shù)組的地址管理機制5、應(yīng)用字符數(shù)組的基本表示方法6、應(yīng)用典型常用算法解決問題7、理解項目開發(fā)和程序編制本章教學(xué)目標(biāo)C語言程序設(shè)計-第5章數(shù)組和矩陣重點數(shù)組與循環(huán)結(jié)合進行數(shù)據(jù)處理常用算法難點多維數(shù)組理解多維向一維和轉(zhuǎn)換常用算法C語言程序設(shè)計-第5章數(shù)組和矩陣本章內(nèi)容5.1數(shù)組的基本概念5.2一維數(shù)組5.3數(shù)組與函數(shù)5.4排序算法5.5數(shù)據(jù)排序算法5.6數(shù)據(jù)插入算法5.7二維數(shù)組5.8字符數(shù)組與字符串處理函數(shù)C語言程序設(shè)計-第5章數(shù)組和矩陣本章項目任務(wù)編寫程序,實現(xiàn)“學(xué)生信息管理系統(tǒng)”中用戶和成績管理子系統(tǒng)部分模塊的功能。

學(xué)習(xí)小組要求劃分模塊會使用自定義函數(shù)編寫程序C語言程序設(shè)計-第5章數(shù)組和矩陣5.1數(shù)組(Array)的基本概念

引例:

學(xué)生成績處理問題?,F(xiàn)需要把某班所有學(xué)生的C語言成績輸入“學(xué)生成績管理系統(tǒng)”,并計算平均成績,同時輸出比平均成績高的學(xué)生成績。分析:

(1)不難構(gòu)造一個單層循環(huán),逐個輸入所有學(xué)生的成績,累加,再求平均值。(2)為了能夠輸出比平均成績高的學(xué)生名單,還必須使每個學(xué)生的成績與平均成績比較。

難道再輸入一次所有學(xué)生成績?這成倍增加了工作量。顯然不可取。如果能同時保留所有學(xué)生的成績,就不用重復(fù)輸入了。但一個簡單變量不能同時保留所有學(xué)生成績。有多少學(xué)生就定義多少個簡單變量?顯然,從內(nèi)存資源和現(xiàn)實而言都不可取。(3)引入數(shù)組來解決這個問題。C語言程序設(shè)計-第5章數(shù)組和矩陣1.數(shù)組的概念數(shù)組:構(gòu)造數(shù)據(jù)類型之一是一組相同類型的變量集;數(shù)組中的每個成員通常稱為數(shù)組元素(arrayelement)

數(shù)組元素通過下標(biāo)(subscript)來引用。數(shù)組下標(biāo)C語言程序設(shè)計-第5章數(shù)組和矩陣例:某次試驗測量到的多個數(shù)據(jù)表示如下:a[0]=0.6a[1]=0.68a[2]=0.63a[3]=0.59a[4]=0.64a[5]=0.59a[6]=0.65

像這樣有共同的名字,具有相同的數(shù)據(jù)類型,有順序(下標(biāo)0、1、2…)的一組變量集叫數(shù)組。C語言程序設(shè)計-第5章數(shù)組和矩陣數(shù)組名:變量集的共同名字。例,a數(shù)組元素(ArrayElement):數(shù)組中的每個成員變量。例,a[0]、a[1]、a[2]...。數(shù)組下標(biāo)(Subscript):數(shù)組元素通過它在數(shù)組中的相對位置來引用。這個位置即下標(biāo)值。下標(biāo)總是從0開始。數(shù)組大小(ArraySize):數(shù)組所包含元素的個數(shù)。數(shù)組元素個數(shù)=下標(biāo)最大值+1C語言程序設(shè)計-第5章數(shù)組和矩陣2.數(shù)組的兩個特征:數(shù)組是有序的。數(shù)組元素之間按順序排列,以下標(biāo)(索引)確定它們之間的相對位置數(shù)組是同質(zhì)的。同一數(shù)組中的每個元素是同類型。叫元素類型(elementtype)3.數(shù)組的分類按數(shù)組元素的數(shù)據(jù)類型可分為:數(shù)值數(shù)組、字符數(shù)組、指針數(shù)組、結(jié)構(gòu)數(shù)組等;按數(shù)組中下標(biāo)的個數(shù)可分為:

一維數(shù)組、二維數(shù)組、多維數(shù)組。C語言程序設(shè)計-第5章數(shù)組和矩陣

1)一維數(shù)組。只需要一個下標(biāo)就能確定數(shù)組中各元素的相對位置。

2)二維數(shù)組。需要兩個下標(biāo)才能唯一確定出數(shù)組中的某個元素;

3)n維數(shù)組。需要n個下標(biāo)才能唯一確定出數(shù)組中的某個元素。

邏輯結(jié)構(gòu):對數(shù)組的這種排列組織方法,僅是一種概念上的排列,只是從邏輯關(guān)系(某種順序上)觀察數(shù)據(jù),它獨立于計算機,可以從理論上、形式上進行研究、計算,這叫數(shù)組的邏輯結(jié)構(gòu)。存儲結(jié)構(gòu):數(shù)組的所有數(shù)組元素如何存儲在內(nèi)存中?C語言的數(shù)組占用內(nèi)存中一片連續(xù)的存儲單元,這就涉及到數(shù)組在內(nèi)存中的存儲結(jié)構(gòu),也叫物理結(jié)構(gòu),是邏輯結(jié)構(gòu)在計算中的實現(xiàn),它依賴于計算機。

C語言程序設(shè)計-第5章數(shù)組和矩陣【項目案例5-1】理解某高?!皩W(xué)生信息管理”系統(tǒng)中學(xué)生成績中的數(shù)據(jù)結(jié)構(gòu)分析:(1)某班所有學(xué)生的物理課程成績對應(yīng)一個一維數(shù)組(行或列)。(2)某班所有學(xué)生的7門課程成績對應(yīng)一個二維數(shù)組(二維表格)。(3)一個專業(yè)所有班的所有學(xué)生的7門課程成績對應(yīng)一個三維數(shù)組(成績冊)。(4)一個系所有專業(yè)所有班的學(xué)生的7門課程成績對應(yīng)一個四維數(shù)組(若干冊為?。?。C語言程序設(shè)計-第5章數(shù)組和矩陣5.2一維數(shù)組(One-dimensionalArray)5.2.1一維數(shù)組的定義(邏輯結(jié)構(gòu),LogicalStructure)5.2.2一維數(shù)組的存儲結(jié)構(gòu)(物理結(jié)構(gòu))5.2.3一維數(shù)組的初始化(Initialization)5.2.4一維數(shù)組元素的引用

C語言程序設(shè)計-第5章數(shù)組和矩陣5.2.1一維數(shù)組的定義(邏輯結(jié)構(gòu),LogicalStructure)

一維數(shù)組可以直觀地被認為是排列成一行或一列的數(shù)據(jù)列表。547890.30.50.60.5'a''d''c''I''u'C語言程序設(shè)計-第5章數(shù)組和矩陣數(shù)組也必須先定義后使用。一維數(shù)組定義的一般語句形式如下:[存儲類型]數(shù)組類型說明符數(shù)組名

[常量表達式];指明數(shù)組元素的數(shù)據(jù)類型下標(biāo):指明數(shù)組元素的總數(shù),只能是常量。取值范圍是[0,總數(shù)-1][]:數(shù)組運算符單目運算符優(yōu)先級(1)左結(jié)合不能用()auto、static、extern型。省略時默認為auto型。不能是寄存器類型。

C語言程序設(shè)計-第5章數(shù)組和矩陣例如:inta[10];/*定義的整型數(shù)組a含10個元素*/floatb[20];/*定義的實型數(shù)組b含20個元素*/注意:數(shù)組的命名、定值和引用與簡單變量的命名、定值和引用不完全一樣。C語言程序設(shè)計-第5章數(shù)組和矩陣1)數(shù)組大小不能改動。數(shù)組一經(jīng)定義,其大小就固定了,不能在程序的運行過程中更改其大小。2)符號常量指定數(shù)組大小。對于事先難以確定數(shù)組元素個數(shù)或為使元素個數(shù)具有通用性,可用符號常量指定數(shù)組大小。而符號常量應(yīng)該根據(jù)實際應(yīng)用中可能遇到的個數(shù)最大的數(shù)目確定。例如:

#defineMAXELEMENTS60

intphysics[MAXELEMENTS];3)下標(biāo)也可以是字符型數(shù)據(jù)。例:

intb[‘A’];

定義了一個有65個元素的自動整型數(shù)組b。

C語言程序設(shè)計-第5章數(shù)組和矩陣5.2.2一維數(shù)組的存儲結(jié)構(gòu)(物理結(jié)構(gòu))

1)數(shù)組的存儲:編譯器為已定義的數(shù)組預(yù)留一段連續(xù)的內(nèi)存空間,按下標(biāo)從小到大的順序保存所有數(shù)組元素的值。

2)元素地址:數(shù)組元素占用相同的字節(jié)數(shù),每個元素都有一個確定的地址,這個地址稱為數(shù)組元素的地址。

3)數(shù)組名是數(shù)組首地址。數(shù)組名表示數(shù)組在內(nèi)存的首地址,也叫數(shù)組的地址。和第一個元素的地址一樣,是一個地址常量,也是指針常量。

4)數(shù)組元素尋址:通過數(shù)組地址,可順序找到數(shù)組中的每個元素。C語言程序設(shè)計-第5章數(shù)組和矩陣

例如:

inta[10];

系統(tǒng)為數(shù)組a分配40個字節(jié)的連續(xù)存儲空間,即數(shù)組元素個數(shù)10*sizeof(元素數(shù)據(jù)類型)=10*4=40。sizeof是一種單目運算符,計算其操作數(shù)在內(nèi)存中所占字節(jié)數(shù)。使用形式如下:

sizeof(數(shù)據(jù)類型)或

sizeof(變量名)或sizeof

變量名C語言程序設(shè)計-第5章數(shù)組和矩陣例如,數(shù)組定義:

charcharray[20];

預(yù)留20個字節(jié)的內(nèi)存空間,因為每一個元素僅占一個字節(jié)。

數(shù)組定義:

doublescore[5];預(yù)留8字節(jié)/元素*5個元素=40個字節(jié)的內(nèi)存空間,因為每一個元素占8個字節(jié),以存放整個數(shù)組。C語言程序設(shè)計-第5章數(shù)組和矩陣一維數(shù)組的元素在內(nèi)存中依次連續(xù)存儲低地址...a[0]a[1]a[2]a[3]a[4]高地址...chara[5];編譯時分配連續(xù)內(nèi)存內(nèi)存字節(jié)數(shù)=數(shù)組元素個數(shù)*

sizeof(元素數(shù)據(jù)類型)數(shù)組名表示內(nèi)存首地址,是地址常量aC語言程序設(shè)計-第5章數(shù)組和矩陣5.2.3一維數(shù)組的初始化(Initialization)

1)在定義語句中對數(shù)組元素賦值的方法稱為數(shù)組的初始化。

2)數(shù)組初始化是在編譯階段完成的。

3)C語言規(guī)定:數(shù)組的初始化只能對數(shù)組整體或部分數(shù)組元素賦值。數(shù)組初始化的一般格式如下:

[static]類型說明符數(shù)組名[數(shù)組長度]={各數(shù)組元素值};C語言程序設(shè)計-第5章數(shù)組和矩陣定義數(shù)組時對數(shù)組元素全部賦初值,此時數(shù)組定義中數(shù)組長度可以省略。

例:inta[5]={2,4,6,8,10};/*等價于

inta[]={2,4,6,8,10};*/只給部分元素賦初值,此時數(shù)組長度不能省略。例:inta[5]={1,2,3};/*等價于inta[5]={1,2,3,0,0};*/

intb[5]={0};/*對5個數(shù)組元素全部清零*/但,若定義:staticintc[5]={,,7,8};/*錯誤*/存儲形式:但,若定義:

inta[];

若定義:

inta[5]={1,2,3,4,5,6,7,8};╳注意防止數(shù)組下標(biāo)越界,否則結(jié)果難以預(yù)料C語言程序設(shè)計-第5章數(shù)組和矩陣注意:1)C語言并不檢查數(shù)組的邊界,在應(yīng)用中,程序員必須保證數(shù)組邊界的正確性。2)static型數(shù)組定義時若不進行初始化,如果是數(shù)值類型數(shù)組(如整型、實型),各元素值默認為0;如果是字符型數(shù)組,各元素值默認為空字符’\0’。3)auto型數(shù)組定義時不進行初始化,編譯器不為其自動指定初始值。各元素值不可預(yù)知,是隨機數(shù)。

C語言程序設(shè)計-第5章數(shù)組和矩陣5.2.4一維數(shù)組元素的引用

C語言一般不允許對一個數(shù)組進行聚集操作,即不能對整個數(shù)組作為一個整體單元操作(但字符數(shù)組除外)。例如,inta[10],b[10];

如果想將數(shù)組a的值賦給b,下面的語句是錯誤的:

b=a;/*非法語句*/

要想實現(xiàn)這個功能,就必須進行對應(yīng)元素的一一賦值,一次只能給一個元素賦值。C語言程序設(shè)計-第5章數(shù)組和矩陣選擇(selection)引用數(shù)組元素,既需要指定數(shù)組的名字,又要指定對應(yīng)于該元素在數(shù)組中的下標(biāo)。

引用數(shù)組元素的一般形式為:

數(shù)組名[下標(biāo)]下標(biāo)可以是:數(shù)值常量、符號常量、變量、算術(shù)表達式、函數(shù)(非負的數(shù))。C語言程序設(shè)計-第5章數(shù)組和矩陣例:#defineNJUDGES5floatscores[NJUDGES];

該數(shù)組的元素分別為:

scores[0]scores[1]scores[2]scores[3]scores[4]其中:(1)0,1,2,3,4稱為下標(biāo)。數(shù)組元素scores[i](i=0,1,2,3,4)稱為下標(biāo)變量。

(2)scores[5]不是該數(shù)組的元素,因為下標(biāo)越界了。(3)數(shù)組元素賦值:例,scores[2]=5.4;

C語言程序設(shè)計-第5章數(shù)組和矩陣例如:inta[2];/*定義*/錯誤用法:

scanf(“%d,%d”,&a[1],&a[2]);因為,C語言編譯系統(tǒng)不檢查數(shù)組下標(biāo)越界的錯誤,在編程時要注意避免它。C語言程序設(shè)計-第5章數(shù)組和矩陣1.一維數(shù)組元素的輸入和輸出數(shù)組操作的強大功能在于可以通過下標(biāo)值的變化對數(shù)組進行遍歷。常與循環(huán)結(jié)合遍歷處理數(shù)組中的元素。大多數(shù)情況下,下標(biāo)表達式就是循環(huán)的循環(huán)變量,從而可以很容易地依次對每個數(shù)組元素進行各種操作。常用單循環(huán)實現(xiàn)一維數(shù)組元素的輸入和輸出。C語言程序設(shè)計-第5章數(shù)組和矩陣【例5-1】閱讀程序,理解數(shù)組遍歷操作。#include<stdio.h>voidmain(){inti,as[10];

for(i=0;i<10;i++)scanf("%d",&as[i]);

for(i=0;i<10;i++)printf("%4d",as[i]);}for(i=0;i<10;i++)scanf("%d",as+i);for(i=0;i<10;i++)printf(“%d”,*(as+i));注意:(1)for語句中的條件必須指定最終的下標(biāo)值。(2)下標(biāo)越界即訪問的元素超過了該數(shù)組的范圍。這將導(dǎo)致不可預(yù)料的程序結(jié)果。(3)數(shù)組名代表數(shù)組首地址,是常量地址。通過數(shù)組名可以訪問數(shù)組。&as[i]和as+i都是元素as[i]的地址。C語言程序設(shè)計-第5章數(shù)組和矩陣2.一維數(shù)組元素的計算與處理

對數(shù)組元素的操作類似于簡單變量對象,但必須使用下標(biāo)指定被處理的某單個數(shù)組元素。C語言程序設(shè)計-第5章數(shù)組和矩陣【例5-2】計算斐波那契(Fibonacci)數(shù)列,第12個月時兔子的對數(shù)是多少。分析:(1)確定數(shù)據(jù)結(jié)構(gòu)?,F(xiàn)在用數(shù)組表示每月的兔子數(shù),則數(shù)組可定義為rabbit[12]。其中元素rabbit[0]=1表示最初的一對小免子,元素rabbit[1]=1表示最初的小免子長大了,元素rabbit[11],即第12個月的值就是問題所求。(2)遞推算法確定。確定每個月的免子rabbit[i]=rabbit[i-1]+rabbit[i-2],i的初值為2。

(3)用數(shù)組表示現(xiàn)實中的這種數(shù)據(jù)結(jié)構(gòu),可以很容易地反映它們之間的某種對應(yīng)關(guān)系。C語言程序設(shè)計-第5章數(shù)組和矩陣編碼#include<stdio.h>voidmain(void){inti;

intrabbit[12]={1,1};/*數(shù)組初始化*/

for(i=2;i<12;i++)/*循環(huán)遞推,計算數(shù)列*/

rabbit[i]=rabbit[i-1]+rabbit[i-2];

printf("%d",rabbit[11]);}C語言程序設(shè)計-第5章數(shù)組和矩陣【例5-3】由鍵盤輸入某班n個學(xué)生的數(shù)學(xué)成績,分別統(tǒng)計優(yōu)、良、中、差、不及格的人數(shù)和平均成績及比平均成績高的學(xué)生人數(shù)。分析:(1)需求分析:確定問題領(lǐng)域數(shù)據(jù)結(jié)構(gòu)。用一維數(shù)組表示n個學(xué)生的數(shù)學(xué)成績。數(shù)組定義為:floatmath[NUM]

為了與學(xué)號對應(yīng),從math[1]開始存放對應(yīng)學(xué)號學(xué)生的成績,而math[0]用于存放平均成績。定義數(shù)組intc[6],各元素分別用于存放優(yōu)、良、中、可、不及格的人數(shù)和比平均成績高的學(xué)生人數(shù)。(2)確定算法首先用單循環(huán)語句輸入學(xué)生成績,同時累加并進行分類統(tǒng)計;再在循環(huán)后計算平均成績;由于成績已實現(xiàn)存儲,所以可用另一個循環(huán)實現(xiàn)比較,判斷比平均成績高的學(xué)生并計數(shù)。C語言程序設(shè)計-第5章數(shù)組和矩陣編碼#include<stdio.h>#defineNUM100

voidmain(void){ int

i,n;

intc[6]={0}; /*統(tǒng)計數(shù)組,清零*/ floatmath[NUM],sum=0;/*學(xué)生成績數(shù)組*/

printf("請輸入學(xué)生實際人數(shù),n=?");

scanf("%d",&n); /*輸入學(xué)生實際人數(shù)*/ C語言程序設(shè)計-第5章數(shù)組和矩陣編碼

for(i=1;i<=n;i++) /*循環(huán)n次*/ { printf("請輸入第%d個學(xué)生成績:",i);

scanf("%f",&math[i]); /*輸入成績*/ sum+=math[i]; /*求和*/

if(math[i]>=90)c[0]++; /*分類統(tǒng)計*/ elseif(math[i]>=80) c[1]++; elseif(math[i]>=70) c[2]++; elseif(math[i]>=60) c[3]++; elsec[4]++; }C語言程序設(shè)計-第5章數(shù)組和矩陣

math[0]=sum/n; /*求平均成績*/

printf("\n本班平均成績?yōu)?f個\n",math[0]);

for(i=1;i<=n;i++) /*求比平均成績高的人數(shù)*/

if(math[i]>math[0])c[5]++;

printf("優(yōu)\t良\t中\(zhòng)t可\t不及格\t高于平均成績?nèi)藬?shù)\n");/*輸出統(tǒng)計表表頭*/

printf("%d\t%d\t%d\t%d\t%d\t%d\t\n",c[0],c[1],c[2],c[3],c[4],c[5]);}C語言程序設(shè)計-第5章數(shù)組和矩陣【例5-4】數(shù)據(jù)處理問題。

對任意10個正整數(shù),要求:

(1)分別按順序和逆序輸出;(輸出順序的調(diào)整)

(2)求出這些數(shù)據(jù)的和值與平均值;(求和值)

(3)找出其中最大數(shù)和最小數(shù)并輸出;(求極值問題)

(4)指出最大值和最小值在數(shù)組中的位置。(定位)C語言程序設(shè)計-第5章數(shù)組和矩陣分析:(1)問題陳述:現(xiàn)實中,經(jīng)常對所各種實驗收集到的數(shù)據(jù)進行各種處理或計算,例如,排序、查詢、求均值等。該例利用數(shù)組的特性實現(xiàn)對一組相同類型數(shù)據(jù)的各種處理。(2)需求分析:用一維數(shù)組來存放任意10個正整數(shù),通過循環(huán)對該數(shù)組進行各種處理,實現(xiàn)以上功能,并輸出結(jié)果。C語言程序設(shè)計-第5章數(shù)組和矩陣(3)處理流程

①把從鍵盤輸入的10個整型數(shù)據(jù)存放到一個一維數(shù)組中。定義數(shù)組inta[10];

②定義數(shù)組intb[4];,各數(shù)組元素分別存放數(shù)據(jù)的和值、平均值、最大值和最小值。也可定義4個簡單變量存放這些結(jié)果。

b[0]存放和值,需要清零;為了比較出最大值,b[2]的初值放置一個較小的值0;為了比較出正整數(shù)最小值,b[3]的初值要放置一個較大的正值0x7fffffff,它是int數(shù)據(jù)類型范圍內(nèi)的最大正值。

③通過循環(huán)輸入各元素值,同時求和值、找最大/小值、記憶最大/小值位置。C語言程序設(shè)計-第5章數(shù)組和矩陣④求平均值。⑤通過循環(huán)順序、逆序輸出各元素值。按下標(biāo)從小到大的順序訪問每一個數(shù)組元素,得到順序輸出的結(jié)果。按下標(biāo)從大到小的順序訪問每一個數(shù)組元素,得到逆序輸出的結(jié)果。⑥輸出和值、平均值、最大值、最小值以及最大值和最小值在數(shù)組中的位置。C語言程序設(shè)計-第5章數(shù)組和矩陣掃描法(打擂法):

先確定某一基準(zhǔn)變量及其值,將基準(zhǔn)變量和數(shù)組中的每一個元素依次從前向后比較,如果遇到比基準(zhǔn)變量更大(或更?。┑脑?,則將基準(zhǔn)變量值替換為該元素值,直到數(shù)組中所有的元素均被掃描。這時得到的最新基準(zhǔn)變量值就是數(shù)組中最大(或最?。┑脑刂?。尋找元素位置:

假設(shè)當(dāng)前最大值和最小值位置均在0位,即第1個元素。定義變量maxloc=0,minloc=0,用來記憶所尋找元素位置。在掃描過程中,根據(jù)比較更新所記憶的位置,即下標(biāo)值。C語言程序設(shè)計-第5章數(shù)組和矩陣voidmain(){int

i,maxloc=0,minloc=0,a[10];

intb[4]={0,0,0,0x7fffffff};

printf("請輸入10個正整數(shù):\n");for(i=0;i<10;i++){ 輸入數(shù)組元素值;

如果數(shù)據(jù)無效,{計數(shù)退回,重新輸入}

求和值 與基準(zhǔn)b[2]比較,找最大值,記憶最大值位置與基準(zhǔn)b[3]比較,找最小值,記憶最小值位置

}

求平均值順序輸出數(shù)據(jù)

逆序輸出數(shù)據(jù)

輸出和值、平均值、最大值、最小值

輸出最大值和最小值位置}算法C語言程序設(shè)計-第5章數(shù)組和矩陣編碼#include<stdio.h>voidmain(){int

i,maxloc=0,minloc=0,a[10];/*a[10]中的初始值不確定*/

intb[4]={0,0,0,0x7fffffff};/*數(shù)組b[4]置初值*/

printf("請輸入10個正整數(shù):\n");

for(i=0;i<10;i++){printf("請輸入第%d個正整數(shù):\n",i+1);

scanf("%d",&a[i]);/*輸入數(shù)組元素值*/

if(a[i]<=0)/*判斷數(shù)據(jù)有效性*/ {i--;continue;} b[0]+=a[i]; /*求和值*/ if(b[2]<a[i]) /*與基準(zhǔn)b[2]比較,找最大值*/ {b[2]=a[i];maxloc=i;}/*記憶最大值位置*/if(b[3]>a[i])/*與基準(zhǔn)b[3]比較,找最小值*/ {b[3]=a[i];minloc=i;}/*記憶最小值位置*/}C語言程序設(shè)計-第5章數(shù)組和矩陣

b[1]=b[0]/10;/*求平均值*/

printf("\n輸入的10個數(shù)據(jù)順序輸出:\n");

for(i=0;i<10;i++) printf("%8d",a[i]);

printf("\n輸入的10個數(shù)據(jù)逆序輸出:\n");

for(i=9;i>=0;i--) printf("%8d",a[i]); printf("\n10個數(shù)據(jù)的和值、平均值、最大值、最小值分別為:\n");

for(i=0;i<4;i++) printf("\t%d",b[i]); printf("\n最大值是第%d個數(shù),最小值是第%d個數(shù)\n",maxloc+1,minloc+1);}C語言程序設(shè)計-第5章數(shù)組和矩陣3.一維數(shù)組和文件操作數(shù)組也常用于存儲從數(shù)據(jù)文件中讀取的大量或成組的信息。C語言程序設(shè)計-第5章數(shù)組和矩陣【例5-5】假設(shè)我們有一個數(shù)據(jù)文件sensor1.txt,存儲了從某次實驗中收集到的100個時間值和測量結(jié)果。要求計算測量值的平均值,并報告異常數(shù)據(jù)(比平均值大)的個數(shù)。100 0.0132.5 0.1147.2 0.2148.3 0.3157.3 0.4163.2 0.5158.2 0.6169.3 0.7148.2 0.8137.6 0.9135.9 ……C語言程序設(shè)計-第5章數(shù)組和矩陣分析:(1)問題背景:如果只是報告“數(shù)據(jù)點數(shù)、平均值、最大值和最小值”,就可以不使用數(shù)組。而報告異常數(shù)據(jù)個數(shù),需要把每個值都與平均值進行比較,以尋找比平均值大的數(shù)據(jù)。若再次從外存讀入文件數(shù)據(jù),顯然降低程序執(zhí)行效率。如果使用數(shù)組存儲讀入的數(shù)據(jù),以便能夠再次訪問每個值,以犧牲內(nèi)存空間提高效率。

(2)需求分析:循環(huán)讀取測量數(shù)據(jù)存入一維數(shù)組,然后按要求計算。

C語言程序設(shè)計-第5章數(shù)組和矩陣編碼#include<stdio.h>#defineN100#defineFILENAME"sensor1.txt"voidmain(void){/*變量定義和初始化*/

int

k,count=0;doubley[N],y_ave,sum=0,d;FILE*lab;/*打開文件,把數(shù)據(jù)讀入數(shù)組,計算和值*/lab=fopen(FILENAME,"r");

if(lab==NULL) printf("Erroropeninginputfile.\n");elseC語言程序設(shè)計-第5章數(shù)組和矩陣

{fscanf(lab,"%*lf",&d); /*%*lf放棄第一行的1個數(shù)據(jù)100*/ /*輸入并處理數(shù)據(jù)*/

for(k=0;k<=N-1;k++) {fscanf(lab,"%*lf%lf",&y[k]);/*%*lf放棄第一列所有數(shù)據(jù)*/ sum+=y[k]; } /*計算平均值并統(tǒng)計比均值大的數(shù)據(jù)個數(shù)*/

y_ave=sum/N; for(k=0;k<=N-1;k++) if(y[k]>y_ave)count++;/*輸出結(jié)果*/ printf("有%d個數(shù)據(jù)大于平均值%lf\n",count,y_ave);

fclose(lab);}}C語言程序設(shè)計-第5章數(shù)組和矩陣5.3數(shù)組與函數(shù)5.3.1數(shù)組元素作為函數(shù)的實際參數(shù)5.3.2一維數(shù)組名作為函數(shù)參數(shù)5.3.3應(yīng)用案例:開發(fā)常用統(tǒng)計度量函數(shù)C語言程序設(shè)計-第5章數(shù)組和矩陣

數(shù)組作為函數(shù)的參數(shù)分為數(shù)組元素和數(shù)組名作參數(shù)兩種情況。

C語言程序設(shè)計-第5章數(shù)組和矩陣數(shù)組元素不能作函數(shù)的形參。數(shù)組元素作函數(shù)的實參,使用時與普通變量一樣,屬于“值傳遞(CallByValue)”。只與函數(shù)的形參進行值的結(jié)合,完成值的單向傳遞。5.3.1數(shù)組元素作為函數(shù)的實際參數(shù)C語言程序設(shè)計-第5章數(shù)組和矩陣【例5-6】數(shù)值問題。求20個整型數(shù)據(jù)中所有素數(shù)之和。分析:(1)問題陳述和需求分析:求20個整型數(shù)據(jù)中所有素數(shù)的和。用一維數(shù)組存放20個整數(shù),找出這些數(shù)中的素數(shù),求出和值。(2)處理流程

①定義:inta[20];②使用循環(huán)輸入數(shù)據(jù),同時判斷數(shù)組元素是否為素數(shù)。若為素數(shù),求累加和。

③輸出結(jié)果C語言程序設(shè)計-第5章數(shù)組和矩陣(3)自定義函數(shù)設(shè)計為使程序結(jié)構(gòu)清晰,設(shè)計自定義函數(shù)prime()

函數(shù)功能:判斷某整數(shù)是否為素數(shù),若是素數(shù),函數(shù)返回1,否則返回0。函數(shù)原型:int

prime(intx);C語言程序設(shè)計-第5章數(shù)組和矩陣編碼#include<stdio.h>#include<math.h>voidmain(){ inta[20],i,sum=0;

int

prime(intx);

printf("請輸入20個整數(shù):\n");

for(i=0;i<20;i++) {printf("輸入第%d個整數(shù):",i+1);

scanf("%d",&a[i]);

if(prime(a[i]))sum+=a[i];

}printf("sum=%d\n",sum);}intprime(intx){intflag=1,k;for(k=2;k<=(int)sqrt(x);k++)

if(!(x%k)){flag=0;break;}

return(flag);}數(shù)組元素做實參C語言程序設(shè)計-第5章數(shù)組和矩陣【應(yīng)用案例5-1】*計算化學(xué)分子量。計算氨基酸分子量。蛋白質(zhì)中的氨基酸是由氧、碳、氮、硫和氫原子組成,各元素分子量和氨基酸分子如下表:元素氧碳氮硫氫原子量15.999412.01114.0067432.0661.00794元素分子量表C語言程序設(shè)計-第5章數(shù)組和矩陣氨基酸0氧C碳N氮S硫H氫丙胺酸23107精胺酸264015天門冬醯胺34208天門冬胺酸44106半光胺酸23117麩胺酸45108麩胺醯胺352010甘胺酸22105組胺酸263010異白胺酸261013白胺酸261013離胺酸262015甲硫胺酸251111苯丙胺酸290111脯胺酸251010絲胺酸33107酥胺酸34109氨基酸分子表C語言程序設(shè)計-第5章數(shù)組和矩陣分析:(1)問題背景:化學(xué)反應(yīng)在許多科學(xué)和工程領(lǐng)域都扮演著重要的角色。了解和控制化學(xué)反應(yīng)可以使石油工程師提高石油、天然氣精煉廠的效率。了解極高溫度下完全離子化的氣體在強磁場的感應(yīng)下有什么樣的行為和反應(yīng),將是開發(fā)受控核聚變的重要一步。在遺傳工程中,識別DNA中的氨基酸是開發(fā)新產(chǎn)品合成技術(shù)關(guān)鍵的一步。在任意涉及化學(xué)反應(yīng)的場合中,根據(jù)化學(xué)式計算分子重量是很常見的事情。編程計算用于蛋白質(zhì)中與氨基酸有關(guān)的遺傳工程實驗。(2)需求分析:從鍵盤讀取氨基酸化學(xué)式,輸出該氨基酸分子量。C語言程序設(shè)計-第5章數(shù)組和矩陣(3)氨基酸化學(xué)式規(guī)律總結(jié)

①氨基酸化學(xué)式是一串字符(如,丙胺酸是O2C3N1S0H7);

②化學(xué)式中的字符串分為若干組,每組總是一個字母字符開頭,后跟數(shù)字字符結(jié)束;

③所有字母字符均在元素分子表中可查;每組數(shù)字字符最多兩位;

C語言程序設(shè)計-第5章數(shù)組和矩陣(4)處理流程

①定義全局變量inta[30],n;分別保存分子式和其中的字符總數(shù);

②為了使程序結(jié)構(gòu)清晰,且為使用者提供方便,設(shè)計如下自定義函數(shù):輸入化學(xué)式函數(shù):voidinput(void);

功能:輸入化學(xué)式并記憶化學(xué)式字符總長度n;輸出化學(xué)式函數(shù):

voidoutput(void);分析化學(xué)式是否正確函數(shù):

int

anal(intn);

功能:化學(xué)式正確返回1,否則返回0。函數(shù)接口,形參:化學(xué)式長度nC語言程序設(shè)計-第5章數(shù)組和矩陣計算化學(xué)分子式重量函數(shù):voidcolc(intn);

功能:計算化學(xué)分子式重量并輸出。函數(shù)接口,形參:化學(xué)式長度n元素重量查詢函數(shù):

doublecheck(intc);

功能:若字符是合法的氨基酸元素,返回元素重量值,否則返回0。函數(shù)接口,形參:元素字符——即全局變量數(shù)組中的字母字符C語言程序設(shè)計-第5章數(shù)組和矩陣定義全局變量inta[30],n顯示主菜單:1.輸入氨基酸化學(xué)式;input() 2.輸出氨基酸化學(xué)式;output() 3.判斷氨基酸化學(xué)式是否正確;anal() 4.輸出氨基酸化學(xué)式總重量;colc() 0.退出(exit)main()函數(shù)流程圖1C語言程序設(shè)計-第5章數(shù)組和矩陣i=0,f=1,假設(shè)化學(xué)式正確

int

anal(intn)函數(shù)流程圖i<n&&fcheck(a[i])YNreturnf;Y(合法)Nf=0,break;i<n-1&&isdigit(a[i+1])若元素個數(shù)可查詢,且下一個內(nèi)容是數(shù)字i+=2指向下一個可能的元素符號Yi<n&&isdigit(a[i])若下一個符號還是數(shù)字i++f=0,break;Nisalpha(a[i])當(dāng)前元素是字母字符Nf=0,break;字母字符是合法的化學(xué)式分子符號C語言程序設(shè)計-第5章數(shù)組和矩陣doubleweight,sum=0;inti=0,w;colc(intn)函數(shù)流程圖i<n輸出化學(xué)分子重量;i+=2i++假設(shè)化學(xué)式已經(jīng)過驗證,正確查詢當(dāng)前元素重量weight=check(a[i])形成一位的元素個數(shù)數(shù)字w=a[i+1]-'0'指向下一個可能的化學(xué)元素符號i<n&&isdigit(a[i])若此內(nèi)容也是一個數(shù)字符號Y形成兩位的元素個數(shù)數(shù)字w元素重量累加:sum=sum+weight*w;C語言程序設(shè)計-第5章數(shù)組和矩陣inti=0,element[5]={'H','C','N','O','S'};doubleweight,ew[5]={1.00794,12.011,14.00674,15.9994,32.066};check(intc)函數(shù)流程圖定義元素表和元素重量表,以待查詢待查詢字符,確定元素位置i<5&&element[i]!=cYi++i<5查詢元素重量weight=ew[i]YNweight=0returnweight查詢元素重量表C語言程序設(shè)計-第5章數(shù)組和矩陣編碼#include"stdio.h"#include"stdlib.h"#include"ctype.h" /*字符處理頭文件*/inta[30],n;/*n記憶氨基酸化學(xué)式長度*/voidinput(void);voidoutput(void);voidcolc(intn);int

anal(intn);doublecheck(intc);C語言程序設(shè)計-第5章數(shù)組和矩陣voidmain(){inti=0,m; do{ system("CLS");

printf("\n\t歡迎使用分子式查詢程序!!\n"); printf("1.輸入氨基酸化學(xué)式\n"); printf("2.輸出氨基酸化學(xué)式\n"); printf("3.判斷氨基酸化學(xué)式是否正確\n"); printf("4.輸出氨基酸化學(xué)式總重量\n"); printf("0.退出\n");

scanf("%d",&m);getchar();

switch(m) {case1:input();getchar();break; case2:output();getchar();break; case3:if(anal(n))printf("分子式正確!!\n"); elseprintf("分子式錯!!\n");getchar();break; case4:colc(n);getchar();break; case0:exit(0); } }while(1);}C語言程序設(shè)計-第5章數(shù)組和矩陣/*輸入氨基酸化學(xué)式函數(shù)*/voidinput(void){ inti=0; n=0;

printf("請輸入氨基酸化學(xué)式:");

while((a[i++]=getchar())!='\n')n++; }/*輸出氨基酸化學(xué)式函數(shù)*/voidoutput(void){

inti; i=n;

for(i=0;i<n;i++)

putchar(a[i]);}C語言程序設(shè)計-第5章數(shù)組和矩陣/*判斷氨基酸化學(xué)式函數(shù)*/int

anal(intn){ inti=0,f=1; /*f=1標(biāo)記假設(shè)化學(xué)式正確*/

while(i<n&&f) /*符合氨基酸式規(guī)律,繼續(xù)判斷*/ { if(isalpha(a[i])) /*當(dāng)前字符若是字母字符*/ {a[i]=toupper(a[i]);/*轉(zhuǎn)大寫字符*/

if(!check(a[i])){f=0;break;}/*查詢元素重量*/ elseif(i<n-1&&isdigit(a[i+1])) { i+=2;/*符合規(guī)律,繼續(xù)下一次準(zhǔn)備*/

if(i<n&&isdigit(a[i])) i++;/*符合規(guī)律,繼續(xù)下一次準(zhǔn)備*/ } else{f=0;break;} } else{f=0;break;} } returnf;}C語言程序設(shè)計-第5章數(shù)組和矩陣/*計算氨基酸化學(xué)式并輸出總重量*/voidcolc(intn){doubleweight,sum=0;

inti=0,w;

while(i<n) { a[i]=toupper(a[i]);/*轉(zhuǎn)大寫字符*/ weight=check(a[i]);/*調(diào)用函數(shù)check,查詢元素重量*/ w=a[i+1]-'0'; i+=2;/*判斷元素重量是否兩位數(shù)字*/

if(i<n&&isdigit(a[i]))/*若此內(nèi)容也是數(shù)字字符*/ {w=w*10+(a[i]-'0'); i++; } sum=sum+weight*w; }

printf("\n該氨基酸分子重量為:%lf",sum);}C語言程序設(shè)計-第5章數(shù)組和矩陣/*元素重量查詢*/doublecheck(intc){inti=0,element[5]={'H','C','N','O','S'};doubleweight,ew[5]={1.00794,12.011,14.00674,15.9994,32.066};

while(i<5&&element[i]!=c) i++; /*確定元素*/

if(i<5) weight=ew[i]; /*確定元素重量*/ else weight=0; returnweight;}C語言程序設(shè)計-第5章數(shù)組和矩陣5.3.2一維數(shù)組名作為函數(shù)參數(shù)數(shù)組名作函數(shù)參數(shù)時,既可作形參,也可作實參。當(dāng)實參和形參是數(shù)組名時,函數(shù)調(diào)用時將采用地址結(jié)合方式。數(shù)組名作函數(shù)參數(shù),實參和形參的數(shù)組大小可以不一致,但數(shù)組類型應(yīng)該一致。且必須有明確的數(shù)組說明。地址結(jié)合副作用:形參的變化會影響主調(diào)者所使用的實參。通過地址結(jié)合的函數(shù)調(diào)用可實現(xiàn)雙向傳遞數(shù)據(jù)。即函數(shù)不僅通過返回語句可以傳遞一個值,還可以通過參數(shù)傳遞一個或多個值。如果要求形參數(shù)組得到實參數(shù)組的全部元素的值,則形參數(shù)組與實參數(shù)組的長度應(yīng)一致。形參數(shù)組的長度可以省略。C語言程序設(shè)計-第5章數(shù)組和矩陣用數(shù)組名作為函數(shù)參數(shù)時,函數(shù)通常有兩個參數(shù):一個參數(shù)指定參數(shù)數(shù)組,另一個參數(shù)則指定參數(shù)數(shù)組中用到的元素個數(shù)。通過指定數(shù)組中所用元素的個數(shù),函數(shù)將變得更加靈活。C語言程序設(shè)計-第5章數(shù)組和矩陣【例5-7】輸入一組0至9范圍內(nèi)的數(shù)字,統(tǒng)計每個整數(shù)的個數(shù)。分析:(1)定義一個一維數(shù)組,int

a[M];用來存儲從鍵盤上輸入的一組數(shù)字。(2)定義一個一維數(shù)組,int

b[N];用來統(tǒng)計每個整數(shù)的個數(shù)。其中,b[0]統(tǒng)計整數(shù)0的個數(shù),b[1]統(tǒng)計整數(shù)1的個數(shù),……,b[9]統(tǒng)計整數(shù)9的個數(shù)。(3)當(dāng)數(shù)組元素a[i]的值為0時,表達式b[a[i]]就是b[0],b[0]++就實現(xiàn)了整數(shù)0的個數(shù)增1的運算;當(dāng)數(shù)組元素a[i]中的值為1時,表達式b[a[i]]就是b[1],b[1]++就實現(xiàn)了整數(shù)1的個數(shù)增1的運算;……;依此類推。C語言程序設(shè)計-第5章數(shù)組和矩陣(4)處理流程定義自定義函數(shù),統(tǒng)計各個數(shù)字的個數(shù):函數(shù)原型:voidcount(inta[],intb[],intn)接口參數(shù):inta[],待統(tǒng)計數(shù)組;intb[],計數(shù)數(shù)組;intn,待統(tǒng)計數(shù)組長度。C語言程序設(shè)計-第5章數(shù)組和矩陣編碼#include<stdio.h>#defineM60#defineN10voidmain(){int

a[M],b[N],i,n; voidcount(int

a[],int

b[],intn);/*函數(shù)聲明*/

printf("請輸入數(shù)字個數(shù):");

scanf("%d",&n);

printf("請輸入0至9范圍內(nèi)的數(shù)字:");

for(i=0;i<n;i++)scanf("%d",&a[i]);

count(a,b,n); /*一維數(shù)組名作為函數(shù)參數(shù)*/

printf("輸出各整數(shù)的個數(shù):");

for(i=0;i<N;i++)printf("%d",b[i]);}voidcount(int

a[],int

b[],intn){inti;

for(i=0;i<N;i++)b[i]=0; /*b數(shù)組元素置初值0*/

for(i=0;i<n;i++)b[a[i]]++;/*用b數(shù)組元素對各整數(shù)進行統(tǒng)計*/}C語言程序設(shè)計-第5章數(shù)組和矩陣【例5-8】閱讀下面的程序。該程序從一個數(shù)據(jù)文件中讀取一組數(shù)據(jù),然后調(diào)用一個函數(shù)來統(tǒng)計并計算數(shù)組中比平均值大的元素個數(shù)。C語言程序設(shè)計-第5章數(shù)組和矩陣#include<stdio.h>#defineN150#defineFILENAME"sensor2.txt"voidcount(doublex[],intn);voidmain(void){int

ntps=0;doubley[N];FILE*lab;/*打開文件,把數(shù)據(jù)讀入數(shù)組,計算和值*/lab=fopen(FILENAME,"r");

if(lab==NULL) printf("Erroropeninginputfile.\n");else{/*輸入并統(tǒng)計數(shù)據(jù)個數(shù)*/ while((fscanf(lab,"%*lf%lf",&y[ntps]))==1)ntps++; /*計算平均值并統(tǒng)計比均值大的數(shù)據(jù)個數(shù)*/

printf("共有%d個數(shù)據(jù)\n",ntps);

count(y,ntps);

fclose(lab);}}C語言程序設(shè)計-第5章數(shù)組和矩陣voidcount(doublex[],intn){intk,count1=0;doubley_ave,sum=0;

for(k=0;k<=n-1;k++) sum+=x[k];/*計算平均值并統(tǒng)計比均值大的數(shù)據(jù)個數(shù)*/y_ave=sum/n;for(k=0;k<=n-1;k++)

if(x[k]>y_ave)count1++;/*輸出結(jié)果*/

printf("有%d個數(shù)據(jù)大于平均值\n",count1);}C語言程序設(shè)計-第5章數(shù)組和矩陣5.3.3應(yīng)用案例:開發(fā)常用統(tǒng)計度量函數(shù)

分析工程實驗中收集的數(shù)據(jù)是評估實驗的一個重要環(huán)節(jié)。這種分析涉及到對數(shù)據(jù)的簡單計算(如計算平均值),甚至更加復(fù)雜的計算。許多利用數(shù)據(jù)的計算或者測量都屬于統(tǒng)計度量問題,因為它們具備數(shù)據(jù)集可變的統(tǒng)計屬性。

C語言程序設(shè)計-第5章數(shù)組和矩陣

1.簡單工程分析

在評估一組實驗數(shù)據(jù)時,常常要計算其最大值、最小值、平均值以及中值。開發(fā)幾個能夠利用數(shù)組作為輸入來計算這些值的函數(shù)。這些函數(shù)對于以后其它問題解決方案的許多程序都有用。注意,這些函數(shù)都假設(shè)數(shù)組中至少有一個值。C語言程序設(shè)計-第5章數(shù)組和矩陣(1)計算數(shù)組元素最大值的通用函數(shù)doubleismax(doublex[],intn){inti;doublemax=x[0]; /*用x[0]作基準(zhǔn)*/for(i=1;i<n;i++)if(x[i]>max)max=x[i];returnmax;}C語言程序設(shè)計-第5章數(shù)組和矩陣(2)計算數(shù)組元素最小值的通用函數(shù)doubleismin(doublex[],intn){inti;doublemin=x[0]; /*用x[0]作基準(zhǔn)*/for(i=1;i<n;i++)if(x[i]<min)min=x[i];returnmin;}C語言程序設(shè)計-第5章數(shù)組和矩陣(3)計算數(shù)組元素平均值的通用函數(shù)doubleisave(doublex[],intn){inti;doublesum=0,ave;

for(i=0;i<n;i++)sum=sum+x[i];

ave=sum/n;returnave;}C語言程序設(shè)計-第5章數(shù)組和矩陣(4)計算數(shù)組元素中值的通用函數(shù)doublemedian(double

x[],intn){doublemedian_x;if(n%2!=0)median_x=x[n/2];

elsemedian_x=(x[n/2-1]+x[n/2])/2;returnmedian_x;}C語言程序設(shè)計-第5章數(shù)組和矩陣2.方差和標(biāo)準(zhǔn)偏差對于一組數(shù)據(jù)來說,最重要的統(tǒng)計度量值之一就是方差。方差是指一組數(shù)據(jù)中各個數(shù)與它們平均數(shù)的差的平方組成新數(shù)據(jù)的平均數(shù)。數(shù)學(xué)上一般用E{[X-E(X)]^2}來度量隨機變量X與其均值E(X)的偏離程度,稱為X的方差。方差越大,說明數(shù)據(jù)的波動越大,越不穩(wěn)定。標(biāo)準(zhǔn)偏差被定義為方差的平方根。C語言程序設(shè)計-第5章數(shù)組和矩陣(1)計算方差的通用函數(shù)doublevariance(doublex[],intn){inti;doublesum=0,ave;doubleisave(double

x[],intn);

ave=isave(x,n);

for(i=0;i<n;i++)sum=sum+(x[i]-ave)*(x[i]-ave);returnsum/(n-1);}C語言程序設(shè)計-第5章數(shù)組和矩陣(2)計算標(biāo)準(zhǔn)偏差的通用函數(shù)doublestd_dev(doublex[],intn){doublevariance(doublex[],intn);

returnsqrt(variance(x,n));}C語言程序設(shè)計-第5章數(shù)組和矩陣3.自定義頭文件

我們開發(fā)的這幾個函數(shù)在解決工程問題中會經(jīng)常被用到。為方便使用,我們生成了一個自定義頭文件來包含這些函數(shù)的原型語句。然后在main函數(shù)中,我們可以使用預(yù)處理命令包含這個自定義的頭文件,而不必包含所有這些原型語句。C語言程序設(shè)計-第5章數(shù)組和矩陣名為stat_lib.h的自定義頭文件包含了下列函數(shù)原型。doubleismax(doublex[],intn);doubleismin(doublex[],intn);doubleisave(doublex[],intn);doublemedian(doublex[],intn);doublevariance(doublex[],intn);doublestd_dev(doublex[],intn);C語言程序設(shè)計-第5章數(shù)組和矩陣【例5-9】在某次實驗中收集了10個數(shù)據(jù),分別求出這10個數(shù)據(jù)的最大值、最小值、平均值、中值、方差和標(biāo)準(zhǔn)偏差。要求調(diào)用以上函數(shù)實現(xiàn)。#include"stdio.h"#include"stat_lib.h"#include"math.h"voidmain(){doublex[10],max,min,ave,med,var,std;inti;for(i=0;i<10;i++)scanf("%lf",&x[i]);max=ismax(x,10);min=ismin(x,10);ave=isave(x,10);med=median(x,10);var=variance(x,10);std=std_dev(x,10);printf("最大值:%lf最小值:%lf平均值:%lf\n中值:%lf方差:%lf標(biāo)準(zhǔn)偏差:%lf\n",max,min,ave,med,var,std);}C語言程序設(shè)計-第5章數(shù)組和矩陣5.4排序算法1.選擇排序(SelectionSort)算法2.冒泡排序(BubbleSort)算法C語言程序設(shè)計-第5章數(shù)組和矩陣選擇排序思想:在所有元素中查找最小的元素,將此元素與最前面的元素交換,再在余下元素中查找最小的元素,將此元素與余下元素的最前面元素交換,因為每一次都是選擇一個最小數(shù)進行,所以稱為選擇排序。1.選擇排序(SelectionSort)算法(必記算法)C語言程序設(shè)計-第5章數(shù)組和矩陣10個數(shù)據(jù)的選擇排序過程

C語言程序設(shè)計-第5章數(shù)組和矩陣選擇排序通用算法描述:voidSelectSort(intx[],intn){inti,j,k,t;

for(i=0;i<n-1;i++)/*n個數(shù)進行n-1趟選擇,外循環(huán)控制趟數(shù)*/

{k=i; /*k記憶最小值位置,假設(shè)法*/

/*內(nèi)循環(huán)負責(zé)在當(dāng)前無序區(qū)x[i+1]…x[n-1]中選最小值*/

for(j=i+1;j<n;j++)

if(x[j]<x[k])

k=j;/*k記下目前找到的最小值所在的位置*/

if(k!=i)/*將最小數(shù)交換到無序區(qū)最前面*/

{t=x[i];x[i]=x[k];x[k]=t;}

}}C語言程序設(shè)計-第5章數(shù)組和矩陣【例5-10】已知某班學(xué)生的某門課成績,對其按升序排列。#include<stdio.h>#defineNUM100voidSelectSort(intx[],intn){ int

i,j,k,t;

for(i=0;i<n-1;i++) { k=i;for(j=i+1;j<n;j++)

if(x[j]<x[k]) k=j;

if(k!=i)

{t=x[i];x[i]=x[k];x[k]=t;}

}}C語言程序設(shè)計-第5章數(shù)組和矩陣voidmain(){ int

i,n,a[NUM];

printf("請輸入學(xué)生實際人數(shù):\n");

scanf("%d",&n);

for(i=0;i<n;i++) /*數(shù)據(jù)輸入*/ { printf("請輸入第%d個學(xué)生成績:\n",i+1);

scanf("%d",a+i);

if(a[i]<0||a[i]>100){i--;continue;}/*數(shù)據(jù)有效性驗證*/ }

SelectSort(a,n); /*函數(shù)調(diào)用,數(shù)組名做實參*/

printf("thesortednumbers:\n");

for(i=0;i<n;i++) /*輸出*/

printf("%d",a[i]);}C語言程序設(shè)計-第5章數(shù)組和矩陣2.冒泡排序(BubbleSort)算法(必記算法)冒泡排序是對所有相鄰的元素進行比較,在比較排序過程中總是大數(shù)往后(下)放,小數(shù)往前(上)放,相當(dāng)于氣泡往上升,所以稱作冒泡排序。從下往上排序,則最輕氣泡先產(chǎn)生;從上往下排排序,則最重氣泡先產(chǎn)生。C語言程序設(shè)計-第5章數(shù)組和矩陣設(shè)n個數(shù)按由小到大排列,冒泡排序的基本思想是:(1)初始狀態(tài):x[0]、x[1]、…x[n-1]為無序區(qū)。(2)第一趟掃描對無序區(qū)從上往下,依次比較相鄰兩個數(shù)據(jù)的大小,若發(fā)現(xiàn)小者在下、大者在上,則交換二者位置。每次對于每對氣泡(x[j],x[j+1]),若x[j]>x[j+1],則交換x[j]和x[j+1]的值。第一趟掃描完畢時,“最重”的氣泡(數(shù)據(jù))就移到該區(qū)間的最后,即最大數(shù)據(jù)被推到了最后。有序區(qū)在最后。C語言程序設(shè)計-第5章數(shù)組和矩陣

經(jīng)過i-1趟冒泡排序后:

x[0]、x[1]、…x[n-i]為無序區(qū),

x[n-i+1]…x[n-1]為有序區(qū)。(3)第i趟排序:

繼續(xù)掃描無序區(qū)x[0]、x[1]、…x[n-i]。形成新的有序區(qū)和無序區(qū):

x[0]…x[n-i-1]為無序區(qū),

x[n-i]…x[n-1]為有序區(qū)。依次類推,一共需進行n-1趟冒泡排序,完成n-1個數(shù)據(jù)的升序排列,最后一個數(shù)據(jù)不需再排。x[0]、x[1]、…x[n-1]形成新的有序區(qū)。C語言程序設(shè)計-第5章數(shù)組和矩陣10個數(shù)據(jù)的冒泡排序過程

C語言程序設(shè)計-第5章數(shù)組和矩陣冒泡排序通用算法voidBubbleSort(int

x[],intn){/*采用自上向下掃描,對x[]做冒泡排序*/

inti,j,t;

for(i=1;i<n;i++)/*外循環(huán)控制趟,做n-1趟排序*/

for(j=0;j<n-i;j++)/*對當(dāng)前無序區(qū)自前向后掃描*/

if(x[j]>x[j+1]) /*交換數(shù)據(jù)*/{t=x[j];x[j]=x[j+1];x[j+1]=t;}}C語言程序設(shè)計-第5章數(shù)組和矩陣優(yōu)化冒泡排序通用算法voidBubSort(intx[],intn){/*采用自上(左)向下(右)掃描,對x做冒泡排序*/

inti,j,t;

intexchange;/*交換標(biāo)志*/

for(i=1;i<n;i++)/*最多做n-1趟排序*/{exchange=0;

/*本趟排序開始前交換標(biāo)志為假*/

for(j=0;j<n-i;j++) /*對當(dāng)前無序區(qū)自前向后掃描*/

if(x[j]>x[j+1])/*交換數(shù)據(jù)*/

{t=x[j];x[j]=x[j+1];x[j+1]=t;

exchange=1;

/*發(fā)生了交換,故將交換標(biāo)志置為1*/

}

if(!exchange)return;

/*本趟排序未發(fā)生交換,提前終止算法*/

}}C語言程序設(shè)計-第5章數(shù)組和矩陣【例5-11】用冒泡排序法實現(xiàn)例5-10。#include<stdio.h>#defineNUM100voidBubSort(int

x[],intn){ inti,j,t;

intexchange;for(i=1;

溫馨提示

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

評論

0/150

提交評論