內容導讀
- 1.陣列
- 1.1陣列概述
- 1.2為什么要用陣列?
- 2.一維陣列
- 2.1定義與初始化
- 2.1.1一維陣列的定義
- 2.1.2一維陣列初始化
- 2.1.3如何使用一維陣列中的元素呢?
- 2.2簡單程式舉例
- 2.3冒泡排序
- 3.二維陣列
- 3.1定義與初始化
- 3.1.1二維陣列的定義
- 3.1.2二維陣列的初始化
- 3.2簡單程式舉例
- 3.2三子棋
- 3.3掃雷
- 4.字符陣列
- 4.1定義與初始化
- 4.1.1字符陣列的定義
- 4.1.2字符陣列初始化
- 4.2簡單程式舉例
- 4.3簡要介紹與字符相關的庫函式
- 4.3.1輸出輸入字串的函式
- 4.3.2字串連接函式
- 4.3.3字串復制函式
- 4.3.4字串比較函式
- 4.3.5測字串長度的函式
- 4.3.6轉換為大小寫的函式
前面的話:
作者水平很有限,如果發現錯誤,一定要及時告知作者哦!感謝感謝!
博主的碼云gitee,平常博主寫的程式代碼都在里面,
1.陣列
1.1陣列概述
陣列(Array)是有序的元素序列, 若將有限個型別相同的變數的集合命名,那么這個名稱為陣列名,組成陣列的各個變數稱為陣列的分量,也稱為陣列的元素,有時也稱為下標變數,用于區分陣列的各個元素的數字編號稱為下標,陣列是在程式設計中,為了處理方便, 把具有相同型別的若干元素按有序的形式組織起來的一種形式, 這些有序排列的同類資料元素的集合稱為陣列,
陣列是用于儲存多個相同型別資料的集合,
(摘自360百科)

1.2為什么要用陣列?
假如你要向計算機輸入并儲存50個學生的C語言期末考試的成績,如果不使用陣列,意味著你要創建50個變數,非常的繁瑣,如果你并不覺得繁瑣,當你需要向計算機輸入全校學生C語言成績時,你還會覺得不繁瑣嗎?
當遇到這個問題時,仔細思考,你會發現這些資料是具有一定的聯系的,比如它們都是同一學校,同一科目的成績,
所以,為了解決這個問題C語言提供了能夠一次性儲存這些資料的資料型別——陣列,
因為陣列有以下幾個特點:
- 陣列是一組有序資料的集合,陣列中各資料的排列是有一定規律的,下標代表資料在陣列中的序號,
- 用陣列名和下標即可唯一地確定陣列中的元素,
- 陣列中的每一個元素都屬于同一個資料型別,
2.一維陣列
2.1定義與初始化
2.1.1一維陣列的定義
(1) 陣列名的命名規則和變數名相同,遵循識別符號命名規則,
(2) 在定義陣列時,需要指定陣列中元素的個數,方括號中的常量運算式用來表示元素的個數,即陣列長度,
(3) 常量運算式中可以包括常量和符號常量,不能包含變數,
型別說明符 陣列名[常量運算式]
//例如
int a[10];

陣列元素的下標從0開始,用“int a[10];”定義陣列,則最大下標值為9,不存在陣列元素a[10],定義的陣列元素分別為:

