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
candide
Mickaël Wolff a écrit :

C'est nécessaire, rien que pour comprendre les problèmes d'arrondis,



Arrondis de flottants ? je vois pas le rapport, explique.

comprendre les droits POSIX, etc.



OK et il y a d'autres situations plus usuelles, par exemple on écrit
souvent les caractères sous forme hexa ou octale ou quand on travaille
avec les opérateurs bit à bit, on écrit les entiers en hexa, même le
caractère nul écrit sous la forme c'est de l'octal. Et par exemple
dans les jeux vidéo, les sprites sont représentés par des tableaux
statiques de char représentés en hexa. Je dis pas que c'est pas utile
mais le vrai débutant lui il va se demander à quoi ça sert, il pourra
pas vraiment comprendre parce qu'il faut tout un contexte et il n'
utilisera ces représentations (parce que le contexte et tout simplement
les conventions de programmation l'y obligeront ) que beaucoup plus
tard. Donc, inutile de surcharger la barque : "Entities should not be
multiplied beyond necessity".

En tous cas, je me rappelle que quand l'ai vu ça la première fois j'ai
été envahi par un abîme de perplexité : pourquoi diantre représenter les
entiers d'une manière aussi peu commune ? (et là les livres ne
t'expliquent rien).



C'est bien plus difficile
de comprendre qu'on affiche une représentation sous forme de caractères
et non un nombre ;)




La question du statut des caractères en C est une des plus
déconcertantes qui soient, tous les livres sont piètres sur cette
question. Là encore, il est assez facile pourtant de faire un exposé
relativement clair au débutant, quitte à lui taire certaines choses.
Avatar
candide
Marc Boyer a écrit :
Après quelques années de recherche, en effet, j'ai finis par
trouver uniquement 5 bouquins
"C Programming -- A modern approach" pour débuter



Pour débuter et même aller plus loin.


K&R 2d pour continuer



Incontournable mais apporte bien peu par rapport à une lecture complète
du précédent.


Harbison & Steele pour consolider



Livre très mauvais selon moi. Jargoneux et mal organisé et contenant
beaucoup d'erreurs (consulter l'impressionnant errata).

Tiens hier soir, je cherchais à m'informer sur les "trap
représentations", je vais dans l'index, je cherche "trap" : rien. A
"representation" dans l'index, aucun renvoi vers "trap" alors que cette
notion est vraiment importante et nouvelle en C99.
En principe la notion devrait être développée dans le chapitre 6,
intitulé "Conversions an representations" [qu'il aurait d'ailleurs fallu
appeler "Representations and Conversions" puisque -- et c'est logique --
leur exposé commence par les /representations/ pour se poursuivre avec
les /conversions/]. je parcours tout le § 6.1 sur les representations et
je ne vois rien sur les /traps/, bref, à l'heure actuelle, e ne sais pas
où ils en parle dans leur livre.
Et ça se prétend un livre de référence (c'est le sous-titre) et en plus
à la 5ème édition ! je rigole. Les auteurs connaissent peut-être le C
mais ils ne savent pas écrire un livre clair et organisé


C unsleashe pour en ajouter



Non, livre très surfait, les trois-quarts de l'ouvrage (que dis-je, les
4/5 voire les 9/10) sont un affreux hors-sujet, par contre un tas de
questions très intéressantes ont été ignorées.

Quelle occasion manquée !!


La norme....



ben un excellent document, souvent lisible malgré ce qu'on dit (même si
je trouverais quand même aussi pas mal à redire mais il est possible que
je n'ai pas le niveau pour tout comprendre), des exemples assez souvent
bien choisis. Au moins eux (les auteurs) ils donnent des définitions des
notions qu'ils étudient.


Tu oublies un excellent livre, le meilleur selon moi :

Plauger, "The C standard library".


Le problème des bouquins/tutoriels faciles et faux, c'est
qu'ils sont gentils avec le débutant (c'est facile) mais
qu'il risque de se rendre compte après qu'une partie de ce
qu'il croit juste ne l'est pas.



La gamme des documents dont tu parles est tellement large qu'on ne peut
parler en généralité.

Comment jugeriez vous un professeur chinois de langue
française qui expliquerait que le français, c'est
facile, et qu'il n'y a que 2 groupes de conjugaisons
des verbes ?




