學期2024-2025-1 學號20241317 《計算機基礎與程序設計》第十一周學習總結
學期2024-2025-1 學號20241317 《計算機基礎與程序設計》第十一周學習總結
作業信息
| 這個作業屬于哪個課程 | <班級的鏈接>(如2024-2025-1-計算機基礎與程序設計) |
|---|---|
| 這個作業要求在哪里 | <作業要求的鏈接>(如2024-2025-1計算機基礎與程序設計第一周作業) |
| 這個作業的目標 | <寫上具體方面> |
| 作業正文 | http://www.rzrgm.cn/manurios/p/18593468 |
教材學習內容總結
C語言程序設計第十章通常涉及的是C語言中的高級主題。不過,由于不同的教材和課程可能會有不同的章節安排,以下是一個較為通用的第十章知識點總結,可能包括但不限于以下內容:
-
預處理器指令:
#include:用于包含標準庫或用戶自定義的頭文件。#define:用于定義宏。#ifdef、#ifndef、#endif:用于條件編譯。
-
位運算:
- 位與(&)、位或(|)、位非(~)、位異或(^)。
- 位左移(<<)和位右移(>>)。
-
文件操作:
fopen、fclose、fread、fwrite、fprintf、fscanf、fgets、fputc、fgetc等函數的使用。- 文件指針和文件緩沖區的概念。
-
結構體:
- 結構體的定義和使用。
- 結構體數組。
- 結構體與函數。
-
聯合(Union):
- 聯合的定義和使用。
- 聯合與結構體的區別。
-
枚舉(Enum):
- 枚舉類型的定義和使用。
-
動態內存分配:
malloc、calloc、realloc、free函數的使用。
-
指針的高級應用:
- 指針和數組的關系。
- 指針和函數的關系。
- 指針的指針。
-
遞歸:
- 遞歸函數的定義和使用。
- 遞歸的注意事項和常見問題。
-
信號處理:
signal函數的使用。- 信號集和信號掩碼。
-
多線程編程(如果教材包含):
pthread庫的使用。- 線程的創建、同步和銷毀。
-
網絡編程(如果教材包含):
- 套接字(Socket)的概念。
- 網絡通信的基本流程。
請注意,具體內容可能會根據你所使用的教材或課程有所不同。如果你有具體的教材或課程大綱,可以提供更詳細的信息,以便給出更準確的知識點總結。
通過 AI 工具總結一下內容,自己再補充
通過思維導圖形成知識體系
看懂就過,看不懂,學習有心得的記一下
教材學習中的問題和解決過程(先問 AI)
(一個模板:我看了這一段文字 (引用文字),有這個問題 (提出問題)。 我查了資料,有這些說法(引用說法),根據我的實踐,我得到這些經驗(描述自己的經驗)。 但是我還是不太懂,我的困惑是(說明困惑)。【或者】我反對作者的觀點(提出作者的觀點,自己的觀點,以及理由)。 )
- 問題1:聯合與結構體的區別是什么?
- 問題1解決方案:在C語言中,聯合(Union)和結構體(Structure)都是用戶定義的復合數據類型,但它們之間存在一些關鍵的區別:
-
存儲方式:
- 結構體:結構體中的所有成員都占用自己的內存空間,它們是同時存儲的。這意味著結構體的大小是其所有成員大小的總和(考慮到內存對齊)。
- 聯合:聯合中的所有成員共享同一塊內存空間。在任意時刻,聯合只能存儲其中一個成員的值。聯合的大小等于其最大成員的大小(也要考慮內存對齊)。
-
內存占用:
- 結構體:由于所有成員都同時存儲,結構體通常占用更多的內存。
- 聯合:由于成員共享內存,聯合通常占用較少的內存。
-
使用目的:
- 結構體:用于存儲不同的、相關的數據項,這些數據項不一定在所有時間都同時使用。
- 聯合:用于存儲多個數據項,但這些數據項在同一時間只能使用其中一個。聯合常用于需要節省空間或處理多種數據類型的場景。
-
訪問成員:
- 結構體:可以通過點操作符(
.)或箭頭操作符(->)安全地訪問所有成員,不會覆蓋其他成員。 - 聯合:雖然也可以通過點操作符(
.)或箭頭操作符(->)訪問成員,但訪問一個成員可能會覆蓋另一個成員的值,因此需要小心使用。
- 結構體:可以通過點操作符(
-
初始化:
- 結構體:可以初始化所有成員,也可以只初始化部分成員(使用指定初始化器)。
- 聯合:只能初始化一個成員,因為所有成員共享內存。
-
清零:
- 結構體:使用
memset清零結構體會清零所有成員。 - 聯合:使用
memset清零聯合只會清零共享的內存區域。
- 結構體:使用
-
賦值:
- 結構體:不能直接將一個結構體賦值給另一個結構體,除非使用
memcpy或結構體賦值運算符(C11標準引入)。 - 聯合:可以直接將一個聯合賦值給另一個聯合,因為它們共享內存。
- 結構體:不能直接將一個結構體賦值給另一個結構體,除非使用
-
傳遞和返回:
- 結構體:作為函數參數時,通常是通過值傳遞或引用傳遞。
- 聯合:作為函數參數時,也可以通過值傳遞或引用傳遞,但由于共享內存的特性,有時可以直接傳遞聯合的地址。
根據具體的應用場景和需求,開發者可以選擇使用結構體或聯合來存儲和管理數據。
- 問題2:為什么將一個聯合賦值給另一個聯合,它們共享內存
- 問題2解決方案:在C語言中,將一個聯合賦值給另一個聯合,它們共享內存的原因是因為聯合(union)是一種特殊的數據結構,其內部的所有成員都共享同一塊內存空間。這意味著無論聯合中定義了多少個成員,它們實際上都是同一個存儲位置的別名。
以下是幾個關鍵點來解釋為什么聯合賦值會導致它們共享內存:
-
內存共享機制:
- 聯合的定義使得它的所有成員都從同一塊內存地址開始存儲。因此,當一個聯合被賦值給另一個聯合時,它們實際上都指向了同一塊內存區域。
-
地址相同:
- 當你將一個聯合變量賦值給另一個時,你只是復制了這塊內存的地址,而不是內存中的內容。這意味著兩個聯合變量現在指向了同一塊內存,任何對這塊內存的修改都會反映在兩個聯合變量上。
-
節省空間:
- 聯合的設計初衷之一是為了節省空間。通過共享內存,聯合可以只占用最大成員所需的空間,而不是所有成員大小的總和。
-
數據覆蓋:
- 由于聯合的成員共享內存,對一個成員的賦值會覆蓋其他成員的值。因此,當你將一個聯合賦值給另一個聯合時,你實際上是在復制了這塊內存的當前狀態,而不是它們的獨立副本。
-
不可預測的行為:
- 如果同時通過兩個聯合變量訪問和修改內存,可能會導致不可預測的行為,因為它們實際上訪問的是同一塊內存區域。
-
賦值語義:
- 在C語言中,當一個聯合被賦值給另一個聯合時,這種賦值操作是通過內存拷貝實現的,而不是值拷貝。這意味著兩個聯合變量將共享同一塊內存空間。
因此,當你將一個聯合賦值給另一個聯合時,它們共享內存是因為聯合的數據結構定義了這樣的內存共享機制,這也是聯合與結構體的一個主要區別。結構體的成員各自擁有獨立的內存空間,而聯合的成員則共享相同的內存空間。
- ...
基于AI的學習
問題1:細講指針
回答:指針是C語言中一個非常核心和強大的概念,它提供了對內存的直接訪問和操作能力。以下是指針的一些基礎知識和詳細解釋:
1. 指針的定義
指針是一個變量,其存儲的是另一個變量的內存地址。指針變量的聲明通常包括指針類型和指針名,例如:
int *ptr; // ptr是一個指向整型變量的指針
2. 指針的類型
指針的類型決定了它可以指向的數據類型。例如:
int *ptr指向一個整型變量。float *ptr指向一個浮點型變量。char *ptr指向一個字符型變量。
3. 指針的初始化
指針變量在使用前應該被初始化,以避免指向隨機的內存地址。可以初始化為NULL或者具體的地址:
int a = 10;
int *ptr = &a; // ptr指向變量a的地址
int *ptr = NULL; // ptr初始化為NULL
4. 指針的解引用
通過指針訪問其指向的變量的值稱為解引用。使用*操作符來解引用指針:
int a = 10;
int *ptr = &a;
int value = *ptr; // value現在等于10
5. 指針的算術
指針可以進行加法和減法運算,但只能對同類型的指針進行。指針的加法實際上是按照指針指向的數據類型的大小進行跳轉:
char str[] = "Hello";
char *ptr = str;
ptr++; // ptr現在指向'e'
6. 指針和數組
指針和數組緊密相關。數組名本身可以作為指向數組第一個元素的指針:
int arr[5] = {1, 2, 3, 4, 5};
int *ptr = arr; // ptr指向數組的第一個元素
7. 指針和函數
指針可以作為函數參數傳遞,這允許函數直接修改傳入的變量:
void increment(int *num) {
(*num)++; // 增加指針指向的值
}
8. 指針的指針
指針的指針是指指向另一個指針的指針。這在處理多級指針和動態內存分配時非常有用:
int a = 10;
int *ptr1 = &a;
int **ptr2 = &ptr1;
9. 動態內存分配
使用malloc、calloc、realloc和free等函數可以在堆上動態分配和釋放內存。這些函數返回指向分配內存的指針:
int *ptr = (int *)malloc(sizeof(int)); // 分配一個整型大小的內存
if (ptr != NULL) {
*ptr = 20; // 使用分配的內存
free(ptr); // 釋放內存
}
10. 指針和字符串
在C語言中,字符串通常以字符數組的形式存儲,而字符數組的地址可以作為指向字符串的指針:
char str[] = "Hello";
char *ptr = str; // ptr指向字符串的首地址
11. 指針的比較
可以比較兩個指針是否相等,或者它們是否指向同一塊內存區域。也可以比較指針的值(即它們存儲的地址)。
12. 指針的注意事項
- 避免野指針(未初始化的指針)。
- 避免內存泄漏(分配了內存但沒有釋放)。
- 注意指針的生命周期,確保在指針使用完畢后釋放內存。
- 避免越界訪問,這可能導致程序崩潰或數據損壞。
指針是C語言中非常強大的工具,但也需要謹慎使用,以避免常見的錯誤和安全問題。
問題2:#ifdef、#ifndef、#endif:用于條件編譯。如何使用
回答:#ifdef、#ifndef 和 #endif 是 C 語言預處理器指令,用于條件編譯,即根據特定的條件決定是否編譯代碼的某個部分。這些指令通常用于根據不同的平臺、操作系統或編譯器選項來包含或排除代碼段。
以下是如何使用這些指令的詳細說明:
1. #ifdef(If defined)
#ifdef 指令用于檢查一個宏是否已經定義。如果宏已經定義,則編譯下面的代碼塊;如果沒有定義,則跳過該代碼塊。
#ifdef MACRO
// 如果宏MACRO已經定義,則編譯這段代碼
#endif // MACRO
2. #ifndef(If not defined)
#ifndef 指令用于檢查一個宏是否沒有定義。如果宏沒有定義,則編譯下面的代碼塊;如果已經定義,則跳過該代碼塊。
#ifndef MACRO
// 如果宏MACRO沒有定義,則編譯這段代碼
#endif // MACRO
3. #endif(End if)
#endif 指令用于結束由 #ifdef 或 #ifndef 開始的條件編譯塊。
使用示例
假設我們有一個宏 DEBUG,我們想要在調試模式下編譯某些代碼,而在發布模式下不編譯這些代碼:
#ifdef DEBUG
#include <stdio.h>
printf("Debug information: Variable x = %d\n", x);
#endif // DEBUG
在上面的代碼中,如果 DEBUG 宏被定義了,那么包含 printf 的代碼塊將被編譯;否則,這段代碼將被編譯器忽略。
同樣地,使用 #ifndef:
#ifndef DEBUG
// 這段代碼只有在DEBUG宏未定義時才會被編譯
#endif // DEBUG
組合使用
#ifdef 和 #ifndef 可以與 #else 結合使用,以提供兩種互斥的編譯選項:
#ifdef MACRO
// 如果MACRO定義了,編譯這段代碼
#else
// 如果MACRO沒有定義,編譯這段代碼
#endif
這種結構允許你根據宏是否存在來選擇兩個代碼塊中的一個進行編譯。
宏定義
宏通常在編譯前通過編譯器命令行選項定義,或者在代碼中使用 #define 指令定義:
#define MACRO
或者在編譯時通過命令行定義(以 GCC 為例):
gcc -DMACRO source.c
使用條件編譯可以使得代碼更加靈活,能夠適應不同的編譯環境和配置需求。
三個原則:
- 切勿原封不動地接受生成式人工智能工具的輸出;確保對其進行評估、完善和修改(或提示),以適應您的目標。
- 切勿將任何個人數據(自己、同學、老師等)或版權材料納入到你的提示詞中。這個可以說是保護個人隱私的最起碼的舉措。
- 所有人工智能生成工具都容易產生幻覺,因此會生成不準確或誤導性的信息,要學會甄別信息真假
選擇至少2個知識點利用chatgpt等工具進行蘇格拉底挑戰,并提交過程截圖,提示過程參考下面內容
“我在學***X知識點,請你以蘇格拉底的方式對我進行提問,一次一個問題”
核心是要求GPT:“請你以蘇格拉底的方式對我進行提問”
然后GPT就會給你提問,如果不知道問題的答案,可以反問AI:“你的理解(回答)是什么?”
如果你覺得差不多了,可以先問問GPT:“針對我XXX知識點,我理解了嗎?”
GPT會給出它的判斷,如果你也覺得自己想清楚了,可以最后問GPT:“我的回答結束了,請對我的回答進行評價總結”,讓它幫你總結一下。
代碼調試中的問題和解決過程
- 問題1:XXXXXX
- 問題1解決方案:XXXXXX
- 問題2:XXXXXX
- 問題2解決方案:XXXXXX
- ...
代碼托管
(statistics.sh腳本的運行結果截圖)
上周考試錯題總結
- 錯題1及原因,理解情況
- 錯題2及原因,理解情況
- ...
其他(感悟、思考等,可選)
xxx
xxx
學習進度條
| 代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
|---|---|---|---|---|
| 目標 | 5000行 | 30篇 | 400小時 | |
| 第一周 | 200/200 | 2/2 | 20/20 | |
| 第二周 | 300/500 | 2/4 | 18/38 | |
| 第三周 | 500/1000 | 3/7 | 22/60 | |
| 第四周 | 300/1300 | 2/9 | 30/90 |
嘗試一下記錄「計劃學習時間」和「實際學習時間」,到期末看看能不能改進自己的計劃能力。這個工作學習中很重要,也很有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。
-
計劃學習時間:XX小時
-
實際學習時間:XX小時
-
改進情況:
(有空多看看現代軟件工程 課件
軟件工程師能力自我評價表)
參考資料
- 《計算機科學概論(第七版)》
- ...

浙公網安備 33010602011771號