C語言程序設計課件第6章 數組 2_第1頁
C語言程序設計課件第6章 數組 2_第2頁
C語言程序設計課件第6章 數組 2_第3頁
C語言程序設計課件第6章 數組 2_第4頁
C語言程序設計課件第6章 數組 2_第5頁
已閱讀5頁,還剩54頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

第六章數組大學計算機基礎網絡信息中心教研室2主要內容6.1一維數組6.2二維數組6.3字符數組大學計算機基礎網絡信息中心教研室3教學目的:理解數組與數組元素概念掌握一維數組的定義與引用掌握常用排序算法熟練掌握二維數組的定義、引用、初始化掌握字符數組的定義、引用、初始化掌握字符數組的輸入與輸出掌握字符串處理函數大學計算機基礎網絡信息中心教研室4引言:數組和數組元素已經學習的C語言基本數據類型:整型(short、int、long)實型(float、double、longdouble)字符型(char)空類型(void)后續學習C語言數據類型:枚舉類型(屬于基本類型)構造類型:數組、結構體、共同體指針類型所謂構造類型:由基本類型數據按一定規則組成的,因此又稱為“導出類型”大學計算機基礎網絡信息中心教研室5引言:數組和數組元素問題1:輸入100個數并以與輸入時相反的順序輸出這100個數;問題2:輸入100名學生的成績,輸出高于平均分的成績。思考:問題特點:數據處理量大且具有相同性質大學計算機基礎網絡信息中心教研室6引言:數組和數組元素數組:是一組同類型變量組成的有序集合。數組中的每個變量稱為數組的一個元素。可以用數組名稱與數組的下標惟一地確定一個數組元素。例如:一個班有30個學生,用

s0,s1,s2,‥,s29

來表示30個學生的某科成績,其中,s15就表示第16個學生的成績。S是數組名,下標表示序號。在C語言中用s[15]表示s15即為數組s的第16個元素。數組包括一維數組和多維數組。大學計算機基礎網絡信息中心教研室76.1一維數組1一維數組的定義

2一維數組元素的引用3一維數組的初始化4一維數組程序舉例大學計算機基礎網絡信息中心教研室86.1.1一維數組的定義1、一維數組的定義類型說明符數組名[常量表達式];可以是任何一種基本數據類型或構造類型。指定數組中所有元素的共同數據類型。空格[]數組名的命名規則同簡單變量的命名規則指定數組元素的個數,又稱數組長度。可以是常量或符號常量。必須是方括號!大學計算機基礎網絡信息中心教研室96.1.1一維數組的定義a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]例如:inta[10];/*定義10個整型變量*/charc[12];/*定義12個字符變量*/c[0]c[1]c[2]c[3]c[4]c[5]c[6]c[7]c[8]c[9]c[10]c[11]大學計算機基礎網絡信息中心教研室10

數組必須先定義后使用,而且只能逐個引用數組元素,而不能一次引用整個數組。數組元素的表示:數組名[下標]定義時使用的名稱可以使整型常量或整型表達式;注意數組元素下標從0開始。最后一個元素的下標是數組長度-16.1.2一維數組元素的引用大學計算機基礎網絡信息中心教研室11

例1、定義一個名稱為a并含有10個元素的整型數組,然后依次把1,2,3,…,10這10個數存入元素a[0],a[1],a[2],…,[9],最后求出這10個數的和。#include<stdio.h>main(){inta[10],s;a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;a[5]=6;a[6]=7;a[7]=8;a[8]=9;a[9]=10;s=a[0]+a[1]+a[2]+a[3]+a[4]+a[5]+a[6]+a[7]+a[8]+a[9];printf(“a[0]+a[1]+…+a[9]=%d”,s);}數組與循環結合起來,可以有效地處理批量數據!#include<stdio.h>main(){inta[10],i,s=0;

