學數學的時候,我們通常會通過大量的練習題來鞏固所學知識;其實學習程序設計設計語言也不例外。那么如何通過練習去磨礪自己的C#使用能力呢?一個方法是參與到實際的軟件項目開發中,而另一個更加直接的方法則是“做題”。 
  去哪里找練習題呢?聽過或接觸過ACM/ICPC(http://cm.baylor.edu )的讀者,應該不會對Online Judge(http://en.wikipedia.org/wiki/Online_judge )(以下簡稱OJ)陌生。OJ是一個在線評測平臺,包含了大量的程序設計題目,在這個平臺上用戶可以提交源代碼,OJ會對其進行編譯和執行,并通過預定義的測試數據來驗證源代碼是否正確。在國內,比較有影響力的OJ有POJ(http://acm.pku.edu.cn/JudgeOnline/ )和ZOJ(http://acm.zju.edu.cn/onlinejudge/ )等。但可惜地是,它們只支持C、C++、Pascal、Java等,卻沒有給C#一席之地。盡管如此,還是有不少國外的OJ支持著C#。下面我就列舉了三個優秀的在線評測平臺,它們在一定程度上很好地支持了C#。
 ?
 Timus Online Judge 
  
   Timus Online Judge(以下簡稱TOJ) 地址是 http://acm.timus.ru/ 。它是一個俄羅斯的在線評測平臺,上面匯集了大量程序設計競賽的套題。此外,它也是為數不多一直提供最新C#編譯功能的OJ。下面是TOJ關于支持C#編譯的一些歷史:
 2006年12月31日開始支持使用C#源程序提交解題程序; 2008年02月08日以前均在使用Microsoft Visual C# 2005編譯器; 2009年08月04日以前均在使用Microsoft Visual C# 2008編譯器; 2009年08月04日開始至今使用Microsoft Visual C# 2010編譯器   TOJ服務器目前的C#編譯命令為:
 csc /o+ /d:ONLINE_JUDGE /r:System.Numerics.dll 
  先簡單介紹一下這個編譯命令什么意思。開頭的csc實質上是csc.exe,它是C#編譯器的名稱,在安裝完.NET Framework之后就可以在安裝目錄找到。后面跟著的一串命令“/o+ /d:ONLINE_JUDGE /r:System.Numerics.dll”是所謂的編譯器參數。
 “/o”是“/optimize”的簡稱,該選項可以通知CLR在運行時是否優化代碼。這里的“/o+”即為啟用優化,它可以使得輸出文件更小、更快且更有效; “/d”是“/define”的簡稱,它可以用來定義源文件中的一個或多個符號名稱,功能類似于#define預指令定義一個宏。這里的“/d:ONLINE_JUDGE”就是將ONLINE_JUDGE定義為所有源代碼文件中的一個符號。這樣就相當于用戶不需要做任何事情就可以在源程序序中直接使用ONLINE_JUDGE進行一些預處理操作; “/r””是“/reference”的簡稱,該選項可以將指定文件的public類型信息導入到當前項目中,從而可以從指定的程序集文件引用元數據。因此“/r:System.Numerics.dll”就是將System.Numerics.dll程序集導入到當前項目中。為什么非要把這個程序集導入呢?因為.NET Framework 4.0新引入的這個程序集里引入了兩個非常有用的結構,它們就是BigInteger和Complex。前者可以支持任意大的帶符號整數的加減乘除等運算;后者可以支持復數運算。這兩個結構可以給你做題時帶來極大的便利。   下面讓我們一同走進TOJ,看看如何通過它來提高自己的C#使用能力。首先要做的事情就是在TOJ上注冊一個賬號(http://acm.timus.ru/register.aspx )。注冊完畢會得到一個Judge ID,接著便可以打開“Problem Set”并挑選一道題目進行解答。以1000. A+B Problem(http://acm.timus.ru/problem.aspx?space=1&num=1000 )為例:題目大意就是對給定兩個數a和b,輸出它們的和,要求程序必須在1秒內運行完,且最多只能使用16M的內存。讀題完畢,相信大家都可以很輕松地寫出如下代碼:
   view source   print?    
    03 public class 
    05 ????private static void  
    07 ????????string ' ' );  
  08 ????????Console.WriteLine(int int  
         點擊“Sumbit solution”,選擇要提交的源代碼文件或者直接將源程序粘貼到文本框中、填入剛剛申請的Judge ID、選擇“Language”為C#、點擊“Submit”按鈕之后就可以看到評測的結果了,如:
 
   上述狀態的意思是:RujinCao于2010年8月10日21點35分42秒提交了題號為1000的程序,該程序使用C#語言編寫,運行時間為109毫秒,占用內存613K,最重要的是該程序通過了全部的測試數據!除了Accepted外,你還可能會常常碰到如下的返回狀態:
 Compilation Error  編譯錯誤Wrong Answer  程序不正確,無法通過全部的測試數據Time limit exceeded  程序運行時間超過了規定的時間限制Memory limit exceed  程序運行內存超過了規定的內存限制Crash  程序運行有異常  更多信息可以閱讀TOJ的FAQ(http://acm.timus.ru/help.aspx?topic=faq )。
 ?
 TopCoder 
 
   TopCoder網站地址為http://www.topcoder.com/tc  。它是一個美國的網站,主要以競賽形式外包軟件設計、軟件開發等項目。不過這里要介紹的并不是如何開發軟件,而是介紹TopCoder的算法競賽部分。
   首先打開TopCoder網站,點擊右側的“Register Now”或者直接輸入網址https://www.topcoder.com/reg/  進行注冊。注冊完畢,點擊左上角的“O(n)”圖標,并按照提示安裝必要的Java組件,之后就可以下載并打開TopCoder競技場軟件(TopCoder Arena),如下圖所示:
 
   輸入注冊號的賬號和密碼,點擊“GO”,會進入到競技場的休息聊天室(Lobby Chat Room),在這里你可以和當前登錄的其他用戶進行聊天(TopCoder用戶分布于世界各個國家)。選擇菜單“Practice Rooms” –> “2. SRMs”,接著挑選要練習的一個場次,如“SRM 454 DIV2”,就可以進入到練習區域(注:SRM全稱為Single Round Match。TopCoder會在每月舉行4到5次的SRM在線競賽,每場競賽分兩個級別:DIV1和DIV2,前者適合于高等級的用戶,后者適合于分數較低的用戶。對于初學者建議選擇DIV2進行練習),如圖:
 
   接下去選擇“Select one”下拉框,會看到250,500和1000的字樣,這代表了此輪競賽有三個題目,分數分別為250分,500分和1000分,分數越高,難度越大。當用戶打開某一道題目之后,分數就開始自動減少,換句話說,提交源程序越快則分數越高。TopCoder允許用戶多次提交同一道題目,但是每次提交都會扣取一定的分數。下面我們打開250分的題目:
 
   閱讀完題目大意“Problem Statement”后,就可以在代碼區域“Coding Area”編寫解答程序。要注意地是,TopCoder與普通的OJ不一樣,它要求用戶提交的程序的類名、方法名等必須完全符合題目中的要求。以這道250分的題來說,題目要求我們類名必須為“MinimalDifference”,方法名必須聲明為“int findNumber(int A, int B, int C)”,而且必須是public類型。
   這道題目大意是“給定三個整數A,B和C,要求返回區間[A,B]之間的一個數字X,使得X各位數字之和與C各位數字之和的絕對值最小,如果存在多個這樣的X,返回最小的一個。其中A,B,C的范圍均在[1,1000000000]之間,且保證B減去A的值在[0, 100000]之間。”
   我們可以很輕松地完成下面的代碼(注意:TopCoder中的.NET Framework 版本僅為2.0.50727,因此有許多C#的新特性在這里無法使用):
   view source   print?    
    03 public class 
    05 ????private int int  
          10 ????????????sum += n % 10;  
            16 ????public int int int int  
    18 ????????int  
  19 ????????int int  
    21 ????????for int  
    23 ????????????int  
  24 ????????????int  
  25 ????????????if  
      28 ????????????????minDiff = diff;  
               確保“Language”選擇的是“C#”,之后點擊“Compile”,系統會告訴你編譯是否有問題,如果沒有問題,可以點擊“Submit”提交源代碼(注:這里還有一些其他非常還用的功能,尤其是“Test”,讀者可以自行實踐”)。接下去系統會在聊天區給出這次提交得到的分數,但是盡管如此,我們并不能保證提交的程序一定正確。幸好TopCoder提供了測試功能,點擊菜單上的“Practice options”->“Run System Test”, 如果一切順利,我們會看到一個綠色的分數(如圖所示);否則會看到一個紅色的分數,這說明源程序中有錯誤,需要修改。
 
   如果讀者實在無法解答某一道題目,一種方法可以通過TopCoder主頁左側欄中的“Competitions->Algorithm->Statistics->Match Editorials ”或直接輸入網址http://www.topcoder.com/wiki/display/tc/Algorithm+Problem+Set+Analysis  中找到對應比賽的解題報告;另外一種方法可以打開Arena中的“Summary”功能查看其他比賽選手的代碼進行學習。
   TopCoder Arena功能豐富,我所介紹的只是冰山一角,更多功能期待讀者們自己去發掘。
 ?
 CodeForces 
 
   Code Forces地址在http://codeforces.com/  。這是2010年剛興起的一個在線評測網站,由俄羅斯人創建。它綜合了TopCoder和普通OJ的優點:以TopCoder比賽的形式進行,以普通OJ的文件方式提交源程序。下面我將簡單介紹一下如何在CodeForces上使用C#進行練習:http://codeforces.com/register  。注冊完畢之后,我們可以挑選一場比賽進行練習,下面以Codeforces Beta Round#25(Div. 2)為例(http://codeforces.com/contest/25 )。點擊右側的“Register for practice”以注冊這次練習。打開B題 Phone numbers(http://codeforces.com/contest/25/problem/B ),并仔細閱讀題目。大意就是:“給定一個n位的電話號碼(2?≤?n ≤?100),將其分割成任意兩位或三位的組合以方便記憶。如:7位的電話號碼1198733可以分割為11-987-33或119-87-33或11-98-733,只要輸出一種分割即可。”相信大家可以很輕松地完成如下的類似代碼:
   view source   print?    
    03 public class 
    05 ????public static void  
    07 ????????int int  
  08 ????????string  
    10 ????????for  
    12 ????????????Console.Write(phoneNum.Substring(i, 2)); Console.Write("-" );  
    14 ????????Console.WriteLine(phoneNum.Substring(i));  
         選擇“Language”為“C# Mono 2.6+”,并選擇要提交的源代碼文件,點擊“Submit”提交之后即可以看到結果,如下:
 
   這里,讀者們也許會有些疑問,剛剛提到的“C# Mono 2.6+”是何物,它又和微軟的C#有什么關系?其實,C# Mono是微軟C#的一個開源實現,它的目標是跨平臺和跨語言,目前由Novell公司主持。更多關于Mono的信息請關注http://mono-project.com/Main_Page  。
   當然,除了上面介紹的三個支持C#的在線評測平臺以外,還有著其他一些OJ也支持C#,不過大體上做題的方式都相近,不再一一列舉。為了幫助讀者們更好地去了解如何在上述的三個OJ中做題,我特意創建了一個Blog(http://newacm.info/ )用以跟進分析解答它們中的習題。如果大家有問題,可以直接在Blog中留言或者直接發送郵件給我(newacminfo AT gmail.com)。好了,到這里我相信讀者們對使用C#“做題”練習也有了一定的認識,接下去就是你們在OJ平臺上一展身手的時候了!最后希望大家都能在練習中將自己的C#使用能力磨礪的越來越精純!
 
轉載于:https://www.cnblogs.com/yqskj/articles/2005052.html
                            總結 
                            
                                以上是生活随笔 為你收集整理的宝剑锋从磨砺出——使用在线评测平台磨砺C#使用能力 的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                            
                                如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。