一維陣列儲存地址是連續的,
#include <stdio.h>
int main()
{
int a[10] = { 0,1,2,3,4,5,6,7,8,9 };
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%p \n", &a[i]);//列印陣列各元素的地址
}
return 0;
}
輸出結果
0079FCA8
0079FCAC
0079FCB0
0079FCB4
0079FCB8
0079FCBC
0079FCC0
0079FCC4
0079FCC8
0079FCCC
D:\gtee\C-learning-code-and-project\test_731\Debug\test_731.exe (行程 27748)已退出,代碼為 0,
按任意鍵關閉此視窗. . .
每個元素儲存地址都是相鄰的,
2.1.2一維陣列初始化
為了使程式簡潔,常在定義陣列的同時給各陣列元素賦值,這稱為陣列的初始化,
初始化陣列時有以下幾種方法:
(1) 在定義陣列時對全部陣列元素賦予初值,
int a[10]={0,1,2,3,4,5,6,7,8,9};
將陣列中各元素的初值順序放在一對花括號內,資料間用逗號分隔,花括號內的資料就稱為“初始化串列”,
(2) 可以只給陣列中的一部分元素賦值,
int a[10]={0,1,2,3,4};
定義a陣列有10個元素,但花括號內只提供5個初值,這表示只給前面5個元素賦初值,系統自動給后5個元素賦初值為0,
(3) 給陣列中全部元素賦初值為0,
int a[10]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
//或
int a[10]={0}; //未賦值的部分元素自動設定為0
(4) 在對全部陣列元素賦初值時,由于資料的個數已經確定,因此可以不指定陣列長度,
int a[5]={1,2,3,4,5};
//或
int a[ ]={1,2,3,4,5};
但是,如果陣列長度與提供初值的個數不相同,則方括號中的陣列長度不能省略,
2.1.3如何使用一維陣列中的元素呢?
陣列名[下標]
//例如
int i = a[2];
//訪問第三個元素
只能參考陣列元素而不能一次整體呼叫整個陣列全部元素的值,
陣列元素與一個簡單變數的地位和作用相似,
“下標”可以是整型常量或整型運算式,而陣列定義時C99之前只支持常量運算式,要注意區分,
陣列的大小可以通過sizeof得到陣列總大小除以陣列第一個元素大小得到
a[]={1,2,3,4,5,6,7,8,9,0};
size = sizeof(a) / sizeof(a[0]);//size = 10
2.2簡單程式舉例
對10個陣列元素依次賦值為0,1,2,3,4,5,6,7,8,9,要求按逆序輸出,
#include<stdio.h>
//對10個陣列元素依次賦值為0,1,2,3,4,5,6,7,8,9,要求按逆序輸出,
int main()
{
int i, a[10];
for (i = 0; i <= 9; i++) //對陣列元素a[0]~a[9]賦值
a[i] = i;
for (i = 9; i >= 0; i--) //輸出a[9]~a[0]共10個陣列元素
printf("%d ", a[i]);
printf("\n");
return 0;
}

用陣列來處理求Fibonacci數列問題,用陣列求斐波拉契數列前20個元素
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//用陣列來處理求Fibonacci數列問題
int main()
{
int i;
int f[20] = { 1,1 }; //對最前面兩個元素f[0]和f[1]賦初值1
for (i = 2; i < 20; i++)
f[i] = f[i - 2] + f[i - 1]; //先后求出f[2]~f[19]的值
for (i = 0; i < 20; i++)
{
if (i % 5 == 0)
printf("\n"); //控制每輸出5個數后換行
printf("%d \t", f[i]); //輸出一個數
}
printf("\n");
return 0;
}

2.3冒泡排序
設計一個程式,將一個整型陣列內的十個數按從小到大的規則排列
思路:從陣列首位元素開始將陣列的相鄰兩個元素進行比較,如果前面的元素比后面大,則進行交換否則不交換,每進行一趟排序就能將一個最大的數放在最后,如果需要把所有元素都排好序,需要進行陣列元素個數減一趟排序,因為每一趟排序都會排出一個最大的數放在后面,也就是說每排序一趟就有一個數排序完成,所以每完成一趟排序,排序比較次數就減一,假設陣列元素個數為size,則一共要進行size-1趟排序,第n趟排序比較次數為size-n,比如10個元素進行冒泡排序,一共要進行9趟排序,第一趟需排序比較9次,第二趟8次,第三趟7次,以此類推,
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//冒泡排序(int) 從小到大
void bubble_sort(int* arr, int size)
{
int i = 0;
for (i = 0; i < size - 1; i++)
{
int j = 0;
int flag = 1;//判斷資料是否發生交換,默認沒有發生交換
for (j = 0; j < size - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = 0;
}
}
if (flag)
break;
}
}
int main()
{
int arr[] = { 9,7,5,2,0,1,8,3,6,4 };
int i = 0;
int size = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < size; i++)
{
//scanf("%d", &arr[i]);
printf("%d ", arr[i]);
}
printf("\n");
bubble_sort(arr, size);//排序
for (i = 0; i < size; i++)
{
printf("%d ", arr[i]);
}
return 0;
}

3.二維陣列
3.1定義與初始化
3.1.1二維陣列的定義
二維陣列常稱為矩陣(matrix),把二維陣列寫成行(row)和列(column)的排列形式,可以有助于形象化地理解二維陣列的邏輯結構,
//二維陣列定義格式
型別說明符 陣列名[常量運算式][常量運算式]