for(i=0;i<=9;i++)a[i]=i+1;for(i=0;i<=9;i++)s=s+a[i];printf(“a[0]+a[1]+…+a[9]=%d”,s);}大學計算機基礎網絡信息中心教研室126.1.3

一維數組的初始化對數組元素的初始化可以用下面4種方法:定義時賦初值如:inta[5]={0,1,2,3,4};只給一部分元素賦值如:inta[5]={0,1,2};

/*只對前三個元素賦值*/元素值全為0時的賦值如:inta[5]={0};缺省數組長度對全部元素賦值如:inta[]={0,1,2,3,4};

/*定義數組a,并對其中的元素賦值,賦5個值則長度為5*/

大學計算機基礎網絡信息中心教研室13#include<stdio.h>main(){inta[]={23,56,83,52,100,88,78,25,34},max,i;max=a[0];/*擂臺初值*/for(i=1,i<=8;i++)/*循環*/if(a[i]>max)max=a[i];

/*讓每個數與擂臺上的數比較,大者留在擂臺上*/printf(“最大值:%d”,max);}例2、利用數組求集合{23,56,83,52,100,88,78,25,34}的最大值。擂臺2356835210088782534求最值的“擂臺法”大學計算機基礎網絡信息中心教研室146.1.4一維數組程序舉例

在程序設計中,排序的算法主要有冒泡法、選擇法、插入法等。本節中主要通過一維數組來介紹冒泡法和選擇法兩種排序算法。大學計算機基礎網絡信息中心教研室15

冒泡法的基本思想:通過相鄰兩個數之間的比較和交換,使數值較小的逐漸從底部移向頂部,數值較大的逐漸從頂部移向底部。就像水底的氣泡一樣逐漸向上冒,故而得名。冒泡法排序1(以從小到大舉例)

大學計算機基礎網絡信息中心教研室16988888895555559444444922222290000009第1次第2次第3次第4次第5次結果第一趟比較

6-1次以6個數為例的算法示意圖:大學計算機基礎網絡信息中心教研室178555558444448222228000008第1次第2次第3次第4次結果第二趟比較

6-2次5444452222500005第1次第2次第3次結果第三趟比較

6-3次大學計算機基礎網絡信息中心教研1次第2次結果2002第1次結果第四趟比較

6-4次第五趟比較

6-5次

算法結論:6個數需要比較5趟才可以完成排序,而在第一趟中比較6-1次,第二趟比較6-2趟…由此可以總結出若有n個數,則要進行n-1趟比較,在第i趟中比較n-i次。(i初值為1)大學計算機基礎網絡信息中心教研室19根據算法結論畫出流程圖如下:設n=10輸入10個數給a[0]~a[9]i由0到8共執行9次循環進行9-i次比較真

a[j]和a[j+1]交換輸出a[0]~a[9]a[j]>a[j+1]#include<stdio.h>#defineN10main(){inta[N],i,j,t;printf("inputtennumber:\n");for(i=0;i<N;i++) scanf("%d",&a[i]);printf("\n");for(i=0;i<N-1;i++)for(j=0;j<N-1-i;j++){if(a[j]>a[j+1])

{t=a[j];a[j]=a[j+1];a[j+1]=t;}}printf("thesortednumber:\n");for(i=0;i<N;i++)printf("%5d",a[i]);}程序假大學計算機基礎網絡信息中心教研室20選擇排序法的基本思想:(假設n=6)(1)、采用“擂臺法”,首先以A[0]為“擂主”,從A[0],…,A[5]中找出最大的元素與A[0]交換。(2)、然后以A[1]為“擂主”,找出A[1]~A[5]中最大的元素與A[1]交換。(3)、依此類推以A[i]為“擂主”,找出A[i]~A[5]中最大的元素與A[i]交換。當i==5停止。(此時“擂主”左邊所有元素均遞減有序,而“擂主”為最后一個元素,故完成排序)選擇法排序1(以從大到小舉例)

大學計算機基礎網絡信息中心教研室21974938137665134938977665以6個數為例的算法示意圖:kj76kjjkjj139797

