[英]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.