web-dev-qa-db-ja.com

Cを学ぶ興味深いプロジェクト?

私はC(およびC++のもう少し)の基本的な知識を持っています。 K&Rのコピーを入手しました。これを使用して、言語をより深く掘り下げることができます。 Cのほとんどの機能と標準ライブラリの使用に関連する良いアイデアは何ですか?また、C89とC99の重要な違いは何ですか。

編集: 言及するのを忘れて、これは初心者のためにほとんどできるはずです。私はプログラミングのチュートリアルを求めているのではありません。むしろ、中規模の何か。 OSのものがCの主な目的の1つであることは理解していますが、複雑すぎないでしょうか。

また、質問を読んで答えることは常に良い考えですが、実際に練習して、何かを行うプログラムを作りたいです。

41
Javier

プログラミング言語を実装します。これはひどく難しい必要はありません-私はそうしました 名前を付けてはならない言語 -しかし、それはあなたにCの重要な部分の多くを学ぶことを強いるでしょう。レクサーやパーサーを自分で作成する場合は、Lex/flexとyacc/bisonを使用できますが、これを計画している場合は、やや小規模なプロジェクトから始めることをお勧めします。

あなたがより高級な言語で持っているいくつかのプログラムを取り、それを書き直してください。頻繁に使用するPerl/Python/Ruby/Bashスクリプトがあり、実行中に遅延時間が発生する場合は、パフォーマンスを重視してCで書き直してください。

ただし、Cを学習するプログラムを作成している場合は、ホイールを再発明する方が良いと私は思います。 Cでのプログラミングとは、ホイールを作成して調整することです。ホイールを抽象化するライブラリーを使用してCを学習するだけなら、まあ、実際にはCを学習しているわけではありません。 Cの実際のプロジェクトでは、必ず、ホイールを再発明しないでください。ただし、これを行って学習する場合は、必ず、ホイールのしくみを学んでください。

65
Chris Lutz

StackOverflowでCの質問を読んで答えることは、言語の詳細を学ぶのに良い方法です。

28

私はこれらに取り組むことをお勧めします: http://projecteuler.net/ 。もちろん、ブルートフォースにかかる時間を把握するために、Cでこれらのいくつかを非効率的に行うと役立つ場合があります。次に、より巧妙な方法を考え出して、Cの美しさをよく理解してください。

16
Vince

単純な文法言語のインタプリタ。もちろん、面白くするためにレクサー/パーサージェネレーターを使用しないでください。

7
Ray

チェスゲームを構築します。単純なコンソールでも実行できるので、これは非常に簡単です。ロジックの実装、データ構造の使用、ポインターの操作などができます。スコアを保存して、永続性を操作できるようにします。

5
Rui Craveiro

私は新しい言語を学びたいとき、私はいつも私が便利だと思うであろう、そしてそれを書くであろういくつかのユーティリティを思いつきます。使用される実際のプログラムを書くことは、単なる概念の証明以上のものを私に教えてくれます。

たとえば、指定したディレクトリから始めて、すべてのファイルのリストを横方向に構築し、それらを使用して処理するプログラムを作成する場合があります。同様に、指定したサイズより大きいすべてのファイルの単純なリストを提供します。次に、フィルタを追加して、完了時にそれを使用してディレクトリをクリーンアップできるようにします。 Wordの「バックアップ」またはtmpを含むファイルを探す場合があります。良い感じを得るために、ポインタにポインタを渡す関数を少なくとも1つ持つことを忘れないでください。

はい、私はあなたがそれをスクリプトとして行うことができることを知っていますが、あなた自身に特定のものにカスタマイズすることもできます。

4
Ben

どれだけ深く行きたいかによって、多分 Doom

4
Jim Buck

ハードウェア(組み込みマイクロプロセッサシステム)およびオペレーティングシステムのカーネルコード?

4
stanigator

このような状況で実装する私のお気に入りのプログラムは、かなり基本的な構文を使用しますが、言語の低レベル機能の多くを使用するRegexマッチングプログラムです(そしてCがかなり低レベルの言語であることを考えると、それがほとんどです) 。

2
Tyler Menezes

シンプルなデータベースアプリケーション(連絡先リスト、映画、アルバムなど)も良いプロジェクトかもしれません。これには、ファイルI/O、インタラクティブI/O、メモリ管理、かなりのデータ構造などが含まれます。

1
John Bode

http://projecteuler.net/ はどうですか?それはいくつかの脳細胞を誘発するはずです:)

1
Johan

カーネルハッキングを行う

Sudo apt-get install git-core
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git linux-2.6

私はubuntuを使用しているので、apt-getを実行しました。gentooも使用しています。コマンドは# emerge dev-util/git

1
devin

2006 ICFPコンテストの問題 は非常に楽しかったです。仮想マシンの実装の最初の部分は、Cがまだ適切であるような小さな問題です。ただし、標準ライブラリの多くは学習できません。

0
Darius Bacon

たぶん、bigfiles.cとman 3 fts(ファイル階層をトラバース)の使用(および改善)を見てください。

http://codesnippets.joyent.com/posts/show/1888

0
justc

言語の違いについてはあまり気にしないでください。それらの多くはありませんが、まだです。 (私は2年間cを書いていますが、そこに何の基準があるのか​​まだわかりません。サポートされていないコンパイラーを入手した場合、コードを修正するのに数分かかります)

起こり得る最も苛立たしいことの1つは、通常、for(int i; i <2; i ++);のようにコードの途中で値を定義することです。 c ++仕様のみと見なされるループ。それが私が聖霊に直面していたことです。クロスコンパイルでは、その標準的な違いをはるかに苛立たせる他のものが見つかります。

Cで始める場合は、アルゴリズムとオペレーティングシステムまたは組み込みシステム(ローエンド/ミッドエンドの組み込みシステムでは、まだ最も一般的な言語であるcを学習すること)を学ぶことをお勧めします。

たとえばマイクロチップ、atmel、freescaleからハードウェアの平和を手に入れ、埋め込まれたRTOSサポートを確認します。

0
Luka Rahne