763813496549kjjjkj386597

76

65134938491397

76

65

49133897

76

65

49

38133813結果:第5輪:第4輪:第3輪:第2輪:第1輪:大學計算機基礎網絡信息中心教研室22#defineN10main(){inti,j,k,t,a[N];printf("inputNnumbers:\n");for(i=0;i<N;i++)scanf(“%d”,&a[i]);//輸入N個數

printf("\n");for(i=0;i<N-1;i++)//執行N-1輪比較

{k=i;for(j=i+1;j<N;j++)if(a[j]>a[k])//遇到比當前元

k=j;//素大的數,記下kif(k!=i){t=a[i];a[i]=a[k];a[k]=t;}}printf("thesortednumbers:\n");for(i=0;i<N;i++)printf(“%3d”,a[i]);//輸出數組}輸入10個數給a[0]~a[9]i=0i由0到8共執行9次循環k=ij=i+1

當j<N時真

假k=jj=j+1a[i]和a[k]交換i=i+1輸出a[0]~a[9]a[j]>a[k]大學計算機基礎網絡信息中心教研室23一維數組題型總結:5、隨機給一維數組賦值,輸出最大或者最小幾個元素的平均值。1、一維整型數組實現倒序。2、一維數組排序(冒泡或選擇)。3、統計一維數組中滿足條件的元素個數。4、在已排序的數組中插入一個數據,保證數組的有序性。大學計算機基礎網絡信息中心教研室24補充內容隨機函數rand()的使用方法在程序中如果直接調用rand函數,第一次運行獲得的是隨機數,以后在運行該組數不會發生變化,這是因為計算機是嚴格按照某種規則執行,不可能靈活變化。那么要利用計算機產生真正隨機數,就必須和srand一起用。

srand用法:srand(time(0))

如果想要產生一個范圍內的隨機數,比如10—99之間的正整數賦給變量a,就應該是a=rand()%(99-10+1)+10。大學計算機基礎網絡信息中心教研室25隨機函數用法舉例:#include<stdio.h>#include<stdlib.h>#include<time.h>main(){ inta[3][4],i,j; srand(time(0)); for(i=0;i<3;i++) { for(j=0;j<4;j++) a[i][j]=rand(); } for(i=0;i<3;i++) { for(j=0;j<4;j++) printf("%3d",a[i][j]); printf("\n"); }}大學計算機基礎網絡信息中心教研室26小結

本講主要講述一維數組的概念和定義方法,并用幾個簡單的實例說明了其使用方法。最后所講的排序算法是本講的難點和重點。大家應在課下練習相關程序,尤其是關于一維數組中數據的排序算法。大學計算機基礎網絡信息中心教研室276.2二維數組1二維數組的定義與存儲2二維數組元素的引用3二維數組的初始化

4二維數組程序舉例大學計算機基礎網絡信息中心教研室286.2.1二維數組的定義與存儲1、二維數組的定義一般形式:

類型說明符數組名[常量表達式1][常量表達式2]

說明:①第一個常量表達式表示數組第一維的長度(行數),第二個表示數組第二維的長度(列數),例如:inta[3][2];

邏輯結構如圖

a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]大學計算機基礎網絡信息中心教研室29②表示行數和列數的下標值必須寫在兩個方括號中③二維數組在機器內部存儲時,先存放第一行的元素,再存放第二行的元素,以此類推,比如a[3][2]在內存的存儲次序為:

a[0][0],a[0][1],a[1][0],a[1][1],a[2][0],a[2][1]④二維數組可被看成特殊的一維數組。a[0]

a[1]

a[2]a[2][0]a[2][1]

aa[0][0]a[0][1]a[1][0]a[1][1]6.2.1二維數組的定義與存儲大學計算機基礎網絡信息中心教研室306.2.2二維數組的引用二維數組元素引用形式:

數組名

[下標][下標]

