作業資訊
這個作業屬於哪個課程 | <班級的連結>(如2024-2025-1-計算機基礎與程式設計) |
---|---|
這個作業要求在哪裡 | <作業要求的連結>(如2024-2025-1計算機基礎與程式設計第七週作業 |
這個作業的目標 | <寫上具體方面>電腦科學概論(第七版)第8章 並完成雲班課測試,《C語言程式設計》第6章並完成雲班課測試 |
作業正文 | ... 本部落格連結 |
教材學習內容總結
《電腦科學概論(第七版)》第8章
- 抽象資料型別:
- 抽象資料型別是對資料及對資料操作的封裝,使用者只需要關心其邏輯特性而不必瞭解具體的實現細節。它提供了一種更高層次的資料抽象方式,使得程式的設計和理解更加容易。
- 資料結構:
- 棧:是一種具有特殊操作規則的線性表,遵循“後進先出”(LIFO)的原則。就像一個堆疊的盤子,最後放上去的盤子最先被拿走。在計算機程式中,棧常用於函式呼叫、表示式求值等場景,例如在程式呼叫函式時,函式的引數、區域性變數等資訊會被壓入棧中,函式執行結束後再從棧中彈出。
- 佇列:也是一種線性表,但遵循“先進先出”(FIFO)的原則。類似於排隊買票,先來的人先買到票。佇列在計算機系統中常用於任務排程、訊息傳遞等場景,比如作業系統中的任務佇列,按照任務到達的先後順序進行處理。
- 列表:是一種常見的資料結構,可以分為陣列實現的列表和鏈式實現的列表。陣列實現的列表在記憶體中是連續儲存的,訪問元素的速度較快,但插入和刪除元素的操作比較耗時;鏈式實現的列表則是透過節點之間的連結來儲存資料,插入和刪除元素相對較方便,但訪問元素需要遍歷連結串列。
- 樹:是一種分層的資料結構,具有根節點、子節點和葉節點等概念。二叉樹是樹的一種特殊形式,每個節點最多有兩個子節點。二叉樹有三種遍歷方式,分別是前序遍歷(先訪問根節點,再遍歷左子樹,最後遍歷右子樹)、中序遍歷(先遍歷左子樹,再訪問根節點,最後遍歷右子樹)和後序遍歷(先遍歷左子樹,再遍歷右子樹,最後訪問根節點)。
- 圖:圖是由節點(頂點)和邊組成的資料結構,可以分為有向圖和無向圖。圖在現實生活中有很多應用,比如社交網路中的人際關係圖、地圖導航中的道路圖等。
- 引數傳遞:介紹了形參和實參的區別。形參是在函式定義時指定的引數,僅在函式內部有效,用於接收呼叫函式時傳遞的實際引數的值;實參是在呼叫函式時傳遞給函式的具體數值或變數。
- 子程式:子程式是一段可以被其他程式呼叫的程式碼模組,它可以提高程式碼的複用性和可維護性。透過將一些常用的功能封裝成子程式,在程式的不同部分可以多次呼叫,減少了程式碼的重複編寫。
《C 語言程式設計(第四版)》第六章:
一、函式的基本概念
函式是 C 語言程式的基本組成模組,它將一個較大的程式任務分解為若干個較小且相對獨立的子任務,每個子任務由一個函式來實現。這樣可以提高程式的可讀性、可維護性和可複用性。一個函式由函式頭和函式體兩部分組成。函式頭包含函式的返回型別、函式名和引數列表(形式引數);函式體則包含了在函式被呼叫時執行的一系列語句,用花括號括起來。
二、函式的定義
函式定義的一般形式為:
返回型別 函式名(形式引數列表)
{
宣告部分
語句部分
}
例如:
int max(int x, int y)
{
int z;
if (x > y)
z = x;
else
z = y;
return z;
}
這裡定義了一個名為 max
的函式,它接受兩個 int
型別的引數 x
和 y
,在函式體中比較這兩個引數的大小,將較大的值賦給變數 z
,並透過 return
語句返回 z
的值。
三、函式的宣告
函式宣告的作用是把函式的名字、函式型別以及形參型別、個數和順序通知編譯系統,以便在呼叫該函式時系統按此進行對照檢查。函式宣告可以在主函式之前,也可以在主函式內部,但在呼叫函式之前。其一般形式為:
返回型別 函式名(引數型別列表);
例如:int max(int, int);
如果函式在主函式之前定義,則可以不進行宣告,因為編譯系統在編譯主函式之前已經知道了函式的相關資訊。
四、函式的引數傳遞
- 值傳遞:
在函式呼叫時,將實參的值複製一份傳遞給形參。形參和實參分別佔用不同的記憶體單元,對形參的修改不會影響實參的值。例如:
#include <stdio.h>
void swap(int a, int b)
{
int temp;
temp = a;
a = b;
b = temp;
printf("在 swap 函式中:a = %d, b = %d\n", a, b);
}
int main()
{
int x = 3, y = 5;
swap(x, y);
printf("在 main 函式中:x = %d, y = %d\n", x, y);
return 0;
}
在這個例子中,swap
函式試圖交換兩個引數的值,但由於是值傳遞,在 swap
函式中對 a
和 b
的修改不會影響到 main
函式中的 x
和 y
。
五、函式的返回值
函式可以返回一個值給呼叫它的函式。返回值的型別由函式定義時的返回型別指定。在函式體中使用 return
語句返回值,return
語句後面可以跟一個表示式,該表示式的值就是函式的返回值。當函式執行到 return
語句時,函式立即結束並將返回值帶回撥用處。如果函式不需要返回值,則將返回型別定義為 void
。例如:
double average(int a, int b)
{
return (double)(a + b) / 2;
}
這個函式計算兩個整數的平均值並以 double
型別返回。
六、函式的巢狀呼叫
C 語言中函式可以巢狀呼叫,即一個函式在執行過程中可以呼叫另一個函式。例如:
#include <stdio.h>
int f1(int x)
{
return x * x;
}
int f2(int x)
{
return f1(x) + 1;
}
int main()
{
int a = 3;
printf("結果:%d\n", f2(a));
return 0;
}
在這個例子中,main
函式呼叫 f2
函式,f2
函式又呼叫 f1
函式來完成特定的計算。
七、函式的遞迴呼叫
函式直接或間接呼叫自身稱為遞迴呼叫。遞迴函式通常包含兩個部分:遞迴部分和終止條件。遞迴部分用於將問題不斷分解為規模更小的子問題;終止條件用於在問題規模足夠小時停止遞迴,防止無限遞迴。例如計算階乘的遞迴函式:
int factorial(int n)
{
if (n == 0 || n == 1)
return 1;
else
return n * factorial(n - 1);
}
在計算 n
的階乘時,不斷呼叫自身計算 n - 1
的階乘,直到 n
為 0 或 1 時停止遞迴。
八、變數的作用域和生存期
-
作用域:
- 區域性變數:在函式內部或複合語句內部定義的變數稱為區域性變數,其作用域僅限於定義它的函式或複合語句內部。
- 全域性變數:在函式外部定義的變數稱為全域性變數,其作用域從定義位置開始到原始檔結束,可以被多個函式共享。但過多使用全域性變數可能會導致程式的可讀性和可維護性變差,並且容易引起命名衝突等問題。
-
生存期:
- 動態儲存變數:區域性變數屬於動態儲存變數,在函式呼叫時分配記憶體空間,函式執行結束時釋放記憶體空間。
- 靜態儲存變數:使用
static
關鍵字修飾的區域性變數或全域性變數屬於靜態儲存變數。靜態區域性變數在函式第一次呼叫時初始化,其生存期延長至整個程式執行期間,但作用域仍侷限於函式內部;靜態全域性變數的作用域限制在定義它的原始檔內,生存期為整個程式執行期間。
透過對函式相關知識的深入理解和掌握,可以編寫出結構更加清晰、功能更加強大且易於維護的 C 語言程式。
基於AI的學習
程式碼除錯中的問題和解決過程
問題:輸入1個字元,若為字母,輸出"Character",若為數字,輸出"Number",否則輸出"Not character or number"。
解決方法:尋找AI的幫助,瞭解到了新的知識
呼叫新的函式
#include<stdio.h>
#include<ctype.h>
int main()
{
char a;
scanf("%c",&a);
if(isalpha(a))
printf("character");
else if(isdigit(a))
printf("number");
else
printf("not character or number");
return 0;
}
學習進度條
程式碼行數(新增/累積) | 部落格量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第五週 | 900/1500 | 1/2 | 20/30 | |
第六週 | 1100/1600 | 1/4 | 18/38 | |
第七週 | 1300/1800 | 1/7 | 22/60 | |
第八週 | 1300/1300 | 0/9 | 30/90 |