Tu caricatures. Je ne serais pas choqué qu'on fasse _comme si_ il n'y
avait que des verbes du premier groupe pour expliquer ce que c'est que
le passé simple en français et mieux le distinguer du passé composé. Que
fera l'auteur lambda d'un cours de C confronté à la même tâche (je vais
caricaturer moi aussi) : il va t'enseigner d'abord toutes les formes
conjuguées à tous les groupes et à tous les temps en dérivant au passage
sur la notion collatérale de préfixe, suffixe et infixe puis il va
traiter du passé simple vs le passé composé en prenant des exemples dans
toute la gamme de ce qu'il a déjà expliqué, histoire de bien surcharger.
Il est curieux de voir que ce sont ces auteurs-là qui expliquent dans
leur livre ce que c'est que l'encapsulation et la différence entre une
interface et l'implémentation (attention Marc, je ne fais aucune
allusion à toi ni à personne en particulier d'ailleurs (quoique en fait,
y'a bien quelqu'un qui me vient à l'esprit)). On a un proverbe sur les
cordonniers, faudrait trouver l'équivalent avec les programmeurs qui
écrivent des livres de C (j'imagine que le fossé doit être encore plus
grand avec le C++).
Avatar
Thierry B.
--{ candide a plopé ceci: }--

Voilà, je vais vous laisser sur cette situation. Je continue mon étude avec
les 2 et jusqu'à ce jour, cela fonctionne bien. Je suis aux saisies
formatées de nombres octaux et hexadécimaux.



Les nombres ne sont ni octaux ni hexadécimaux, c'est leur représentation
mathématique qui l'est.



C'est plutôt leur représentation à destination des humains qui
peut être octale, décimale ou hexadécimale.

Bon sinon, les saisies formatées en octal et en
hexa !!! mais le débutant s'en fout et ça lui sert à rien pour apprendre
le C, c'est que de la prise de tête,



Justement, le débutant a parfois envie de comprendre, et ce genre
d'exercice est formateur: il faut lire la doc des fonctions de la
bibliothèque, se bagarrer avec les chaines de caractères, plein de
trucs, quoi. Et quand on maitrise la chose, on dispose d'un outil
supplémentaire pour (par exemple) pouvoir donner un argument à un
proggy dans une des trois bases connues.

Je regrette vraiment qu'il n'existe pas un 0b11000011 :)

--
_____________________________________________________________________
= = = = = = = = = = = = = = = = = = = = = = = = = = = = Kikooooooooo
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Avatar
Thierry B.
--{ candide a plopé ceci: }--

lorsqu'on souhaite récupérer les informations fournies par l'environnement :

int main(void) /* forme usuelle */
int main(int nbarg, char *argv[]);"



1) la forme canonique est argc.
2) quel rapport avec l'environnement ?

float f= INT_MAX - 7;



Effectivement, ça manque de précautions de contexte mais quand on
s'adresse à des débutants, il faut passer outre ce genre de détail,



Non, c'est justement à des débutants qu'il faut dire dès le
départ qu'il y a, dans le langage C, plein de détails fourbes,
dangeureux, et même chafouins :)


--
- si on oblige les membres de fufa à lire fufe, plus personne ne
voudra en faire partie.
Avatar
candide
Thierry B. a écrit :


Justement, le débutant a parfois envie de comprendre, et ce genre



Mais il même essentiel qu'il comprenne. Le tout est que les choses
soient faites dans le bon ordre.

d'exercice est formateur: il faut lire la doc des fonctions de la
bibliothèque, se bagarrer avec les chaines de caractères, plein de
trucs, quoi.



Bref pour toi apprendre est un combat, une lutte. Pour moi, apprendre
c'est comme quand je vais au cinéma ou quand on me raconte une histoire
ou que je fais un voyage. En tous cas, c'est comme ça que je veux que ce
soit.
Avatar
candide
Thierry B. a écrit :


lorsqu'on souhaite récupérer les informations fournies par l'environnement :

int main(void) /* forme usuelle */
int main(int nbarg, char *argv[]);"



1) la forme canonique est argc.



Oui, je sais et je pense que Delannoy le sait aussi. Et "canonique"
n'est pas le bon terme, ce n'est pas une obligation. Et puis nbarg est
plus parlant que argc (argument count).


2) quel rapport avec l'environnement ?



