程序清單8.7 使用兩個函數來向一個算術函數傳送整數,該函數計算特定範圍內全部整數的平方和。程序限制這個特定範圍的上界不該該超過1000,下界不該該小於-1000。編程
/*checking.c --輸入確認*/ #include <stdio.h> #include <stdbool.h> //確認輸入了一個整數 int get_int(void); //確認範圍的上下界是否有效 bool bad_limits (int begin,int end,int low,int high); //計算從a到b之間的整數的平方和 double sum_squares(int a,int b); int main (void) { const int MIN = -1000; //範圍的下界限制 const int MAX = +1000; //範圍的上界限制 int start; //範圍的下界 int stop; //範圍的上界 double answer; printf("This program computes the sum of the squares of " "integers in a range.\nThe lower bound should not " "be less than -1000 and \nthe upper bound should not " "be more than +1000.\nEnter the limits (enter 0 for " "both limits to quit):\nlower limit: "); //注意printf()的換行方式 start = get_int(); printf("upper limit:"); stop = get_int(); while(start!=0 || stop!=0) { if(bad_limits(start,stop,MIN,MAX)) printf("please try again.\n"); else { answer = sum_squares(start,stop); printf("The sum of the squares of the integers from "); printf("from %d to %d is %g\n",start,stop,answer); } printf("Enter the limits (enter 0 for both limits to quit): \n"); printf("lower limit: "); start = get_int(); printf("upper limit: "); stop = get_int(); } printf("Done.\n"); return 0; } int get_int (void) { int input ; char ch; while(scanf("%d",&input)!=1) { while((ch=getchar())!='\n') putchar(ch); //剔除錯誤的輸入 printf(" is not an integer .\nPlease enter an "); printf("integer value ,such as 25, -178, or 3: "); } return input; } double sum_squares (int a ,int b) { double total = 0; int i ; for(i=a;i<=b;i++) total += i*i; return total; } bool bad_limits(int begin,int end,int low,int high) { bool not_good = false; if(begin>end) { printf("%d isn't smaller than %d.\n",begin,end); not_good=true; } if(begin<low || end<low) { printf("Values must be %d or greater.\n",low); not_good = true; } if(begin>high || end>high) { printf("Values must be %d or less.\n",high); not_good = true; } return not_good; }
8.6.1 分析程序less
首先集中討論程序的總體結構。模塊化
咱們已經遵循了一種模塊化的方法,使用獨立的函數(模塊)來確認輸入和管理顯示。程序越大,使用模塊化的方法進行編程就越重要。函數
main()函數管理流程,爲其餘函數指派任務。它使用get_int()來獲取值,用while循環來處理這些值,用bad_limits()函數來檢查值的有效性,sum_squares()函數則進行實際的計算;ui
8.6.2 輸入流和數值編碼
考慮以下輸入 :code
is 28 12.4字符串
在您的眼中,該 輸入是一串字符後面跟着一個整數,而後是一個浮點值。對C程序而言,該 輸入 是一個字節流。第一個字節是字母i的字符編碼,第二個字節是字母s的字符編碼,第三個字節是空格字符的字符編碼,第四個字節是數字2的字符編碼,等等。因此若是get_int()遇到這一行,則下面的代碼將讀取並丟棄整行,包括數字,由於這些數字只是該行中的字符而已:get
while((ch=get())!='\n') putchar(ch);input
雖然輸入流由字符組成,但若是您指示了scanf()函數,它就能夠將這些字符轉換成數值。例如,考慮下面的輸入:
42
若是您在scanf()中使用%c說明符,該函數將只讀取字符4並將其存儲在一個char類型的變量中。若是您使用%s說明符,該 函數會讀取兩個字符,即字符4和字符2,並將它們存儲在一個字符串中。若是使用%d說明 符,則scanf()讀取一樣的兩個字符,可是隨後它會繼續計算與它們相應的整數值爲4X10+2,即42而後將該 整數的二進制表示保存在一個int 變量中。若是使用%f說明符,則scanf()讀取這兩個字符,計算它們對應的數值42,而後之內部浮點表示法表示該 值,並將結果保存在一個float變量中。
簡言之,輸入由字符組成,但scanf()能夠將輸入轉換成整數或浮點值。使用像%d或%f這樣的說明符能限制可接受的輸入的字符類型,但getchar()和使用%c的scanf()接受任何字符。