周亞輝
摘要:隨著人工智能和計(jì)算機(jī)技術(shù)的不斷發(fā)展,C語言因其獨(dú)特優(yōu)勢(shì)一直被廣泛應(yīng)用。數(shù)組是C語言中常用的數(shù)據(jù)類型之一,本文介紹了C語言在程序設(shè)計(jì)中數(shù)組的有效運(yùn)用,首先文章從數(shù)組的排序、插入、刪除和應(yīng)用四個(gè)方面介紹了數(shù)組的各類應(yīng)用和編程方法,然后介紹了數(shù)組和指針的關(guān)系,并以處理轉(zhuǎn)置矩陣為例介紹了數(shù)組和指針的聯(lián)合應(yīng)用是如何解決實(shí)際問題的。本文所做研究對(duì)C語言的數(shù)組的學(xué)習(xí)和應(yīng)用提供了一定的指導(dǎo)意義。
關(guān)鍵詞:C語言;數(shù)組;應(yīng)用
中圖分類號(hào):TP311? ? ?文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2020)35-0209-02
開放科學(xué)(資源服務(wù))標(biāo)識(shí)碼(OSID):
1 引言
自1972年C語言作為一種獨(dú)立的面向過程的開發(fā)語言問世以來,一直作為適應(yīng)于底層開發(fā)的通用設(shè)計(jì)語言。因其編譯方式簡單,低級(jí)存儲(chǔ)器便可處理編譯工作,不需要任何其他編譯環(huán)境,且支持高校程序設(shè)計(jì),多年來一直被廣大開發(fā)者熱衷[1]。其跨平臺(tái)輸出的特點(diǎn),決定了C語言程序可在嵌入式處理器等平臺(tái)中被編譯和使用。與C++和JAVA等面向?qū)ο缶幊痰恼Z言不同,C語言的主要目標(biāo)是實(shí)現(xiàn)簡易編譯、適應(yīng)低級(jí)存儲(chǔ)器,高編譯效率[2]。
C語言主要的數(shù)據(jù)類型包括:整數(shù)型、字符型、實(shí)型、浮點(diǎn)型、枚舉型、數(shù)組類型、結(jié)構(gòu)體類型、共用體類型、指針類型和空類型。數(shù)組是一組有序的元素組合序列,為了方便計(jì)算機(jī)進(jìn)行數(shù)據(jù)處理[3],把無序的元素按照一定的次序有序組織起來。從數(shù)據(jù)處理角度講,數(shù)組能夠方便解決各類復(fù)雜的數(shù)據(jù)處理問題。元素是構(gòu)成數(shù)組的基本單位,不同元素通過順序號(hào)將其順序標(biāo)識(shí)。根據(jù)數(shù)組中元素的類型可以分為字符型數(shù)組、數(shù)值型數(shù)組、指針數(shù)組和結(jié)構(gòu)數(shù)組等[4]。
雖然C語言中數(shù)組類型定義比較簡單,但因其由于范圍廣,在進(jìn)行排序、字符串處理、計(jì)算函數(shù)處理等過程中,都離不開數(shù)組[5]。本文介紹C語言設(shè)計(jì)過程中,數(shù)組的有效運(yùn)用,對(duì)其在解決實(shí)際問題過程中的方法進(jìn)行總結(jié)。對(duì)于數(shù)組的應(yīng)用,首先要掌握其基本操作,如變量定義、賦值和使用。一般數(shù)組的應(yīng)用可以分為五大類:排序、插入、刪除、合并、查詢,還可來存儲(chǔ)大數(shù)據(jù)。
2 數(shù)組的應(yīng)用
2.1排序
排序是程序設(shè)計(jì)中最常見的一種算法,對(duì)于數(shù)組的排序也是C語言編程中的一類重要內(nèi)容,排序規(guī)則也是其他應(yīng)用開發(fā)的基礎(chǔ)。排序是將無規(guī)則的數(shù)據(jù)或者字符串等元素,按照固定規(guī)則和順序進(jìn)行大小排列,常見的排序防范有插入法排序、冒泡排序、交換排序法等,其中冒泡排序法是排序的最常用方式。針對(duì)a[0]-a[9]10個(gè)數(shù)字采用冒泡排序法進(jìn)行排序,應(yīng)用案例如下:
1)數(shù)組元素輸入;a[0]-a[9];
2)數(shù)組中相鄰元素兩兩比較,數(shù)值大者往前冒泡,數(shù)值小者往后冒泡;
3)第一輪比較結(jié)束后,用相同方式再進(jìn)行循環(huán)比較。若數(shù)組中元素個(gè)數(shù)有N個(gè),則N-1輪便可將數(shù)組按照從大到小的順序排好。
若此排序要求,不按照冒泡等排序算法進(jìn)行而用常規(guī)變量解決,需定義10個(gè)變量,且無法再排序過程中借助循環(huán)法解決此問題。
2.2插入
針對(duì)已經(jīng)做好排序工作的數(shù)組,若要在數(shù)組中增加新元素,并且按照原有排序規(guī)則重新組合新數(shù)據(jù),是常見的一類數(shù)組操作。數(shù)組插入元素的基本操作步驟如下。
比較待插入元素X和數(shù)組中末尾元素的大小,若末尾元素大于X,則將X直接插入至數(shù)組末尾,若末尾元素小于X,則一次比較a[0]-a[n-1],直至a[i]>X是,將X插入a[i-1]之后,a[i]之前,同時(shí)將其后的元素逐一后移,增加其序號(hào)值。
在數(shù)組元素插入過程中,常見問題是會(huì)出現(xiàn)數(shù)組index越界問題,發(fā)生此類問題的主要原因在于數(shù)組在定義之初,未充分考慮元素插入問題,插入新元素后其容量比原有數(shù)組定義元素?cái)?shù)量數(shù)值大。還有常見問題是,當(dāng)出現(xiàn)比X大的數(shù)組元素時(shí),未進(jìn)行中段操作,致使插入錯(cuò)誤。
2.3 刪除
數(shù)組刪除和數(shù)組插入類似。數(shù)組刪除分兩種情況,一類是未排序數(shù)組的元素刪除,一類是已排序數(shù)組的元素刪除。兩類數(shù)組元素的刪除邏輯相同,具體步驟如下:
1)在鍵盤中輸入數(shù)組中要?jiǎng)h除的元素;
2)所輸入元素在數(shù)組中是否存在,如果存在則執(zhí)行刪除操作,如果不存在則忽略此元素;
3)若數(shù)組本身是已排序數(shù)組,則在數(shù)組刪除元素位置進(jìn)行依次遞補(bǔ),數(shù)組元素總數(shù)減1。
在刪除數(shù)組元素過程中,元素漏刪現(xiàn)象較多,一旦輸入元素在數(shù)組中連續(xù)出現(xiàn)時(shí),為了保證刪除動(dòng)作正常進(jìn)行,應(yīng)該在程序中一次刪除多個(gè)元素。其程序邏輯圖如圖1所示。
2.4 合并
數(shù)組的合并是對(duì)兩個(gè)已經(jīng)實(shí)現(xiàn)排序的數(shù)組重新合并后組成新數(shù)組的過程,合并完成后的數(shù)組仍然要有序。
2.5 查詢
常規(guī)的數(shù)組元素查詢方法一般是根據(jù)輸入元素從數(shù)組中每個(gè)元素逐一查找,直至查詢到元素為止,若數(shù)組中查找不到被查元素,則程序結(jié)束。此種查找方式查詢效率較低,假設(shè)數(shù)組中存在500個(gè)元素且被查元素在數(shù)組末尾,則需要進(jìn)行499次比較才能得到最終結(jié)果。按照概率計(jì)算,數(shù)組元素的搜索至少需要250次方可完成比較。折半法是常用的數(shù)組元素查找方法,其查找效率比正常查找效率高、速度快。例如存在數(shù)組,其元素?cái)?shù)量為9,分別為1,2,3,7,11,16,18,19,22,若輸入3,查找3是否在數(shù)組中,步驟如下:
1)首先找出數(shù)組中位置居中的數(shù),由于數(shù)組已經(jīng)按照從小到大順序排序。中位數(shù)為11。
2)比較3和11的大小,若前者小于后者,則在全班段中(即a[1]-a[5]中)尋找與3相同的元素。
3)根據(jù)以上邏輯繼續(xù)在a[1]-a[5]中尋找,再次取中位數(shù),a[3],恰好a[3]=3,因此,通過兩步便得到了最終想要的結(jié)果。在查找效率上有了很大提升。若數(shù)組中數(shù)組元素的含量為int(log2n)+1。
3 數(shù)組與指針
數(shù)組和指針在C語言中是聯(lián)系最緊密的兩種數(shù)據(jù)類型,對(duì)于數(shù)組的處理,往往借助指針的手段實(shí)現(xiàn)。在具體程序設(shè)計(jì)中,數(shù)組和指針的關(guān)系很容易被混淆。具體來講,指針是用來存放具體變量之地址的變量。變量中保存了其他變量的地址,根據(jù)對(duì)變量地址的訪問間接實(shí)現(xiàn)對(duì)變量的訪問。
3.1指針和一維數(shù)組
可借助數(shù)組元素的指針實(shí)現(xiàn)指針和一維數(shù)組的關(guān)聯(lián),也就是通過定義數(shù)組元素的指針,并將其指向一維數(shù)組的第一個(gè)元素。假設(shè)p是已經(jīng)被定義的指向整形數(shù)組的指針,且已被賦值,使其指向數(shù)組元素的第一個(gè)元素,則p+1便指向數(shù)組的第二個(gè)元素。
3.2指針和多維數(shù)組
多維數(shù)組和指針的關(guān)系比較復(fù)雜,其使用方法也相對(duì)靈活,這樣在一定程度上增加了編程的復(fù)雜性。本文以二維數(shù)組為例,介紹指針和其關(guān)系。首先定義int b[3][4] = {{0,2,4,6},{1,3,5,7},{7,8,10,11}},由于二維數(shù)組是指由兩個(gè)一維數(shù)組組合而成的,a數(shù)組含有3個(gè)行和4個(gè)列,其三個(gè)行可以分別表示為a[0],a[1],a[2],每個(gè)一維數(shù)組又含有4個(gè)子元素。另外,二維數(shù)組在存儲(chǔ)過程中是按照行的主順序方法占據(jù)一連串存儲(chǔ)空間的,因此C語言通過建立二維數(shù)組和指針的關(guān)系,除使用指針指向數(shù)組元素外,還可采用數(shù)組指針和指針數(shù)組兩種方式。
(1)數(shù)組的指針。數(shù)組的指針可以是一個(gè)指向多維或者一維的指針,定義數(shù)組指針后,可以對(duì)其復(fù)制,并以此在數(shù)組和指針之間建立起關(guān)聯(lián)關(guān)系。例如int(*)p[4]=a,定義了p為數(shù)組指針,并將其賦值為數(shù)組a。
(2)指針數(shù)組。數(shù)組的元素可以為整數(shù),也可以為浮點(diǎn)型數(shù)據(jù)或字符類數(shù)據(jù)。故數(shù)組的元素種類可以是多種多樣的,因此數(shù)組的元素類型也可以為指針類型。例如定義int*p[3] = {b[0],b[1],b[2]},此種形式表示定義了包含有3個(gè)整數(shù)型指針的數(shù)組。
具體應(yīng)用過程中,為了不斷優(yōu)化C語言的程序,進(jìn)而提升程序的運(yùn)轉(zhuǎn)效率,在程序中會(huì)充分利用數(shù)組和指針的關(guān)系,借助指針實(shí)現(xiàn)對(duì)數(shù)組元素的間接訪問。例如通過C語言編程的方式實(shí)現(xiàn)對(duì)4*4矩陣的轉(zhuǎn)置操作等。在C語言中可借助二維數(shù)組實(shí)現(xiàn)對(duì)矩陣的存儲(chǔ),并可采用相關(guān)算法實(shí)現(xiàn)矩陣的轉(zhuǎn)置。使用指針實(shí)現(xiàn)對(duì)數(shù)組元素的引用首先需要將數(shù)組和指針之間建立起關(guān)聯(lián)關(guān)系。具體程序?qū)崿F(xiàn)如下所示:
#include
void main(){
void move(int(*q)[3];//對(duì)move函數(shù)進(jìn)行定義,并聲明其參數(shù)類型為數(shù)組指針
int i,a[3][3] = {1,2,3,4,5,6,7,8,9};
int (*p)[3] = a;//定義數(shù)組類型的指針
move (p);
for(int i=0;i<3;i++)//將轉(zhuǎn)至矩陣輸出
printf(“%d %d %d\n”,a[i][0],a[i][1],a[i][2]);
}
void move (int (*q)[3])
{
int j,k,n;
for(j=0;j<3;j++){
for(k=0;k<3;k++){
n = *(*(q+j)+k);
*(*(q+j)+k) = *(*q+k)+j);
*(*q+k)+j) = n;
}
}
}
綜上所述,move函數(shù)主要是通過變量n實(shí)現(xiàn)矩陣中對(duì)角線元素的兩兩置換,這種置換方式是C語言中經(jīng)常使用的編程方法,如數(shù)組排序中也經(jīng)常被使用。因篇幅限制,move函數(shù)的具?體實(shí)現(xiàn)方式不再贅述。指針和數(shù)組是C語言學(xué)習(xí)過程的重中之重,也是C語言學(xué)習(xí)過程中的難點(diǎn)之一,若不能充分理解數(shù)組和指針的相互關(guān)系,便無法充分借助C語言便利的編程方法解決實(shí)際問題,C語言的實(shí)際效能便大打折扣。
4 結(jié)論
隨著人工智能和計(jì)算機(jī)技術(shù)的飛速發(fā)展,各類芯片被不斷開發(fā)出來,隨之嵌入式應(yīng)用也越來越被廣泛應(yīng)用,C語言作為開發(fā)的最基礎(chǔ)類語言,引起具有開發(fā)簡便、編譯速度快、入門快且對(duì)編譯器的存儲(chǔ)能力要求不高等問題,也越來越被受到重視。
數(shù)組作為C語言中應(yīng)用最為廣泛的數(shù)據(jù)類型之一,和鏈表、指針等關(guān)系緊密,因其具有數(shù)據(jù)規(guī)律性存儲(chǔ)的特點(diǎn),其在編程中時(shí)長被用到。本文總結(jié)了C語言數(shù)組的各類數(shù)據(jù)處理方式和C語言中數(shù)組和指針的關(guān)系,介紹了數(shù)組和指針的關(guān)系,為C語言學(xué)習(xí)過程中數(shù)組的應(yīng)用提供了借鑒和指導(dǎo)意義。
參考文獻(xiàn):
[1] 沈逸飛,任春龍,胡云飛,等.淺析C語言、Java、Python的數(shù)組合并方法[J].電腦知識(shí)與技術(shù),2020,16(3):78-82.
[2] 馬振嬰. C語言程序設(shè)計(jì)課程指針的教學(xué)設(shè)計(jì)[J].科教導(dǎo)刊, 2019 (7):111-112.
[3] 常歡,羅奇鳴,李薛劍,等.Alias Analysis Algorithm for C Programs Based on a Stack Memory Model[J].小型微型計(jì)算機(jī)系統(tǒng),2019, 40(2):353-358.
[4] 張樂, 楊立. 基于問題引導(dǎo)法的C語言一維數(shù)組插入算法教學(xué)過程分析[J]. 現(xiàn)代計(jì)算機(jī)(專業(yè)版), 2018, 621(21):64-67+71.
[5] 李凌.C語言的教學(xué)設(shè)計(jì)——基于布盧姆教育目標(biāo)分類理論視角[J].柳州職業(yè)技術(shù)學(xué)院學(xué)報(bào),2018,18(4):76-80.
【通聯(lián)編輯:李雅琪】