《c语言从入门到精通》看书笔记——第8章 数组
生活随笔
收集整理的這篇文章主要介紹了
《c语言从入门到精通》看书笔记——第8章 数组
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、一維數組
一維數組是用于存儲一維數列中數據的集合。一般形式為
類型說明符 ?數組標識符[常量表達式]? ,例如:int iArray[5];
一維數組的引用:
數組標識符[下標] ?;例如:iArray[2];
一維數組的初始化:
(1)定義數組時直接對數組元賦初值
(2)只給一部分元素賦值,為賦值的部分元素值為0
(3)在對全部數組元素賦初值時可以不指定數組長度
2、二維數組
一般形式:數據類型 數組名[常量表達式1][常量表達式2];
常量表達式1為行下標,常量表達式2為列下標
二維數組元素的引用形式:
數組名[下標][下標];
二維數組的初始化
(1)可以將所有數據寫在一個大括號內,按照數組元素排列順序最元素賦值
(2)在為所有元素賦值時,可以省略行下標,但是不能省略列下標
(3)可以分行個數組元素賦值。例如:int a[2][3]={{1,2,3},{4,5,6}}
(4)二維數組也可以直接對數組元素賦值
3、字符數組
數組中的元素類型為字符型時稱為字符數組。字符數組的定義和使用方法和其他類型的數組類似。
字符數組的結束標志是“\0”,即,要比數值型數組存儲時多用一個字節。
4、多維數組
多維數組的聲明和二維數組相同,只是下標更多。
5、數組的排序算法
(1)、選擇法排序:指每次選擇所要排序的數組中的最大值(由大到小排序)的數組元素,將這個數組元素的值與前面沒有進行排序的數組元素互換。即:最后一個元素和最前面沒有排序的數比較
/*從小到大排序*/
for(i=0;i<9;i++) ??????????????????? /*設置外層循環為下標0~8的元素*/
{
iTemp = a[i]; ??????????????????? /*設置當前元素為最小值*/
iPos = i;???????????????????????? /*記錄元素位置*/
for(j=i+1;j<10;j++) ????????? /*內層循環i+1到9*/
{
if(a[j]<iTemp) ?????????????? /*如果當前元素比最小值還小*/
{
iTemp = a[j];???? ???? /*重新設置最小值*/
iPos = j; ?????????????? /*記錄元素位置*/
}
}
/*交換兩個元素值*/
a[iPos] = a[i];
a[i] = iTemp;
}
(2)、冒泡法排序:指在排序時,每次比較數組中相鄰的兩個數組元素的值,將較小的數(從小到大排序)排在較大的數前面。即:從最后一個元素開始依次和前面的元素比較,小則靠前。
/*從小到大排序*/
for(i=1;i<10;i++) ??????????????????? /*外層循環元素下標為1~9*/
{
for(j=9;j>=i;j--) ?????????????? /*內層循環元素下標為i~9*/
{
if(a[j]<a[j-1]) ????????? /*如過前一個數比后一個數大*/
{
/*交換兩個數組元素的值*/
iTemp? = a[j-1];
a[j-1] = a[j];
a[j]?? = iTemp;
}
}
}
(3)、交換法排序:將每一位數與氣候的所有數一一比較,如果發現符合條件的數據則交換數據。即,依次比較,滿足條件換,沒滿足條件就保持那個位子,然后由又用前面的數依次比較。
/*從小到大排序*/
for(i=0;i<9;i++) ??????????????????? /*外層循環元素下標為0~8*/
{
for(j=i+1;j<10;j++) ?????????????? /*內層循環元素下標為i+1到9*/
{
if(a[j] < a[i]) ?????????????? /*如果當前值比其他值大*/
{
/*交換兩個數值*/
iTemp = a[i];
a[i]? = a[j];
a[j]? = iTemp;
}
}
}? ?
(4)、插入法排序:基本工作原理是抽出一個數據,在前面的數據中尋找相應的位置插入,然后繼續下一個數據,直到完成排序。即取一個數放一個位置,取后一個數與前面排好了的數比較再放入。
? ?? /*從小到大排序*/
for(i=1;i<10;i++) ?????????????????????????????????? /*循環數組中元素*/
{
iTemp = a[i]; ????????????????????????????? /*設置插入值*/
iPos = i-1;
while((iPos>=0) && (iTemp<a[iPos])) ???? /*尋找插入值的位置*/
{
a[iPos+1] = a[iPos]; ??????????????????? /*插入數值*/
iPos--;
}
a[iPos+1] = iTemp;
}
(5)、折半法排序:又稱快速排序,是選擇一個中間值middle(在程序中使用數組中間值),然后把比中間值小的數據放在左邊,比中間值打的數據放在右邊(具體的實現是從兩邊找,找到一對后進行交換)。然后對兩邊分別進行遞歸使用這個過程。即:從兩頭出發和中間的比較,兩邊都停止時(左邊的比中間的大,右邊的比中間的小)然后交換這兩個停下的數,下次從xxxx開始
void CelerityRun(int left, int right, int array[])
{
int i,j;
int middle,iTemp;
i = left;
j = right;
middle = array[(left+right)/2];??????????????????? /*求中間值*/
do
{
while((array[i]<middle) && (i<right))???? /*從左找小于中值的數*/
i++;?????
while((array[j]>middle) && (j>left))???? /*從右找大于中值的數*/
j--;
if(i<=j)??????????????????????????????????????? /*找到了一對值*/
{
iTemp = array[i];
array[i] = array[j];
array[j] = iTemp;
i++;
j--;
}
}while(i<=j);??????????????????? /*如果兩邊的下標交錯,就停止(完成一次)*/
/*遞歸左半邊*/ if(left<j) CelerityRun(left,j,array); /*遞歸右半邊*/ if(right>i) CelerityRun(i,right,array); 6、排序算法的比較 插入法、冒泡法、交換法排序的速度比較慢,但參加排序的序列局部或整體有序時,這種排序能達到較快的速度;在這種情況下,折半法排序反而會顯得速度慢了。當n較小時,對穩定性不作要求時宜用選擇法排序,對穩定性有要求時宜用插入法或冒泡法排序。 7、字符串處理函數:要添加頭文件string.h (1)字符串復制:strcpy(目的字符串組名,源字符串組名) (2)字符串連接:strcat(目的字符數組名,源字符數組名) (3)字符串比較:strcmp(字符數組名1,字符數組名2)。按照ASCII碼順序比較兩個數組中的字符串,并由函數返回值返回比較結果(1>2=正;1<2=負;1=2=0;) (4)字符串中小寫字母變大寫:strupr(字符串) (5)字符串中大寫字母變小寫:strlwr(字符串) (6)獲得字符串長度:strlen(字符數組名) 8、反轉輸出字符串 int main() { int i; char String[7]? = {"mrsoft"}; char Reverse[7] = {0}; int size; size = sizeof(String);???? /*計算源字符串長度*/
/*循環讀取字符*/ for(i=0;i<6;i++)?????//是6是因為字符串的大小為6,又是從0開始的, { Reverse[size-i-2] = String[i];???? /*向目標字符串中插入字符*///“size-i-2”是因為String末尾一位是"\0",i的排位是從0開始,“size-1”結束。 }
/*輸出源字符串*/ printf("輸出源字符串:%s\n",String); /*輸出目標字符串*/ printf("輸出目標字符串:%s\n",Reverse); printf("%d\n",size); getchar();
return 0;????????????????????????????? /*程序結束*/
9、獲取系統日期和時間(要添加頭文件time.h) 輸出系統日期: time_t nowTime; time(&nowTime);?????????????????????????????????? /*獲取系統日期*/
?????????????? sysTime= localtime(&nowTime);?????????????? /*轉換為系統日期*/
?????????????? printf("系統日期:%d-%d-%d \n",1900 + sysTime->tm_year,sysTime->tm_mon + 1 ,sysTime->tm_mday);? 輸出系統時間: time_t nowTime; time(&nowTime);?????????????????????????????????? /*獲取系統時間*/
?????????????? sysTime = localtime(&nowTime);?????????????? /*轉換為系統時間*/
?????????????? printf("系統時間:%d:%d:%d \n",sysTime->tm_hour ,sysTime->tm_min ,sysTime->tm_sec);??????????????????? /*輸出信息*/??????????????????? /*輸出信息*/
/*遞歸左半邊*/ if(left<j) CelerityRun(left,j,array); /*遞歸右半邊*/ if(right>i) CelerityRun(i,right,array); 6、排序算法的比較 插入法、冒泡法、交換法排序的速度比較慢,但參加排序的序列局部或整體有序時,這種排序能達到較快的速度;在這種情況下,折半法排序反而會顯得速度慢了。當n較小時,對穩定性不作要求時宜用選擇法排序,對穩定性有要求時宜用插入法或冒泡法排序。 7、字符串處理函數:要添加頭文件string.h (1)字符串復制:strcpy(目的字符串組名,源字符串組名) (2)字符串連接:strcat(目的字符數組名,源字符數組名) (3)字符串比較:strcmp(字符數組名1,字符數組名2)。按照ASCII碼順序比較兩個數組中的字符串,并由函數返回值返回比較結果(1>2=正;1<2=負;1=2=0;) (4)字符串中小寫字母變大寫:strupr(字符串) (5)字符串中大寫字母變小寫:strlwr(字符串) (6)獲得字符串長度:strlen(字符數組名) 8、反轉輸出字符串 int main() { int i; char String[7]? = {"mrsoft"}; char Reverse[7] = {0}; int size; size = sizeof(String);???? /*計算源字符串長度*/
/*循環讀取字符*/ for(i=0;i<6;i++)?????//是6是因為字符串的大小為6,又是從0開始的, { Reverse[size-i-2] = String[i];???? /*向目標字符串中插入字符*///“size-i-2”是因為String末尾一位是"\0",i的排位是從0開始,“size-1”結束。 }
/*輸出源字符串*/ printf("輸出源字符串:%s\n",String); /*輸出目標字符串*/ printf("輸出目標字符串:%s\n",Reverse); printf("%d\n",size); getchar();
return 0;????????????????????????????? /*程序結束*/
9、獲取系統日期和時間(要添加頭文件time.h) 輸出系統日期: time_t nowTime; time(&nowTime);?????????????????????????????????? /*獲取系統日期*/
?????????????? sysTime= localtime(&nowTime);?????????????? /*轉換為系統日期*/
?????????????? printf("系統日期:%d-%d-%d \n",1900 + sysTime->tm_year,sysTime->tm_mon + 1 ,sysTime->tm_mday);? 輸出系統時間: time_t nowTime; time(&nowTime);?????????????????????????????????? /*獲取系統時間*/
?????????????? sysTime = localtime(&nowTime);?????????????? /*轉換為系統時間*/
?????????????? printf("系統時間:%d:%d:%d \n",sysTime->tm_hour ,sysTime->tm_min ,sysTime->tm_sec);??????????????????? /*輸出信息*/??????????????????? /*輸出信息*/
總結
以上是生活随笔為你收集整理的《c语言从入门到精通》看书笔记——第8章 数组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用fputc()函数以字符串形式写入字符
- 下一篇: 双拓扑排序 HDOJ 5098 Smar