Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Quel tutoriel pour débuter ?

202 réponses
Avatar
Migrec
Bonjour,

Je cherche un tutoriel imprimable sur le web pour apprendre le C avant
d'acheter un bouquin "de référence".
Je suis débutant en programmation mais je connais les scripts shell
(linux), le HTML ou encore un peu de PHP.

Quel tutoriel imprimable me conseillez-vous pour débuter ? Les 560 pages
de celui du site du zéro
(http://www.siteduzero.com/tuto-29-8-0-apprenez-a-programmer-en-c.html)
découragent un peu mon imprimante, même avec le recto-verso
automatique... Mais le style me plaît ! Existe-t-il quelque chose dans
le même esprit mais en plus condensé ?

--
Migrec

10 réponses

Avatar
Thierry B.
--{ Wykaaa a plopé ceci: }--

Si ta référence, pour dire que le K&R est le meilleur livre pour
apprendre le C, sont les ng US, alors, ce n'est même pas la peine de
discuter...




<troll>
Par contre, apprendre le C sans avoir le K&R sous la main,
c'est aussi une grosse erreur. Le gros défaut de ce livre,
c'est qu'il est très "dense", que chaque mot compte, et
qu'il necessite beaucoup de reflexion pour être assimilé.
Ce qui, parfois, rebute les débutants qui veulent avoir
l'impression d'avancer vite. Une fois que l'on pense avoir
compris le K&R, on peut songer à envisager de comprendre
l'essence metaphysique du C :)
</troll>


--
Une des corolaires de la loi de Murphy veux que le nombre d'emerdements
prévisible est très limité, contrairement aux emerdements imprévisible
dont la liste est par définition infinie.
--{ NM, macounet lucide }--
Avatar
Alexandre BACQUART
candide wrote:
Alexandre BACQUART a écrit :

Comme si le K&R avait pour vocation d'être un "tutoriel"...



Remplace "vocation" par "intention" et observe le titre du chapitre 1 ...



"Présentation générale du C" ?

Le résultat est selon moi un fiasco absolu.



N'exagérons rien. Mais d'un point de vue pédagogique, je suis plutôt
d'accord. Maintenant, je ne suis pas spécialiste en matière de
pédagogie, et comme tous les hackers de l'époque, j'ai dû faire avec. Si
cela ne m'a pas posé trop de problèmes, c'est que j'avais beaucoup
pratiqué l'assembleur avant d'aborder ce bouquin, et ça, ça aide
énormément (les pointeurs passent alors comme une lettre à la poste,
l'OP a d'ailleurs signalé qu'il était embêté avec ça, ce qui est classique).

Dommage, l'intention était
bonne. En réalité, le livre est très inégal du point de vue de la
pédagogie. Ça mériterait une analyse détaillée à laquelle je me livrerai
peut-être un jour ici même.



Comme je l'ai dit, le débat revient régulièrement ici. Tu devrais sans
peine trouver de l'inspiration dans les archives.

de plus, ce livre a 30 ans (presque 20 pour la 2ème édition) !
Qu'est-ce qui vous permet de croire qu'on a pas fait mieux depuis pour
s'initier au C ?



Absolument. S'il y en a qui ont consulté le K&R première version, je
serais curieux de savoir où sont les différences de contenu avec K&R2.
Je suis à peu près convaincu qu'on retrouve à des détails près
exactement la même chose.


Quand on est consultant FL > 45 ans, on a tous appris le C avec le
K&R il y a 25 ans et on ne le regrette pas.







"
This book (widely known as K&R, after the authors' initials) has for
over twenty years been the best way to learn C.
"






On dirait la quatrième de couverture mais google semble renvoyer vers
amazon.com, la critique des lecteurs, ici plus précisément :

http://www.amazon.com/review/product/0131103628?showViewpoints=1

De toute façon, le niveau d'argumentation est proprement sidérant.



On a vu, ne t'inquiète pas.

Si son niveau en C est comparable, je lui conseille le tuto du site du
zéro, ah! ah! ah!



Si je peux me permettre de me faire l'avocat du diable : je ne suis pas
un puriste, donc je n'ai pas grand-chose à en dire de ce site. J'ai
néanmoins jeté un oeil et je ne le trouve pas si mauvais en tant que
tutoriel, même si on peut regretter quelques écarts inutiles, comme le
fait d'utiliser le mot "librairie" en lieu et place de "bibliothèque",
volontairement de son aveu (le genre de choses qui donnera des boutons
aux puristes, mais les puristes ne sont pas censés lire des tutoriels).

En dehors de ce genre de libertés gratuites, il faut quand-même admettre
qu'on ne peut pas faire un tutoriel sans casser des oeufs, c'est
inévitable, sinon on rentre dans des détails qui feront que ce ne sera
plus un tutoriel.

Je suis sûr que beaucoup d'apprentis programmeurs y trouvent leur
compte. Je dirai même qu'ils obtiendront des résultats bien plus
rapidement qu'en abordant la chose avec le K&R. Il ne faut quand-même
pas mélanger ceux qui font cela pour s'amuser, et ceux qui en vivent.


--
Alex
Avatar
candide
Wykaaa a écrit :


Au passage, je vois que quelques pages plus loin, il écrit

enum {FAUX, VRAI};

pratique que tu avais condamné me semble-t-il dans un message antérieur.



Je ne crois pas avoir condamné cette pratique.




SI : http://groups.google.fr/group/fr.comp.lang.c/msg/65ccae2201c81220?hl=fr


Il me semble que j'avais
même écrit :
enum bool {FAUX=0, VRAI=1} /* pour être sûr */



Oui mais ça c'est différent de ce que j'ai rapporté.



Justement, du point de vue pédagogique, on évite de faire l'erreur
d'énoncer une règle, immédiatement suivie de ses exceptions. On
introduit les exceptions à la règle là où elles sont nécessaires.



Non, absolument pas. Il faut indiquer au moins que des exceptions
existent et faire un renvoi par si les livres de grammaire de nos gamins
étaient écrits comme ça, ils écriraient des bijous (et d'ailleurs, c'est
ce qu'ils font ;) ).

En plus il donne l'impression d'avoir oublié les exceptions et
soudainement de s'en souvenir. En plus, il a oublié le cas &tableau.



Bonne pratique de signaler l'exception seulement quand on parle de
sizeof(tableau) car, sur ce cas, le débutant est en mesure de comprendre
que ce serait absurde de rendre comme résultat la taille du pointeur de
l'adresse du tableau...



D'accord à condition que le lecteur ait été prévenu de l'_existence_ de
ces exceptions, ce qui n'est pas le cas ici. Le principe à appliquer est
un bien connu, c'est le le fameux "Rule of Least Surprise".


Au paragraphe 4.13.2 (intitulé "Cas particulier des chaines
littérales"), il y a un exemple, des commentaires et un dessin qui me
laissent penser que l'auteur ne sait peut-être pas que dans

char *p="Hello";

"Hello" est non modifiable.



Ca veut dire quoi que "Hello" est non modifiable ?
Veux-tu parler du pointeur (créé par le compilateur) qui référence la
chaîne ?
Parce que p[4]='a'; c'est censé marcher, hein ?




Oui, rien dans son exposé ne laisse entendre que ce serait impossible
tellement il fait le parallèle entre

char s[]="hello";/* modifiable */
char *s="hello";/* non modifiable */

Un court de C doit forcément contenir des propos non ambigus là-dessus.




Je viens de passer plus d'une heure à regarder le livre, c'est pour
moi un très très mauvais livre d'apprentissage.



Beaucoup moins mauvais que le K&R (pour l'apprentissage, en tout cas).



Mauvais quand même, je préfère encore K&R.
Avatar
candide
Alexandre BACQUART a écrit :

"Présentation générale du C" ?




Si c'est la traduction française de "A tutorial Introduction" tu devrais
te procurer la VO.


Si
cela ne m'a pas posé trop de problèmes, c'est que j'avais beaucoup
pratiqué l'assembleur avant d'aborder ce bouquin, et ça, ça aide
énormément (les pointeurs passent alors comme une lettre à la poste,



Je note ce point tout à fait intéressant.


l'OP a d'ailleurs signalé qu'il était embêté avec ça, ce qui est
classique).



Pareil pour moi, c'était d'ailleurs l'objet de mon premier message sur
fclc il y a exactement trois ans !



Comme je l'ai dit, le débat revient régulièrement ici. Tu devrais sans
peine trouver de l'inspiration dans les archives.



Franchement, j'en doute, je me sens très inspiré tout seul sur cette
question (qui me tient à coeur).

Si je peux me permettre de me faire l'avocat du diable : je ne suis pas
un puriste, donc je n'ai pas grand-chose à en dire de ce site. J'ai
néanmoins jeté un oeil et je ne le trouve pas si mauvais en tant que
tutoriel, même si on peut regretter quelques écarts inutiles, comme le
fait d'utiliser le mot "librairie" en lieu et place de "bibliothèque",
volontairement de son aveu (le genre de choses qui donnera des boutons
aux puristes, mais les puristes ne sont pas censés lire des tutoriels).



Cet écart de langage est très fréquent y compris chez des informaticiens
très titrés. J'ai appris à être tolérants avec ce genre d'écart.


Je suis sûr que beaucoup d'apprentis programmeurs y trouvent leur
compte. Je dirai même qu'ils obtiendront des résultats bien plus
rapidement qu'en abordant la chose avec le K&R.



Tout à fait.

Il ne faut quand-même
pas mélanger ceux qui font cela pour s'amuser, et ceux qui en vivent.




Après, il y a ceux qui vivent en s'amusant ...
Avatar
Wykaaa
candide a écrit :
Wykaaa a écrit :


Au passage, je vois que quelques pages plus loin, il écrit

enum {FAUX, VRAI};

pratique que tu avais condamné me semble-t-il dans un message antérieur.



Je ne crois pas avoir condamné cette pratique.




SI :
http://groups.google.fr/group/fr.comp.lang.c/msg/65ccae2201c81220?hl=fr


Il me semble que j'avais même écrit :
enum bool {FAUX=0, VRAI=1} /* pour être sûr */



Oui mais ça c'est différent de ce que j'ai rapporté.



Justement, du point de vue pédagogique, on évite de faire l'erreur
d'énoncer une règle, immédiatement suivie de ses exceptions. On
introduit les exceptions à la règle là où elles sont nécessaires.



Non, absolument pas. Il faut indiquer au moins que des exceptions
existent et faire un renvoi par si les livres de grammaire de nos gamins
étaient écrits comme ça, ils écriraient des bijous (et d'ailleurs, c'est
ce qu'ils font ;) ).

En plus il donne l'impression d'avoir oublié les exceptions et
soudainement de s'en souvenir. En plus, il a oublié le cas &tableau.



Bonne pratique de signaler l'exception seulement quand on parle de
sizeof(tableau) car, sur ce cas, le débutant est en mesure de
comprendre que ce serait absurde de rendre comme résultat la taille du
pointeur de l'adresse du tableau...



D'accord à condition que le lecteur ait été prévenu de l'_existence_ de
ces exceptions, ce qui n'est pas le cas ici. Le principe à appliquer est
un bien connu, c'est le le fameux "Rule of Least Surprise".


Au paragraphe 4.13.2 (intitulé "Cas particulier des chaines
littérales"), il y a un exemple, des commentaires et un dessin qui me
laissent penser que l'auteur ne sait peut-être pas que dans

char *p="Hello";

"Hello" est non modifiable.



Ca veut dire quoi que "Hello" est non modifiable ?
Veux-tu parler du pointeur (créé par le compilateur) qui référence la
chaîne ?
Parce que p[4]='a'; c'est censé marcher, hein ?




Oui, rien dans son exposé ne laisse entendre que ce serait impossible
tellement il fait le parallèle entre

char s[]="hello";/* modifiable */
char *s="hello";/* non modifiable */

Un court de C doit forcément contenir des propos non ambigus là-dessus.



Là, je suis d'accord car c'est un point très délicat du langage C.




Je viens de passer plus d'une heure à regarder le livre, c'est pour
moi un très très mauvais livre d'apprentissage.



Beaucoup moins mauvais que le K&R (pour l'apprentissage, en tout cas).



Mauvais quand même, je préfère encore K&R.


Alors là, tu vois, je crois que ça devient une question de "goût", ou
plutôt de tournure d'esprit.
Avatar
Pierre Maurette
candide, le 09/08/2008 a écrit :

[...]

Un court de C doit forcément contenir des propos non ambigus



Tout à fait. Par exemple un "court de C" est-il un terrain muni d'un
filet sur lequel s'échangent longuement des propos passionnants sur
l'enseignement de ce langage? Ou alors un cours de C plutôt compact?

--
Pierre Maurette
Avatar
Pierre Maurette
Wykaaa, le 09/08/2008 a écrit :

[...]

char s[]="hello";/* modifiable */
char *s="hello";/* non modifiable */

Un court de C doit forcément contenir des propos non ambigus là-dessus.



Là, je suis d'accord car c'est un point très délicat du langage C.



Ce peut être également très intéressant sur un plan pédagogique. En
profitant du fait qu'une toolchain encore très répandue(*) fait pointer
s vers un "hello" en mémoire RW. A partir de là et du fait que ça va
faire boom avec par exemple gcc on peut développer sur les littéraux
chaîne, mais également sur le fait qu'un machin "qui tourne" n'est pas
validé pour autant.

(*) Je ne l'ai pas à ma disposition, mais sauf erreur de ma part c'est
le cas de Borland BC5.5 .

--
Pierre Maurette
Avatar
Alexandre BACQUART
candide wrote:
Alexandre BACQUART a écrit :

"Présentation générale du C" ?



Si c'est la traduction française de "A tutorial Introduction" tu devrais
te procurer la VO.



Du coup je n'y tiens pas trop... mais bon, c'est une exception.

Si cela ne m'a pas posé trop de problèmes, c'est que j'avais beaucoup
pratiqué l'assembleur avant d'aborder ce bouquin, et ça, ça aide
énormément (les pointeurs passent alors comme une lettre à la poste,



Je note ce point tout à fait intéressant.



Charlie Gordon a posté dans cette enfilade et le résume assez bien.
Beaucoup considèrent C comme un macro-assembleur (et effectivement, le C
est une abstraction de l'assembleur) et les pointeurs jouent un rôle
prépondérant pour créer ce lien très étroit entre les deux.

L'assembleur apprend beaucoup sur le fonctionnement des
micro-processeurs (de *tous* les micro-processeurs). Bien-sûr, ce n'est
pas portable, c'est primitif, c'est fastidieux et rébarbatif. Mais ça a
le mérite d'être très, très instructif sur quelques concepts qu'on
retrouve partout (il faut pratiquer cependant, je doute que la théorie
suffise vraiment). Mais si tu pratiques déjà bien C, ce n'est peut-être
pas très utile... tout au plus tu en arrivera en C à faire des
expériences que l'on pourrait qualifier de "chimie amusante" (ie.
dangereuses). Mais bon, nous parlions de pédagogie, alors pourquoi pas.

Si tu veux t'y mettre par curiosité, contrairement à Charlie, je ne
conseillerais pas le x86, mais plutôt le 68000, beaucoup plus intuitif,
mieux foutu et moins contraignant (ce ne sont pas les émulations à base
de 68k qui manquent).

J'ai mis du temps avant de comprendre pourquoi pas mal de gens avaient
autant du mal avec les pointeurs de C alors que pour moi, c'était
intuitif. Après, la sémantique n'est pas toujours évidente en C, il faut
l'admettre (notamment en ce qui concerne les pointeurs de fonctions).

Dernier point : à ma connaissance, la littérature en assembleur utilise
peu (voire pas) le terme "pointeur" mais plutôt "adresse" (et tout ce
qui va avec, comme les "modes d'adressage").

l'OP a d'ailleurs signalé qu'il était embêté avec ça, ce qui est
classique).



Pareil pour moi, c'était d'ailleurs l'objet de mon premier message sur
fclc il y a exactement trois ans !


Comme je l'ai dit, le débat revient régulièrement ici. Tu devrais sans
peine trouver de l'inspiration dans les archives.



Franchement, j'en doute, je me sens très inspiré tout seul sur cette
question (qui me tient à coeur).



Je voulais surtout t'éviter de répéter ce qui a déjà été ressassé à de
nombreuses reprises.

Si je peux me permettre de me faire l'avocat du diable : je ne suis
pas un puriste, donc je n'ai pas grand-chose à en dire de ce site.
J'ai néanmoins jeté un oeil et je ne le trouve pas si mauvais en tant
que tutoriel, même si on peut regretter quelques écarts inutiles,
comme le fait d'utiliser le mot "librairie" en lieu et place de
"bibliothèque", volontairement de son aveu (le genre de choses qui
donnera des boutons aux puristes, mais les puristes ne sont pas censés
lire des tutoriels).



Cet écart de langage est très fréquent y compris chez des informaticiens
très titrés.



Y compris chez moi ! Mais il y a des endroits (comme ici) où il vaut
mieux faire attention pour ne pas déclencher les foudres des puristes.

J'ai appris à être tolérants avec ce genre d'écart.



Surtout que c'est excusable en ce sens que "library" y ressemble
beaucoup et que la littérature informatique est essentiellement en anglais.


--
Alex
Avatar
-ed-
On 10 août, 00:14, Alexandre BACQUART wrote:
Dernier point : à ma connaissance, la littérature en assembleur utili se
peu (voire pas) le terme "pointeur" mais plutôt "adresse" (et tout ce
qui va avec, comme les "modes d'adressage").



Ce n'est pas la même chose. En assembleur ou en C, une adresse c'est
une valeur constante (ASM : valeur immédiate, C : expression constante
ou pointeur constant) qui désigne un objet en mémoire.

On peut utiliser cette adresse pour accéder à cette mémoire via une
opération de déréferencement (ASM : (A0), SP:[BP] C : *p) d'une
mémoire contenant la valeur de cette adresse. Pour désigner ce genre
de mémoire, en assembleur, on parle de registre d'adresse, et en C, C+
+, Pascal, Ada etc, on parle de pointeur.

Il n'y a pas lieu de confondre adresse et pointeur.
Avatar
Alexandre BACQUART
-ed- wrote:
On 10 août, 00:14, Alexandre BACQUART wrote:
Dernier point : à ma connaissance, la littérature en assembleur utilise
peu (voire pas) le terme "pointeur" mais plutôt "adresse" (et tout ce
qui va avec, comme les "modes d'adressage").



Ce n'est pas la même chose.



En effet, et d'ailleurs on parle aussi d'adresses en C et là c'est la
même chose que les adresses de C (heureusement !).

Seulement les adresses, on en bouffe à toutes les sauces en assembleur
(du moment qu'on fait référence à une zone mémoire, qui elle-même
correspond à de la RAM, ou à un registre externe...). C'est quand-même
moins présent en C.

Par contre, si tu trouves un terme bref pour désigner l'équivalent de
"pointeur" dans la littérature assembleur, je suis preneur. A part
"variable contenant une adresse", je ne vois rien qui s'en rapproche
suffisament. Bon, je ne voulais pas non plus rentrer dans ces détails.

En assembleur ou en C, une adresse c'est
une valeur constante (ASM : valeur immédiate, C : expression constante
ou pointeur constant) qui désigne un objet en mémoire.

On peut utiliser cette adresse pour accéder à cette mémoire via une
opération de déréferencement (ASM : (A0), SP:[BP] C : *p) d'une
mémoire contenant la valeur de cette adresse. Pour désigner ce genre
de mémoire, en assembleur, on parle de registre d'adresse, et en C, C+
+, Pascal, Ada etc, on parle de pointeur.

Il n'y a pas lieu de confondre adresse et pointeur.



Tout à fait. En tous cas, merci de ta contribution, ça faisait longtemps
que tu ne m'avais pas fouetté, ça me manquait :)


--
Alex