如:a[3][4]表示數組a的第行第列所對應的元素45大學計算機基礎網絡信息中心教研室31二維數組初始化:分行賦值如:inta[3][2]={{0,1},{2,3},{4,5}};按數組排列次序賦值如:inta[3][2]={0,1,2,3,4,5};對部分元素賦值如:inta[3][2]={{0},{1,0}};省略第一維長度對全部元素賦值如:inta[][2]={0,1,2,3,4,5};/*由全部元素的個數可以確定第一維的長度為3,省略第一維時,第二維不能缺省*/賦值結果0010006.2.3二維數組的初始化大學計算機基礎網絡信息中心教研室32#include<stdio.h>main(){ inti,j,a[3][3]={{1,2,3},{4,5,6},{7,8,9}};

for(i=0;i<3;i++) { for(j=0;j<3;j++) printf("%3d",a[i][j]); printf(“\n”);//輸完一行換行

}}for(i=0;i<3;i++)for(j=0;j<3;j++) scanf("%d",&a[i][j]);例:6.2.3二維數組的初始化大學計算機基礎網絡信息中心教研室336.2.4二維數組應用舉例

例1:將一個二維數組行和列的元素互換(又稱矩陣專置),存入另一個二維數組中。

算法分析:首先定義原數組a[2][3],設定兩個下標變量i和j,用以標示a的某個元素所在的行和列,這樣的話,兩個數組行列互換,也就是把a中元素a[i][j]的值賦給b[j][i]。123456789a=ij147258369b=ji轉置后大學計算機基礎網絡信息中心教研室34#include<stdio.h>main(){inta[3][3]={{1,2,3},{4,5,6},{7,8,9}};intb[3][3],i,j;//定義數組a和bprintf(“arraya:\n”);for(i=0;i<3;i++){for(j=0;j<3;j++){printf(“%5d”,a[i][j]);//輸出數組ab[j][i]=a[i][j];//a的行列互換,存入b}printf(“\n”);}printf(“arrayb:\n”);for(i=0;i<3;i++){for(j=0;j<3;j++)printf(“%5d”,b[i][j]);printf(“\n”);}}方法一:大學計算機基礎網絡信息中心教研室35#include<stdio.h>//(以上三角為基準交換)main(){ inti,j,t,a[3][3]={{1,2,3},{4,5,6},{7,8,9}}; for(i=0;i<3;i++) for(j=i;j<3;j++) {t=a[i][j];a[i][j]=a[j][i];a[j][i]=t;} for(i=0;i<3;i++) { for(j=0;j<3;j++) printf("%3d",a[i][j]); printf("\n"); }}方法二:大學計算機基礎網絡信息中心教研室36例2:打印楊輝三角形。1111211331146415101051……算法分析:由上圖可知楊輝三角形每一行的第一個和最后元素均為1,其余的元素是上一行兩個元素的和。若用二維數組y來存儲楊輝三角形,則

y[i][j]=y[i-1][j-1]+y[i-1][j](1≤j≤i-1)1121

331……ijy[i][j]y[i-1][j]y[i-1][j-1]大學計算機基礎網絡信息中心教研室37#defineN10main(){inti,j;inty[N][N];

for(i=0;i<N;i++){for(j=1;j<=i-1;j++)y[i][j]=y[i-1][j-1]+y[i-1][j];//其他元素由上一行得到

y[i][0]=y[i][i]=1;//每行首尾元素為1}//數組y初始化完畢

for(i=0;i<N;i++)//用for循環輸出數組y{for(j=0;j<=i;j++)//楊輝三角只有前i個元素

printf(“%6d”,y[i][j]);printf(“\n”);}}大學計算機基礎網絡信息中心教研室38算法分析:可以定義一個二維數組s記錄學生的成績,將輸入的15個成績分別存入數組每一行的前5個元素中,再根據每一行前5個元素的值求出平均值,也就是該行最后一個元素的值。s00s01s02s03s04s05s10s11s12s13s14s15s20s21s22s23s24s25學生s0

