有哪些小的 C 語言項目(大概幾千行)適合個人開發?
個人情況:
1 c 語言基礎紮實2 有較好的數據結構和基本演算法基礎,從高中開始就練習了3 做過 XXX 管理系統希望各位有豐富編程經驗的程序員給些建議,對自己能夠有比較大的實際性鍛煉,感覺那些管理系統沒多大意義。謝謝大家!ps: 是個人項目,開源項目就算了,感覺那些太難了,而且很難入手。
有一些比較好的開源框架可以學習,比如:
- Libevent
libevent是一個開源的事件驅動庫,基於epoll,kqueue等OS提供的基礎設施。其以高效出名,它可以將IO事件,定時器,和信號統一起來,統一放在事件處理這一套框架下處理。基於Reactor模式,效率較高,並且代碼精簡(4.15版本8000多行),是學習事件驅動編程的很好的資源。
下載鏈接:GitHub - libevent/libevent
- Webbench
Webbench是一個在linux下使用的非常簡單的網站壓測工具。它使用fork()模擬多個客戶端同時訪問我們設定的URL,測試網站在壓力下工作的性能,最多可以模擬3萬個並發連接去測試網站的負載能力。Webbench使用C語言編寫, 代碼實在太簡潔,源碼加起來不到600行。
下載鏈接:https://github.com/EZLippi/WebBench
- Memcached
Memcached 是一個高性能的分散式內存對象緩存系統,用於動態Web應用以減輕資料庫負載。它通過在內存中緩存數據和對象來減少讀取資料庫的次數,從而提供動態資料庫驅動網站的速度。Memcached 基於一個存儲鍵/值對的 hashmap。Memcached-1.4.7的代碼量還是可以接受的,只有10K行左右。
下載地址:memcached - a distributed memory object caching system
- SQLite
SQLite是一個開源的嵌入式關係資料庫,實現自包容、零配置、支持事務的SQL資料庫引擎。 其特點是高度便攜、使用方便、結構緊湊、高效、可靠。足夠小,大致3萬行C代碼,250K。
下載地址:SQLite Home Page 。
- Boost.Asio
它是非同步輸入輸出的核心。 名字本身就說明了一切:Asio 意即非同步輸入/輸出。該庫可以讓 C++ 非同步地處理數據,且平台獨立。非同步數據處理就是指,任務觸發後不需要等待它們完成。相反,Boost.Asio 會在任務完成時觸發一個應用。非同步任務的主要優點在於,在等待任務完成時不需要阻塞應用程序,可以去執行其它任務。
鏈接:Boost.Asio - 1.58.0- Tinyhttpd
tinyhttpd是一個超輕量型Http Server,使用C語言開發,全部代碼只有502行(包括注釋),附帶一個簡單的Client,可以通過閱讀這段代碼理解一個 Http Server 的本質。
下載鏈接:https://github.com/EZLippi/Tinyhttpd
- cJSON
cJSON是C語言中的一個JSON編解碼器,非常輕量級,C文件只有500多行,速度也非常理想。
cJSON也存在幾個弱點,雖然功能不是非常強大,但cJSON的小身板和速度是最值得讚賞的。其代碼被非常好地維護著,結構也簡單易懂,可以作為一個非常好的C語言項目進行學習。
項目主頁:cJSON | SourceForge.net
可以看看值得推薦的C/C++框架和
可是嘗試自己實現Linux下的命令,比如diff, tar等,有些命令的源碼也就幾千行
謝 @林卡拉 邀請。
我收到這個邀請已經很久,但我一直不知從何說起。因為我最早就是從開源項目開始看起的,當時看的代碼是 Blackbox,一個很簡單的 XWindow 窗口管理器,那時候也就萬把行C++代碼。我不知道提問者的計算機水平怎麼樣,如果是本科畢業,或許從頭到尾讀這樣的程序有困難,但調幾個bug,並不能算不能完成的任務。
如果說萬把行 C++ 代碼還有難度,那最簡單的辦法就是自己寫些更小的程序。比如我之前拼裝我的 ArchLinux 時,為了支持 Openbox 窗口管理器用快捷鍵控制系統音量,就自己寫了一個命令行程序,3000 多行,基於 PulseAudio API,支持指定命令行參數來控制哪些設備音量。
如果提問者工作在 Windows 上,那麼也有一些事情可做。比如我之前做過一個 COM 組件,把 FindWindow(),AccessibleObjectFromWindow() 和 AccessibleObjectFromPoint() API 暴露出來給 JScript 用,用來做 UI 自動化測試的。因為雖然微軟給的 IAccessible 介面是可以完整通過 JScript 訪問,但從 FindWindow 的窗口句柄到從中獲取 IAccessible 介面卻沒有 JScript 版本。這個代碼量也就不到一千行,解決了我們的大問題。
說白了,你遇到什麼問題就解決去唄。與其等項目,不如自己做項目。如果是利用業餘時間做的話,如果還做些簡單的,花里胡俏的,只流行沒內涵的東西,那該多無聊啊。所以樓主這個時候就應該去造些輪子,譬如說實現一下正則表達式什麼的,沒有複雜功能的話兩三千行就搞定了,很適合一個人寫。
各種OJ刷題。
- POJ(Welcome To PKU JudgeOnline)
- 九度(九度Online Judge,用代碼記錄你的成長之路!)
- ZOJ(ZOJ :: Home)
其它:(from quora)
- Programming Competition,Programming Contest,Online Computer Programming
- Sphere Online Judge (SPOJ)
- Programming Praxis
- Project Euler
- TopCoder, Inc. | Home of the world"s largest development communityTopCoder, Inc. | Home of the world"s largest development community
- Codeforces
- HackerEarth Beta
- The Python Challenge
- HackerRank
- LeetCode
Computational Geometry (計算幾何)
計算幾何真是個計算機世界中的一朵奇葩,是我上的眾多計算機課程中最優雅地將演算法理論和應用結合起來的(鄧sir也是我遇到最好的老師,cg project list:Project)一些CG的Demo:- 3D Convex Hull http://www.openprocessing.org/sketch/94632
- Triangulation Triangulate Star-Shaped Polygon
- Voronoi Diagram Delaunay Triangulation Voronoi/Delaunay Applet
- Trapezoidal Map Compunational Geometry
例如,我們前幾天做的一個CG的課程項目(Qt+opengl用於顯示和交互核心是用C++寫的):
------------------------------------------------------------------------------即陶冶了情操又為以後找工作奠定了強大的基礎。------------------------------------------------------------------------------
做日常的項目會把自己陷入到一個苦逼程序員的定義中不可自拔,做oj會覺得自己很偉岸,嗯,是這樣的。謝邀。如果你真的做到 C 語言基礎紮實了,你絕對不可能不知道目前有什麼樣的項目可以練手。我遇到過很多號稱 C 語言熟練的人,隨便問幾個問題之後就發現其實他 C 語言根本還沒有入門。做項目不是目的,提高水平才是目的。如果將來打算以編程為職業的話,請再自己審視一下自己的 C 語言水平,最好能找專業人員仔細聊一聊,有人指導的話最好。
這是一個五百行的C語言文件,實現了一個最基礎的Scheme解釋器。具有除掉quote
之外所有的語言特性。此外沒有垃圾收集模塊,沒有釋放任何內存,因為我的目標不是寫一個完備的Scheme解釋器。基本上是想到哪寫到哪,沒有多少注釋但是變數名都比較幼稚,適合一口氣從頭讀到尾。
寫一個解釋器不僅僅是對初級編譯原理知識點的總結和運用,更是將自己培養為代碼、程序乃至編程語言的設計師路上必經的一步。比如我不喜歡一個過於複雜的詞法結構,希望詞法分析器對應的函數不要超過100行,那麼就取消了布爾值字面量,只要在標準庫里加兩句話:
(define true (= 42 42))
(define false (= 42 43))
也就行了。那麼對應的,我也可以把內建函數的數量降至最少,比如對布爾值的或與非操作就可以用普通的函數實現:
(define and (lambda (a b)
(cond
(a (cond
(b true)
(else false))
(else false))))
但是表達「空值」的nil
呢?這個值是必要的,對於一些不應當返回任何值的函數和特殊形式(比如cond
所有的斷言都為假),必須依賴nil
以維持「一切都是表達式」的原則。因此這個值就要對應著一個解釋內部的類型,那麼我們要怎樣生成這個值呢?一種策略是把它寫進詞法分析器,還有一種策略是用一些看起來不那麼「直觀」的方式,比如:
(define nil (cond (false 42)))
這當中的取捨完全取決於語言的設計者,也就是解釋器的編寫者。站在語言的使用者的對立面進行一定的思考,對於理解其他語言中的設計有好處。
標準的Scheme中「欽定」了以列表作為其基礎的也是唯一的複合數據結構,比如(quote (a b c d))
的結果,是可以像普通的、用cons
構建起來的列表一樣,用car
和cdr
進行操作的。但我們完全可以創建新的數據結構,甚至用別的數據結構替換之作為基礎數據結構。這是一個與語言提供的「編程模型」息息相關的特性。比如說,你可以提供一組內建函數,對可以隨機讀寫的數組進行封裝,那麼恭喜你,你寫的已經不是LISP了,而是一種新的,應當被成為ARRAP(array processor)的語言的解釋器。再比如說,你完全可以用普通函數定義如下一套使用Church編碼的列表:
(define (cons h t) (lambda (f) (f h t)))
(define (car c) (c (lambda (h t) h)))
(define (cdr c) (c (lambda (h t) t)))
使用這一套介面創建的列表和Scheme通過quote
創建的列表是不「兼容」的。它們有什麼區別?如何提供合適的quote
,使它和cons
的返回值可以使用一套介面操作?這都是很值得思考的問題。
接下來我計劃在這個五百行程序的基礎上添加quote
和一個讀取文件的內建函數,然後用Scheme寫成一個從Scheme編譯到彙編的編譯器完成自舉,歡迎圍觀。
寫一個儘可能豐富的Scheme解釋器/編譯器,還是有不少合適的地方的
1. 容易開頭,並且代碼量滿足要求。Scheme的語法很容易用遞歸下降法來解析(省下學習lex/yacc的功夫),並且直接遍歷語法樹進行求值的方法也很簡單粗暴(Matz剛開始寫的Ruby呃也是這樣子的,別介意)。如果你完善一下這個東西,那麼幾千行的代碼量不是問題。
2. 參考資料多。有很多書是以講解Scheme解釋器的方式貫穿全書的,同時還可以參考正統的編譯原理方面的書,另外也有不少講中文的人是懂行的,有問題也可以到知乎這裡來提問;-P另外,小巧的Scheme實現的源代碼也很容易獲得,並且代碼量不大,寫的時候方便參考。(我是野路子做法,寫編譯器的時候看的是《PAIP》中第23章的代碼
3. 設計內容多。C語言本身的功能比較貧瘠,而Scheme卻是一門有著很多高級特性的語言,在使用C語言實現Scheme的過程中就會有很多功能是你自己需要實現的,當中有一些會涉及到演算法和數據結構,尤其當你開始實現標準庫和語言runtime的時候,這一點就更加明顯了。題主也提到了自己的演算法和數據結構知識較好,那麼不妨在實現標準庫和runtime的時候挑戰一下自己,儘可能多地去提供功能XD
PS:剛開始手機碼字提交結果沒了QAQ輸出2千行的helloworld 不準用循環
C語言相比其他語言的長處在於性能。可以寫個棋類A.I.,簡單點如五子棋,複雜點如象棋。
這是我用C++寫的一個玩具圍棋A.I.,希望對你有啟發:
chncwang/FoolGo · GitHub可以寫一個WM吧,dwm也才2000多行。自己用自己寫的WM,感覺特別得爽。
以我自己來說,喜歡在工作之餘圍繞當前項目使用到的類庫,做些小工具,小組件為以後的項目打基礎,也可以練練手,形成自己的代碼倉庫。
試著把你日常工作的重複部分用程序來建模解決。行數不重要,從實用這個詞出發,才能明白為啥要寫程序。
http://www.buildyourownlisp.com
一千行C寫一個小型Lisp解釋器把windows自帶的遊戲自己實現一遍。如果還不過癮就把windows自帶的各種常用小工具自己實現一遍。
試著寫個小型操作系統內核或者一個簡單的編譯器是最好的
造 Server 吧~~nginx 什麼的~~我超喜歡造 Server 的~~現在也有書專門分析這方面的開源代碼,不至於看不懂。如果看不懂,那就是 C 還不夠紮實咯~~
玩具os解釋器(lua, python, lisp系)正則等等……
C語言紮實嘛,那就寫個掃雷或者魔方啥的吧
一個是去工業控制領域裡看看有沒有小代碼的機會;一個是我真心勸你,既然C基礎紮實,不如快速轉手到Objective-C,去APPstore上淘些錢來安全可靠。
推薦閱讀:
※在一家大公司如果想要自暴自棄的話, 是不是就可以選擇去開發Android?
※為什麼黑客領域幾乎一片男生?
※2G內存和64位處理器到底裝32位還是64位系統?
※本科學計算機類的體驗與前景如何?