C語言程序設(shè)計(jì)Chapter6數(shù)組.ppt_第1頁
C語言程序設(shè)計(jì)Chapter6數(shù)組.ppt_第2頁
C語言程序設(shè)計(jì)Chapter6數(shù)組.ppt_第3頁
C語言程序設(shè)計(jì)Chapter6數(shù)組.ppt_第4頁
C語言程序設(shè)計(jì)Chapter6數(shù)組.ppt_第5頁
已閱讀5頁,還剩60頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第6章 數(shù) 組,例:輸入5個(gè)人的成績后按逆序輸出顯示。,float score1,score2,score3,score4,score5;,scanf(“%f“,scanf(“%f“,scanf(“%f“,scanf(“%f“,scanf(“%f“,printf(“%f“,score5);,printf(“%f“,score4);,printf(“%f“,score3);,printf(“%f“,score2);,printf(“%f“,score1);,main() ,score5;,scanf(“%f“,for(i=1;i=5;i+),printf(“%f“, scorei);,for(i=4;i=0;i-),for(i=0;i=4;i+),int i;,引 言,C語言用同名的帶下標(biāo)的變量組成一個(gè)數(shù)組, 帶下標(biāo)的變量由數(shù)組名和用方括號(hào)括起來的下標(biāo)來表示, 稱為數(shù)組元素, 同一數(shù)組的各個(gè)元素只是下標(biāo)不同, 通過數(shù)組名和下標(biāo)可直接訪問數(shù)組的每個(gè)元素。,數(shù)組是由具有固定數(shù)目的同類型的 變量按一定順序排列而構(gòu)成的。,像簡單變量一樣, 數(shù)組元素必須先定義后引用。,一維數(shù)組的定義和引用,定義:,當(dāng)數(shù)組的元素只帶一個(gè)下標(biāo)時(shí),形式:,元素類型名 數(shù)組名常量表達(dá)式,例:int a5;,說明:,1、 元素類型名指定該數(shù)組各元素的類型。,2、數(shù)組名命名方法同變量名,應(yīng)符合標(biāo)識(shí)符命名規(guī)則。,3、方括號(hào) 括起來的常量表達(dá)式的值為該數(shù)組含數(shù)組 元素的個(gè)數(shù), 即數(shù)組長度; 表達(dá)式可含常量和符號(hào)常 量, 不允許有變量。數(shù)組元素的下標(biāo)都從0開始編排。,例:int a(20);,float b10.0;,int n=5; int an;,存儲(chǔ)方式:,一維數(shù)組各元素按下標(biāo)的順序 連續(xù)地分配在內(nèi)存單元之中。,引用方式:,數(shù)組名下標(biāo),其中下標(biāo)為整型表達(dá)式,由它確定了引用元素的 序號(hào),下標(biāo)從0開始,最大等于定義的數(shù)組長度減1。 在程序中數(shù)組元素等價(jià)一個(gè)同類型的變量。,例:int m10; m9=m0*5+m2*4*6;,初始化:,1、全部賦初值。,int m10=10,11,12,13,14,15,16,17,18,19;,2、部分?jǐn)?shù)組元素賦初值,剩余部分系統(tǒng)自動(dòng)置0。,int m10=0,1,2,3,4;,3、在對(duì)全部元素賦初值時(shí),可以不指定數(shù)組長度。,int m =0,1,2,3,4,5;,/*a5a9系統(tǒng)設(shè)置為0*/,4、當(dāng)初值個(gè)數(shù)多于數(shù)組元素個(gè)數(shù)時(shí),編譯出錯(cuò)。,int a5=0,1,2,3,4,5; /*error: too many initializers in main function*/,一維數(shù)組應(yīng)用舉例,例.將任意一個(gè)十進(jìn)制數(shù)轉(zhuǎn)換成二進(jìn) 制數(shù),然后以二進(jìn)制數(shù)形式輸出。,把10進(jìn)制數(shù)59轉(zhuǎn)換成2進(jìn)制數(shù),59,2,29,2,14,2,7,2,3,2,1,2,0,(59)10=(111011)2,1,1,1,0,1,1,main() int i, x, arr20; printf(“nPlease input an integer:”); scanf(“%d”, ,思考:任意進(jìn)制之間的轉(zhuǎn)換實(shí)現(xiàn)?,例:Fibonacci(斐波納契)數(shù)列定義如下 Fib1=1; (n=1) Fib2=1; (n=2) Fibn=Fibn-1+Fibn-2 (n=3) 即數(shù)列為:1,1,2,3,5,8, 13, ,long Fib12=1,1; for(i=2;i12;i+) Fibi=Fibi-1+Fibi-2;,main() long FibN=1,1; int i; for(i=2;i12;i+) Fibi=Fibi-1+Fibi-2; for(i=0;i12;i+) printf(“%5d“,Fibi); printf(“n“); ,例: 輸入10個(gè)整數(shù),找出其中最大值和最 小值,并把二者值對(duì)調(diào)后全部打印輸出。,#define N 10 #include main() int i, arrN, max, min,maxi,mini; printf(“Please input %d integers:n“,N); for(i=0; iN; i+) scanf(“%d“, ,/*找最大和最小值,并交換*/ max=min=arr0; maxi=mini=0; for(i=1;imax) / 找最大值 max=arri; maxi=i; else if(arrimin) /找最小值 min=arri; mini=i; printf(“max=%d,min=%dn“, max,min); arrmaxi=min; arrmini=max;,思考:找其中兩個(gè)最小或最大的數(shù)?,簡單選擇排序法的算法思想如下: (1) 首先通過n-1次比較,從數(shù)組的a0 an-1中找出最小的, 將它與a0 交換第一趟選擇排序,結(jié)果最小的數(shù)被安置在第一個(gè)元素位置上 (2) 再通過n-2次比較,從剩余的a1 an-1個(gè)數(shù)中找出次小的數(shù), 將它與第二個(gè)數(shù)a1交換第二趟選擇排序。 (3) 重復(fù)上述過程,共經(jīng)過n-1趟排序后,排序結(jié)束,數(shù)組排序,-簡單選擇排序法,98,38,14,55,77,35,62,48,98,38,48,55,77,35,62,14,48,38,98,55,77,35,14,98,62,48,55,77,38,35,14,62,/* 簡單選擇排序算法 */ for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+) if(akaj) k=j; if(k!=i) t=ai; ai=ak; ak=t; ,#define N 10 main() int i, j, k, n, aN, t; printf(“nInput the number of integers to sort:“); scanf(“%d“, ,數(shù)組排序,-冒泡排序法,是一種簡單的交換排序方法。其算法思想如下: (1) 比較第一個(gè)數(shù)與第二個(gè)數(shù),若a0a1,則交換;然后比較第二個(gè)數(shù)與第三個(gè)數(shù);依次類推,直至第n-1個(gè)數(shù)和第n個(gè)數(shù)比較為止第一趟冒泡排序,結(jié)果最大的數(shù)被交換到最后一個(gè)元素位置上。 (2) 接著對(duì)前n-1個(gè)數(shù)進(jìn)行第二趟冒泡排序,結(jié)果使次大的數(shù)被安置在第n-1個(gè)元素位置。 (3) 重復(fù)上述過程,經(jīng)過 n-1趟后,排序結(jié)束。,(相鄰逆序交換),62,77,35,98,98,14,55,38,思想:在掃描的過程 中順次比較相鄰的兩 個(gè)元素的大小,若逆序 就交換位置。,第一趟 共7次,第二趟 共6次,55,38,77,77,48,35,62,14,第i趟 共n-i次,第n-1趟 排序結(jié)束,/* 冒泡排序算法 */ for(i=0; i aj+1 ) t=aj; aj=aj+1; aj+1=t; ,思考:效率可 否改進(jìn)?,main() int i, j, k, n, a50, t; printf(“nInput the number of integers to sort:“); scanf(“%d“, ,二維數(shù)組的定義和引用,定義:,每個(gè)元素都帶兩個(gè)下標(biāo),形式:,元素類型名 數(shù)組名常量表達(dá)式1 常量表達(dá)式2,說明:,1、元素類型名、數(shù)組名同一維數(shù)組定義。,2、常量表達(dá)式1的值表示數(shù)組行數(shù), 常量表達(dá)式2的值表示數(shù)組列數(shù)。,存放方式:,按行、按列兩種方式,可將二維數(shù)組的元素看成若干個(gè)特殊的一維數(shù)組。,如: int b3 4;,則: 有三個(gè)特殊的一維數(shù)組b0,b1, b2, 每個(gè)一維數(shù)組又有四個(gè)元素:,b00, b01, b02, b03, b10, b11, b12, b13, b20, b21, b22, b23,引用方式:,數(shù)組名行下標(biāo)列下標(biāo),其中的行下標(biāo)和列下標(biāo)均為整型表達(dá)式, 最小下標(biāo)都是0, 最大下標(biāo)分別等于數(shù)組 定義的行數(shù)減1和列數(shù)減1, 引用時(shí)行下標(biāo) 和列下標(biāo)都不得越界。,初始化:,1、按行給二維數(shù)組賦初值:,int b34=1,2,3,4,5,6,7,8,9,10,11,12,;,2、可以對(duì)部分元素賦初值,但需表達(dá)清楚。,int a34=1,2,3,8;,3、可通過賦初值決定數(shù)組大小。,如為二維,則只可省略第一維的大小.,int a 4=1,2,3,12;,例: 求兩個(gè)矩陣a與b之和,將計(jì)算結(jié)果仍然放在a中。,+,a00=a00+b00;,a01=a01+b01;,a02=a02+b02;,a03=a03+b03;,for(j=0;j4;j+),a0j=a0j+b0j;,for(j=0;j4;j+),a1j=a1j+b1j;,for(j=0;j4;j+),a2j=a2j+b2j;,for(i=0;i3;i+) for(j=0;j4;j+) aij=aij +bij;,aij+=bij;,main() int a34= 1, 2, 3, 4,3, 4, 5, 6,5, 6, 7, 8; int b34= 1, 2, 3, 4, 5, 6 ; int i, j; for(i=0;i3;i+) for(j=0;j4;j+) aij+=bij; for(i=0; i3; i+) for(j=0; j4; j+) printf(“%6d”, aij ); printf(“n”); ,例: 求矩陣a的轉(zhuǎn)置矩陣b。轉(zhuǎn)置矩陣是指將一個(gè) 二維數(shù)組行和列元素互換,存到另一個(gè)二維數(shù)組中,b00=a00,b01=a10,bij=aji,a,b,for (i=0; i3; i+) for (j=0; j2; j+) bij=aji; ,b10=a01,b11=a11,main ( ) int a23=1,2,3,4,5,6; int b32, i, j; printf(“array a: n“); for (i=0; i2; i+) for (j=0; j3; j+) printf(“%5d“, aij); printf(“n“); for (i=0; i3; i+) for (j=0; j2; j+) bij=aji; printf(“array b:n“); for (i=0; i3; i+) for (j=0; j2; j+) printf(“%5d“, bij); printf(“n“); ,/*數(shù)組a是2行3列*/,/*數(shù)組b是3行2列*/,例: 求兩個(gè)矩陣a和b的乘積c,c00=a00*b00 +a01*b10 +a02*b20,c01=a00*b01 +a01*b11 +a02*b21,77,32,32,14,for(k=0;k3;k+) c00+=a0k*bk0;,for(k=0;k3;k+) c01+=a0k*bk1;,for(j=0;j2;j+) for(k=0;k3;k+) c0j+=a0k*bkj; for(j=0;j2;j+) for(k=0;k3;k+) c1j+=a1k*bkj;,for(i=0;i2;j+) for(j=0;j2;j+) for(k=0;k3;k+) cij+=aik*bkj;,main() int a23=1,2,3,4,5,6; int b32=1,4,2,5,3,6; int c22=0,0,0,0; int i,j,k; for(i=0;i2;i+) for(j=0;j2;j+) for(k=0;k3;k+) cij=cij+aik*bkj; printf(“the array a * array b is :n“); for(i=0;i2;i+) for(j=0;j2;j+) printf(“%4d“,cij); printf(“n“); ,例. 輸出楊輝三角形。,for(i=0;iN;i+) yi0=1; yii=1; ,int yNN;,for(i=2;iN;i+) for(j=1;ji;j+) yij=yi-1j+yi-1j-1;,#define N 6 main() int i,j,yNN; for(i=0;iN;i+) yi0=1; yii=1; for(i=2;iN;i+) for(j=1;ji;j+) yij=yi-1j+yi-1j-1; for(i=0;iN;i+) for(j=0;j=i;j+) printf(“%5d“,yij); printf(“n“); ,例. 輸出楊輝三角形。,int yN;,=1;,y1=y1+y0;,y1=y1+y0;,y2=y2+y1;,y1=y1+y0;,y2=y2+y1;,y3=y3+y2;,順序可以 顛倒嗎?,for(i=0;i=1;j-) yj=yj+yj-1;,#define N 6 main() int i,j,yN=1; for(i=0;i=1;j-) yj=yj+yj-1; for(j=0;j=i;j+) printf(“%5d“,yj); printf(“n“); ,例:從鍵盤輸入5個(gè)學(xué)生三門課程的成績求每個(gè) 學(xué)生各門課的平均分,并按平均分從高到低的 順序輸出每個(gè)學(xué)生各門課程的成績和平均成績。,問題分析: 排序方法: 簡單選擇排序 冒泡排序等 排序注意: 交換時(shí)應(yīng)整行交換,87,88,99,93,70,80,69,63,70,33,20,50,93,70,89,91.3,81.0,67.3,34.3,84.0,84.0,91.3,93,70,89,87,88,99,排序過程成績的交換:,averi averk scorei0 scorek0 scorei1 scorek1 scorei2 scorek2,for(m=0;m3;m+) scoreim scorekm,/*排序部分代碼*/ for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+) if(averkaverj) k=j; if(k!=i) t=averi; averi=averk; averk=t; for(m=0;m3;m+) a=scoreim; scoreim=scorekm; scorekm=a; ,/*輸入部分代碼*/ for(i=0;in;i+) for(j=0;j3;j+) scanf(“%d“, c,/*輸出部分代碼*/ printf(“the sorted score is :n“); for(i=0;in;i+) printf(“nthe average is %.1f. “,averi); printf(“the score is “); for(j=0;j3;j+) printf(“%d “,scoreij); ,/*主函數(shù)部分代碼*/ #include #define N 100 main() int n, i, j, j, m; int scoreN3, a; float averN, t; printf(“please input the total number: “); scanf(“%d“, /*輸入部分代碼*/ /*計(jì)算平均值部分代碼*/ /*排序部分代碼*/ /*輸出部分代碼*/ ,input_array(score,n);,cal_average(score,aver,n);,sort(score,aver,n);,output_array(score,aver,n);,字符數(shù)組,存放字符數(shù)據(jù)的數(shù)組,它的每個(gè)元素存放一個(gè) 字符。字符串就是用字符數(shù)組存放的。,定義:,形式:,char 數(shù)組名常量表達(dá)式,元素類型名,數(shù)組名,長度,例如: char c20;,初始化:,1、直接給出字符數(shù)組中的各字符。,char a5=G, o, o, d;,2、可以去掉定義時(shí)的長度設(shè)置, 此時(shí)字符數(shù)組的長度 等于 中的字符數(shù)。后面不會(huì)自動(dòng)加字符串結(jié)束符0。,char x =I, ,a,m, ,a, ,s,t,u,d,e,n,t,.;,3、可以用字符串常量對(duì)字符數(shù)組初始化。,char x20=“I am a student.”;,char x20=“I am a student.”;,也可以去掉定義時(shí)的長度設(shè)置,此時(shí)會(huì)自動(dòng)加0,char x=“I am a student.”,例:對(duì)于如下聲明的數(shù)組 char a =“Hello!”; char b =H,e,l,l,o,!; 正確的描述是_ A. a數(shù)組和b數(shù)組完全相同 B. a數(shù)組比b數(shù)組長度長 C. a數(shù)組和b數(shù)組長度相同 D. b數(shù)組比a數(shù)組長度長,B,字符數(shù)組的輸入輸出,用scanf( )和printf( )輸入/輸出時(shí), 可用如下兩種格式符:,%c 逐個(gè)元素輸入/輸出字符(char),%s 整體輸入/輸出字符串(string),1.用格式符%c逐個(gè)元素輸入/輸出字符,輸入時(shí)系統(tǒng)不會(huì)自動(dòng)加0。,例:main() char b10; int i; for(i=0;i10;i+) scanf(“%c“, ,2.用格式符%s整體輸出字符數(shù)組,在printf( )中用格式串“%s”, 輸出項(xiàng)直接寫數(shù)組名,例如: char c =“I am a student“; printf(“%s“, c);,注意:,(1)若數(shù)組長度大于字符串長度, 則遇到0即結(jié)束;,例如: char c12=“student“; printf(“%s!“, c);,(2)結(jié)束符0不顯示。若數(shù)組中有多個(gè)0, 輸出時(shí) 遇到第一個(gè)0即結(jié)束。,(3)如果數(shù)組中沒有0, 當(dāng)用此格式整體輸出數(shù)組時(shí) 結(jié)果可能不對(duì), 最好改用%c格式輸出各元素。,3.用格式符%s整體輸入字符串,在scanf( )中用格式串“%s”, 輸入項(xiàng)直接用數(shù)組名,例如: char c20; scanf(“%s“, c);,注意:,(1)數(shù)組名本身就代表該數(shù)組的首地址(0號(hào)元素的地址), 所以scanf( )中數(shù)組名前不允許再加地址符& 。,(2)輸入字符串時(shí), 系統(tǒng)自動(dòng)加上0。,(3)輸入多個(gè)字符串,可用空格隔開。,例如: scanf(“%s%s%s“, s1, s2, s3);,輸入 You are happy! ,則: s1: “You “ s2: “are “ s3: “happy!“,例如:輸入一個(gè)學(xué)生的名字,并輸出。,#include /*按字符形式輸入輸出*/ main() int count=0 ,i; /*count用于統(tǒng)計(jì)姓名的字符個(gè)數(shù)*/ char name20; printf(“nInput your name:“); for(i=0; ;i+) scanf(“%c“, ,for(i=0;namei!=0;i+),printf(“%s“,name);,scanf(“%s“,name);,#include main() char name20; printf(“nInput your name:“); scanf(“%s“,name); printf(“Your name is:“); printf(“%s“,name); ,不能加空格?,gets(name);,char name310;,for(i=0; i3; i+) printf(“nPlease Input %d students name:“,i+1); gets(namei); printf(“n students name:n“); for(i=0; i3; i+) puts(namei); printf(“n”); ,例如:輸入1個(gè)學(xué)生的姓名并輸出。,3,一維字符數(shù)組常用于處理一個(gè)字符串。 二維字符數(shù)組常用于處理多個(gè)字符串。,字符串處理函數(shù),C語言程序庫中提供了一些專門處理字符串的函數(shù):,gets(字符數(shù)組); 輸入一行字符序列到字符數(shù)組 puts(字符串); 將字符串輸出到終端 strcat(字符數(shù)組1,字符串2); 字符串連接 strcpy(字符數(shù)組1,字符串2); 復(fù)制字符串 strcmp(字符串1, 字符串2); 兩個(gè)字符串比較 strlen(字符串); 測字符串長度 strlwr (字符串); 將字符串大寫字母轉(zhuǎn)換為小寫 strupr (字符串); 將字符串小寫字母轉(zhuǎn)換為大寫,1.字符串整行輸入函數(shù)gets( ),格式:,gets(字符數(shù)組),功能:,從鍵盤將帶空格的字符序列(以回車鍵結(jié)束)全 部輸入到指定的字符數(shù)組中,并自動(dòng)加字符串結(jié) 束符0。該函數(shù)的返回值是字符數(shù)組的首地址。,例如: char str20; gets(str);,運(yùn)行時(shí): I am a student. ,結(jié)果將此字符序列15個(gè)字符和0共16個(gè)字符存入str。,2.字符串整體輸出函數(shù)puts( ),格式:,puts(字符串),功能:,將指定的字符串作為一行輸出到終端。,此功能可以用printf( )實(shí)現(xiàn)。字符串可以是字符串 常量或字符數(shù)組(存有0),字符串中可以有轉(zhuǎn)義字符。,例如: char s =“I am a student.n You are a worker.“; puts(s); puts(“He is a teacher.“);,輸出: I am a student. You are a worker. He is a teacher.,3.字符串連接函數(shù),格式:,strcat(字符數(shù)組1, 字符串2);,功能:,將字符串2連接到字符數(shù)組1中的字符串后面, 字符串2可以是字符串常量、字符型數(shù)組名, 而字符數(shù)組1只能是字符型數(shù)組名。此函數(shù) 的返回值是字符數(shù)組1的首地址。,顯然字符數(shù)組1應(yīng)該有足夠的長度, 以便能存放下連接 后的新字符串。連接時(shí)字符串1后面的0取消, 在字符 數(shù)組中新字符串的最后保留一個(gè)0。,例如: char s120= “Hello, “; puts(strcat(s1,“Bill Gates.“););,輸出: Hello, Bill Gates.,4.字符串復(fù)制函數(shù),格式:,strcpy(字符數(shù)組1,字符串2);,功能:,將字符串2復(fù)制到字符數(shù)組1中, 字符串2可以是字符 串常量、字符型數(shù)組名, 而字符數(shù)組1只能是字符型 數(shù)組名。此函數(shù)的返回值是字符數(shù)組1的首地址。,字符數(shù)組1應(yīng)該有足夠的長度, 以便能存放下字符串2。,例如: char s120; puts (strcpy(s1,“teacher.“);,輸出: teacher.,5.字符串比較函數(shù),格式:,strcmp(字符串1, 字符串2);,功能:,字符串比較, 返回比較結(jié)果。對(duì)字符串1和字符串2 從左向右逐個(gè)字符, 按其ASCII碼值進(jìn)行比較, 直到 字符值不相等或遇到字符串結(jié)束符0為止。,char s120= “tea.“; printf(“%d %d“, strcmp(s1,“tea.“) ,strcmp(“cd“,“ccd“);,輸出: 0 1,例: 輸入三個(gè)整數(shù),并求最大值。,#include ma

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論