學生s1

學生s2

平均成績

例3:輸入3個學生、5門課程的成績,分別存放在3×6矩陣的前5列上,求出每個學生的平均成績并存放在該行對應的列上。6.2.4二維數組應用舉例大學計算機基礎網絡信息中心教研室39#include<stdio.h>main(){inti,j;floats[3][6],sum;

for(i=0;i<3;i++)for(j=0;j<5;j++) scanf("%f",&a[i][j]);

for(i=0;i<3;i++){sum=0;for(j=0;j<5;j++)sum=sum+s[i][j];//用循環計算每行前5個元素的和

s[i][5]=sum/5;//求出平均并存入該行最后一個元素的位置

}for(i=0;i<3;i++){for(j=0;j<6;j++)//用for循環輸出數組s,運行結果如下

printf(“%5.1f”,s[i][j]);printf(“\n”);}}大學計算機基礎網絡信息中心教研室40小結

本節主要介紹了二維數組的定義、引用、初始化,并通過具體的例子示范了其使用方法。大學計算機基礎網絡信息中心教研室416.3字符數組1字符數組的定義2字符數組的初始化3字符串和字符串結束標志4字符數組的輸入與輸出5字符串處理函數4字符數組程序舉例大學計算機基礎網絡信息中心教研室42字符數組定義的一般形式:

char

數組名[數組長度];例如:charc[10];說明:字符型和整型是通用的,因此定義也可改為intc[10];但應注意它們占用的存儲空間不同。10個元素占10個字節在TurboC中10個整數占20個字節6.3.1字符數組的定義大學計算機基礎網絡信息中心教研室436.3.2字符數組的初始化用字符常量對字符數組進行初始化例如:charstr[8]={‘’,‘p’,‘r’,‘o’,‘g’,‘r’,‘a’,‘m’}或: charstr[]={‘’,‘p’,‘r’,‘o’,‘g’,‘r’,‘a’,‘m’}說明:如果只給數組的一部分字符元素初始化,沒有指定初值的元素默認初值為空字符(ASCII碼為0的字符)。注意,空字符與空格字符(ASCII碼32)不同。大學計算機基礎網絡信息中心教研室446.3.3字符串和字符串結束標志

字符串是指若干有效字符的序列,其標志是用雙引號括起來的一串字符,比如”program”。字符串可以包括轉義字符以及ASCII碼表中的字符(控制字符以轉義字符出現)。c語言規定了一個“字符串結束標志”,即空字符“\0”。比如在一個字符數組中的第7個元素存儲的是“\0”,那就說明該數組存儲的字符串長度是6,也即是說在讀取字符數組元素時,遇到空字符“\0”就表示所讀取的字符串結束,由空字符前面的所有字符組成字符串。大學計算機基礎網絡信息中心教研室456.3.3字符串和字符串結束標志用字符串對字符數組進行初始化例如:

charstr[]=“program”;

該方式賦予數組8個字符,最后一個為“\0”,而

charstr[]={‘p’,‘r’,‘o’,‘g’,‘r’,‘a’,‘m’};該方式賦予數組7個字符。大學計算機基礎網絡信息中心教研室466.3.4字符串的輸入和輸出

調用scanf函數時,空格和換行符都作為字符串的分隔符而不能讀入。gets函數讀入由終端鍵盤輸入的字符(包括空格符),直至讀入換行符為止,但換行符并不作為串的一部分存入。

1、逐個字符輸入/輸出

(1)在標準輸入/輸出函數printf和scanf中使用%c格式描述符

