演算法筆記 第二章 C C 快速入門 學習總結

2021-09-12 19:44:31 字數 3687 閱讀 2033

如果時間充足的話,想學c語言的話推薦去看書《c和指標》,然後配著mooc上翁愷老師的課程一起看,看完之後基礎可以比較紮實,如果時間很緊張就仔細閱讀這部分內容,配著翁愷老師mooc一起。

由於之前有c的基礎,這學期也在學習c++(c++可以聽翁愷老師和侯捷老師的課,書用c++prime),所以很多基礎的部分就省略掉,只整理一些小點:

(1)cin 和 cout消耗的時間比printf和scanf多得多。

(2)在c++標準中,#include 與#include 寫法等價,其它標頭檔案類似。

(3)絕對值在10的9次方範圍以內的整數(或稱32位整數)都可以用int來存放,如果在10的10次方到10的18次方以內的整數(或稱64位整數)用long long型來存放。

(4)遇到浮點型資料都應該用double型來儲存。

(5)數字,小寫字母,大寫字母在ascii中的順序是數字《大寫字母《小寫字母,其中小寫字母比大寫字母值大32,但大寫字母和數字之間還有其它字元。

(6)在程式設計的時候應該編寫字尾為.cpp(devc++中)的原始檔,也就是說在c++的環境中程式設計,但整體使用c語言的程式設計方式,但可以在其中混合使用一些c++的比較方便的東西。

(7)c語言沒有bool型別,但c++有,所以可以直接使用bool型別,也可以加上標頭檔案#include 。

(8)位運算子的優先順序沒有算術運算子的高。

(9)如果在程式中需要設定乙個無窮大的數inf,一般設定成2^30 – 1,具體寫法可以是:

兩種寫法等價。

(10)在使用scanf函式進行讀取時,一定要小心%c格式的字元,它是可以讀入空格和換行的。使用scanf函式讀取字串%s的時候它是以空格和換行為結束的標誌的。

(11)幾個有用的輸出格式:

(a)%md:輸出向右對齊,不足m位的高位補空格,超過m位的原樣輸出(同理,左對齊m為負數)。

(b)%0md:和上面很相似,不過不足m位的高位補0.

(c)%.mf:保留m位小數,採取原則四捨五入。

(12)getchar()可能會讀入空格和換行。

(13)常用math函式:

(a)fabs( double x) : 取絕對值;

(b)floor(double x) 和 ceil( double x) : 向下取整和向上取整;

(c)pow( double r, double p) : 求冪;

(d)sqrt( double x) : 求平方根;

(e)log( double x) : 求對數(以自然數為底);

(f)sin( double x ), cos( double x ), tan( double x ) : 求三角函式(弧度制);

(g)asin( double x ),acos( double x ), atan( double x ) : 反三角函式;

(h)round( double x ) : 四捨五入求整。

(14)氣泡排序(本質在於交換):

書上寫法:

void bubble_sort1( int a, int n )

}

我習慣的寫法:

void bubble_sort2( int a, int n )

}

之所以習慣這種寫法是因為之前總是忘掉氣泡排序的演算法思想,其實簡單來說就是每一次都從頭開始遍歷,每次選乙個當前未排序列表中的最大值放在最後,所以每一次遍歷的長度應該減1,所以外迴圈應該是從末尾開始向前減少,所以每次寫冒泡的時候我就能夠捋一遍演算法的過程。書上的寫法其實也很好理解,選擇哪種都可以。

(15)如果陣列大小較大(大概10的6次方),需要將陣列定義在main主函式外面,因為函式內部申請的區域性變數是來自系統棧,允許申請的空間較小,會使程式異常退出,而全域性變數來自靜態儲存區,允許申請的空間較大。

(16)memset函式(對陣列中每乙個元素賦相同的值):

新增標頭檔案標頭檔案,函式原型是:

void *memset(void *s, int ch, size_t n)
呼叫形式是:

void *memset( 陣列名, 值, sizeof(陣列名) );
由於memset函式是按位元組賦值,所以剛開始只使用函式來賦0和-1。

(17)因為gets()函式是以換行作為結束標誌的,所以在使用scanf讀取完一些內容後再使用gets()時,需要先用getchar()吸收掉換行符。

(18)sscanf和sprintf(均在標頭檔案stdio.h中)

寫一段**示例一下就很好理解了:

//sscanf和sprintf

#include int main ( void )

執行結果是:

就可以輕鬆地完成字串和其它型別資料的轉換。

另外,sscanf還支援正規表示式。(正規表示式不太了解,有時間補一下)

(19)指標是乙個unsigned型別的整數。

(20)引用:

引用使用符號&,本質是為變數起乙個別名(所以常量不能使用引用),引用並不是取位址的意思。

(21)使用建構函式初始化結構體:

同樣舉例說明:

假設現在建立乙個點的結構體:

struct point ;
它會預設生成乙個隱藏的建構函式point(){},所以才可以定義結構體變數而不進行初始化,如果想要修改建構函式,比如:

struct point 

/* 也可以寫為

point( int x_, int y_ ) : x(x_), y(y_)

*/};

這樣就不能不經初始化就定義結構變數,不過這樣就可以手動進行初始化,例如:

struct point p1 = point( 1, 2 );
(21)c++讀入一整行:

char str[100];

cin.getline( str, 100 ); //str是個字元陣列

string str;

getline( cin, str ); //string容器

c++輸出精度控制:

//輸出精度

#include #include using namespace std;

int main ( void )

考試不建議使用cin和cout,容易超時。

(22)浮點數的比較:

由於計算機儲存中浮點數總是不確定的,所以在比較兩個浮點數時需要用乙個精度eps來判斷兩個浮點數的大小關係,eps合適的值是10的-8次方,同時可以利用巨集定義來寫判斷的語句(注意加括號)。

(23)較高的時間複雜度會讓系統返回「執行超時」,對一般的oj系統來說,一秒鐘能承受的最大的運算次數大概是10的7次方~10的8次方,也就是說當演算法時間複雜度是o(n^2)的時候,當輸入規模n = 1000時,是可以承受的,但n = 100000是不可承受的。(這個問題之前遇到過,在參加2023年3月pat乙級春考的時候,最後一道題我的演算法就是o(n ^2),輸入規模n = 100000,最後導致有兩個測試點執行超時,扣了9分)。

演算法筆記 第二章c c 快速入門 總結

cin與cout消耗的時間比scanf和printf多得多,建議使用scanf與printf.標頭檔案 include c 中 如int a 1 int的範圍 絕對值在10 9內,printf用 d輸出。long long的範圍 絕對值在10 18內,printf用 lld輸出。long long型...

第二章 c c 快速入門

1.整數範圍選擇 10 9以內或者32位整數,用int。10 18以內或者64位整數用long long 2浮點型用double即可。3字元常量用ascii統一編碼。標準ascii範圍0 127。0 9,a z,a z對應的ascii碼分別為48 57,65 90,97 122.4.字串可以直接賦值...

第二章 C C 快速入門

1.c和c 部分區別 輸入輸出,指標引用 c語言的scanf和printf比c 的cin和cout要快 2.標頭檔案是什麼 include 例如stdio是標準輸入輸出庫,h是標頭檔案的檔案格式。檔案中包含一些跟輸入輸出有關的東西,程式需要輸入輸出的時候,需要引用標頭檔案才能使用檔案裡的輸入輸出函式...