C Primer Plus 第8章 字符輸入/輸出和輸入確認 8.6 輸入確認

程序清單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()接受任何字符。

相關文章
相關標籤/搜索