(2)使用getchar和putchar函數。大學計算機基礎網絡信息中心教研室47str[i]=getchar();putchar(str[i]);【例】逐個字符輸入/輸出#include<stdio.h>main(){ inti; charstr[10]; for(i=0;i<9;i++) scanf("%c",&str[i]); str[i]='\0'; for(i=0;i<9;i++) printf("%c",str[i]);}6.3.4字符串的輸入和輸出大學計算機基礎網絡信息中心教研室482、字符串整體輸入/輸出(1)在標準輸入/輸出函數printf和scanf中使用%s格式描述符【例】字符串整體輸入/輸出#include<stdio.h>main(){inti;charstr[10];scanf(“%s”,str);printf(“%s\n”,str);printf(“%6s\n”,str);/*字符串多于6個,全部輸出*/printf(“%-.6s\n”,str);/*只輸出前6個字符,多余不輸*/}str為字符數組名,代表該數組的起始地址。輸入時,系統自動在每個字符串后加入結束符‘\0’。若同時輸入多個字符串,則以空格或回車符分隔。6.3.4字符串的輸入和輸出大學計算機基礎網絡信息中心教研室49例如

charstr1[5],str2[5],str3[5]; scanf(“%s%s%s”,str1,str2,str3);輸入數據:How

are

you輸入數據后str1,str2,str3數組狀態如下圖:

★數組名具有雙重功能,除了表示名稱外,還表示該數組的首地址,所以用scanf函數不用在前面加“&”;字符串只能在變量定義時初始化,不能在程序語句中賦值。How\0are\0you\0str1str2str36.3.4字符串的輸入和輸出大學計算機基礎網絡信息中心教研室506.3.5字符串處理函數字符串處理函數為庫函數,在程序開頭應加預編譯命令#include<string.h>(1)puts(str);輸出指定字符串。參數可以為字符串常量。輸出的字符串可以包含轉義字符。(2)gets(str);從終端輸入一個字符串到字符數組,且得到一個函數值。該函數值是字符數組的起始地址。以下函數參數中的str,str1,str2均為字符數組名。注意:如果輸入字符串有空格,則必須用gets而不能用scanf!大學計算機基礎網絡信息中心教研室516.3.5字符串處理函數(3)strcat(str1,str2);把str2連接到str1的后面,結果放在str1中,函數返回值為str1地址.

例如:charstr1[30]=“People’sRepublicof”;

charstr2[]=“China”;

printf(“%s”,strcat(str1,str2));

輸出結果:People’sRepublicofChina說明:str1必須足夠大,連接前兩個字符串后面都有一個“\0”,連接時取消str1后面的“\0”,只在新串最后保留一個“\0”。大學計算機基礎網絡信息中心教研室52(4)strcpy(str1,str2);將str2復制到str1中,實際上完成字符串的賦值操作。說明:

(1)str1必須足夠大;

(2)復制時連同字符串后面的“\0”一起復制到str1中;

(3)不能用賦值語句將一個字符串常量或字符數組直接賦值給一個字符數組。例如:

str1=“China”;str1=str2;

是不合法的;(4)str1必須是數組名,str2可以是字符數組名,也可以是字符串常量。例如:

charstr1[20];

charstr2[]=“China”;則,strcpy(str1,str2)與strcpy(str1,“China”)作用相同。大學計算機基礎網絡信息中心教研室536.3.5字符串處理函數(5)strcmp(str1,str2);

比較str1和str2,若兩者相同,返回函數值為0;若str1大于str2,返回函數值為一個正整數;若str1小于str2,返回函數值為一個負整數。說明:對兩個字符串自左至右逐個字符比較(按ASCII碼值大小比較),知道出現不同的字符或遇到“\0”為止。如果,全部字符相同,則認為相等;如果出現不相同的字符,則以第一個不相同的字符為依據確定字符串的大小。大學計算機基礎網絡信息中心教研室546.3.5字符串處理函數(6)strlen(str);

函數值為字符串實際長度,不包括“\0”。例如:

charstr[]=“China”;

printf(“%d”,strlen(str));

輸出結果5(7)strlwr(str);

把str中的大寫字母轉換成小寫字母,并存入str。str必須為字符數組

溫馨提示

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

評論

0/150

提交評論