by freeuniverser
程序語言現在是越來越多,但是好多都是在現有語言的基礎上改了改,本質上並沒有給程序員帶來什麼,這就提醒廣大程序員不要被某種語言限制住了,不要過分迷戀某種語言,因為現在還沒有完美語言(也許人類追求的完美本來就是個美麗的錯誤)。這個月的TIOBE上,C語言又回到了首位,但是也不必太在意,僅供參考嘛。
C語言的一些小程序舉例:
Count blanks,tabs and newlines
/*First Version*/
#include <stdio.h>
int main(void)
{
int blanks;
int tabs;
int newlines;
int c;
blanks = 0;
tabs = 0;
newlines = 0;
while((c = getchar()) != EOF)
{
if(c == ' ')
blanks++;
if(c == '\t')
tabs++;
if(c == '\n')
newlines++;
}
printf("\nBlanks: %d\nTab: %d\nNewline: %d\n",
blanks,tabs,newlines);
return 0;
}
寫程序時的注釋非常重要,以前初寫的時候亂寫,而且命名單字母一大堆,其實吧,好的命名與注釋同等重要,甚至見名知意比注釋更加有力。程序小的話還可以,但是涉及大點的項目的話,如果注釋和命名不注意,那麼很容易產生問題,後期的維護會異常困難,沒人願意再深究你的變量究竟代表什麼,甚至你自己都不知道當初的意思是什麼。
1 /*Second Version*/
2 #include <stdio.h>
3
4 int mian(void)
5 {
6 int blanks;
7 int tabs;
8 int newlines;
9 int c;
10 int done;
11 int lastchar;
12
13 blanks = 0;
14 tabs = 0;
15 newlines = 0;
16 done = 0;
17 lastchar = 0;
18
19 while(done == 0)
20 {
21 c = getchat();
22 if(c == ' ')
23 blanks = blanks + 1;
24 if(c == '\t')
25 tabs = tabs + 1;
26 if(c == '\n')
27 newlines = newlines + 1;
28 if(c == EOF)
29 {
30 if(lastchar == '\n')
31 {
32 newlines = newlines + 1;
33 }
34 done = 1;
35 }
36 lastchar = c;
37 }
38 printf("\nBlanks: %d\nTabs: %d\nNewlines: %d\n",
39 blanks,tabs,newlines);
40 return 0;
41 }
自加自減運算符看似方便,但是濫用其實很不好,容易繞進去。其實好多語言在設計上都是在玩兒技巧,這樣可以少敲點字,可以少占點內存,可以……現在內存不小了,多敲幾個字母也沒什麼,實際上是在節省時間,如果後期維護的話,那將會少很多力氣,這不挺好的嗎?
Copy input to output
1 /*First Version*/
2 #include <stdio.h>
3 #define NONBLANK 'c'
4 int main(void)
5 {
6 int c;
7 int lastchar;
8 lastchar = NONBLANK;
9
10 while((c == getchar()) != EOF)
11 {
12 if(c != ' ')
13 putchar(c);
14 if(c == ' ' && lastchar != ' ')
15 putchar(c);
16 lastchar = c;
17 }
18 }
用getchar()和putchar()搭配干活不累,有好多這樣的函數可以拿來用,當然你也可以自己去寫自己的,不過他山之石何不用呢?如果不是特別需要的地方,那麼不妨就“拿來主義”下吧
1 /******Second Version*********************/
2 int c;
3 int inspace;
4 inspace = 0;
5 while((c = getchar()) != EOF)
6 {
7 if(c == ' ')
8 {
9 if(inspace ==0)
10 {
11 inspace = 1;
12 putchar(c);
13 }
14 }
15 if(c != ' ')
16 {
17 inspace = 0;
18 putchar(c);
19 }
20 }
Copy input to output,replace tab by \t,backspace by \b and backslash by \\
這個程序的\b是個問題,可能會有點錯誤,或者不是很理想,有興趣自己可以寫寫。
1 //*****First Version*****************************/
2
3 int c;
4 while((c = getchar()) != EOF)
5 {
6 if(c == '\t')
7 printf("\\t");
8 if(c == '\b')
9 printf("\\b");
10 if(c == '\\')
11 printf("\\\\");
12 if(c != '\t' &&c != '\b' && c != '\\')
13 putchar(c);
14 }
簡單的用if判斷條件,雖然顯得有點單調,但是確實非常常用的。這很符合人的邏輯,如果怎麼……你看其實程序語言裡面用的單詞其實沒有太難的,對比好多語言你就會發現,像while,if,for等等,好多都是重復的,就行寫文章一樣,把不同的字做一個合乎邏輯的排列組合即可,程序也是如此,只不過是換種表達方式罷了。
1 /******Second Version***************************/
2 int c,t;
3 while((c = getchar()) != EOF)
4 {
5 t = 0;
6 if(c == '\\')
7 {
8 putchar('\\');
9 putchar('\\');
10 t = 1;
11 }
12 if(c == '\t')
13 {
14 putchar('\\');
15 putchar('t');
16 t = 1;
17 }
18 if(c == '\b')
19 {
20 putchar('\\');
21 putchar('b');
22 t = 1;
23 }
24 if(t == 0)
25 putchar(c);
26 }
putchar()雙劍合璧,顯得更清晰。這就像籬笆,你可以兩個捆一起,還可以三個、四個……最後連起來就可以了,分開寫可能有時候會顯得更加清晰、有條理,擠一塊當然也可以,注意分隔,沒人規定籬笆不能是一長條彎起來吧。
1 /******Third Version***********************/
2 #define DOUBLELINE '\\'
3 int c;
4 while((c = getchar()) != EOF)
5 {
6 switch(c)
7 {
8 case DOUBLELINE:
9 putchar(DOUBLELINE);
10 putchar(DOUBLELINE);
11 break;
12 case '\t':
13 putchar(DOUBLELINE);
14 putchar('t');
15 break;
16 case '\b':
17 putchar(DOUBLELINE);
18 putchar('b');
19 break;
20 default:
21 putchar(c);
22 break;
23 }
24 }
switch-case顯得更為清晰而有條理,但是好多時候不及if有效。其實,好多時候,一種語言提供了多種方式來表達同樣的意思,只不過要看場合和自己的興趣了,不要太拘束,怎樣順怎麼來表達,做到簡潔清晰就行了。
prints its input one word per line
1 int c;
2 int inspace;
3 inspace = 0;
4 while((c = getchar()) != EOF)
5 {
6 if(c == ' ' || c == '\t' || c == '\n')
7 {
8 if(inspace == 0)
9 {
10 inspace = 1;
11 putchar('\n');
12 }
13 }
14 else
15 {
16 inspace = 0;
17 putchar(c);
18 }
19 }
inspace在上面的作用已經很明顯,和上面的done一樣,作為控制作用,有點相當於開關。畢竟程序語言借自然的智慧誕生於人類的頭腦,其結果也必然是來源於現實社會,又反映現實社會。
好多語言發展到現在都遇到了瓶頸,而且好多都是在炒剩飯,然後換件外衣,新瓶裝老酒而已。其實也沒有哪種語言可以一統程序界江湖,不必有宗教情節,期待簡潔清晰方便的語言出現。