C语言程序设计 利用数组处理批量数据
1 為什么要用數組
一組具有同一屬性的數據,這一組數據就稱為一個數組(array)。C語言規定用方括號中的數字來表示下標,如用s[15]表示s15。這樣就把具有同一屬性的若干個數據組織成為一個整體。
數據是有序數據的集合。
在C語言程序中常根據需要定義數組,并且用循環對數組中的元素進行操作。
2 怎么定義和引用一維數組
2.1 怎么定義一維數組
在定義數組時需要指定這批變量的類型、數組名稱和數組中包含多少個元素(即變量)。例如:
int a[10];
它表示定義了一個整型數組,數組名為a,數組有10個元素。
定義一維數組的方式為:
類型符 數組名 [常量表達式];
使用說明:
(1)數組名的命名規則和變量名相同,遵循標識符命名規則。
(2)方括號中的常量表達式用來表示元素的個數,即數組長度。下標從0開始的。
(3)常量表達式中可以包括常量和符號變量,不能包含變量。例如:
這是錯誤的。
2.2 怎么引用一維數組的元素
必須先定義數組,才能引用數組中的元素。只能一次引用一個數組元素而不能一次引用整個數組中的全部元素。例如:
t=a[2];正確
printf("%d %d %d\n",a);錯誤
引用數組元素的表示形式:
數組名 [下標]
如:a[5]表示a數組中序號為5的元素。
下標可以是整型常量,也可以是整型表達式。例如:
a[2+3],a[2*3],a[7/3] 相當于a[5],a[6],a[2]。
例題:
引用數組元素。利用循環結構把數值0~9賦給數組a[0] ~a[9],然后按逆序輸出各元素的值。
編寫程序:
程序分析:
第一個for循環把數值0~9賦給數組a[0] ~a[9],當第一次執行循環時,i=0,所以a[0]=0,以此類推。
第二個for循環按逆序輸出a數組中的10個元素,i的初值為9,因此先輸出a[9],然后輸出a[8],一直到a[0]。
2.3 一維數組的初始化
(1)在定義數組時對全部數組元素賦初值。例如:
將數組元素的初值依次放在一對大括號內,按順序賦給相應的數組元素。即a[0]=0,a[1]=1,a[2]=2。
(2)可以只給一部分元素賦值。例如:
定義的數組a有5個元素,前面3個元素賦值,后2個元素的初值自動為0。
(3)在定義數組時不指定數組長度,系統會根據數據的數列確定數組長度。例如:
可以寫成
大括號里面有5個數,系統就會根據此自動定義a數組的長度為5。
2.4 一維數組程序舉例
用數組來處理求斐波那契數列問題。輸出數列中前20個數。
思路:數列中的第一個數放在數組第一個的元素中,數列中的第二個數放在數組第二個的元素中…
數組序號為i的元素的值是其前兩個元素值之和。
編寫程序:
冒泡排序
一般形式:對n個數按升序排序。
原則:大的數字下沉,小的數字上升。
如果有n個數,則要進行n-1輪比較。在第一輪比較中進行n-1次兩兩比較,在第j輪比較中要進行n-j次的兩兩比較。
每經過一輪比較與交換,最小的數上升一位,最后升到第一個數。
例題:對9 8 5 4 2 0按升序排序。
分析:
排序結果:
0 2 4 5 8 9
編寫程序:
小結:數字大的往下沉,數字小的往上升。
3 怎么定義和引用二維數組
3.1 怎么定義二維數組
定義二維數組,例如;
定義a為3×4(3行4列)的數組,b為5×10(5行10列)的數組。
定義二維數組的一般形式:
類型名 數組名[常量表達式][常量表達式];
二維數組中元素排序的順序是按行存放的,在內存中先存放第一行的元素,再存放第二行的元素。對a[3][4]數組存放順序如下:(邏輯上的概念)
物理層上的概念圖,如下:
3.2 怎么引用二維數組的元素
二維數組元素的表示形式為:
數組名[下標][下標]
下標可以是整型常量,也可以是整型表達式,如[2*1-1][1+1]
下標值不能超過數組大小的范圍內。
3.3 二維數組的初始化
(1)分行給二維數組賦初值。如:
第1個大括號內的數據賦給第1行的元素,第2個大括號內的數據賦給第2行的元素…按行賦初值。
(2)可以將所有數據寫在一個大括號內,按數組排列的順序對各元素賦初值。例如:
寫出一大片,容易漏,不易檢查。
(3)對部分元素賦初值。例如:
(4)給全部元素都賦初值和第二維長度,系統自動算出第一維長度。例如:
在定義時也可以只對部分元素賦初值而省略第一維的長度,但應分行賦初值。例如:
這寫法可以通知系統數組有3行,數組各元素為:
3.4 二維數組程序舉例
將一個二維數組a的行和列的元素互換(即行列轉置),存到另一個二維數組b中,例如:
解題思路:
將a數組中第i行j列元素賦給b數組中j行i列元素,例如a[0][0]賦給b[0][0],a[0][1]賦給b[1][0]…
用雙層循環來處理,外層循環控制行的變化,內循環控制列的變化。
4 字符數組
用來存放字符數據的數組是字符數組。字符數組中的一個元素存放一個字符。
4.1 怎么定義字符數組及對其初始化
把“ab c”一個4個字符(包括空格)存放在一個數組中,可以這樣做:
先定義數組c,然后用賦值語句將字符賦給字符數組中的元素。
還可以在定義字符數組時對各元素賦初值,即初始化。如:
把4個字符分別賦給c[0]~c[3]這4個元素。
如果初值個數小于數組長度,則將這些字符賦給數組中前面那些元素,區域的元素自動定為空字符(即’\0’)。例如:
數組狀態如下:
系統會自動根據初值個數確定數組長度。例如:
數組c的長度自動定為4。這方法可以省去算數組的個數,比較方便。
4.2 怎么引用字符數組
可以引用字符數組中的某個元素,得到一個字符。
例題:輸出一個菱形圖。
編寫程序:
分析:
在定義字符數組d時沒有指定行數,是因為在賦初值中已用了5個大括號,表明賦給5行中的元素,因此在定義字符數時不必指定行數,系統會自頂定義詞數組為5行5列。
4.3 字符串和字符串結束標志
系統在處理字符串常量時會自動加一個\0作為結束符,在遇到字符\0時,表示字符串結束。在程序中往往依靠檢測\0的位置來判定字符串是否結束。
\0代表ASCII碼為0的字符,ASCII碼為0的字符是一個“空操作符”,即它什么也不做,只是一個辨別的標志。
例如:
輸出一個字符串。
系統自動在最后一個字符\n的后面加一個\0作為字符串標志,遇到\0就停止輸出。
用字符常量來使字符數組初始化。例如:
等價于
4.4 怎么進行字符數組的輸入輸出
輸入輸出可以有兩種方法。
(1)逐個字符輸入輸出。用格式聲明%c輸入或輸出一個字符。
(2)將整個字符串一次輸入或輸出。用格式聲明%s,意思是對字符串的輸入輸出。例如:
在內存中數組c的狀態如下:
使用說明:
(1)輸出字符不包括結束符\0。
(2)用%s格式符輸出字符串時,printf函數中輸出項是字符數組名,不是數組元素名。
(3)如果數組長度大于字符串的實際長度,也只輸出到遇\0結束。例如:
也只輸出字符串的有效字符“abc”,而不是輸出10個字符,這就是用字符串結束標志的好處。
(4)如果喲個字符數組中包含一個以上\0,則遇到第一個\0時輸出就結束了。
(5)可以用scanf函數輸入一個字符串。例如:
輸入項c是已定義的字符數組名,輸入的字符串應短于已定義的字符數組的長度。
如果利用一個scanf函數輸入多個字符串,則在輸入時以空格分隔。例如:
輸入數據:
Are you ok?
輸入后str1,str2,str3數組狀態如下圖。
(6)scanf函數中的輸入項如果是字符數組名,不要再加地址符&,因為在C語言中數組名代表該數組的起始地址。下面寫法錯誤:
(7)如果想知道數組str在內存中的起始地址,可以用以下輸出語句:
用十進制數形式表示的數組str的起始地址。
(8)如果以下輸出語句:
按數組字符數組名str找到str數組的起始地址,然后逐個輸出其中的字符,直到遇\0為止。
4.5 字符串處理函數
4.6 字符數組應用舉例
有3個字符串,“China”,“Japan”,“India”要求找出其中“最大”者。
“大”者是指ASCII代碼較大的那個字符。例如:字符‘B’大于字符‘A’,字符‘a’大于字符‘A’。如果是字符串,則沖第一個字符開始一一進行比較,如果第一個字符相同,就比較下一個字符,直到出現不同為止。如果字符串中都是英文,按字母表的排序,字母表中位置在后的為大,例如“then”<“they”。
思路:
定義二維字符數組,大小為3×10,有3行10列,每一列可以容納10個字符(包括最后的結束符\0)。二維數組的情況如下:
編寫程序:
分析:
在使用字符串函數時在本程序的開頭要用#include <string.h>。
空格字符參加比較,它“大于”任何字母字符。
5 提高部分
5.1 為什么在定義二維數組時采用兩對雙括號的形式
定義二維數組,例如;
定義a為3×4(3行4列)的數組,b為5×10(5行10列)的數組。
好處:
是的二維數組可被看作是一種特殊的一維數組,a包括3個元素,每個元素又是一個包含4個元素的一維數組。上面定義的二維數可以理解為定義了3個一維數組,相當于:
a[0]、a[1]、a[2]看作一維數組名。表示一維數組a[0]包含4個元素。
5.2 對C的字符串函數的詳細說明
5.2.1 gets函數(讀入字符串函數)
作用是從終端輸入一個字符串到字符數組。執行函數:gets(str)
從鍵盤輸入:abc
將輸入的字符串"abc"送給字符數組str(注意,送給數組的共有4個字符)。
5.2.2 puts函數(輸出字符串函數)
puts函數一般形式為:puts(字符數組);
其作用是將一個字符串(以’\0‘結束的字符序列)輸出到終端。
用puts函數輸出的字符串中可以包含轉義字符。例如:
5.2.3 strcat函數(字符串連接函數)
strcat函數一般形式為:
strcat(字符數組1,字符數組2)
strcat是STRing CATenate(字符串連接)的縮寫。其作用是連接兩個字符數組中的字符串,把字符串2接到字符串1的后面,把結果放在字符數組1。例如:
說明:
(1)字符數組1的長度必須足夠大,以便容納連接后的新字符串。
(2)連接前兩個字符串的后面都有’\0’,連接時將字符串1后面的’\0’取消了,只在連接后的字符串保留’\0’。
5.2.4 strcpy函數(字符串復制函數)
strcpy函數一般形式:
strcpy(字符串數組1,字符串2)
strcpy是STRing CoPY(字符串復制)的簡寫。作用是將字符串2復制到字符數組1中去。例如:
執行后,c的狀態如下:
說明:
(1)字符數組1的長度不應小于字符串2的長度。
(2)字符數組1必須寫成數組名形式(如c1),字符串2可以是字符數組名,也可以是一個字符串常量。例如:
(3)不能用賦值語句將一個字符常量或字符數組直接給一個字符數組。如:
是錯誤寫法。
(4)可以用strncpy函數將字符串2中前面n個字符復制到字符數組1中去。例如:
作用是將str2中最前面2個字符復制到str1中,期待str1中原有的最前面2個字符。但復制的字符個數n不應多于str1中原有的字符(不包括\0)。
5.2.5 strcmp函數(字符串比較函數)
strcmp函數一般形式為:
strcmp(字符串1,字符串2)
strcmp是STRing CoMPare(字符比較)的縮寫。它的作用是比較字符串1和字符串2。例如:
字符串比較規則:對于兩個字符串自左向右追個字符相比(按ASCII碼值大小比較),指導出現不同的字符或遇到’\0’為止。如果全部字符相同,則認為相等;若出現不同的字符,則以第一個不相同的字符的比較結果為準。
如果參加比較的兩個字符串有英文字母組成,則按照在英文字典中位置在后面的為“大”。例如:“then”<“they”。
但應注意小寫字母比大寫字母“大”。
比較的結果由函數值帶回。
(1)如果字符串1=字符串2,則函數值為0。
(2)如果字符串1>字符串2,則函數值為一個正整數。
(3)如果字符串1<字符串2,則函數值為一個負整數。
兩個字符串比較,只能有strcmp函數。
5.2.6 strlen函數(測字符串長度函數)
strlen函數一般形式:
strlen(字符數組)
strlen是STRing LENgth(字符串長度)的縮寫,作用是量出字符串長度的函數,函數值為字符串中的實際長度(不包括’\0’在內)。例如:
輸出為3,不是8,也不是4。
5.2.7 strlwr函數(轉換為小寫字符函數)
strlwr函數的一般形式:
strlwr(字符串)
strlwr是STRing LoWeRcase(字符串小寫)的縮寫。作用是將字符串中大寫字母換成小寫字母。
5.2.8 strupr函數(轉換大寫字符函數)
strupr函數的一般形式:
strupr(字符串)
strupr是STRing UPpeRcase(字符串大寫)的縮寫。作用是將字符串中小寫字母換成大寫字母。
6 小結
數組時有序數據的集合。
定義數組要特別注意“下標越界”問題。
區別定義數組和數組元素的引用形式。
二維數組的元素的排列次序為“按行排列”。在對二維數組初始化時,按行賦初值。
字符串是以字符數組形式存放的。
\0不是字符串的組成部分,是字符串結束標志。
對字符串的運算要通過字符串函數來進行。使用字符串函數時,必須在本程序的開頭用#include<string.h>。
數組的名字代表數組首元素的地址,不是代表數組中的全部元素的值。
總結
以上是生活随笔為你收集整理的C语言程序设计 利用数组处理批量数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [html] 进入编辑页面时,如何把光
- 下一篇: 获取原始NMEA 0183语句的方法