float a[3][4], b[5][10];
//定義a為3×4(3行4列)的浮點數陣列,b為5×10(5行10列)的浮點數陣列
int a[2][5] = { {1,2,3,4,5},{6,7,8,9,10} };
int b[][5] = { {1,2,3,4,5},{6,7,8,9,10} };
//定義2行5列的整型陣列
//其中行可以省略,但是列不能省
二維陣列可被看作一種特殊的一維陣列: 它的元素又是一個一維陣列,
例如,float a[3][4];可以把a看作一個一維陣列,它有3個元素:a[0], a[1], a[2],每個元素又是一個包含4個元素的一維陣列:
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]
既然說二維陣列是一個特殊的一維陣列,所以二維陣列的儲存地址也是連續的,只是我們將二維陣列理解為矩陣中行與列的形式,
用矩陣形式(如3行4列形式)表示二維陣列,是邏輯上的概念,能形象地表示出行列關系,而在記憶體中,各元素是連續存放的,不是二維的,是線性的,
#include <stdio.h>
int main()
{
int a[2][5] = { {1,2,3,4,5},{6,7,8,9,10} };
int b[][5] = { {1,2,3,4,5},{6,7,8,9,10} };
int i = 0;
for (i = 0; i < 2; i++)
{
int j = 0;
for (j = 0; j < 5; j++)
{
printf("%p \n", &a[i][j]);
}
}
return 0;
}
輸出結果
00F7F728
00F7F72C
00F7F730
00F7F734
00F7F738
00F7F73C
00F7F740
00F7F744
00F7F748
00F7F74C
D:\gtee\C-learning-code-and-project\test_731\Debug\test_731.exe (行程 31064)已退出,代碼為 0,
按任意鍵關閉此視窗. . .
3.1.2二維陣列的初始化
//二維陣列參考
陣列名[下標] [下標]
(1)分行給二維陣列賦初值,(最清楚直觀)
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
(2)可以將所有資料寫在一個花括號內,按陣列元素在記憶體中的排列順序對各元素賦初值,
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
(3)可以對部分元素賦初值,
int a[3][4]={{1},{5},{9}};//①
int a[3][4]={{1},{0,6},{0,0,11}}; //②
int a[3][4]={{1},{5,6}}; //③
int a[3][4]={{1},{},{9}}; //④

(4)如果對全部元素都賦初值(即提供全部初始資料),則定義陣列時對第1維的長度(行)可以不指定,但第2維的長度(列)不能省,
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};
在定義時也可以只對部分元素賦初值而省略第1維(行)的長度,但應分行賦初值,
int a[][4]={{0,0,3},{},{0,10}};
3.2簡單程式舉例
逆置矩陣:BC107 矩陣轉置
描述
KiKi有一個矩陣,他想知道轉置后的矩陣(將矩陣的行列互換得到的新矩陣稱為轉置矩陣),請編程幫他解答,
輸入描述:
第一行包含兩個整數n和m,表示一個矩陣包含n行m列,用空格分隔, (1≤n≤10,1≤m≤10)
從2到n+1行,每行輸入m個整數(范圍-231~231-1),用空格分隔,共輸入n*m個數,表示第一個矩陣中的元素,
輸出描述:
輸出m行n列,為矩陣轉置后的結果,每個數后面有一個空格,
輸入:
2 3
1 2 3
4 5 6
輸出:
1 4
2 5
3 6
#include <stdio.h>
int main()
{
int n = 0;
int m = 0;
int arr1[15][15] = {0};
int arr2[15][15] = {0};
scanf("%d%d",&n,&m);
int i = 0;
int j = 0;
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
scanf("%d",&arr1[i][j]);
arr2[j][i] = arr1[i][j];//將矩陣1的元素儲存在矩陣2,其中它們的行列數相反
}
}
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
printf("%d ",arr2[i][j]);//列印
}
printf("\n");
}
return 0;
}
3.2三子棋
小時候玩過的三子棋(井字棋),你還記得嗎?C語言實作簡單的三子棋小游戲(點擊直達)
3.3掃雷
當心!前面有地雷!C語言實作簡單掃雷小游戲(點擊直達)
4.字符陣列
4.1定義與初始化
4.1.1字符陣列的定義
用來存放字符資料的陣列是字符陣列,在字符陣列中的一個元素記憶體放一個字符,
char c[10];
c[0]='I';
c[1]=' ';
c[2]='a';
c[3]='m';
c[4]=' ';
c[5]='h';
c[6]='a';
c[7]='p';
c[8]='p';
c[9]='y';

由于字符型資料是以整數形式(ASCII代碼)存放的,因此也可以用整型陣列來存放字符資料,
int c[10];
c[0]='a'; //合法,但浪費存盤空間,因為char占1位元組,int占4位元組
4.1.2字符陣列初始化
char c[10]={'I',' ', 'a','m',' ','h','a','p','p','y'};
//把10個字符依次賦給c[0]~c[9]這10個元素
如果在定義字符陣列時不進行初始化,則陣列中各元素的值是不可預料的,
如果花括號中提供的初值個數(即字符個數)大于陣列長度,則出現語法錯誤,
char c[10]={'c',' ','p', 'r','o','g','r','a','m'};

