cpp編程基礎:
信息學奧賽選擇題:https://www.bilibili.com/video/BV1vM4y1G7bt
信息學奧賽一本通在線評測網站:http://ybt.ssoier.cn:8088/
冒泡排序動畫1:https://www.bilibili.com/video/BV1Zz4y1D7ZE
冒泡排序動畫2: https://www.bilibili.com/video/BV1kq4y1R7ez
排序方法比較:https://www.bilibili.com/video/BV1ex411e7eb
一、程序基本結構:
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int main(){ 5 6 return 0; 7 }
解釋說明:
1行是萬能頭,萬能頭會增加編譯的時間(智能編譯的時間),編譯完成之后,程序才會運行,所以不會增加運行的時間,不會增加運行的內存(復賽編程后,判分時,限制運行時間和運行內存不能超某大小)。 baidu有說法是不建議用萬能頭,理由是不利於理解c++,老師建議是使用萬能頭,理由是可以簡化學習難度。避免入門就打擊學習興趣。初學,重基礎(變量類型,基本語句),頭文件,不是基礎。
頭文件的分類使用,目的是為了簡化難度和減小最終程序的體積,如設計的游戲程序,必須用游戲頭文件,游戲頭文件可能很大。而非游戲的程序,可能就沒必要用游戲的頭文件。編譯過程是智能的,會自動判斷需要萬能頭中的哪些頭文件。現狀:我們的復賽,支持使用萬能頭。
2行是啟用命名空間“std”,c++功能超級強大,為了避免復雜程序的可能性沖突,啟動了“std”,個人自定義的空間都放入“std”中,雖然我們現在用不了以后的可能性沖突,程序為了避免,已經這樣定義了,我們不啟用“std”,就不能自定義空間。明白嗎?不明白的話,提意見,我再修改這行的描述。
4行,幾乎所有編程軟件都會定義main()函數,一個程序啟動后,都會去找入口函數,如入口main(),並運行main()。main()是程序運行后的入口函數。 linux操作系統程序結束后,需要返回 int 型值 0,才能正常退出。我們的評分是運行在linux中的,所以,我們在windows系統中編程寫程序的時候,也得用 int 聲明 main()函數的返回值類型,聲明寫前面,就寫成了 int mian() 。 並且 main()函數的程序體 { },{ }結束時,使用 return 0;語句結束。 明白嗎?不明白的話,提意見,我再修改這行的描述。
6、7行的解釋,在4行中解釋中。
另:語句體 { } 中寫程序的具體語句。if 和for等都可以用{ } ,需要注意{ } 的開始和結束位置,必須配對使用。
二、加法
#include<bits/stdc++.h> using namespace std; int main(){ int a,b,c; cin>>a>>b; c=a+b; cout<<c; return 0; }
5行,int 聲明整數類型,a,b,c 語句結束用;
a和b和c,老師習慣說成房間名,他們是變量名。int的聲明讓它們中只能存放整數。
6行,c控制,in 入,cin控制輸入,輸入默認從鍵盤輸入, >> 數據流的方向,cin>>a 控制“數據流”從鍵盤流向a,
8行,c控制,out出,cout控制輸出,輸出默認輸出到屏幕,<<數據流的方向,cout<<c 控制“數據流”c流向屏幕。
這里每一行的結束,都用英文分號結束。
三、小數(保留2位小數)
#include<bits/stdc++.h> using namespace std; #define PI 3.1415926 int main(){ const double pi=3.1415926; double r,s; cin>>r; s=pi*r*r; printf("%.2f",s); return 0; }
注意:只要用到小數的地方,盡量聲明為double,並且,計算的時候,計算1+2 的時候,用1.0+2,明白嗎?做多了題,你可能會碰到,1*a不對,1.0*a就對了。
define 與 const 定義固定值。編程可以不用。初賽筆試會有這樣的語句。
四、字符(ASCII碼)
#include<bits/stdc++.h> using namespace std; int main(){ char a; int b; cin>>a; b=a; cout<<b; return 0; }
ASCII碼(美國標准信息交換碼):單引號'a'、'A'是整數97、65。單引號'b'、'B'是整數98、66。鍵盤的任何一個按鍵都會對應一個ASCII的整數。ascii的范圍大於鍵盤按鍵數量。ascii共128個,足夠英文使用。
一個字節占8位,8位2進制能表示0-255,ascii只用了0-127
學習二進制。 學習鏈家以后補充。
二進制加法、減法。十進制減法會轉化為二進制加法,乘法和除法也會轉化為加法,這樣簡化了計算機的制造,只需要制造加法器就可以,為此,數學家設計了二進制的補碼(反碼再得到補碼)實現只用加法器實現十進制的四則運算。
計算機科學家首先是數學科學家。數學科學家不一定是計算機科學家。很會計算機的,不一定語文很好。出的計算機題,誤解多多,木辦法。
五、字符串
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int main(){ 5 char a[101]="hello"; 6 string b; 7 b="china"; 8 cout<<a<<" "<<b; 9 10 return 0; 11 }
計算機還不夠智能,不能代替人。
計算機是從最低級發展過來的,會越來越智能。
向前兼容,會讓以前的程序也能正常運行。
1+2==3和“hello”+“word”==“helloword”,
所以又出了個“1”+"2"=="12" ,自己理解吧。
以前的計算機科學家為了讓計算機速度能更快,1+1和1.0+1 ,前面說過不同?自己理解吧。可以百度學習一下運算符重載。
如有更正確的理解,歡迎反饋給老師,謝謝。
常用的字符類型:整型,雙精度浮點型,字符型,字符串。等等。
以后再學個數組。數組不是數據類型。
六、判斷閏年
普通閏年:公歷年份是4的倍數,且不是100的倍數的,為閏年(如2004年、2020年等就是閏年)。
世紀閏年:公歷年份是整百數的,必須是400的倍數才是閏年(如1900年不是閏年,2000年是閏年)。
#include<bits/stdc++.h> using namespace std; int main(){ int a; cin>>a; if(a%400==0 or (a%4==0 and a%100!=0)){ cout<<a<<"年,是閏年"; }else{ cout<<a<<"年,不是閏年"; } return 0; }
if 與 eles ,不難理解。配套的 { } 可以嵌套,注意以后去理解{ }的嵌套。
與0或1,異或異1,0是假,1是真,這是老師總結的順口溜。
and與,or或,xor異或,&&與,||或, not非,!非。
%取余數,c++ 沒有乘方運算, 二進制的異或把那個符號^占用了。
c和c++的優點是也能操作硬件,編譯后的程序速度會快很多,所以操作系統一般都用c寫的,c++是c的發展。
安卓用java寫的,但是安卓的底層是linux,linux是用c寫的。
編程語言:二進制(低級語言)、匯編語言(低級語言?)、c語言等(高級語言)。也有說法把c當中級語言,老師還是認為c是高級語言,老師認為高級低級的區別是能否讓讓英語母語的人容易看懂。
(道可道,非常道;名可名,非常名。無名,天地之始,有名,萬物之母。概念都是后人定義的,老師不喜歡考察定義,老師也喜歡用定義去解釋某些東西,迷茫加矛盾,自己悟)
七、循環
輸入3行,第一行1個數字,控制第2行數字的個數,第3行1個數字。輸出一個數字,第3行數字在第2行中出現的次數。
所有數字x都滿足0 ≤x ≤100。
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int main(){ 5 int a,b[101],c,d; 6 d=0; 7 cin>>a; 8 for(int i=1;i<=a;i++){ 9 cin>>b[i]; 10 } 11 cin>>c; 12 for(int i=1;i<=a;i++){ 13 if(c==b[i]){ 14 d++; 15 } 16 } 17 cout<<d; 18 19 return 0; 20 }
{ } 的嵌套使用出現了。
學習 for( ) 的規則,注意()中只使用了2個分號。 for(初值;終值;步長變化)
這里用了數組,數組的下標從0開始。聲明語句 int a[3] 后,可以用a[0],a[1],a[2],這三個;不能用a[3]和3以后的數字下標。
八、最大余數
除數a,b≤被除數 ≤c,依次輸入a,b,c三個數,輸出最大的余數。
數據范圍:2≤a≤b≤c≤e9
#include<bits/stdc++.h> using namespace std; int main(){ int a,b,c; cin>>a>>b>>c; cout<<a-1; return 0; }
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int main(){ 5 int a,b,c,d,s,t; 6 s=0; 7 cin>>a>>b>>c; 8 d=c-b; 9 if(d>=a){ 10 cout<<a-1; 11 return 0; 12 } 13 for(int i=0;i<=d;i++){ 14 t=c%a; 15 if(t>s){ 16 s=t; 17 } 18 c--; 19 } 20 cout<<s; 21 22 return 0; 23 }
#include<bits/stdc++.h> using namespace std; int main(){ int a,b,c,d,m2,m3; cin>>a>>b>>c; d=c-b; if(d>=a){ cout<<a-1; return 0; } m2=c%a; m3=b%a; if(m2<m3){ cout<<a-1; }else{ cout<<m2; } return 0; }
九、統計字符個數
輸入1行字符串,包含大小寫字母、數字、空格。統計字母和數字的個數。輸出這個數。
1 #include<bits/stdc++.h> 2 using namespace std; 3 string n; 4 5 int main(){ 6 int s; 7 getline(cin,n); 8 for(int i=0;i<=4;i++){ 9 if(n[i]>='0' and n[i]<='9'){ 10 s++; 11 } 12 if(n[i]>='A' and n[i]<='Z'){ 13 s++; 14 } 15 if(n[i]>='a' and n[i]<='z'){ 16 s++; 17 } 18 } 19 cout<<s; 20 return 0; 21 }