如果時間充足的話,想學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是標頭檔案的檔案格式。檔案中包含一些跟輸入輸出有關的東西,程式需要輸入輸出的時候,需要引用標頭檔案才能使用檔案裡的輸入輸出函式...