Curieuse cette question. C'est l'environnement qui est considéré comme
l'appelant de main() et c'est à lui que main() retourne le int
[un truc que j'ai mis un temps fou à intégrer].

D'ailleurs, dans la Norme :

5.1.2 Execution environments
1 Two execution environments are defined: freestanding and hosted. (...)

5.1.2.2.1 Program startup
1 The function called at program startup is named main. (...) The intent
is to supply to the program information determined prior to program
startup from elsewhere in the hosted environment. If the host
environment is not capable of supplying strings (...)

5.1.2.2.3 Program termination
(...) If the return type is not compatible with int, the termination
status returned to the host environment is unspecified.


float f= INT_MAX - 7;


Effectivement, ça manque de précautions de contexte mais quand on
s'adresse à des débutants, il faut passer outre ce genre de détail,



Non, c'est justement à des débutants qu'il faut dire dès le
départ qu'il y a, dans le langage C, plein de détails fourbes,
dangeureux, et même chafouins :)



Oui, il faut dire qu'il y a des détails (et pas seulement des détails)
comme tu dis mais ne pas donner ces détails.
Avatar
Mickaël Wolff
candide a écrit :
Mickaël Wolff a écrit :

C'est nécessaire, rien que pour comprendre les problèmes d'arrondis,



Arrondis de flottants ? je vois pas le rapport, explique.



En fait je faisais allusion aux nombres réels décimaux qui n'ont
qu'un équivalent transcendant binaire. Lorsque j'ai recopié mon premier
programme dans ma TI-80, qui était un programme en Pascal permettant de
calculer les résultats d'une équation du second degré, je ne comprenais
pas pourquoi le programme comparait à 1e-14 au lieu de 0 :) (et pas de
commentaire pour expliquer pourquoi)


comprendre les droits POSIX, etc.



OK et il y a d'autres situations plus usuelles



Les droits POSIX sont très usuels ;) Mais bien sûr, tout ce que tu
énumère était dans mon « /et caetera/ » ;)

Je dis pas que c'est pas utile
mais le vrai débutant lui il va se demander à quoi ça sert, il pourra
pas vraiment comprendre



Ça c'est de la pédagogie. Si on apprend le C sans savoir qu'un
ordinateur est un calculateur fonctionnant avec des nombres binaires, on
est pas rendu. Lors de ma formation, ça m'a semblé naturel d'apprendre
le langage de la machine avant d'apprendre des langages humains.


que beaucoup plus
tard. Donc, inutile de surcharger la barque : "Entities should not be
multiplied beyond necessity".



Faire 0.1 + 0.6 ça peut arrivé très tôt, ainsi que d'afficher une
adresse contenue dans un pointeur.


En tous cas, je me rappelle que quand l'ai vu ça la première fois j'ai
été envahi par un abîme de perplexité : pourquoi diantre représenter les
entiers d'une manière aussi peu commune ? (et là les livres ne
t'expliquent rien).



Quelle idée d'apprendre tout seul ;)


La question du statut des caractères en C est une des plus
déconcertantes qui soient, tous les livres sont piètres sur cette
question. Là encore, il est assez facile pourtant de faire un exposé
relativement clair au débutant, quitte à lui taire certaines choses.



C'est parce que c'est exposé sans explication. Les IO et les chaînes
de caractères sont toujours bâclées. C'est souvent considéré comme
trivial, alors que ce qui est vraiment trivial, à savoir les pointeurs,
est expliqué dans tout les sens.


--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Avatar
candide
Mickaël Wolff a écrit :
candide a écrit :
Mickaël Wolff a écrit :

C'est nécessaire, rien que pour comprendre les problèmes d'arrondis,



Arrondis de flottants ? je vois pas le rapport, explique.



En fait je faisais allusion aux nombres réels décimaux qui n'ont qu'un
équivalent transcendant binaire. Lorsque j'ai recopié mon premier
programme dans ma TI-80, qui était un programme en Pascal permettant de
calculer les résultats d'une équation du second degré, je ne comprenais
pas pourquoi le programme comparait à 1e-14 au lieu de 0 :) (et pas de
commentaire pour expliquer pourquoi)




