web-dev-qa-db-fra.com

Projet intéressant pour apprendre le C?

J'ai quelques connaissances de base en C (et un peu plus en C++). J'ai obtenu une copie de K&R, et je veux l'utiliser pour m'aider à approfondir la langue. Quelle est une bonne idée qui impliquera l'utilisation de la plupart des fonctionnalités et de la bibliothèque standard de C? De plus, quelles différences importantes entre C89 et C99 dois-je savoir?

ÉDITER: Oublié de mentionner, cela devrait être principalement faisable pour un débutant. Je ne demande pas de tutoriel de programmation; plutôt quelque chose de milieu de gamme. Je comprends que le système d'exploitation est l'un des principaux objectifs de C, mais cela ne serait-il pas trop compliqué?

De plus, lire et répondre aux questions est toujours une bonne idée, mais je veux obtenir une pratique réelle, créer un programme qui fera des choses.

41
Javier

Implémentez un langage de programmation. Cela ne doit pas être terriblement difficile - je l'ai fait la langue qui ne doit pas être nommée - mais cela vous obligera à apprendre beaucoup des parties importantes de C. Si vous ne voulez pas écrire un lexer et/ou un analyseur vous-même, vous pouvez utiliser Lex/flex et yacc/bison, mais si vous prévoyez cela, vous voudrez peut-être commencer par un projet un peu plus petit.

Prenez un programme que vous avez dans une langue de niveau supérieur et réécrivez-le. Si vous disposez d'un script Perl/Python/Ruby/Bash que vous utilisez beaucoup et que vous remarquez un décalage pendant son exécution, réécrivez-le en C en mettant l'accent sur les performances.

Je pense cependant que si vous écrivez un programme pour apprendre le C, il vaut mieux réinventer la roue. La programmation en C consiste à créer et à ajuster la roue, et si vous apprenez le C uniquement en utilisant des bibliothèques qui résument la roue pour vous, eh bien, vous n'apprenez vraiment pas C. Cela peut être plus rapide - et lorsque vous travaillez sur un vrai projet en C, par tous les moyens, ne réinventez pas la roue - mais si vous faites cela pour apprendre, alors par tous les moyens, apprenez comment fonctionne la roue.

65
Chris Lutz

La lecture et la réponse aux questions C sur StackOverflow est un bon moyen d'apprendre les détails de la langue.

28
Martin v. Löwis

Je recommanderais de travailler à travers ceux-ci: http://projecteuler.net/ . Bien sûr, il est parfois utile de faire certaines de ces tâches de manière inefficace en C, pour avoir une idée du temps que prend la force brute. Ensuite, essayez de trouver une manière plus intelligente et voyez vraiment la beauté de C bien fait!

16
Vince

Un interprète pour un langage grammatical simple. Aucun générateur de lexer/analyseur ne doit être utilisé bien sûr pour le rendre intéressant.

7
Ray

Créez un jeu d'échecs. Cela peut être assez trivial car vous pouvez même le faire avec une console ordinaire. Il vous permet d'implémenter une logique, d'utiliser des structures de données, de travailler avec des pointeurs, etc. Stockez le score afin de pouvoir travailler avec persistance.

5
Rui Craveiro

Quand je veux apprendre une nouvelle langue, je trouve toujours un utilitaire que je trouverais utile et je l'écris. Je trouve qu'écrire un programme réel qui va être utilisé m'apprend plus qu'une simple preuve de concepts.

Par exemple, vous pourriez écrire un programme qui, à partir du répertoire spécifié, traversera la construction d'une liste de tous les fichiers et fera quelque chose avec eux. Comme vous donner une liste simple de tous les fichiers d'une taille supérieure à une taille spécifiée. Ensuite, découvrez comment ajouter des filtres afin que, une fois terminé, vous puissiez l'utiliser pour nettoyer les répertoires. Il peut rechercher le mot "sauvegarde" ou les fichiers contenant tmp. N'oubliez pas d'avoir au moins une fonction qui passe un pointeur à un pointeur pour avoir une bonne idée d'eux.

Oui, je sais que vous pouvez le faire comme un script, mais vous pouvez également le personnaliser en fonction de quelque chose de spécifique à vous.

4
Ben

Selon la profondeur à laquelle vous voulez aller, peut-être Doom ?

4
Jim Buck

Matériel (système de microprocesseur intégré) et codes du noyau du système d'exploitation?

4
stanigator

Mon programme préféré à implémenter dans des situations comme celle-ci est un programme de correspondance Regex, qui utilise une syntaxe assez basique mais utilise beaucoup de fonctionnalités de bas niveau d'un langage (et étant donné que C est un langage de bas niveau, c'est la plupart d'entre eux) .

2
Tyler Menezes

Une simple application de base de données (liste de contacts, films, albums, etc.) pourrait également être un bon projet; cela impliquerait des E/S de fichiers, des E/S interactives, une gestion de la mémoire, des structures de données raisonnablement charnues, etc.

1
John Bode

Que diriez-vous http://projecteuler.net/ fait avec c? Cela devrait déclencher quelques braincells :)

1
Johan

Faites du piratage du noyau

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

J'utilise ubuntu, donc j'ai fait un apt-get, j'utilise aussi gentoo, la commande y est # emerge dev-util/git

1
devin

--- 2006 ICFP Contest problem était incroyablement amusant. La première partie, l'implémentation de la machine virtuelle, est un petit problème qui est juste le genre de chose pour laquelle C est toujours approprié. Cependant, cela ne vous apprendra pas beaucoup de la bibliothèque standard.

0
Darius Bacon

Peut-être voir (et améliorer) bigfiles.c et l'utilisation de man 3 fts (traverser une hiérarchie de fichiers):

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

0
justc

Pour la différence de langues ne vous inquiétez pas trop. Il n'y en a pas beaucoup, mais quand même. (j'écris c depuis 2 ans mais je ne sais toujours pas quel stadard est là, si je ne suis pas conforme, il faut quelques minutes pour corriger le code)

L'une des choses les plus frustrantes qui puisse arriver est la définition habituelle de valeurs au milieu du code comme dans for (int i; i <2; i ++); boucle qui n'est considérée que comme une spécification c ++. C'est à cela que je faisais face. Dans la compilation croisée, vous trouverez autre chose beaucoup plus frustrante que la différence standard.

Pour commencer en c, je suggère d'apprendre des algorithmes et des systèmes d'exploitation ou un système embarqué (c dans la langue de loin la plus courante sur les systèmes embarqués bas/milieu de gamme)

Obtenez une certaine tranquillité de matériel, par exemple, à partir de puces, d'atmel ou de freescaleand et vérifiez leur support RTOS support.

0
Luka Rahne