C語言學習筆記 初識陣列
1.求一組數的平均數,並輸出大於該值的所有數。
#include <stdio.h> //求一組數的平均數,並輸出大於該值的所有數。輸入-1時結束輸入。 int main() { int x; double sum = 0; int cnt = 0; int number[100];//定義陣列 scanf("%d", &x); while (x!=-1) { number[cnt] = x;//對陣列中的元素賦值 //printf("%d ", number[cnt]); cnt++; sum+= x; //printf("%.2f", sum); scanf("%d", &x); } if (cnt > 0) { double average = sum / cnt; printf("average=%.2f\n", average); int i = 0; for ( i = 0; i < cnt; i++)//遍歷陣列 { if (number[i]>average)//使用陣列中的元素 { printf("%d ", number[i]); } } } return 0; } imput:1 2 3 4 5 6 7 8 9 10 -1 output: average=5.50 6 7 8 9 10
2. 陣列的使用
定義陣列
<型別> 變數名稱[元素數量] int grades[100] double number[20]
陣列是一種容器,,特點是:其中所有的元素具有相同的資料型別;一旦建立不能改變大小;陣列中的元素在記憶體中是連續依次排列的。
陣列的單元:陣列的每個單元就是陣列型別的一個變數,使用陣列時放在[]中的數字叫做下標或索引,下標從0開始計數。
責任來保證程式只使用有效的下標值。
程式:輸入數量不確定的[0,9]範圍內的整數,統計每一種數字出現的次數,輸入-1結束。
#include <stdio.h> int main() { const int number = 10;//陣列的大小 int x; int i; int count[number];//定義陣列 for (i = 0; i < number; i++) { //初始化陣列 count[i] = 0; } scanf("%d", &x); while (x != -1) { if (x >= 0 && x <= 9) { count[x]++;//陣列參與運算 } scanf("%d", &x); } for (i = 0; i < number; i++) { //遍歷陣列輸出 printf("%d:%d\n", i, count[i]); } return 0; } 1 1 2 3 3 3 6 -1 0:0 1:2 2:1 3:3 4:0 5:0 6:1 7:0 8:0 9:0
DEV-C++使用的編譯器是GCC,它允許使用變數作為陣列的長度定義陣列。
VC的編譯器不是GCC,它不允許你這樣做。在VS中會出錯,DEV-C++則完全不會。
3. 陣列運算
//陣列的整合初始化
int a[] = { 0,1,2,3,4,5 };
int a[] = { 0 };
//整合初始化時的定位C99only
int a[10] = { [0] = 2,[2] = 3,6,};
//用[n]在初始化資料中給出定位;
//沒有定位的資料接在前面的資料後面;
//其他的位置值補0;
//也可以不給出陣列的大小,讓編譯器算;
//特別適合初始資料稀疏的陣列。
//陣列的大小
//sizeof給出整個陣列所佔據內容的大小,單位是位元組
sizeof(a)/sizeof(a[0])
//陣列的賦值
//陣列變數本身不能被賦值,要把陣列中的所有元素交給另一個數組,必須採用遍歷
//陣列作為引數時,不能在[]中給出陣列的大小,不能再利用sizeof來計算陣列的元素個數,必須用另一個引數來傳入陣列的大小
4. 陣列例子
求素數
法一:
int isPrime(int x, int knownPrime[], int numberofknownPrime);//判斷能否被已知的且<x的素數整除 int main() { const int number = 10; //int prime[number] = {2};//VS中不支援變數定義陣列元素個數,DEVc++中使用變數定義長度時, //不可在定義時同時進行初始化賦值,需要在之後進行賦值。 //int prime[10]={2,0,0,0,0,0,0,0,0,0}; int prime[number]; prime[0] = 2; int j; for(j = 1;j<number;j++){ prime[j] = 0; } int i = 3; int count = 1; while(count < number){ if(isPrime(i, prime, count)){ prime[count++] = i;//相當於prime[count] = i;count++;將得到的素數新增到陣列中去。 } i++; } for(i = 0;i<count;i++){ printf("%d",prime[i]); if((i+1)%5) printf("\t"); else printf("\n"); } return 0; } int isPrime(int x, int knownPrime[], int numberofknownPrime) { int ret = 1; int i; for(i = 0;i<numberofknownPrime;i++){ if(x%knownPrime[i] == 0){ ret = 0; break; } } return ret; } output: 2 3 5 7 11 13 17 19 23 29
關於i++與++i
即i++返回的是i未更新的原值,++i返回的是更新後的值。
法二:構建素數表
構建素數表: 1.令x = 2 2.將2x, 3x, 4x乃至ax < n標記為非素數 3.令x為下一個沒有被標記為非素數的數,重複2;直到所有的數都被嘗試完畢。 虛擬碼: 欲構造n以內(不包含n)的素數表 1.開闢prime[n],初始化其所有元素為1,prime[x]為1表示x為素數 2.令x為2 3.如果x為素數,則對於(i = 2; i * x < n; i++)令prime[x] = 0 4.令x++,如果x<n則重複3,否則結束。
程式:
int main() { const int maxnumber = 15; //int isPrime[number]; int isPrime[15]; int x; int i; for (i = 0; i < maxnumber; i++) { isPrime[i] = 1; } //for test------------------------ printf("\t"); for (i = 2; i < maxnumber; i++) { printf("%d\t", i); } printf("\n"); //for test--------------------- for (x = 2; x < maxnumber; x++) { if (isPrime[x]) { for (i = 2; i * x < maxnumber; i++) { isPrime[i * x] = 0; } } //for test-------------- printf("%d\t", x); for (i = 2; i < maxnumber; i++) { printf("%d\t", isPrime[i]); } printf("\n"); } for (i = 2; i < maxnumber; i++) { if (isPrime[i]) { printf("%d\t", i); } } return 0; }
輸出:
2 3 4 5 6 7 8 9 10 11 12 13 14 2 1 1 0 1 0 1 0 1 0 1 0 1 0 3 1 1 0 1 0 1 0 0 0 1 0 1 0 4 1 1 0 1 0 1 0 0 0 1 0 1 0 5 1 1 0 1 0 1 0 0 0 1 0 1 0 6 1 1 0 1 0 1 0 0 0 1 0 1 0 7 1 1 0 1 0 1 0 0 0 1 0 1 0 8 1 1 0 1 0 1 0 0 0 1 0 1 0 9 1 1 0 1 0 1 0 0 0 1 0 1 0 10 1 1 0 1 0 1 0 0 0 1 0 1 0 11 1 1 0 1 0 1 0 0 0 1 0 1 0 12 1 1 0 1 0 1 0 0 0 1 0 1 0 13 1 1 0 1 0 1 0 0 0 1 0 1 0 14 1 1 0 1 0 1 0 0 0 1 0 1 0 2 3 5 7 11 13
5. 二維陣列
二維陣列的遍歷
for (i = 0; i < 3; i++) { for (j = 0; j < 5; j++) { a[i][j] = i * j; } }
例項:
1 //tic-tac-toe小遊戲 2 3 int main() 4 { 5 const int size = 3; 6 int board[size][size]; 7 int i, j; 8 int numofx; 9 int numofo; 10 int result = -1;//-1:沒人贏 1:x贏 0:o贏 11 12 //讀入矩陣 13 for (i = 0; i < size; i++) { 14 for (j = 0; j < size; j++) { 15 scanf("%d", &board[i][j]); 16 } 17 } 18 //檢查行 19 for (i = 0; i < size && result == -1; i++) { 20 numofx = numofo = 0; 21 for (j = 0; j < size; j++) { 22 if (board[i][j] == 1) { 23 numofx++; 24 } 25 else { 26 numofo++; 27 } 28 } 29 if (numofo == size) { 30 result = 0; 31 } 32 else if (numofx == size) { 33 result = 1; 34 } 35 } 36 37 //檢查列 38 if (result == -1) { 39 for (j = 0; j < size; j++) { 40 numofo = numofx = 0; 41 for (i = 0; i < size; i++) { 42 if (board[i][j] == 1) { 43 numofx++; 44 } 45 else { 46 numofo++; 47 } 48 } 49 if (numofo == size) { 50 result = 0; 51 } 52 else if (numofx == size) { 53 result = 1; 54 } 55 } 56 } 57 58 //檢查主對角線 59 if (result == -1) { 60 numofo = numofx = 0; 61 for (i = 0; i < size; i++) { 62 if (board[i][i] == 1) { 63 numofx++; 64 } 65 else { 66 numofo++; 67 } 68 } 69 if (numofo == size) { 70 result = 0; 71 } 72 else if (numofx == size) { 73 result = 1; 74 } 75 } 76 77 //檢查副對角線 78 if (result == -1) { 79 numofo = numofx = 0; 80 for (i = 0; i < size; i++) { 81 if (board[i][size - i - 1] == 1) { 82 numofx++; 83 } 84 else { 85 numofo++; 86 } 87 } 88 if (numofo == size) { 89 result = 0; 90 } 91 else if (numofx == size) { 92 result = 1; 93 } 94 } 95 96 return 0; 97 }
二維陣列的初始化
a[][5] = { {1,2,3,4,5}, {2,3,4,5,6}, }; 列數是必須給出的,行數可以由編譯器來數; 每行一個{},逗號分隔; 最後的逗號可以存在,有古老的傳統; 如果省略,表示補零; 也可以用定位(*C99 ONLY)