1. 程式人生 > 實用技巧 >C語言學習筆記 初識陣列

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,陣列的大小 - 1] 編譯器和執行環境都不會檢查陣列下標是否越界,無論是對陣列單元做讀還是寫。這是程式設計師的
責任來保證程式只使用有效的下標值。

程式:輸入數量不確定的[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)