D'abord, c'est une question mathématique plus qu'informatique et encore
moins du ressort du langage C. Disons qu'il est préférable que le
débutant en est été averti mais il est inutile de lui donner les
explications à moins qu'il ne le demande. Sans compter que la
résolution de ce type de question peut en poser d'autres qui
compliqueront et feront augmenter le temps d'apprentissage. L'âme du C
n'est absolument pas là. Si le train dans lequel tu te trouves tombe en
panne, t'as pas besoin, en tant que voyageur, de connaitre la nature
exacte de la panne. Pareil ici.





Je dis pas que c'est pas utile mais le vrai débutant lui il va se
demander à quoi ça sert, il pourra pas vraiment comprendre



Ça c'est de la pédagogie.



Non, il y a des situations que tu ne peux pas vraiment comprendre si tu
ne disposes pas du contexte adéquat. Tout simplement parce qu'on
comprend bien mieux une chose lorsqu'on en a besoin. Et on ne peut pas
faire semblant d'avoir besoin. Peut-on vraiment comprendre la faim
lorqu'on ne l'a jamais connue ?


Si on apprend le C sans savoir qu'un
ordinateur est un calculateur fonctionnant avec des nombres binaires, on
est pas rendu.



Là encore, c'est un peu la tarte à la crème. Tu peux aller assez loin en
C en ignorant que la mémoire est faite d'une suite de 0 et de 1. On n'a
pas à imposer ça au débutant et en tout cas, il n'y a pas lieu
d'insister là-dessus tant qu'on n'en a pas vraiment besoin.

Lors de ma formation, ça m'a semblé naturel d'apprendre
le langage de la machine avant d'apprendre des langages humains.



Je comprends ton point de vue. Un peu comme il y en a qui disent que
pour apprendre le C++ on commence par apprendre le C.



que beaucoup plus tard. Donc, inutile de surcharger la barque :
"Entities should not be multiplied beyond necessity".



Faire 0.1 + 0.6 ça peut arrivé très tôt, ainsi que d'afficher une
adresse contenue dans un pointeur.



C'est pour éviter ce genre d'interférence factice que j'éviterais de
parler de flottant dans des exemples visant à illustrer les concepts du
C (à moins que la question ne soit justement de parler des flottants en C).


Quelle idée d'apprendre tout seul ;)



je progresse à mon rythme sans ralentir personne ;)




C'est parce que c'est exposé sans explication. Les IO et les chaînes
de caractères sont toujours bâclées. C'est souvent considéré comme
trivial, alors que ce qui est vraiment trivial, à savoir les pointeurs,
est expliqué dans tout les sens.



ça c'est ce qui vient à l'esprit. Mais je pensais aux différents autres
statuts du caractères : à la fois entier et au sens de la Norme :

3.7
1 character
<abstract> member of a set of elements used for the organization,
control, or representation of data

ou constituant d'un byte :

byte
addressable unit of data storage large enough to hold any member of the
basic character set of the execution environment

ainsi que les subtilités sur le jeu de caractères d'exécution et le jeu
de caractères source.
Avatar
Thierry B.
--{ candide a plopé ceci: }--

2) quel rapport avec l'environnement ?



Curieuse cette question. C'est l'environnement qui est considéré comme
l'appelant de main() et c'est à lui que main() retourne le int



Ah, oké. Je faisais référence à une forme de main que j'ai croisée
de temps en temps: main(int argc, char *argv[], char *envp[]) qui
permettrait de récupérer les variables d'environnement...

Non, c'est justement à des débutants qu'il faut dire dès le
départ qu'il y a, dans le langage C, plein de détails fourbes,
dangeureux, et même chafouins :)



Oui, il faut dire qu'il y a des détails (et pas seulement des détails)
comme tu dis mais ne pas donner ces détails.



L'apprentissage par l'obscurité ?-)

--
> Ignorantam sum....
Un attribut du sujet à l'accusatif ? C'est la grammaire latine réformée ?


Non, c'est du latin de cuisine. Ça doit être une déformation fmblienne.
Avatar
Thierry B.
--{ candide a plopé ceci: }--

Si le train dans lequel tu te trouves tombe en
panne, t'as pas besoin, en tant que voyageur, de connaitre la nature
exacte de la panne.



Pourtant, quand tu marines une heure en rase-campagne, ce que tu
entends le plus c'est: "ils pourraient au moins nous dire ce qui
se passe !".


--
"Moi j'aurais préféré que l'instituteur on lui ai appris le rugby
plutôt que l'internet : le rugby, ça parle aux gens d'ici, l'internet,
pas vraiment..."