如果初值個數小于陣列長度,則只將這些字符賦給陣列中前面那些元素,其余的元素自動定為空字符(即′\0′),
char c[]={'I',' ', 'a','m',' ','h','a','p','p','y'};
//陣列c的長度自動定為10
字符陣列可以用來初始字串,字串最后都會含有一個’\0’,是結束轉義符,當以陣列列印字串時,會以’\0’為標志,從陣列第一個元素輸出到陣列’\0’前一個元素,
char ch1[20] = { 'F','B','I',' ','o','p','e','n',' ','t','h','e',' ','d','o','o','r','!','\0'};
char ch2[20] = "FBI open the door!";
//這兩個是子是等價的
字符陣列和一維陣列一樣,儲存地址是連續的,字符陣列只是型別為char的陣列,
4.2簡單程式舉例
使用陣列輸出FBI open the door!
#include <stdio.h>
int main()
{
char ch1[20] = { 'F','B','I',' ','o','p','e','n',' ','t','h','e',' ','d','o','o','r','!','\0'};
char ch2[20] = "FBI open the door!";
printf("%s\n", ch1);
printf("%s\n", ch2);
return 0;
}
輸出結果
FBI open the door!
FBI open the door!
D:\gtee\C-learning-code-and-project\test_731\Debug\test_731.exe (行程 688)已退出,代碼為 0,
按任意鍵關閉此視窗. . .
4.3簡要介紹與字符相關的庫函式
4.3.1輸出輸入字串的函式
puts(字符陣列);//輸出
gets(字符陣列);//輸入
回傳的函式值是字串str的第一個元素的地址,
用puts和gets函式只能輸出或輸入一個字串,
puts作用:將一個字串(以′\0′結束的字符序列)輸出到終端,
用puts函式輸出的字串中可以包含轉義字符,
在用puts輸出時將字串結束標志′\0′轉換成′\n′,即輸出完字串后換行,
gets作用:從終端輸入一個字串到字符陣列,并且得到一個函式值,該函式值是字符陣列的起始地址,
4.3.2字串連接函式
strcat(字串1, 字串2);
作用:把兩個字符陣列中的字串連接起來,把字串2接到字串1的后面,結果放在字符陣列1中,函式呼叫后得到一個函式值——字符陣列1的地址,
字符陣列1必須足夠大,以便容納連接后的新字串,
連接前兩個字串的后面都有′\0′,連接時將字串1后面的′\0′取消,只在新串最后保留′\0′,
4.3.3字串復制函式
strcpy(字串1, 字串2);
作用:將字串2復制到字符陣列1中去,
字符陣列1必須定義得足夠大,以便容納被復制的字串2,字符陣列1的長度不應小于字串2的長度,
“字符陣列1”必須寫成陣列名形式,“字串2”可以是字符陣列名,也可以是一個字串常量,
若在復制前未對字符陣列1初始化或賦值,則其各位元組中的內容無法預知,復制時將字串2和其后的′\0′一起復制到字符陣列1中,取代字符陣列1中前面的字符,未被取代的字符保持原有內容,
不能用賦值陳述句將一個字串常量或字符陣列直接給一個字符陣列,字符陣列名是一個地址常量,它不能改變值,正如數值型陣列名不能被賦值一樣,
可以用strncpy函式將字串2中前面n個字符復制到字符陣列1中去,
將str2中最前面2個字符復制到str1中,取代str1中原有的最前面2個字符,但復制的字符個數n不應多于str1中原有的字符(不包括′\0′),
4.3.4字串比較函式
strcmp(字串1, 字串2);
對兩個字串比較不能直接用str1>str2進行比較,因為str1和str2代表地址而不代表陣列中全部元素,而只能用 (strcmp(str1,str2)>0)實作,系統分別找到兩個字符陣列的第一個元素,然后順序比較陣列中各個元素的值,
作用:比較字串1和字串2,
字串比較的規則是: 將兩個字串自左至右逐個字符相比(按ASCII碼值大小比較),直到出現不同的字符或遇到′\0′為止,
(1) 如全部字符相同,則認為兩個字串相等;
(2) 若出現不相同的字符,則以第1對不相同的字符的比較結果為準,
比較的結果由函式值帶回,
(1) 如果字串1與字串2相同,則函式值為0,
(2) 如果字串1>字串2,則函式值為一個正整數,
(3) 如果字串1<字串2,則函式值為一個負整數,
4.3.5測字串長度的函式
strlen(字串);
作用:測驗字串長度的函式,函式的值為字串中的實際長度(不包括′\0′在內),
4.3.6轉換為大小寫的函式
strlwr(字串);//大寫字母轉小寫字母
strupr(字串)//小寫字母轉大寫字母
作用:
srtlwr將字串中大寫字母換成小寫字母,
strupr將字串中小寫字母換成大寫字母,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/291537.html
標籤:其他
上一篇:剛畢業一個月,7 月正式入職深圳互聯網公司的前端月度作業匯報 |總結
下一篇:C語言詳解:運算子
