human
La plupart des livres que je lis donnent des exemples en utilisant `printf` et `scanf`. À un certain moment, les étudiants savent parfaitement comment utiliser ces deux fonctions mais ils ne connaissent pas `stdin`, `stdout` et `argv`. Pour moi, et selon de nombreux principes de programmation (par exemple, KISS), un programme ne devrait pas interrompre l'exécution pour demander des entrées à l'utilisateur. À la place, et c'est une approche bien plus intelligente, le développeur devrait apprendre à utiliser la puissance des tubes (pipes) et à utiliser les options et les arguments. Je pense que ceci :

```
$ whatdaywas 1982 02 16
Lundi
```

est bien meilleur que :

```
$ whatdaywas
Entrez une année : 1982
Entrez un mois : 2
Entrez un jour : 16
C'était un lundi.
```

Y a-t-il une raison derrière cette approche pédagogique ?
gpt
Lors de l'enseignement aux jeunes étudiants en informatique, l'entrée utilisateur est en réalité un concept délicat. Si ce n'était pour l'entrée utilisateur, les résultats de tout programme pourraient être pré-compilés en rien d'autre que sa sortie. Vous obtenez une leçon en récupérant toutes les entrées au début, avec argc/argv, mais à partir de ce moment, c'est juste l'ordinateur qui travaille. Vous obtenez une leçon différente en obtenant des entrées pendant l'exécution du programme.

L'idée de recevoir des entrées de l'utilisateur est étonnamment contre-intuitive, étant donné que presque chaque programme avec lequel nous interagissons au quotidien le fait. Cela suggère qu'introduire cela tôt aide à éliminer les idées fausses sur le fonctionnement des ordinateurs avant qu'elles ne deviennent un réel problème.

Évidemment, tous les étudiants ne sont pas identiques, mais un schéma particulier est qu'ils peuvent comprendre ce qu'un programme devrait faire lorsqu'il s'exécute, mais pas comment cela se produit réellement. Ils peuvent regarder

```
BOOL x = TRUE;
if (x)
    printf("Hello\n");
else
    printf("World\n");
```

Et ils peuvent intuitivement comprendre que le programme devrait imprimer "Hello", mais ils ne peuvent pas intuitivement comprendre comment un ordinateur peut réellement le faire. Souvent, on dit aux étudiants que le compilateur fait la "magie" et détermine quel printf utiliser (ignorons les optimiseurs pour le moment). Cependant, lorsque les valeurs proviennent de l'entrée, vous ne pouvez plus penser à l'ordinateur comme à un dispositif magique qui atteint le résultat final immédiatement. Vous devez voir qu'il suit des étapes. Nous le savons, mais il semble que beaucoup d'étudiants ne saisissent pas cela au début. Si vous avez des entrées provenant de `argv`, il est plus facile de maintenir cette illusion. Si vous avez une entrée pendant le programme, après que le programme a déjà fait quelque chose, vous devez réaliser ce qui se passe plus rapidement. En particulier, cela vous rapproche du point de réaliser que l'entrée demandée par l'ordinateur peut varier en fonction des entrées précédentes (appuyez sur 1 pour calculer l'aire d'un cercle, appuyez sur 2 pour calculer l'aire d'un rectangle. En fonction du prochain scanf/gets, l'ordinateur demandera un nombre supplémentaire ou deux).
human
Pourrais-tu élaborer sur l'aspect contre-intuitif ? Je suis toujours à la recherche de nouveaux pièges cognitifs que je n'ai pas encore remarqués.
gpt
Il est constaté que certains étudiants comprennent le concept de fonctions avant de saisir l'idée d'exécution. Ils peuvent se frayer un chemin à travers le code et le comprendre dans leur tête, mais ils ne voient pas que l'ordinateur le parcourt également, en temps réel. De manière intéressante, ces mêmes personnes ont tendance à supposer que si elles compilent `if(x) f(); else g();`, le compilateur détermine quelle branche sera suivie et ne capture que les instructions pour cette branche. Ils sont dérangés si l'enseignant construit des exemples où il est difficile de savoir quelle branche sera prise (comme lorsqu'il y a une entrée).