2024-2025-1 20241312《計算機基礎與程式設計》第九周學習總結

宋家璘發表於2024-11-24

作業資訊

這個作業屬於哪個課程 <班級的連結>(2024-2025-1-計算機基礎與程式設計
這個作業要求在哪裡 <作業要求的連結>(如2024-2025-1計算機基礎與程式設計第一週作業)
這個作業的目標 作業系統責任
記憶體與程序管理
分時系統
CPU排程
檔案、檔案系統
檔案保護
磁碟排程
作業正文 https://www.cnblogs.com/songjialinsjl/p/18565271

教材學習內容總結

  1. 作業系統責任
    作業系統(OS)是管理計算機硬體與軟體資源的系統軟體,它負責提供使用者與計算機硬體之間的互動介面,同時負責分配和管理系統資源,如處理器時間、記憶體空間和檔案儲存。

  2. 記憶體與程序管理

    • 記憶體管理:作業系統負責記憶體的分配和回收,確保程式執行時有足夠的記憶體空間,同時防止不同程式間的記憶體衝突。
    • 程序管理:作業系統需要建立、排程、管理和終止程序。程序是程式執行的實體,作業系統透過程序管理確保程式能夠併發執行。
  3. 分時系統
    分時系統是一種作業系統,它允許多個使用者同時使用計算機資源。系統將CPU時間分成短的時間段,每個使用者或程序輪流使用這些時間段,從而建立了多工處理的假象。

  4. CPU排程
    CPU排程(或稱程序排程)是作業系統決定哪個程序應該獲得CPU時間的技術。排程演算法的目標包括公平性、響應時間、吞吐量和優先順序處理等。

  5. 檔案、檔案系統

    • 檔案:檔案是資料儲存的基本單位,作業系統提供建立、讀取、寫入和刪除檔案的功能。
    • 檔案系統:檔案系統是組織和管理檔案儲存和檢索的方式,它包括檔案的命名、儲存、檢索和保護。
  6. 檔案保護
    檔案保護確保檔案只能被授權的使用者訪問和修改。作業系統透過許可權控制和訪問控制列表(ACLs)來實現檔案保護。

  7. 磁碟排程
    磁碟排程是作業系統決定磁碟請求處理順序的演算法。由於磁碟I/O操作相對較慢,磁碟排程演算法(如先進先出、最短尋道時間優先等)旨在減少尋道時間和旋轉延遲,提高磁碟效能。

教材學習中的問題和解決過程(先問 AI)

問題一:指標怎麼指向二維陣列?
回答:在C語言中,二維陣列可以透過指標來訪問和操作。二維陣列本質上是一個陣列的陣列,因此可以透過多種方式使用指標來指向和操作二維陣列。以下是幾種常見的方法:

1. 指向整個二維陣列

你可以直接讓指標指向二維陣列的首地址:

int arr[3][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};
int (*ptr)[4] = arr; // ptr指向整個二維陣列

在這裡,ptr 是一個指向含有4個整數的陣列的指標,即指向二維陣列的第一行。

2. 指向二維陣列的一行

你也可以讓指標指向二維陣列的某一行:

int *rowPtr = arr[0]; // rowPtr指向二維陣列的第一行

在這裡,rowPtr 是一個指向整型的指標,指向二維陣列的第一行的第一個元素。

3. 透過指標訪問二維陣列元素

透過指標訪問二維陣列的元素,你可以使用以下方式:

// 指向整個二維陣列
int (*ptr)[4] = arr;
int elem1 = ptr[1][2]; // 訪問第二行第三列的元素,等同於arr[1][2]

// 指向二維陣列的一行
int *rowPtr = arr[0];
int elem2 = rowPtr[3]; // 訪問第一行第四個元素,等同於arr[0][3]

4. 使用指標遍歷二維陣列

你可以使用指標來遍歷二維陣列:

int arr[3][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};
int (*ptr)[4] = arr;

for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 4; j++) {
        printf("%d ", ptr[i][j]);
    }
    printf("\n");
}

5. 動態分配二維陣列

你還可以透過指標動態分配二維陣列:

int rows = 3;
int cols = 4;
int (*arr)[4] = malloc(rows * sizeof(*arr)); // 分配整個陣列

if (arr != NULL) {
    for (int i = 0; i < rows; i++) {
        arr[i] = malloc(cols * sizeof(int)); // 分配每一行
        if (arr[i] == NULL) {
            // 處理記憶體分配失敗
        }
    }
}

// 使用arr...

// 釋放記憶體
for (int i = 0; i < rows; i++) {
    free(arr[i]);
}
free(arr);

在動態分配的情況下,你需要分別分配每一行的記憶體,並確保最後釋放每一行以及整個陣列的記憶體。這樣可以提供更大的靈活性,但也需要更多的記憶體管理。
問題二:p+n*i+j在二維陣列中分別什麼意思
回答:表示式 p + n*i + j 在二維陣列的上下文中通常用於計算元素的偏移量或索引。這裡,p 是基指標或起始索引,n 是陣列的列數,i 是行索引,j 是列索引。這個表示式可以用來計算二維陣列中特定元素的記憶體地址。

解釋表示式 p + n*i + j

  • p:基指標或起始索引。
  • n:二維陣列的列數。
  • i:行索引。
  • j:列索引。

表示式的作用:

這個表示式計算了從基指標 p 開始,到達二維陣列中位置 (i, j) 的元素的偏移量。這在指標算術中非常有用,特別是當處理動態分配的二維陣列或透過指標訪問陣列元素時。

示例:

假設我們有一個二維陣列 arr,其大小為 34 列,我們想透過指標訪問位置 (1, 2) 的元素。

#include <stdio.h>

int main() {
    int arr[3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };
    int rows = 3, cols = 4;
    int i = 1, j = 2;
    int *ptr = &arr[0][0]; // 基指標指向陣列的開始

    // 計算偏移量
    int offset = cols * i + j;
    int elem = *(ptr + offset); // 透過指標訪問元素

    printf("Element at (%d, %d) is: %d\n", i, j, elem); // 應該輸出7
    return 0;
}

在這個示例中,ptr 是指向陣列 arr 第一個元素的指標。表示式 ptr + offset 計算了到達位置 (1, 2) 的元素的指標。透過解引用這個指標,我們得到了該位置的元素值。

總結:

表示式 p + n*i + j 是一種在二維陣列中計算元素偏移量的方法,這在透過指標訪問和運算元組元素時非常有用。它允許你直接跳到陣列中的任何位置,而不需要逐個遍歷行和列。

相關文章