簡體   English   中英

C編程語言(K&R)-練習1-13

[英]The C Programming Language (K&R) - Exercise 1-13

這是相對較新的編程方法,我正在嘗試通過K&R的第二版“ C編程語言”。 我已經獲得了練習的答案書,而且我非常困於練習1-13,因此我仔細研究了一下以得出一個主意。

任務是這樣的:“編寫一個程序以在輸入中打印單詞長度的直方圖。很容易用水平的橫條繪制直方圖;垂直方向更具挑戰性。”

答案書中給出的代碼如下:

#include <stdio.h>

#define MAXHIST 15  
#define MAXWORD 11  
#define IN 1        
#define OUT 0      


main()
{

    int c, i, nc, state;
    int len;
    int maxvalue;
    int ovflow;
    int wl[MAXWORD];

    state = OUT;
    nc = 0;         
    ovflow = 0;

    for (i = 0; i < MAXWORD; i++)
        wl[i] = 0;  

    while ((c = getchar()) != EOF)
    {
        if(c == ' ' || c == '\n' || c == '\t')
        {
            state = OUT;            
            if (nc > 0)
            {
                if (nc < MAXWORD)   
                    ++wl[nc];       
                else
                    ++ovflow;       
            }                       
            nc = 0;                 
        }
        else if (state == OUT)
        {
            state = IN;             
            nc = 1;                 
        }
        else
            ++nc;                   
    }

    maxvalue = 0;
    for (i = 1; i < MAXWORD; ++i)
    {
        if(wl[i] > maxvalue)
            maxvalue = wl[i];       
    }

    for(i = 1; i < MAXWORD; ++i)
    {
        printf("%5d - %5d : ", i, wl[i]);
        if(wl[i] > 0)
        {
            if((len = wl[i] * MAXHIST / maxvalue) <= 0)
                len = 1;
        }
        else
            len = 0;

        while(len > 0)
        {
            putchar('*');
            --len;
        }
        putchar('\n');
    }

    if (ovflow > 0)
        printf("There are %d words >= %d\n", ovflow, MAXWORD);

    return 0;

}

我可以理解其中的絕大多數內容,但是這一部分給我帶來了麻煩:

for(i = 1; i < MAXWORD; ++i)
{
    printf("%5d - %5d : ", i, wl[i]);
    if(wl[i] > 0)
    {
        if((len = wl[i] * MAXHIST / maxvalue) <= 0)
            len = 1;
    }
    else
        len = 0;

    while(len > 0)
    {
        putchar('*');
        --len;
    }
    putchar('\n');
}

現在,我知道if函數if((len = wl[i] * MAXHIST / maxvalue) <= 0)正在規范化數組中的值。 我不明白的是它設置len = 1 如果len始終為1 ,那么putchar('*')函數是否應該僅對大於0的任何給定值打印一個星號?

在此先感謝您的幫助。

if分成多個部分,可能會更容易。

len = wl[i] * MAXHIST / maxvalue;
if (len <= 0)
    len = 1;

現在應該清楚的是,僅當len的計算值不大於0時,才將其設置為1。

條件

if((len = wl[i] * MAXHIST / maxvalue) <= 0)
        len = 1;

實際上永遠不會小於零,因為它僅應用於正wl[i] 如您所料, len被標准化為最大數量的星號。 請注意,在if語句本身中, (len = wl[i] * MAXHIST / maxvalue) 因此len剛剛被標准化。 僅當歸一化截斷為零(因為整數除法對小於1的數字所做的事情)時,才會將len設置為1 這只是確保將為非零小節打印至少一個星號。

就是這樣說的:

如果我們有一個非零的字長,但是歸一化的值為0,我們想通過將其提高到1來將其與0區別開。否則,我們使用歸一化的值(在if語句本身中設置-而不是大多數現代編碼標准的良好做法)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM