周亞輝

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