K R《C程式語言》p23 列印最長的輸入行

2021-09-30 14:27:39 字數 3716 閱讀 4899

零、**

#include #define maxline 1000	// 輸入行的最大長度 

int max; // 儲存目前為止最長行的長度

char line[maxline]; // 儲存當前的輸入行

char longest[maxline]; // 儲存最長的行

int get_line(void);

void copy_longest_line(void);

int main()

}if(max > 0)

return 0;

}// 將當前輸入行的內容儲存到line陣列中

int get_line(void)

if (c == '\n')

// 換行符的下乙個字元是行結束符'\0','\0'不算在行長度內

line[i] = '\0';

return i;

}void copy_longest_line(void)

}

一、執行結果輸入a

二、分析

0 請先閱讀關聯博文

1 定義陣列char c[10],可存放十個字元,從c[0]~c[9]。注意計算機是從0開始計數而不是從1開始計數,所以最後乙個元素是c[9]而不是c[10]。

2 字元與數字是一一對應的。具體而言,就是每個字元都對應著乙個ascii編碼。

比如:a對應97,b對應98,其它小寫字母以此類推;

a對應65,b對應66,其它大寫字母以此類推;

字元『1』對應49,字元『2』對應50,其它數字以此類推;

回車符『\r』對應13,換行符『\n』對應10;

行結束符『\0』對應0。

具體可參考 

所以,整型陣列既可以用來存放整型元素,也可以用來存放字元元素;

同理,字元陣列既可以用來存放字元元素,也可以用來存放整型元素。

3 在c語言中,字元陣列是以』\0』作為行結束符的,並且行結束符不算在字元陣列的長度內。

例子:輸入abc並換行,這在長度為10的字元陣列c[10]中是這麼放的ab

c\n\0空

空空空空

這裡c[0] = 『a』, c[1] = 『b』, c[2] = 『c』, c[3]= 『\n』, c[4] = 『\0』, c[5]~c[9]都為空。

其長度為4,行結束符』\0』不算在長度內。

4 get_line函式中有個句子

for (; i < maxline-1 && (c=getchar()) != eof && c != '\n'; ++i)

等價於for (i = 0; i < maxline-1 && (c=getchar()) != eof && c != '\n'; ++i)

因為i = 0;上面已經出現過,所以這裡不寫也可以。

5 本程式的執行過程

(0)最開始max=0;

(1)第一次輸入a並且換行,get_line()函式的執行順序為

i = 0時; 輸入『a』,迴圈的三個條件都滿足,先執行line[0] = 『a』;

再執行i++,i的值變為1

i = 1時; 輸入換行符』\n『 ,迴圈條件有乙個不滿足,結束迴圈

繼續執行if(c == 『\n』),這個條件是成立的,所以line[1] = 『\n』,i++,i的值變為2

繼續執行line[2] = 『\0』

繼續執行return 2。返回的2就是當前行的長度。

此時main()函式中cur_len=2,max=0, cur_max > max成立,執行max = cur_len,即max由原先的0更新為 2。再執行copy_longest_line()函式。

copy_longest_line()函式中,

longest[0] = line[0] = 『a』

longest[1] = line[1] = 『\n』

longest[2] = line[2] = 『\0』迴圈結束

(2)第二次輸入abc並換行,get_line()函式的執行順序為

while語句中,

i = 0時,line[0] = 『a』,i++,i的值變為1;

i = 1時,line[1] = 『b』,i++,i的值變為2;

i = 2時,line[2] = 『c』,i++,i的值變為3;

i = 3時,line[3] = 『\n』,迴圈結束;

if語句中

line[3] = 『\n』, i++, i的值變為4

line[4] = 『\0』;

return 4;

main()函式中,

cur_len的值為get_line()的返回值4,上次得到的max值為2,cur_len>max,max=cur_len=4,即max的值由原先的2更新為4,並執行copy_longest_line()函式。

copy_longest_line()函式中,

longest[0] = line[0] = 『a』;

longest[1] = line[1] = 『b』;

longest[2] = line[2] = 『c』;

longest[3] = line[3] = 『\n』;

longest[4] = line[4] = 『\0』;

迴圈結束。

(3)第3次輸入ab並換行,執行get_line()函式,

line[0] = 『a』;

line[1] = 『b』;

line[2] = 『\n』;

line[3] = 『\0』;

return 3;

因為cur_len=3, max=4, cur_len>max不成立,所以max仍為上次得到的4不作改變,並且copy_longest_line()函式不被執行。

6 本程式中,全域性變數max,line[1000], longest[1000]的定義和使用都在同乙個檔案中,並且是先定義後使用,所以實際上所有的extern語句都可以去掉。

但是若全域性變數的定義在乙個檔案內(比如test1.c),使用在另乙個檔案內(比如test2.c),那麼extern語句不能省。

**:

#include #define maxline 1000	// 輸入行的最大長度 

int max; // 儲存目前為止最長行的長度

char line[maxline]; // 儲存當前的輸入行

char longest[maxline]; // 儲存最長的行

int get_line(void);

void copy_longest_line(void);

int main()

}if(max > 0)

return 0;

}// 將當前輸入行的內容儲存到line陣列中

int get_line(void)

if (c == '\n')

// 換行符的下乙個字元是行結束符'\0','\0'不算在行長度內

line[i] = '\0';

return i;

}void copy_longest_line(void)

}

執行結果:

演算法導論P23題目2 3 7

請給出乙個執行時間為o n lgn 的演算法,使之在給定乙個由n個整數構成的集合s和另乙個整數x時,判斷出s中是否存在有兩個其和等於x的元素。以下思路一 和 思路二來自 思路一 我們最容易想到的是o n2 的演算法,大致偽碼即 1 findx a,x 6 7 return false 8 這裡的演算...

Java之Java中的變數 書(P23)

變數的定義 變數 儲存單元的名字 每乙個記憶體單元都用乙個識別符號來標識,這些記憶體單元被稱為變數,定義的識別符號就是變數名,記憶體單元儲存的資料就是變數的值。變數的型別轉換 1 自動型別轉換 隱式型別轉換 兩種型別在轉換過程中不需要顯示的進行宣告 兩種型別必須相容 目標型別的取值範圍大於原型別的取...

程式設計小白C語言題目練習23

設 int b 2 表示式 b 2 b 1 的值是 這個 的叫左移運算子,這個 是右移運算子 左移運算子將乙個數的各二進位制位全部左移若干位,移動的位數由右運算元指定,右運算元必須是非負值,其右邊空出的位用0填補,高位左移溢位則捨棄該高位。左移一位相當於該數乘以2,左移2位相當於該數乘以2 2 4。...