版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第6章數(shù)組教學(xué)內(nèi)容掌握一維數(shù)組的定義,數(shù)組元素的引用方法。掌握二維數(shù)組的定義,數(shù)組元素的引用,了解二維數(shù)組的實際意義。掌握字符數(shù)組與字符串的概念與定義方法,熟悉常用的字符串處理函數(shù)。掌握應(yīng)用數(shù)組進行應(yīng)用程序的設(shè)計的方法。6.1概述6.3二維數(shù)組6.2一維數(shù)組6.6實例6.7小結(jié)結(jié)束6.5數(shù)組為函數(shù)的參數(shù)6.4字符數(shù)組和字符串教學(xué)要求6.1數(shù)組概述編寫程序的目的是處理數(shù)據(jù),前面我們已經(jīng)提到,描述程序要處理的數(shù)據(jù)是程序設(shè)計很重要的一個方面。由程序處理的數(shù)據(jù)可能很簡單,也可能很復(fù)雜,為了描述各種各樣不同的數(shù)據(jù),要求語言系統(tǒng)有足夠的數(shù)據(jù)表示能力。和大多數(shù)高級語言一樣,C語言也采用了下面的數(shù)據(jù)機制:①把語言要處理的數(shù)據(jù)對象劃分為一些類型,每個類型是一個數(shù)據(jù)值的集合。②提供一組基本數(shù)據(jù)類型,確定書寫方式和一組相關(guān)基本操作,以支持程序中對基本數(shù)據(jù)對象的表示和使用。③提供一組由簡單數(shù)據(jù)類型、數(shù)據(jù)對象構(gòu)造更加復(fù)雜的數(shù)據(jù)類型、數(shù)據(jù)對象的手段,以滿足程序中處理復(fù)雜數(shù)據(jù)的要求。6.1數(shù)組概述C語言的基本類型包括整型、實型和字符類型,
本課程的第2章介紹了C語言基本數(shù)據(jù)類型的表示和運算方面的問題。C語言的構(gòu)造類型包括數(shù)組、結(jié)構(gòu)和公用體,還有用于數(shù)據(jù)組織的重要機制“指針”。利用C語言的數(shù)據(jù)構(gòu)造技術(shù),可以把多個基本類型的數(shù)據(jù)或不是基本類型的數(shù)據(jù)組成一個整體在程序中使用,這樣能更貼切地描述現(xiàn)實問題中的數(shù)據(jù)。由這種構(gòu)造技術(shù)產(chǎn)生的數(shù)據(jù)類型和數(shù)據(jù)對象是復(fù)合數(shù)據(jù)類型和復(fù)合數(shù)據(jù)對象。對象的各個組成部分稱為“元素”、“成員”和“成分”等。同樣,復(fù)合數(shù)據(jù)類型和復(fù)合數(shù)據(jù)對象都有名字,同時C語言還提供訪問復(fù)合對象成分的操作機制。6.1數(shù)組概述數(shù)組是C語言對一組相同性質(zhì)數(shù)據(jù)的順序存儲管理機制;利用數(shù)組可把多個具有相同類型的數(shù)據(jù)對象組合在一起并作為一個整體來管理,這些數(shù)據(jù)對象稱為數(shù)組的元素。C語言中用a[0]、a[1]……
的形式表示數(shù)組元素,方括號內(nèi)的整型數(shù)稱為下標。使用下標和數(shù)組名可以用同一方式處理一批或所有數(shù)組元素,也可處理個別元素。數(shù)組是最簡單的構(gòu)造類型,但是十分有用,許多問題不用數(shù)組幾乎難以解決。本章介紹一維和二維數(shù)組的定義、數(shù)組元素引用、字符數(shù)組。字符串和數(shù)組應(yīng)用的基本算法。6.1數(shù)組概述6.1數(shù)組概述◆構(gòu)造數(shù)據(jù)類型之一◆數(shù)組:有序數(shù)據(jù)的集合,用數(shù)組名標識◆元素:屬同一數(shù)據(jù)類型,用數(shù)組名和下標確定6.2一維數(shù)組1.一維數(shù)組的定義什么是一維數(shù)組數(shù)組的維數(shù)是指數(shù)組使用的下標個數(shù),如果數(shù)組中每個元素只帶有一個下標,稱為一維數(shù)組。定義形式類型說明符數(shù)組名[常量表達式];說明類型說明符指出數(shù)組元素的數(shù)據(jù)類型;數(shù)組名是標識符;常量表達式必須用方括號括起來,指的是數(shù)組的元素個數(shù)(長度),是一個整型值,可包含常數(shù)和符號常量。不能用變量定義數(shù)組維數(shù),例:intn=10;
inta[n];C語言規(guī)定,數(shù)組變量的大小是固定不變的,因此需要在定義時規(guī)定元素類型和元素個數(shù)。與普通變量一樣,可以在一個定義語句中定義多個數(shù)組。例如:inta[10],b[5],c;6.2一維數(shù)組2.一維數(shù)組的存儲意義掌握一維數(shù)組在內(nèi)存中的存儲形式,有利于理解數(shù)組機制和數(shù)組元素的性質(zhì)。存儲系統(tǒng)定義數(shù)組時,根據(jù)定義語句中的空間需求分配足夠的連續(xù)存儲空間,數(shù)組元素順序存放在這些存儲單元中。下標為
0
的元素排在最前面,每個元素占據(jù)的存儲空間完全相同。數(shù)組空間開銷計算
有兩種計算方法。①
存儲容量
=元素個數(shù)×sizeof(元素類型名)②
存儲容量
=sizeof(數(shù)組名)6.2一維數(shù)組數(shù)組名的本質(zhì)是數(shù)據(jù)組的內(nèi)存起始地址??梢园褦?shù)組名看作是一個表示存儲地址的常量。例如:如果a是已有定義的整型數(shù)組名,scanf(“%d”,a);
將讀入的一個整型數(shù)賦給a所表示的存儲單元,該整型數(shù)正好是數(shù)組a的第一個數(shù)組元素的地址。(不能用scanf("%d",&a));實例inta[5]6.2一維數(shù)組數(shù)組名表示內(nèi)存首地址,是地址常量
a
0a[0]1a[1]2a[2]3a[3]4a[4]編譯時分配連續(xù)內(nèi)存內(nèi)存字節(jié)數(shù)=元素個數(shù)
*sizeof(元素類型)3.一維數(shù)組的引用
數(shù)組元素表示形式數(shù)組名[下標]其中:下標可以是常量或整型表達式說明數(shù)組必須先定義,后使用只能逐個引用數(shù)組元素,不能整體引用下標是元素相對于數(shù)組起始地址的偏移量,所以從0(下界)開始順序編號。最后一個元素的下標(上界)值為數(shù)組元素個數(shù)減一。6.2一維數(shù)組注意:元素的下標和元素在數(shù)組中的序號的關(guān)系,如A[i]表示數(shù)組A的第i+1個元素。注意:C
語言系統(tǒng)并不自動檢查數(shù)組的下標是否越界,對下標的控制由編稱者完成。例:intdata[5];
data[5]=10;/*越界*/引用數(shù)組元素的本質(zhì)是將數(shù)組元素看作簡單變量。數(shù)組元素可以作為定義類型的變量參加表達式計算和變量操作(引用和賦值)。只能逐個引用數(shù)組元素,不能整體引用。6.2一維數(shù)組4.一維數(shù)組初始化概念在定義數(shù)組時,為數(shù)組元素賦初值(在編譯階段使之得到初值)如:inta[6]={1,2,3,4,5};等價于:a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;a[5]=6;說明存儲在動態(tài)存儲區(qū)中的(局部)數(shù)組不初始化,其元素值為隨機數(shù)6.2一維數(shù)組存儲在靜態(tài)存儲區(qū)中(static、全局)數(shù)組元素不賦初值,系統(tǒng)會自動賦以0值如:staticinta[6]
等價于:a[0]=0;a[1]=0;a[2]=0;a[3]=0;a[4]=0;a[5]=0;可以只給部分數(shù)組元素賦初值如:inta[6]
={1,2}等價于:a[0]=1;a[1]=2;a[2]=0;a[3]=0;a[4]=0;a[5]=0;但:inta[3]={1,2,3,4}出界錯誤全部數(shù)組元素賦初值時,可不指定數(shù)組長度inta[]={1,2,3,4,5,6}6.2一維數(shù)組5.一維數(shù)組實例【例6.2】求一組成績的平均分數(shù),設(shè)給定的數(shù)據(jù)是87,90,85,98,65,80,74,67。分析考慮用數(shù)組表示這組成績,雖然給出的數(shù)據(jù)全是整數(shù)值,但考慮作為成績及可能需要進行的運算,使用實型數(shù)更合適。本例使用數(shù)組定義時初始化的方式來表示要計算的數(shù)據(jù),其次,為增加程序的通用性,考慮讓程序自動判斷數(shù)據(jù)值的個數(shù),用于循環(huán)結(jié)束的控制條件。6.2一維數(shù)組程序#include<stdio.h>main(){inti,num;floatscore[]={87,90,85,98,65,80,74,67}floatsum=0.0;num=sizeof(score)/sizeof(float);for(i=0;i<num;i++)sum+=score[i];printf("Average:%.1f\n",sum/num);}6.2一維數(shù)組運行結(jié)果:
Average:80.8【例6.3】編寫程序。將前15個奇數(shù)按每行5個的格式正序和反序輸出。分析:本例用循環(huán)結(jié)構(gòu)控制數(shù)組的方法順序或逆序地逐個引用數(shù)組元素的操作,實現(xiàn)換行動作的控制。6.2一維數(shù)組程序#defineM15main(){inti,k=1,a[M];for(i=0;i<M;i++,k+=2)a[i]=k;printf("SequenceOutput:\n");for(i=0;i<M;i++){printf("%4d",a[i]);if((i+1)%5==0)printf("\n");}printf("InvertOutput:\n");for(i=M-1;i>0;i--){printf("%4d",a[i]);if(i%5==0)printf("\n");}}6.2一維數(shù)組運行結(jié)果:
SequenceOutput:1357911131517192123252729InvertOutput:2927252321191715131197531【例6.4】編寫程序,輸入一組整數(shù),將它們排序后由小到大輸出。分析使用冒泡方法來完成排序的操作。其思路很簡單,將相鄰兩個數(shù)組元素進行比較,將小的調(diào)整到前面。排序過程①比較第一個數(shù)與第二個數(shù),若為逆序a[0]>a[1],則交換;然后比較第二個數(shù)與第三個數(shù);依次類推,直至第
n-1個數(shù)和第n個數(shù)比較為止——
第一趟冒泡排序,結(jié)果最大的數(shù)被安置在最后一個元素位置上;②
對前
n-1個數(shù)進行第二趟冒泡排序,結(jié)果使次大的數(shù)被安置在第
n-1個元素位置;③
重復(fù)上述過程,經(jīng)n-1趟冒泡排序后,排序結(jié)束。6.2一維數(shù)組算法舉例6.2一維數(shù)組2377148906682314770668第一趟第二趟14230668第三趟第四趟140623第五趟0614程序:main(){inta[50],num,i,j,t,change=1;printf("\nEnterNumbers:");scanf("%d",&num);printf("\nEnterDate:");for(i=0;i<num;i++)scanf("%d",&a[i]);for(i=num-1;i>0&&change;i--){change=0;for(j=0;j<i;j++)if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;change=1;}}printf("\nSortedDate:");for(i=0;i<num;i++)printf("%d",a[i]);}6.2一維數(shù)組運行結(jié)果:
EnterNumbers:5EnterDate:237714668SortedDate:6142368776.3二維數(shù)組1.二維數(shù)組的定義什么是二維數(shù)組如果數(shù)組中每個元素帶有兩個下標,稱這樣的數(shù)組為二維數(shù)組。二維數(shù)組的定義形式
類型說明符數(shù)組名[常量表達式1][常量表達式2];
說明定義中除了使用兩個方括號和常量表達式外,與一維數(shù)組的要求相同??砂讯S數(shù)組看成是一個矩陣,常量表達式
1
表示矩陣的行數(shù),常量表達式
2
表示列數(shù)。可把二維數(shù)組看作一種特殊的一維數(shù)組,它的元素又是一維數(shù)組。即二維數(shù)組是數(shù)組的數(shù)組。例如inta[3][4];定義了一個二維數(shù)組a,數(shù)組元素是整型數(shù),數(shù)組有12(3×4)個元素,可以看成為3行4列的矩陣。同時,可以把a看作是一個一維數(shù)組,它有3個元素,名字為a[0]、a[1]、a[2],每個元素又是一個包含4個元素一維數(shù)組:a[0]:a[0][0],a[0][1],a[0][2],a[0][3]a[1]:a[1][0],a[1][1],a[1][2],a[1][3]a[2]:a[2][0],a[2][1],a[2][2],a[2][3]多維數(shù)組的實現(xiàn)以二維數(shù)組為基礎(chǔ),如把三維數(shù)組定義成元素是二維數(shù)組的數(shù)組。下例定義了一個三維數(shù)組:floata[2][3][4],其元素是兩個二維數(shù)組,a[0]和a[1],都是一個3行4列的二維數(shù)組。6.3二維數(shù)組2.二維數(shù)組的存儲存儲二維數(shù)組在內(nèi)存中占據(jù)一系列連續(xù)的存儲單元,數(shù)組元素按行順序存放,先放行下標是0的元素,再放行下標是1的元素,依此類推。數(shù)組a[2][4]的存儲示意圖原因內(nèi)存是一維的6.3二維數(shù)組a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]←行下標為0的元素→←行下標為1的元素→3.二維數(shù)組的引用
數(shù)組元素表示形式:數(shù)組名[下標1][下標2]其中:下標可以是常量或整型表達式說明每個下標的值不能超越該下標的上界和下界,數(shù)組元素可以出現(xiàn)在表達式中,也可以被賦值。對基本數(shù)據(jù)類型的變量所能進行的操作,也都適合于相同數(shù)據(jù)類型的2維數(shù)組元素。不論是一維數(shù)組還是二維數(shù)組,都要注意數(shù)組引用和數(shù)組定義表示形式的區(qū)別。如定義中出現(xiàn)的a[3][4]表示數(shù)組的維數(shù)和各維數(shù)的大小,引用時a[3][4]的3和4是下標,a[3][4]代表一個數(shù)組元素。6.3二維數(shù)組4.二維數(shù)組的初始化作用二維數(shù)組定義時也可以用花括號對全部或前面一部分數(shù)組元素進行初始化。通過初始化可以定義二維數(shù)組。初始化形式分行初始化全部初始化:inta[2][3]={{1,2,3},{4,5,6}};部分初始化:inta[3][4]={{1,2,3},{4},{5,6}};部分初始化:inta[3][4]={{1,2},{3}};6.3二維數(shù)組123040005600120030000000123456按元素排列順序初始化全部初始化:inta[2][3]={{1,2,3,4,5,6};部分初始化:inta[2][3]={1,2};初始化的數(shù)據(jù)多于數(shù)組的定義,編譯出錯:inta[2][3]={1,2,3,4,5,6,7,8};×第一維長度省略初始化分行第一維長度省略初始化:inta[][4]={{1,2,3},{4,5},{6}};按元素排列順序第一維長度省略初始化:inta[][3]={1,2,3,4,5};6.3二維數(shù)組123456120000123045006000123450005.二維數(shù)組實例【例6.6】通過鍵盤給3×4的二維數(shù)組輸入數(shù)據(jù),然后分別按行和按列輸出數(shù)組元素。分析:遍歷二維數(shù)組的每一個元素經(jīng)常使用雙重循環(huán),本例演示了二維數(shù)組的基本輸入輸出控制方法。程序:6.3二維數(shù)組main(){inta[3][4],i,j;printf("Enterdatabyline:\n");for(i=0;i<3;i++)for(j=0;j<4;j++)scanf("%d",&a[i][j]);printf("Outputbyline:\n");for(i=0;i<3;i++){for(j=0;j<4;j++)printf("%5d",a[i][j]);printf("\n")}printf("Outputbycolumn:\n");
for(i=0;i<4;i++){for(j=0;j<3;j++)printf("%5d",a[j][i]);printf("\n")}}6.3二維數(shù)組運行結(jié)果:
Enterdatabyline:123456789101112Outputbyline:
123456789101112Outputbycolumn:
1592610371148126.4字符數(shù)組和字符串1.字符數(shù)組定義元素數(shù)據(jù)類型是字符類型的一維數(shù)組。例如:charstr[50];定義了一個有50個字符元素的數(shù)組字符數(shù)組的初始化方法都與一維數(shù)組相同逐個字符賦值:
charc[5]={'H','e','l','l','o'};部分字符賦值:chars[5]={'1','2'};省略數(shù)組元素個數(shù):
chars[]={'1','2','3','4','5'};字符數(shù)組的引用字符數(shù)組的逐個字符引用與數(shù)值數(shù)組元素類似。12345Hello12\0\0\02.字符串定義用雙引號括起來的任意字符序列。包括字母、數(shù)字、專用字符、轉(zhuǎn)義字符等。存儲無字符串變量,用字符數(shù)組連續(xù)、順序存放每一個字符,最后加字符'\0'做結(jié)束標志。"12345"共5個字符,在內(nèi)存占6個字節(jié),字符串長度55個字符占用的空間是5個字節(jié),chars[5]={'1','2','3','4','5'};結(jié)束標志'\0'代表ASCII碼為0的字符,表示一個“空操作”,只起標志作用。因此可以對字符數(shù)組采用另一種方式操作了──字符數(shù)組的整體操作。6.4字符數(shù)組和字符串12345\012345用字符數(shù)組處理字符串應(yīng)考慮以下問題定義變量時,可能存儲的最長字符串的長度。對字符數(shù)組初值賦值方法的擴充問題。例:①charstr[10]={"China"};str的前6個字符初始化,其他賦0。②charstr[]={"China"};charstr[]="China";定義數(shù)組str的長度是6個字符。③charstr[5]="morning";×初始化的數(shù)據(jù)多于數(shù)組的定義,編譯出錯。6.4字符數(shù)組和字符串China\0China\0\0\0\0\03.字符串數(shù)組
◆定義字符串數(shù)組就是數(shù)組中的每一個元素都是存放字符串的數(shù)組?!舸鎯肅語言數(shù)組構(gòu)造的特點,二維數(shù)組可以看作是一個一維數(shù)組,這個一維數(shù)組的元素又是一個一維數(shù)組。因此,可以將一個二維字符數(shù)組看作一個字符串數(shù)組。例如字符串數(shù)組line[10][80]共有10個元素,每個元素可以存放80個字符(包括'\0')◆引用可以通過二維數(shù)組元素的形式引用其中的字符。如:str[1][1]的值是b。6.4字符數(shù)組和字符串
符串數(shù)組的初始化方法例:charstr[3][5]={"a","ab","abc"};charstr[][5]={"a","ab","abc"};6.4字符數(shù)組和字符串str[0]a\0str[1]ab\0str[2]abc\04.字符串函數(shù)概述字符與字符串是C程序處理的重要對象,C標準函數(shù)庫中提供了許多相關(guān)的函數(shù),它們的原型說明在下面頭文件中:ctype.h說明了一組字符類型判斷函數(shù)string.h說明了許多字符串處理函數(shù)stdio.h說明了用于字符串I/O函數(shù)常用的字符串函數(shù)字符串輸入輸出函數(shù)(頭文件:stdio.h)①scanf②printf③gets④puts字符串處理函數(shù)(頭文件:string.h)①strcpy
②strcat③strlen④strcmp字符判斷函數(shù)(頭文件:ctype.h)is…6.4字符數(shù)組和字符串字符串輸入輸出①
Scanf
的
s格式串可以實現(xiàn)字符串的整體輸入例如
charstr[20];scanf("%s",str);
/*str
是地址*/說明輸入字符依次放入以
str
為起點的存儲單元,并自動在末尾加
"\0"。遇到空格、回車和制表符都作為輸入數(shù)據(jù)分隔符而不能被輸入。輸入字符串的長度不能超過字符數(shù)組所能容納的字符個數(shù)。輸入項可以是字符串的起始地址,也可以是字符數(shù)組元素的地址,將從此地址表示的單元開始輸入數(shù)據(jù)。如
scanf("%s",&str[5]);。6.4字符數(shù)組和字符串②
printf的
s格式串可以實現(xiàn)字符串的輸出例如:
charstr[20];printf("%s",str);/*str
是地址*/說明:調(diào)用printf時,從str表示的地址開始輸出存儲單元中的字符,直到遇到第一個"\0"為止。str也可以是字符數(shù)組元素的地址。字符數(shù)組操作的關(guān)鍵是理解數(shù)組名的地址屬性,系統(tǒng)將數(shù)組名解釋為地址常量,可以引用它定位數(shù)組的存儲單元,但不能對數(shù)組名賦值。6.4字符數(shù)組和字符串③
gets用于從終端輸入字符串調(diào)用形式gets(str);說明gets用來從終端鍵盤讀入字符串(包括空格),直到讀入一個換行符為止。換行符不作為字符串的內(nèi)容,系統(tǒng)自動加"\0"。str是存放字符串的起始地址。可以是字符數(shù)組名、字符數(shù)組元素地址或第7章將要介紹的字符指針。例如:
gets(str);
執(zhí)行時鍵入以goodmorning!,將讀入該串并
用"\0"替代最后的換行符()
。6.4字符數(shù)組和字符串④
puts用于從終端輸出字符串調(diào)用形式
puts(str);說明str是輸出字符串的起始地址,從這一地址開始,依次輸出存儲單元中的字符,直到遇到第一個"\0"為止,并自動輸出一個換行符。6.4字符數(shù)組和字符串返回字符串處理函數(shù)①字符串復(fù)制函數(shù)strcpy調(diào)用形式strcpy(s1,s2);說明s2可以是字符數(shù)組名或字符串常量,s1是字符數(shù)組名函數(shù)把字符串s2復(fù)制到s1所指向的存儲空間中,并返回s1的值,s1指向的存儲空間必須足夠容納s2。復(fù)制時連同結(jié)束符一起復(fù)制。例如:charstr[10];
strcpy(str,"China");將常量字符串"China"復(fù)制到字符數(shù)組str中6.4字符數(shù)組和字符串China\0②字符串連接函數(shù)strcat調(diào)用形式
strcat(s1,s2);說明函數(shù)把字符串s2接到字符串s1的后面,自動覆蓋s1后面的結(jié)束符,返回s1。數(shù)組s1的空間必須足夠容納連接后字符串。例如:
charstr[20],s2[10];strcpy(s1,"like");strcpy(s2,"school");stcat(s1,s2)s1:6.4字符數(shù)組和字符串
likeschool\0③字符串長度函數(shù)strlen調(diào)用形式strlen(s);說明函數(shù)用于計算并返回字符串s的長度,不包括末尾的結(jié)束符"\0"。例如:
執(zhí)行strcpy(str,"China");strlen(str)的值是5。6.4字符數(shù)組和字符串
④字符串比較函數(shù)strcmp調(diào)用形式
strcmp(s1,s2);說明:函數(shù)用于比較字符串s1和s2:如果s1=s2,函數(shù)值返回0;如果s1>s2,函數(shù)值返回正數(shù);如果s1<s2,函數(shù)值返回負數(shù)。C語言中,字符串比較以字符比較為基礎(chǔ),字符比較等價于比較字符的ASCll編碼。有三種結(jié)果:等于、小于、大于。如比較字符c1和c2,如果c1==c2真,結(jié)果為0;如果c1>c2為真,結(jié)果為正數(shù);c1<c2為真,結(jié)果為負數(shù)。6.4字符數(shù)組和字符串
返回字符串比較規(guī)則自左向右逐個字符比較,直到出現(xiàn)不同的字符或遇到"\0"為止。如全部字符相同,則兩字符串相等;若出現(xiàn)不同字符,則以第一個不同字符的比較結(jié)果為準。比較的結(jié)果由函數(shù)帶回。因此,如果兩個字符串相等,則它們不僅長度相同,而且對應(yīng)位置的字符也相等。6.4字符數(shù)組和字符串
字符判斷函數(shù)字符判斷函數(shù)大部分是用宏實現(xiàn)的。返回值都是真值和假值,即非
0
和
0。如:isalpha(c)判斷
c是否為字母;isdigit(c)判斷
c是否為數(shù)字;isupper(c)
判斷
c是否為大寫字母。合理地使用字符判斷函數(shù),可以改善程序的可移植性和可讀性,比如程序中我們需要判斷字符變量是否為數(shù)字字符,可以這樣實現(xiàn):if(c>=48&&c<=57)或if(c>='0'&&c<='9')要求使用的編碼方案中數(shù)字字符的編碼連續(xù)。若用:if(isdigit(c))則程序與具體系統(tǒng)完全無關(guān),在任何一個系統(tǒng)上運行都不需要進行修改。程序的可讀性得到改善。6.4字符數(shù)組和字符串5.字符數(shù)組和字符串實例【例6.8】分析下面程序的運行結(jié)果,程序如下:main(){charstr1[]="abcd",str3[]="zzzz",str2[]="ChinaChian";printf("str1=%ostr2=%ostr3=%o\n",str1,str2,str3);printf("Len1=%dLen2=%dLen3=%d\n",strlen(str1),strlen(str2),strlen(str3));printf("str1=%sstr2=%sstr3=%s\n",str1,str2,str3);strcat(str1,str2);printf("str1=%sstr2=%sstr3=%s\n",str1,str2,str3);printf("Len1=%dLen2=%dLen3=%d\n",strlen(str1),strlen(str2),strlen(str3));}6.4字符數(shù)組和字符串a(chǎn)bcd\0zzzz\0ChinaChina\0str1str3str26.4字符數(shù)組和字符串分析abcd\0zzzz\0ChinaChina\0str1str3str2運行結(jié)果:
str1=177704str2=177720str3=177712Len1=4Len2=10Len3=4str1=abcdstr2=ChinaChinastr3=zzzzstrl=abcdChinahinastr2=nastr3=inaChinaLen1=14Len2=2Len3=8ChinaChina\0本例說明:字符數(shù)組下標越界問題可能帶來的影響【例6.9】編寫函數(shù)
strcopy(s1,s2),完成字符串的復(fù)制操作。#include<stdio.h>voidstrcopy(chars1[],chars2[]){inti=0while(s2[i]!='\0'){s1[i]=s2[i];i++;}s1[i]='\0';}main(){charstr1[20],str2[6]="China";strcopy(str1,str2);puts(str1);}6.4字符數(shù)組和字符串程序可修改為:voidstrcopy(s1,s2)chars1[],s2[];{inti=0;while(s1[i]=s2[i])i++;}6.5數(shù)組作為函數(shù)的參數(shù)函數(shù)是C語言中處理復(fù)雜問題的重要機制,但C語言函數(shù)實參和形參的結(jié)合只有值傳遞一種方式。對于數(shù)組對象,也有如何定義函數(shù)處理數(shù)組的問題。
1.利用全局數(shù)組傳遞參數(shù)可以利用全局變量將要處理的數(shù)組定義成全局數(shù)組,使每一個函數(shù)都能操作需要的數(shù)組。數(shù)組名寫在函數(shù)里面,只能處理某個固定的全局數(shù)組,函數(shù)依賴于這個數(shù)組,不能用同一個函數(shù)去處理別的數(shù)組以解決同樣的問題。2.數(shù)組元素作函數(shù)參數(shù)—值傳遞與處理基本類型的變量一樣;只能個別地處理數(shù)組元素3.用數(shù)組名作函數(shù)的參數(shù)—地址值傳遞可在函數(shù)里處理整個數(shù)組的數(shù)據(jù),也可通過不同調(diào)用完成同一函數(shù)對不同數(shù)組的相同計算。函數(shù)參數(shù)依然是值傳遞,只是該值為地址。實參中的數(shù)組名是地址常量,因此,函數(shù)對應(yīng)的形參應(yīng)該是一個表示地址的對象(如指針變量,數(shù)組名)。6.5數(shù)組作為函數(shù)的參數(shù)函數(shù)形參中,數(shù)組名作形參的表示方法為:
func(inta[])括號中不需要有元素個數(shù),因為C系統(tǒng)都它們處理成int*指針形式,與元素個數(shù)無關(guān)。這里我們只要記住用類似inta[]這樣的形式定義形參數(shù)組就可以了。用數(shù)組名作函數(shù)參數(shù),實參、形參傳遞的是數(shù)組名表示的地址值(依然是值傳遞)。因此,實參和形參數(shù)組操作的是同一片空間。形參數(shù)組操作可以改變實參數(shù)組元素的值。這是用數(shù)組作參數(shù)和用簡單變量作參數(shù)最大的不同。6.5數(shù)組作為函數(shù)的參數(shù)6.5數(shù)組作為函數(shù)的參數(shù)例:數(shù)組元素作函數(shù)參數(shù)#include<stdio.h>voidswap1(intx,inty){intz;z=x;x=y;y=z;}main(){inta[2]={1,2};swap1(a[0],a[1]);printf("a[0]=%d\n",a[0]);printf("a[1]=%d\n",a[1]);}12a[0]:a[1]:
調(diào)用前:調(diào)用:12a[0]:a[1]:12x:y:z12a[0]:a[1]:21x:y:
swap:12a[0]:a[1]:
調(diào)用結(jié)束:結(jié)果:
a[0]=1a[1]=2例:數(shù)組名作函數(shù)參數(shù)#include<stdio.h>voidswap2(intx[]){intz;z=x[0];x[0]=x[1];x[1]=z;}main(){inta[2]={1,2};
swap2(a);printf("a[0]=%d\n",a[0]);printf("a[1]=%d\n",a[1]);}6.5數(shù)組作為函數(shù)的參數(shù)12a→調(diào)用前:調(diào)用:xswap2:調(diào)用結(jié)束:12a→x21a→21a→結(jié)果:
a[0]=2a[1]=1實參數(shù)組和形參數(shù)組的類型必須一致,如果需要在函數(shù)中知道處理元素的個數(shù),可以另設(shè)一個表示元素個數(shù)的參數(shù)?!纠?.10】修改例6.4的程序,把冒泡排序作為一個函數(shù)抽象出來,這樣可適應(yīng)對不同數(shù)組的排序要求。程序如下:6.5數(shù)組作為函數(shù)的參數(shù)6.5數(shù)組作為函數(shù)的參數(shù)#include<stdio.h>voidsort(inta[],intnum)main(){inti,j,num,a[50];printf("EnterNumber:");scanf("%d",&num);printf("EnterNumber:");for(i=0;i<num;i++)scanf("%d",&a[i]);sort(a,num);printf("Sorteddata:");for(i=0;i<num;i++)printf("%d",a[i]);}voidsort(inta[],intnum){intchange=1,t,i,j;for(i=num-1;i>0&&change;i--){change=0;for(j=0;j<i;j++)if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;change=1;}}}6.6實例1.數(shù)學(xué)問題【例6.11】將字符串轉(zhuǎn)換成等值的機內(nèi)數(shù)。體會C系統(tǒng)字面量到機內(nèi)表示的轉(zhuǎn)換過程。將無符號八進制數(shù)串轉(zhuǎn)換成十進制機內(nèi)數(shù)。
如:0556→366分析由變換:556=5×8×8+5×8+6=(5×8+5)×8+6得出計算中有一個累加過程,轉(zhuǎn)換方法是:從高位起,累加值=累加值×8+本位值。用一維數(shù)組表示八進制數(shù)串。程序如下#include<stdio.h>main(){inti,n;chars[8];gets(s);i=0;n=0;while(s[i]!='\0'){n=n*8+s[i]-'0';i++;}printf("%d\n",n);}6.6實例【例6.12】將十進制數(shù)轉(zhuǎn)換成八進制數(shù)串。方法反復(fù)除8求余數(shù),將余數(shù)從右向左排列。程序如下#include<stdio.h>main(){inti=0,d,m,n;chars[8];scanf("%d",%n);do{m=n/8;d=n%8;s[i]='0'+d;n=m;i++;}while(n!=0);for(i--;i>=0;i--)putchar(s[i]);}6.6實例123…
3s[0]n(商)
d(余數(shù))…
2s[1]1…
1s[2]012101010顯示順序【例6.13】計算以下一元多項式的值,用數(shù)組表示系數(shù)。f(x)=anxn+an-1xn-1+…+a1x1+a0
方法1分別求出各個項的值,將結(jié)果累加。設(shè)a:存放多項式的系數(shù)的數(shù)組;n:表示多項式最高次的冪值的常量;x:放指定點的值的變量;sum:存放累加和;t:是用于計算每一項的臨時變量。6.6實例程序由雙重循環(huán)實現(xiàn)for(sum=0.0,i=0;i<N;i++){for(t=1.0,j=1;j<=i;j++)t=t*x;sum+=a[i]*t;}改進這段程序中有許多重復(fù)的計算,計算每個項的值時,總是從頭開始作累乘。如果能把前一次內(nèi)部循環(huán)計算得到的t用于后一次計算,一次累乘就夠了。整個大循環(huán)可修改為一個單層循環(huán)sum=0.0;t=1.0;for(i=0;i<=N;i++){sum+=a[i]*t;t=t*x;}6.6實例方法2應(yīng)用數(shù)學(xué)知識,將多項式變形。上面的多項式可以變形如下:f(x)=anxn+an-1xn-1+…+a1x1+a0
=((…((anx+an-1)x+an-2)x+…+a2)x+a1)x+a0
按照這個公式,循環(huán)可以寫為:sum=0.0;for(i=N;i>=0;i--)sum=sum*x+a[i];完整程序練習(xí)6.6實例可以看到:
幾乎所有的數(shù)組問題都用到循環(huán)!2.排序和查找【例6.14】用選擇法排序。方法:設(shè)有n個元素,a[0],a[1],…,a[n-1]第一次,從a[0]~a[n-1]中選出最小的元素a[min],將a[0]與a[min]交換,在a[0]中得到最小元素;第二次,從a[1]~a[n-1]中選出最小的元素a[min],將a[1]與a[min]交換,在a[1]中得到次小元素;…依次類推。執(zhí)行n-1次選擇和交換后,將會得到有序數(shù)組。6.6實例程序如下:6.6實例#include<stdio.h>voidsort_sele(inta[],int);main(){inti,n,a[50];printf("EnterNum:");scanf("%d",&n);printf("Enterdata:\n");for(i=0;i<=n-1;i++)scanf("%d",&a[i]);sort_sele(a,n);for(i=0;i<=n-1;i++)printf("%5d",a[i]);}voidsort_sele(inta[],intnum){inti,j,min,temp;for(i=0;
i<=num-1;i++){min=i;
for(j=i+1;j<num;j++)if(a[min]>a[j])min=j;if(i!=min){temp=a[i];a[i]=a[min];a[min]=temp}}}【例6.15】編寫一個函數(shù),將一個整數(shù)插入上題已排序好的表中。分析:設(shè)函數(shù)名為insert插
溫馨提示
- 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)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 智能電網(wǎng)中的電力電子轉(zhuǎn)換器考核試卷
- 醫(yī)療機器人與專業(yè)技能培訓(xùn)考核試卷
- 文化創(chuàng)意產(chǎn)業(yè)技能提升
- 文化遺址保護性拆除合同
- 大型機械設(shè)備質(zhì)檢聘用合同樣本
- 保安服務(wù)電線電纜施工合同
- 超市促銷臨時工勞動合同書
- 鋼筋工程進度合同
- 汽車修理廠衛(wèi)生間裝修施工合同
- 物業(yè)托管權(quán)利義務(wù)協(xié)議
- 整體施工方案施工組織總體設(shè)想、方案針對性和施工劃分
- _獐子島內(nèi)部控制失效案例分析
- 拼音拼讀練習(xí)過關(guān)訓(xùn)練(無漢字)
- 乳腺癌相關(guān)解剖和手術(shù)技巧體會-PPT課件
- 電廠氨區(qū)液氨儲罐置換方案
- 地理說課ppt課件
- ket分類詞匯表
- 茶藝館會員制度管理辦法
- 六年級數(shù)學(xué)上冊解決問題60道
- 第4章-管內(nèi)氣液兩相流阻力計算
- 五年級期中家長會課件PPT
評論
0/150
提交評論