注意以下範例只是一個範例,還可以有很多別的實現方法
基本文法:
輸入輸出:
正常篇-輸入問題: 作為一個freshman,更多的你們可能第一次接觸編程。那麼輸入輸出作為互動的一種方式,自然是非常重要的。 那麼我們學習的第一中輸入輸出的方法就是cin,cout這兩個函數啦。 首先我們有第一種姿勢:
int a; cin>>a;
先定義個變數,然後輸入。這個變數可以使double,float,int,char,bool等等類型。 在我們上機題中,如果輸入告訴你要輸入多少組case,每個case有多少輸入了,那採用這個方法是自然沒有問題的,因為我們可以用一個迴圈解決。 如第一次練習的C(題號,2076 The Drunk Jailer),
Sample Input
25100
Sample Output
210
我們可以用以下代碼解決輸入問題。
int n,u; cin>>n; for(int i = 0;i < n; i++){ cin>>u; }
但是換一種情況,告訴輸入某個數的時候輸入結束,例如中文練習題C(4144 Simple String Transformation)
輸入範例
3abc4AAbc0
輸出範例
defaaef
我們可以採用如下代碼解決
int n; while(cin>>n){ if(n == 0) break; ... //other code }
這樣不停輸入數字,直到輸入為0結束,跳出迴圈即可。
不過以上都是通過輸入判斷是否結束了,如果遇到輸入為EOF(end of file)就是檔案結束才結束輸入怎麼辦呢。
例如 第一次練習A (2015 Keep on Truckin')
Sample Input:
180 160 170
Sample Output:
CRASH 160
那我們的解決方案如下:
int a,b,c; while(cin>>a>>b>>c){ ... //other code }
以上解決的問題都是一個變數對應於一個輸入的,對於一行是一個句子(字元數組)還有空格時該如何是好呢。
例如第一次練習 D(1153 Word Reversal)
方法1:我們利用string數組來儲存輸入
string a; int n; cin>>n; getchar(); //由於第一個整數輸入後接了一個分行符號'\n',這個字元我們要讀入才能正常讀取下一行 while(n--) { getline(cin,a); ... //other code }
有了這個就可以了嗎。其實我們還有很多別的方法。
我們可以用char 數組(似乎還沒學到,但是很快就學了,提前告訴你們)
方法2:
char a[100]; int n; cin>>n; getchar(); //理由同上 你需要使用到 cstdio 這個標頭檔 #include<cstdio> while(n--){ gets(a); ... //other code }
如果想擷取數組a的長度,代碼如下
int length = strlen(a)
so,到這裡感覺自己會數組了,也是不錯的,但是這樣真的就完了麼。
如何體現更高水平呢,秀一秀黑科技呢(哈哈,也就只能跟大一的說是黑科技了)
方法3:採用getchar()讀入字元
char a[100]; int n; cin>>n; getchar(); //理由同上 while(n--){ int length = 0; while(true){ a[length] = getchar(); //getchar()函數就是擷取一個字元輸入 if(a[length] == '\n') // '\n' 表示分行符號 break; length++; } a[length] = '\0'; // '\0'表示字元數組的終止字元 //cout<<a<<endl; ... //other code }所以到這裡,感覺到一點點的梯度上升嗎。
在方法三種,額外的知識是,你要知道一些編碼知識,這裡特指ASCII,'\0'對應Null 字元,也是表示字元數組結尾的標誌,'\n'是換行字元
參考資料:http://baike.baidu.com/link?url=tSj0V1ALtbxUCo27_IozDqqT2MNrUk7zqxAbIlTrr3yt_m-eEzp24QskmKQFvHQoKsWEWOBC2ElPGLZfXOdN4q
如果明白了這個,那麼任何的輸入都不會難倒你的。
接下來是輸出的問題:
正常篇-輸出問題: 輸出的格式有很多,我們用acm.hdu.edu.cn上幾道簡單題來作為例子,有興趣的可以去做做 1. 1089 A+B for Input-Output Practice (I) Sample Input
1 5 10 20
Sample Output
6 30 這事最簡單的,一行輸入,一行輸出
2.1096A+B for Input-Output Practice (VIII)
Sample Input
3 4 1 2 3 4 5 1 2 3 4 5 3 1 2 3
Sample Output
10 15 6 這個輸出要求每兩個輸出之間有一個換行,那我們該怎麼做呢。 ------------------ 在這裡 告訴你們一個非常裝B的話 (
talk is cheap , show me the code)
int n; cin>>n; int flag = 0; // 這是一個非常常用的標記方法 while(n--){ if(flag == 1) cout<<endl; flag = 1; ... //other code }
這裡我們可以看到新定義了一個flag標記的變數,如果flag==1,那麼輸出換行,因為此時,我們知道之前一定有一行輸出的,進入這次迴圈的時候,一定會產生一次新的輸出,那麼我們有理由確定,這個時候需要輸出一個空白行。
PS:1089-1096都是簡單的a+b問題,就是輸入輸出控制的聯絡,非常建議大家去做一做。
3.5918 sequence I 這題別做啦,就是為了告訴你們還有別的要求的 Sample Input
2 6 3 1 1 2 3 1 2 3 1 2 3 6 3 2 1 3 2 2 3 1 1 2 3
Sample Output
Case #1: 2 Case #2: 1
通常還有一種格式就是輸出 Case # 資料群組號: 答案 或者換個姿勢: Sample Input
2 3 2 1 2 3 1 3 2 3 3 2 3 3 3 1 1 2 2
Sample Output
Case #1: 3 1 Case #2: 2 3
無論哪種格式,實際按要求來即可,只是步驟麻煩了些罷。 輸入輸出到此結束。
迴圈: 對於D(1153 Word Reversal),我們可以用迴圈的姿勢有以下幾種
Sample Input
25100
Sample Output
210
第一種: int n; cin>>n; for(int i = 0;i < n; i++){ ... //other code } 第二種: int n; cin>>n; while(n--){ ... //other code } 第三種: int n; cin>>n; do{ }while(n--);
特別的:
例如中文練習題C(4144 Simple String Transformation)
輸入範例
3abc4AAbc0
輸出範例
defaaef
我們還可以有第四種姿勢寫迴圈
int n; while(cin>>n,n!=0){ ... //other code }是不是很神奇,判斷條件寫到while的括弧中即可。 所以以上四種方式你們都可以嘗試一下哈。
有了以上知識,做練習是沒啥問題了吧,剩下的就是思考了。 但是這樣夠嗎。
no~no~no~ 我們知道大學的學習已經和高中不一樣了,我們需要掌握的一個基本技能就是如何自學,如何尋找資料,如何在學習的道路上漸行漸遠~ 如果你想成為一個ACM大神,如何超越高高在上的學長學姐,如何超越競爭的同年級同學,一年銅、兩年銀、三年金的步伐你能實現嗎,或者你滿足嗎。 如果你想成為一個駭客,電腦網路,組成原理,密碼學,體繫結構,資料庫,作業系統,linux指令........堆積如山的書。 如果你想成為一名科研人員,機器學習,資料採礦,圖形映像,神經網路.....(此處原諒我知之甚少) ............. 嗯好,以上內容都是嚇嚇你們的。我們這裡要講的是查資料。
百度搜尋: 首先百度是大家都會的,那麼我們要多多利用百度了搜尋。有句話是這麼說的:當你知道的越來越多,那你就會覺得自己越來越無知。你做的題目多了,你就會發現自己懂的太少了,於是你要從網上找題解(
此處我強烈不建議從網上找練習題的答案,這麼簡單的題目,你們一定要獨立思考),但是你會發現TOJ上的題,題解還是不那麼好找的。 所以我建議大家想刷題就用杭州電子科技大學的HDU(acm.hdu.edu.cn),北京大學的POJ(poj.org),CF(http://codeforces.com/gyms/)
如果英語是個大問題(熱愛ACM,你遲早得面對),那麼退而求其次,看中文題目吧,福州大學FZU(http://acm.fzu.edu.cn/)sjtu(http://acm.sjtu.edu.cn/OnlineJudge/problems) 其實你有很多平台可以去的,但是注意一點,選擇一個平台不停的刷就行,不要經常換平台,因為簡單題很多,但是它們確不能讓你進步,你要嘗試挑戰自己。 HDU,POJ,CF網上有很多解題報告,當你不會的時候就看看別人怎麼做的。 可以放一些例子(不好意思,又給自己打廣告了)。多看幾個不同的部落格,你們就能懂更多了。
或者查詢strlen函數的用法。
第二個:C++手冊查詢 http://www.cplusplus.com/reference/ (這個網站還是挺慢的)
那這裡我們看看 手冊上可以查到什麼 聽說你對於string類不是很瞭解 在搜尋方塊中輸入string進行搜尋
於是我們會得到string這個標頭檔的一些資訊,往下拉,我們可以看到更多的介紹
有很多方法和操作,但是實際我們需要用到的很少。我們選擇 length 進入查看
我們可以查看更多的說明,可以看到更多的例子。
最後以strlen函數的查詢收尾
第二篇到此結束~~~~~~~
當然最好的成長的方式是找比你們厲害的人學習,你們的學長學姐就是非常不錯的選擇。
孤獨是一個人的狂歡,狂歡是一群人的寂寞。祝你們在學習的不歸路上,越走越深。