對要求解的問題進行分析是我們要做的第一步,這樣就可以清楚地認識到我們的任務。程序的需求是求一個三位數的個、十、百位上的數字,那麼我們就能確定該程序所處理的整數隻能是三位數,也就是說在100~999這個範圍內,當用戶輸入其他整數時,該程序是不能進行處理的。
從上小節中介紹的C語言程序的基本組成結構來看,我們是否需要用戶自定義函數呢?如果不需要,我們則由主函數來實現程序的功能。在主函數內部,我們需要對以下問題進行進一步的細化:
(1)首先,我們考慮本例中是否需要輸入數據。很顯然我們首先必須從鍵盤輸入一個三位數。當輸入了一個合法的三位數之後,才能進一步地對問題進行求解。根據前麵的例題,我們可以設置一個變量(如n),用來存放從鍵盤輸入的整數。
(2)其次,我們思考程序的輸出數據,任何程序都必須有輸出,本程序的輸出是個位、十位和百位上的數字。為了處理方便,分別用三個變量a、b、c表示,當a、b、c有了具體的數值之後,再進行輸出。
(3)最後考慮的是數據處理部分,這也是求解本例的關鍵步驟。對於一個三位數,如何求解其各位上的數字,這顯然又是我們下一步需要討論的問題。在C語言中提供了多種算術運算符,+、-、*、/,這些都是我們熟悉的,另外,還有取模運算(%),即求餘。讀者需要注意的是,C語言中進行取模運算(%)的操作數必須是整型數據,另外,當進行除法運算(/)的操作數都為整型數據時,進行的是整除。有了這些運算符就可以快速地進行求解,如當三位數n=123時,我們可以利用賦值表達式a=n%10就可以求得個位的數字3,同樣十位上的數字可以利用表達式b=(n/10)%10求解,百位上的數字c=n/100。
基於上述分析,我們就找到了解決該問題的算法。正如前麵所說,對於同一個問題,一般有多種解決的方法,請讀者自己思考有沒有其他方法同樣可以求出一個三位數的個、十、百位數。
根據前麵的分析,我們可以用結構化流程圖(N-S圖)來描述以上的解題步驟。
輸入一個三位數整數n求出個位上的數字a=n%10求出十位上的數字b=(n/10)%10求出百位上的數字c=n/100分別輸出a,b,c圖24求解例2.6的N-S圖。
當確定了解決問題的步驟後,我們就可以按照圖24的流程圖,把每一步求解的步驟轉換成C語言的語句,當然前提條件是要符合C語言的語法規則。例如,要完成一個整數的輸入,必定要用到scanf函數,進行輸出又需要printf函數。另外還要根據C語言程序的組成結構,添加必要的說明部分,思考是否需要添加預處理命令等。有了上述的準備後,我們可以打開TurboC20,在該環境中編輯源程序,然後保存為test.c。求解例26的程序如下:
voidmain()
{
intn,a,b,c;
printf("pleaseinputaintegernumber(100~999):");
/*在屏幕上顯示提示字符串*/
scanf("%d",&n);/*調用scanf函數,由鍵盤輸入n的值*/
a=n%10;/*分別求出個、十、百位上的數字*/
b=(n/10)%10;
c=n/100;
printf("%d:%d-%d-%d\n",n,a,b,c);/*按指定格式輸出n,a,b和c*/
}
本程序的執行過程是:首先在屏幕上顯示提示字符串,當用戶從鍵盤上鍵入一個三位數後,按下回車鍵,接著會在屏幕上顯示程序運行結果。
當我們編輯了一個程序後,不要急於進行編譯,先從整體結構上瀏覽該程序,排除一些低級錯誤。以下是初學者經常犯的錯誤:如花括號沒有成對出現,語句後麵遺漏了分號,scanf函數中變量n前麵遺漏了“&”符號,程序中出現的變量沒有預先進行定義等。
當編輯好test.c後,下一步的工作就是驗證我們編寫的程序是否能解決例26的問題。首先我們應用C語言的編譯程序對其進行編譯,以生成以二進製代碼表示的目標程序(後綴名一般為.obj)。當然我們在編譯程序時,如果程序中有語法錯誤,編譯程序就會指出該語法錯誤,而不生成二進製代碼。比如在例26的源程序中,如果把a=n%10;改為a=n%10,那麼經過編譯後,屏幕下方會出現如下一條信息: