非線性結構:樹、圖
鏈表和隊列的結構特性不一樣,鏈表可以在任何位置插入、刪除,而隊列只能在隊尾入隊、隊頭出隊
對長度為n的線性表排序、在最壞情況下時間復雜度,二分查找為O(log2n),順序查找為O(n),哈希查找為O(1)
最壞情況下堆排序的時間復雜度最低;
層數/深度為n的滿二叉樹,節點個數為2^n -1
C語言的數值表示中,e/E后面必須是整數,前面必須有底數
靜態變量只初始化一次
對任何一顆二叉樹,度為0的結點(即葉子結點)總是比度為2的結點多一個
結構化程序的三種基本控制結構:順序、選擇和重復
數據庫管理系統為完成主要功能提供了相應的數據語言,它們是:數據定義語言,該語言負責數據的模式定義與數據的物理存取構建;數據操縱語言,該語言負責數據的操縱,包括查詢與增、刪、改等操作;數據控制語言,該語言負責數據完整性、安全性的定義與檢查以及并發控制、故障恢復等功能。
%md指輸出帶符號的十進制整數,給定最小寬度為m位,不足m位左端補空格,超過m位按實際位數輸出,%.nf表示以小數形式輸出實數,小數占n位,四舍五入到n位
數組元素a[i][j]可表示為*(a[i]+j)
如果在定義函數之后,定義的變量,該變量不能被之前的函數訪問
循環隊列的元素個數:(rear-front+m)%m---------------------m為隊列長度
堆棧的元素個數:(bottom-top+1)或(后棧頂-前棧頂)
關系模式中只有一種元素-------------------關系
關鍵字是指被C語言保留的,不能用作其他用途的一些標識符,它們在程序中都代表著固定的含義,用戶不可重新定義。預定義標識符是系統已經有過定義的標識符,用戶可以重新定義,可以作為變量名。scanf為庫函數名,屬于預定義標識符,可以被用戶重定義case為關鍵字,是選擇結構switch語句中的關鍵字,不可被用戶重定義
表達式不能被賦值 如:a+b=c
在類型轉換過程中,如果較高類型轉換成較低類型,直接忽略多余位數。
所有類型的指針變量都是地址,所占字節數均為4
%s控制符用于輸出字符串,輸出時從給定地址開始依次輸出字符,直到遇到’\0’結束。給字符變量賦值0,相當于賦值’\0’。
帶參數的宏定義不是進行簡單的字符串替換,而是要進行參數替換。例如:#define D(x) 4x+1; D(i+j)=4i+j+1
strcpy 的作用是將源字符串 src(包括字符串的結束符 \0)復制到目標字符串 dest 中。
對任何一棵二叉樹,度為0的節點(即葉子節點)總是比度為2的節點多一個。
軟件工程包含3個要素:方法、工具和過程。
在 C 語言中,return a = b; 返回的是 賦值操作完成后的結果。而a=b++是先賦值再自加
在 C 語言中,數組不能直接通過賦值操作符 = 來賦值。數組的賦值必須通過逐個元素賦值,或者使用函數(如 strcpy)。
在 C 語言中,聲明數組時必須指定大小(除非是初始化時使用字符串字面量)。未指定大小的數組聲明是非法的。
\后跟一個字符構成轉義字符也可以是八進制或十六進制數字
字符實例的一般形式是用一對單引號括起來的一個字符。
實體完整性約束:不能有空值
參照完整性約束:要么為空值,要么必須和原表一樣
定義指針必須初始化(指向某一變量、分配內存或置為NULL)
p++不管怎么樣都是先返回p的值進行外部運算再自增
指針指向結構體變量用 ->
變量指向結構體變量用 .
強制類型轉換數據類型需要用()括起來
整形數組空位自動賦值0、字符數組空位自動賦值\0
主鍵是最小可以唯一標識關系的屬性集
關鍵字是指被C語言保留的,不能用作其他用途的標識符
||語句左邊的條件成立就不會執行右邊的語句了
指針變量存儲的是地址值,所有地址值所占的字節都是一樣的
含指針的題目:注意變化的是指針還是指針指向的變量
&只能對變量取地址,不能對常量取地址
一個字符占8位
具體使用動態庫還是靜態庫是編譯時決定的不是預編譯的作用
strcopy(int* p,“aaa”)是將aaa賦值給p所指向的內存區域中
C語言語句中,若存在未被使用的量,則在轉化成機器指令時會被優化掉
符號常量(通過#define預處理器指令定義的常量)
符號常量除在預編譯階段可多次重新定義,其余地方都不能重新定義
例:
#define PI 3.14
#define PI 3.14159
有些算法是理論可行的,所以不能說的太絕對
變量是值可以改變的量,其所占有的內存空間不能隨意改變
函數體必須由{開始 C程序執行必須由main語句開始
反斜杠 \ 后面跟隨的數字可以表示八進制數,但僅限于1到3位的八進制數字
形參不能是常量
地址不能乘除運算
C語言中,函數名是一個指針,是函數的入口地址
對于一個空指針,必須先給它分配內存再讀取數據
運算符[]內的數據類型只能是int和char
自然連接:兩關系間的公共域相等值連接
操作系統的四項主要功能:進程管理、存儲管理、設備管理、文件管理
指令寄存器用于暫存當前正在執行的指令
一個指令執行包括取指令、存儲器讀、存儲器寫等一系列工作,每一項工作占用一個機器周期。一個指令執行完成占用一個指令周期。故一個指令周期包含n個機器周期
當定義多個變量賦同一個值時,不能用等式連寫的方式
C源程序中不能表示的數制是二進制(除非用特定的編譯器擴展)
逗號表達式(v1,v2,v3)的值為最后一個參數(v3)
宏名一般習慣用大寫字母表示,以便與變量名相區別;
if…else語句默認else語句總是與它上面最接近的if配對
函數不需要傳參數時,()內要明確定義void否則編譯器不會識別是否傳入參數到該函數
軟件測試的實施步驟是單元測試、集成測試、確認測試
指針類型是由指針所指向的地址所存放的數據類型決定
數據交換順序必須"一前一后"順序不能變
異或運算:相同為0、相異為1
通常數據存儲以小端字節序存儲
算法的目的是為了求解,即輸出。沒有輸出的算法是沒有意義的;
形參的值不能傳給實參,只能通過直接改變實參的值來改變實參;
extern、register、static、auto分別是定義外部變量、寄存器變量、靜態變量、自動變量‘其中自動變量和寄存器變量屬于動態存儲,調用時分配臨時單元;
free(q);釋放的是q所指的動態分配的內存空間;
標準輸入輸出中用文件指針FILE;文件描述符是系統提供的IO接口;
請求分頁式管理是動態內存管理的一種,它將經常反復執行和調用的工作區部分存儲起來;
標準輸入輸出#include <stdio.h> 有緩存機制
統一輸入輸出#include <unistd.h> 無緩存機制,直接參與系統調用
int x = (a = 5, b = a + 1, b * 2);//像這樣逗號表達式中出現多余的逗號是不合法的;
while(){循環體} 條件表達式比循環體執行多一次
do{循環體}while() 循環體和條件表達式的執行次數一樣
網絡字節序是大端字節序;主機字節序取決于計算機硬件架構;
實參和形參的類型應相同或賦值兼容,整形數據和字符型數據可以通用
賦值語句中未定義量只能有最左邊的一個
快速排序每經過一次元素的交換會產生新的逆序
strcmp(char *s1,cahr *s2);功能:比較字符串s1,s2的大小,s1==s2時返回0,s1>s2時返回值>0,s1<s2時,返回值<0;
sizeof函數取到的字符串長度是包括字符串結束標志’\0‘
strlen是計算以“\0”結束的字符串的長度的函數,函數值為字符串的實際長度,不包括“\0”
在調用一個函數的過程中又出現直接或間接地調用該函數本身,稱為函數的遞歸調用;在調用f1函數過程中要調用f2函數,而在調用f2函數的過程中又要調用f1函數是間接調用;
軟件調試的任務是診斷和改正程序中的錯誤
黑盒測試的主要方法有:等價類劃分法、邊界值分析法、錯誤推測法、因果圖等,主要用于軟件確認測試
在C語言中,不能直接將一個字符串數組賦值給另一個字符串數組。因為字符串在C語言中是以字符數組的形式存儲的,數組的賦值不能直接通過簡單的賦值語句完成。
字符型數組并不限定最后一個元素必須是‘’\0‘字符
字符串數組,是指數組中的每一個元素都是一個存放字符串的一維數組
在函數內部或復合語句內部定義的變量,均稱為局部變量;
當你定義一個數組時,數組的內存地址在定義時就已經確定了。故,只能改變其變量值不能改變其地址值;
在C程序中函數可以直接或間接的自己調用自己,稱為遞歸調用;遞歸必須要有一個明確的結束遞歸條件;
若循環中修改了全局變量的值,則全局變量的值會被更新,且會保留到下次循環中;
只有在做投影操作時,其結果的列數可能小于原表中的列數
軟件設計中常用的過程設計工具有:圖形工具:程序流程圖、N—S圖,PADHIPO圖;表格工具:判定表 語言工具:PDL(偽碼)
數據庫是有結構的數據的集合
函數聲明必須在函數調用之前,這樣編譯器才能正確解析函數調用。
函數聲明可以在文件的任何地方,只要它在函數調用之前。
函數聲明通常放在頭文件中,通過 #include 引入到需要使用該函數的文件中。
如果函數聲明在函數調用之后,會導致編譯錯誤或警告。
在C語言中,如果出現下標越界的情況,系統不管在編譯還是執行時都不會給出“下標越界”的錯誤提示
如果關系模式R中的某個屬性集不是R的主鍵,而是另一個關系R1的主鍵,則該屬性集是關系模式R的外鍵;外鍵是本關系表與其他關系表的聯系;
如果一個關系表的主鍵由多個屬性組成(即復合主鍵),某個非主屬性只依賴于主鍵的一部分,而不是整個主鍵,那么這種依賴關系就被稱為部分依賴。
在C語言中,類型轉換是指將一個數據類型轉換為另一個數據類型。雖然C語言允許很多類型的隱式轉換和顯式轉換,但某些類型轉換是無效的,可能會導致編譯錯誤、運行時錯誤或未定義行為。以下是一些常見的無效類型轉換情況:
1. 不兼容的類型賦值
- 問題:將一個類型直接賦值給不兼容的類型,而沒有進行顯式轉換。
- 示例:
int a = 10; char c = a; // 錯誤:int 轉換為 char 可能導致數據丟失,需要顯式轉換
- 解決方法:使用顯式類型轉換。
char c = (char)a; // 顯式轉換
2. 指針類型不匹配
- 問題:將一種指針類型賦值給另一種指針類型,而沒有進行顯式轉換。
- 示例:
int* p1; char* p2 = p1; // 錯誤:int* 和 char* 不兼容
- 解決方法:使用顯式類型轉換。
char* p2 = (char*)p1; // 顯式轉換
- 注意:雖然顯式轉換可以解決編譯錯誤,但這種轉換可能會導致運行時錯誤,特別是當指針指向的內存大小不一致時。
3. 從指針到整數的轉換
- 問題:將指針類型直接賦值給整數類型,而沒有進行顯式轉換。
- 示例:
int* p = NULL; int a = p; // 錯誤:指針不能直接賦值給整數
- 解決方法:使用顯式類型轉換。
int a = (int)p; // 顯式轉換
- 注意:這種轉換通常不推薦,因為指針和整數的大小可能不同,可能導致數據丟失或未定義行為。
4. 從整數到指針的轉換
- 問題:將整數類型直接賦值給指針類型,而沒有進行顯式轉換。
- 示例:
int a = 0; int* p = a; // 錯誤:整數不能直接賦值給指針
- 解決方法:使用顯式類型轉換。
int* p = (int*)a; // 顯式轉換
- 注意:這種轉換同樣可能導致未定義行為,特別是當整數值不是有效的內存地址時。
5. 函數指針類型不匹配
- 問題:將一個函數指針賦值給另一個不兼容的函數指針類型。
- 示例:
void f1(int a) {} void (*p1)(int) = f1; // 正確 void (*p2)(char) = p1; // 錯誤:函數指針類型不匹配
- 解決方法:確保函數指針的類型完全匹配,或者使用兼容的類型。
void (*p2)(int) = p1; // 正確
6. 無效的聯合類型轉換
- 問題:聯合體(union)中的成員類型不匹配,或者對聯合體成員進行非法的類型轉換。
- 示例:
union {int a;char b; } u; u.a = 10; int c = u.b; // 錯誤:u.b 是 char 類型,不能直接賦值給 int
- 解決方法:確保訪問聯合體成員時,類型匹配。
int c = u.a; // 正確
7. 從空指針到非空指針的轉換
- 問題:將空指針(
NULL
)賦值給非空指針類型,而沒有進行顯式轉換。 - 示例:
int* p = NULL; char* q = p; // 錯誤:空指針不能直接賦值給非空指針
- 解決方法:使用顯式類型轉換。
char* q = (char*)p; // 顯式轉換
8. 從非數值類型到數值類型的轉換
- 問題:將非數值類型(如結構體、聯合體)直接轉換為數值類型。
- 示例:
struct {int a;int b; } s; int a = s; // 錯誤:結構體不能直接轉換為整數
- 解決方法:如果需要提取結構體中的某個成員值,可以直接訪問該成員。
int a = s.a; // 正確
9. 從數值類型到非數值類型的轉換
- 問題:將數值類型直接轉換為非數值類型(如結構體、聯合體)。
- 示例:
int a = 10; struct {int x;int y; } s = a; // 錯誤:整數不能直接轉換為結構體
- 解決方法:如果需要將數值賦值給結構體的某個成員,需要顯式訪問該成員。
struct {int x;int y; } s; s.x = a; // 正確
10. 從浮點數到整數的轉換(可能導致精度丟失)
- 問題:將浮點數直接賦值給整數類型,可能會導致精度丟失。
- 示例:
float f = 10.5; int a = f; // 警告:浮點數到整數的轉換可能導致精度丟失
- 解決方法:使用顯式類型轉換,并注意精度問題。
int a = (int)f; // 顯式轉換
總結
在C語言中,類型轉換需要謹慎處理,尤其是涉及指針、函數指針、結構體等復雜類型時。為了避免無效的類型轉換,建議:
1. 明確類型轉換的意圖。
2. 使用顯式類型轉換(如 `(type)`)來避免編譯器警告。
3. 確保轉換后的類型與目標類型兼容。
4. 避免可能導致未定義行為的類型轉換,如將非法地址賦值給指針。
如果不確定類型轉換是否安全,可以查閱C語言標準或使用編譯器的警告選項(如 `-Wall`)來幫助發現潛在問題。
printf()函數中,當格式轉換說明符個數少于輸出項個數時,多余的輸出項不予輸出
break和continue只會影響最內層的循環即當前所在的循環;
無論是字符數組還是其他類型的數組都不能直接賦值為一個單一的字符或整數;
C語言中所有函數都有返回,void表示返回的無類型;
fopen(A)是創建文件A或若文件A已存在則清空A再進行操作;
->的優先級大于++;
左值是指一個可以出現在賦值運算符左邊的表達式,它表示一個存儲位置(memory location),可以被賦值或訪問。
右值是指一個不能出現在賦值運算符左邊的表達式,它表示一個值,而不是一個存儲位置。右值通常是一個臨時值,不能被取地址或賦值。
依賴是后者依賴于前者
在樹中,結點數為樹中所有結點的度之和再加1;
逗號表達式返回逗號后面的值,但逗號表達式都會從左到右依次運算;
()------------------------函數調用標識符
實型常量有小數形式和指數形式;
scanf和printf是C語言提供的輸入輸出函數;
printf輸出的數據都隱含右對齊
預定義的標識符是C語言標識符的一種
在C程序中的八進制和十六進制是整型;
printf函數和scanf函數都可以指定輸入數據的寬度
c語言中,位運算符和取模運算符運算對象必須是整型數
sizeof()是一種標識符不是函數,其返回值決定了它是一種什么類型的表達式;
關系數據庫規范化的目的是為了解決關系數據庫中的插入,刪除異常及數據冗余問題
第一范式要求數據庫表中的每一列都是不可再分的基本數據項
第二范式要求在滿足第一范式的基礎上,表中的每個非主屬性必須完全依賴于主鍵,而不能部分依賴于主鍵。也就是說,不能存在僅依賴于主鍵一部分的非主屬性。
第三范式非主鍵必須直接依賴于主鍵,不能存在傳遞依賴;
在C語言中,%md 是一種格式化輸出的格式說明符,用于控制整數的輸出寬度。這里的 m 是一個整數,表示輸出的最小寬度
宏定義#define 可以給任何數據定義但不會對其進行檢查
類型重定義typedef只能給變量類型重新定義但會對變量類型進行檢查,故更加安全;重命名后原名字仍可用