Programmer

Réponses à toutes vos questions de la 2nde à la Terminale toutes séries
Avatar de l’utilisateur
chombier
Membre Irrationnel
Messages: 1324
Enregistré le: 19 Juil 2012, 18:35

par chombier » 27 Mar 2015, 20:22

fatal_error a écrit:donc déjà
1) non C++ n'est pas une extension du C. et d'ailleurs on récupère des codeurs C qui font n'importe quoi en C++...
2) non C c'est pas fait pour experts. C c'est fait pour des systèmes qui exigent de bonnes performances. ca veut pas dire que ya que des gurus qui peuvent faire du C (même si ya qu'un guru qui va exploiter pleinement les capacités du langage).
3) non faire beaucoup de fonctions imbriquées, c'est bad practice. pour raisons de mémoire, mais aussi pour raison de segmentation de code et tout simplement de tests.
4) http://stackoverflow.com/questions/4020419/why-arent-python-nested-functions-called-closures explique que les lectures de variable outer scope sont possibles, c'est lécriture sur variable qui n'est pas possible (la modification l'est)
5) le python n'exige pas une compilation de l'utilisateur*. (ca veut pas dire que rien n'est compilé (voir les .pyc qui sont générés)
6) pas mal de langages permettent la définition de variable à la volée. et ca marche pas mal quand on développe pas n'importe comment. C'est ptet pas génial pour quelqu'un qui débute, certes. Après c'est assez subjectif et dépendant des besoins.
7) quand à True + True, au delà de la stupidité d'écrire ca, les casts à la volée peuvent se révéler assez agréables... ou bien assez désastreux il s'agit juste de pas faire n'importe quoi..

- Le C... Rien que la notion de pointeur reste floue pour tellement de gens... Comment dire.
Quelle est la différence entre char a[][32], et char (*a)[32] ?
Comment déclarer un tableau de pointeurs vers des tableaux d'entiers ?
La confusion tableau/pointeur est elle aussi très difficile à appréhender.
Comment expliquer que a[12] = *(a+12) = 12[a]
pourquoi, si je déclare
int x[13];
int *y = x; /* quelle est la différence entre x et y ? Pourquoi n'ont-ils pas le même type ? */
int *a = &(x[7]);
int *b = x + 7; // b et a ont la même valeur

- Les procédures imbriquées déconseillées pour des raisons de mémoire ? En quoi une fonction imbriquée prends plus de mémoire qu'une fonction qui ne l'est pas ?

- les variables à la volée c'est une source d'erreur et un gros défaut de conception de python. Pourquoi ne pas déclarer ses variables ? Ca coute 3 francs 6 sous et ça permet de détecter un très grand nombre d'erreurs

- les casts à la volée c'est aussi un gros problème du C++. Je ne suis pas pour aller dans l'extrême comme ADA, mais c'est encore une fois une source d'erreur. Il est rare qu'un cast à la volée soit une volonté du programmeur. Et dans ce cas, pourquoi ne pas les expliciter, comme en C par exemple ?



Avatar de l’utilisateur
zygomatique
Habitué(e)
Messages: 6928
Enregistré le: 20 Mar 2014, 12:31

par zygomatique » 27 Mar 2015, 20:26

bon et bien moi je ne suis ni pour ni contre ... bien au contraire ....

:ptdr:
Ce qui est affirmé sans preuve peut être nié sans preuve. EUCLIDE

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 27 Mar 2015, 20:59

- Le C... Rien que la notion de pointeur reste floue pour tellement de gens... Comment dire.

J'ai pas dit que C c'était du plaisir d'apprentissage. Je l'ai (moi meme) déconseillé comme premier langage.
Maintenant n'importe qui qui approfondit peut apprendre le C c'est pas réservé à des experts...
Maintenant, les exemples que tu cites, c'est que de la syntaxe, la complexité vient plus de la gestion mémoire (raii etc).
edit2: la difficulté du C vient probablement du fait que c'est facile de faire crasher le programme (ou etre dans un defined behavioiur à un point donné) sans savoir à quelle ligne (un noob ne connait pas gdb)

- Les procédures imbriquées déconseillées pour des raisons de mémoire ? En quoi une fonction imbriquée prends plus de mémoire qu'une fonction qui ne l'est pas ?

Quand tu fais une closure, tu gardes (au moins) une référence vers la variable outer scope, donc la variable outer scope ne peut pas etre supprimée tant qu'existe la closure. Si tu fais pas trop gaffe, ben elle sera jamais supprimée...
(edit moyennant les closures à la rust où tu spécifies la durée de vie mais bon..)

- les variables à la volée c'est une source d'erreur et un gros défaut de conception de python. Pourquoi ne pas déclarer ses variables ? Ca coute 3 francs 6 sous et ça permet de détecter un très grand nombre d'erreurs

Rien t'empeches de déclarer tes variables en début de __scope__, n'importe quel éditeur de texte peut t'highlighter les variables.
C'est plus la portée d'une variable déclarée à la oneagain qui est importante...

- les casts à la volée c'est aussi un gros problème du C++.

ya pleins de casts à la volée qui sont explicites. La surcharge d'opérateurs est faite pour ca..
Je suis ok que ca peut etre vicieux dans certains cas. Maintenant, rien t'empeche de faire ton static_cast (() en C), ca reste juste dégueulasse !
le plus gros problème du C++ c'est qu'il récupère des développeurs C, qui, justement vont t'enquiller du procédural et des casts à la C style en te défoncant toutes les best practices. (char*, alloc mano, tableau...)
les problèmes de conversion implicites, ca arrive tellement loiiiiiin plus tard!
la vie est une fête :)

Robic
Membre Irrationnel
Messages: 1084
Enregistré le: 03 Mai 2013, 11:00

par Robic » 27 Mar 2015, 21:38

Chombier a écrit:En revanche le fait que les déclarations de variables soient automatiques me parait très peu formateur.

Dans le contexte de l'apprentissage d'un langage, je suis d'accord avec toi. En Fortran les variables sont déclarées implicitement (si le nom commence par i, c'est un entier, par x c'est un flottant, etc.) mais on a toujours la possibilité de brandir la ligne « implicit none » en début de programme pour interdire les déclarations implicites. Il faudrait peut-être un équivalent en Python (mais ça existe peut-être ?)

Cela dit le typage dynamique est quand même utile, je n'ai pas l'impression que c'est un parti-pris arbitraire.

Et puis chaque langage a ses avantages et ses inconvénients, et pour l'instant les avantages du Python me paraissent compenser largement ses inconvénients.

alexis6
Membre Relatif
Messages: 273
Enregistré le: 13 Oct 2014, 12:32

par alexis6 » 27 Mar 2015, 23:07

Bonsoir, et merci à tous ceux qui ont répondu rapidement.

Le sujet a pas mal dévié, sur des sujets assez techniques, mais pour résumer:

- le python, le basic c'est bien pour débuter, langages à but plus scientifique
- le java, C, C++, c'est vraiment pour les bons, c'est pas accessible facilement

Je crois que je vais essayer le python pour commencer. Il vaut sûrement mieux bien maîtriser un langage, avec ses limites, que connaître mal plusieurs langages.

Je m'y mets rapidement!
La modestie s'apprend par la répétition de l'échec.

MABYA
Membre Relatif
Messages: 401
Enregistré le: 13 Mar 2015, 14:37

par MABYA » 28 Mar 2015, 11:30

C'est pour cette raison de variables en closure, il vaut commencer par un langage où les déclarations sont fondamentales local, global, bien sûr le rigoureux pascal est très exigent avec ces déclarations de variables, le C est plus maniable, les basics actuels doivent intégrer ces déclarations de façon plus légère mais il est important qu'il y ait initiation à l'apprentissage

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 28 Mar 2015, 20:08

jamais mais vraiment jamais je ferais commencer par du pascal.
cette syntaxe de mamouth, avec zéro support sur le net, un ide qui est catastrophique (lazarus) puis fpc qui est tout sauf simple à installer...(installer fpc en binaire pour compiler fpc...GG)

Sachant de plus que c'est un langage démodé...

qui peut bien avoir envie de programmer en pascal ?
la vie est une fête :)

Shew
Membre Irrationnel
Messages: 1394
Enregistré le: 02 Jan 2011, 14:39

par Shew » 28 Mar 2015, 20:18

fatal_error a écrit:qui peut bien avoir envie de programmer en pascal ?


Euhhhh ..... :ptdr:

Pour ce qui est des distributions, rien de tel que les bonnes vieilles recettes :lol3: : Turbo Pascal . Pour la documentation, elle est rare c'est vrai mais pour ceux qui ne sont pas rebutés par la langue de Shakespeare on en trouve de très bonnes .

Robic
Membre Irrationnel
Messages: 1084
Enregistré le: 03 Mai 2013, 11:00

par Robic » 28 Mar 2015, 21:37

Wahou, je savais pas que ça existait encore ! Shew : est-ce que tu utilises le Turbo Pascal du lien ? Est-ce que ça permet de faire quelques graphiques ? (Si oui, ça devient une bonne idée de langage pour débuter, je trouve - je parle de débuter au niveau lycée, pas au niveau école d'ingénieur en informatique.)

Shew
Membre Irrationnel
Messages: 1394
Enregistré le: 02 Jan 2011, 14:39

par Shew » 28 Mar 2015, 22:26

Robic a écrit:Wahou, je savais pas que ça existait encore ! Shew : est-ce que tu utilises le Turbo Pascal du lien ? Est-ce que ça permet de faire quelques graphiques ? (Si oui, ça devient une bonne idée de langage pour débuter, je trouve - je parle de débuter au niveau lycée, pas au niveau école d'ingénieur en informatique.)


Personnellement mes versions de prédilections pour pascal sont les turbo pascal 7.0 et borland pascal with objects 7.0 .... pour dos :lol3: . Je ne sais donc pas si cette version implique du graphisme à la hauteur de windows . Mais en l'occurence cette version pour windows rivalise avec l'ancienne version destinée à dos .

Avatar de l’utilisateur
chombier
Membre Irrationnel
Messages: 1324
Enregistré le: 19 Juil 2012, 18:35

par chombier » 28 Mar 2015, 23:15

Personellement j'envisage d'apprendre un peu la programmation à mes collégiens, et mon choix s'était porté sur la structure de piles (une structure simple mais assez contraignante) et et langage qui m'a paru le plus adapté pour illustrer cette structure était... Ocaml.

Je préfère scheme mais la syntaxe est vraiment rébarbative pour un néophyte...

Voici à quoi ça ressemble. Tout d'abord l'API pour manipuler des piles d'entiers :

PileVide est une (ou la) pile vide. PileVide : pile
si P est une pile non vide, tete(p) renvoie l'élément situé tout en haut de la pile. tete : pile -> int
si P est une pile non vide, queue(p) renvoie la pile privée de son premier élément. queue : pile -> pile
si P est une pile, pileVide(P) renvoie vrai si la pile est vide, faux sinon. estVide : pile -> bool

C'est simple, précis, concis.

Pour créer la pile [12; 2; 7; 5] (5 est le sommet de la pile), j'envisage de leur faire écrire :

Code: Tout sélectionner
let p0 = PileVide;;
let p1 = empiler p0 12;;
let p2 = empiler p1  2;;
let p3 = empiler p2  7;;
let p4 = empiler p3  5;;


Voici ce qu'affiche Ocaml si on joue un peu avec lui :
Code: Tout sélectionner
# p4;;
- : pile = Empiler (Empiler (Empiler (Empiler (PileVide, 12), 2), 7), 5)
# tete(p4);;
- : int = 5
# queue(p4)
- : pile = Empiler (Empiler (Empiler (PileVide, 12), 2), 7)
# estVide(p4)
- : bool = false


La première procédure calcule la somme de tous les entiers de la pile :
Si la pile est vide, le résultat est 0.
Sinon on additionne la tête de la pile et la somme de tous les entiers de la pile privée de son premier élément :
Code: Tout sélectionner
let rec somme_pile p =
  if estVide(p) then
    0
  else
    tete(p) + somme_pile(queue(p));;

# somme_pile(p4);;
- : int = 26


Ca me parait assez clair. Evidemment on est dans le domaine de l'algorithmique pure. Mais c'est ça qui m'intéresse.

Le but serait qu'ils puissent faire eux même d'autres procédures comme :

- Trouver le plus grand élément d'une pile
- Trouver le tout premier élément d'une pile
- Inverser l'ordre d'une pile
- Concaténer deux piles
- Insérer un élément à sa place dans une pile triée
- Trier une pile

Mais je suis peut-être un grand utopiste :lol3:

Robic
Membre Irrationnel
Messages: 1084
Enregistré le: 03 Mai 2013, 11:00

par Robic » 29 Mar 2015, 00:33

:doh: :doh: :doh: :doh: :doh: :doh: :doh: :doh: :doh: :doh: :doh: :doh: :doh: :doh: :doh: :doh:

(Je n'ai pas de mots.)

Shew
Membre Irrationnel
Messages: 1394
Enregistré le: 02 Jan 2011, 14:39

par Shew » 29 Mar 2015, 07:51

chombier a écrit:Personellement j'envisage d'apprendre un peu la programmation à mes collégiens, et mon choix s'était porté sur la structure de piles (une structure simple mais assez contraignante) et et langage qui m'a paru le plus adapté pour illustrer cette structure était... Ocaml.

Je préfère scheme mais la syntaxe est vraiment rébarbative pour un néophyte...

Voici à quoi ça ressemble. Tout d'abord l'API pour manipuler des piles d'entiers :

PileVide est une (ou la) pile vide. PileVide : pile
si P est une pile non vide, tete(p) renvoie l'élément situé tout en haut de la pile. tete : pile -> int
si P est une pile non vide, queue(p) renvoie la pile privée de son premier élément. queue : pile -> pile
si P est une pile, pileVide(P) renvoie vrai si la pile est vide, faux sinon. estVide : pile -> bool

C'est simple, précis, concis.

Pour créer la pile [12; 2; 7; 5] (5 est le sommet de la pile), j'envisage de leur faire écrire :

Code: Tout sélectionner
let p0 = PileVide;;
let p1 = empiler p0 12;;
let p2 = empiler p1  2;;
let p3 = empiler p2  7;;
let p4 = empiler p3  5;;


Voici ce qu'affiche Ocaml si on joue un peu avec lui :
Code: Tout sélectionner
# p4;;
- : pile = Empiler (Empiler (Empiler (Empiler (PileVide, 12), 2), 7), 5)
# tete(p4);;
- : int = 5
# queue(p4)
- : pile = Empiler (Empiler (Empiler (PileVide, 12), 2), 7)
# estVide(p4)
- : bool = false


La première procédure calcule la somme de tous les entiers de la pile :
Si la pile est vide, le résultat est 0.
Sinon on additionne la tête de la pile et la somme de tous les entiers de la pile privée de son premier élément :
Code: Tout sélectionner
let rec somme_pile p =
  if estVide(p) then
    0
  else
    tete(p) + somme_pile(queue(p));;

# somme_pile(p4);;
- : int = 26


Ca me parait assez clair. Evidemment on est dans le domaine de l'algorithmique pure. Mais c'est ça qui m'intéresse.

Le but serait qu'ils puissent faire eux même d'autres procédures comme :

- Trouver le plus grand élément d'une pile
- Trouver le tout premier élément d'une pile
- Inverser l'ordre d'une pile
- Concaténer deux piles
- Insérer un élément à sa place dans une pile triée
- Trier une pile

Mais je suis peut-être un grand utopiste :lol3:


La syntaxe est clair, il faudra néanmoin intégrer le concept de pile aux élèves et donc quelques élèments de base de la programmation au-dela de la simple écriture d'algorithmes qu'intègre les cours de mathématiques .

Avatar de l’utilisateur
chombier
Membre Irrationnel
Messages: 1324
Enregistré le: 19 Juil 2012, 18:35

par chombier » 29 Mar 2015, 09:14

Robic a écrit::doh: :doh: :doh: :doh: :doh: :doh: :doh: :doh: :doh: :doh: :doh: :doh: :doh: :doh: :doh: :doh:

(Je n'ai pas de mots.)

Eh ouais mais c'est ça l'informatique, c'est les types abstraits, les structures de données, les piles, les files, les arbres binaires... C'est la complexité, les algorithmes en o(n^2), ceux o(n log n)...

C'est pas faire du python a l'arrache et essayer d'optimiser en bidouillant alors qu'en améliorant l'algorithme sous jacent on gagnerait un ordre de grandeur !

Avatar de l’utilisateur
chombier
Membre Irrationnel
Messages: 1324
Enregistré le: 19 Juil 2012, 18:35

par chombier » 29 Mar 2015, 09:35

Shew a écrit:La syntaxe est clair, il faudra néanmoin intégrer le concept de pile aux élèves et donc quelques élèments de base de la programmation au-dela de la simple écriture d'algorithmes qu'intègre les cours de mathématiques .

Le concept de pile, je l'ai introduit en proposant une méthode pour calculer une expression mathématique en notation polonaise postfixée.

Vous connaissez ?

devient "8 13 x 9 + 3 7 ^ /"

La structure de pile est parfaitement adaptée au calcul d'expression postfixeée : on part d'une pile vide, on lit simplement l'expression de droite à gauche et,
- si on tombe sur un nombre : on empile
- si on tombe sur un opérateur : on dépile deux fois, on opère, et on empile le résultat

A la fin du calcul, il n'y a qu'un élément dans la pile : le résultat. C'est magique.

Shew
Membre Irrationnel
Messages: 1394
Enregistré le: 02 Jan 2011, 14:39

par Shew » 29 Mar 2015, 09:58

chombier a écrit:Le concept de pile, je l'ai introduit en proposant une méthode pour calculer une expression mathématique en notation polonaise postfixée.

Vous connaissez ?

devient "8 13 x 9 + 3 7 ^ /"

La structure de pile est parfaitement adaptée au calcul d'expression postfixeée : on part d'une pile vide, on lit simplement l'expression de droite à gauche et,
- si on tombe sur un nombre : on empile
- si on tombe sur un opérateur : on dépile deux fois, on opère, et on empile le résultat

A la fin du calcul, il n'y a qu'un élément dans la pile : le résultat. C'est magique.



J'avais vu ça avec quelques exemples en Lisp, il y'a longtemps donc je ne maitrise pas réellement le sujet mais je comprends le principe .

Avatar de l’utilisateur
zygomatique
Habitué(e)
Messages: 6928
Enregistré le: 20 Mar 2014, 12:31

par zygomatique » 29 Mar 2015, 11:27

pour celui qui veut s'amuser avec des piles il y avait ce langage très intéressant ::

http://fr.wikipedia.org/wiki/Forth_(langage)

et

http://forth.free.fr/apprentissage/teknik/forthidx.html

....

ce langage est constitué de très peu de mots (gestion des entrées/sorties et de la pile) et chaque nouveau mot est un programme !!!

comme le dit chombier je le trouvais très intéressant en particulier par la structure des opérations à la mode polonaise .... très riche pour apprendre l'ordre et la priorité des opérations .....

mais quand on voit que pour bon nombre d'élèves 2*3*5 = 2*3 * 2 * 5 ... et que le carré d'une somme est la somme des carrés ....
Ce qui est affirmé sans preuve peut être nié sans preuve. EUCLIDE

MABYA
Membre Relatif
Messages: 401
Enregistré le: 13 Mar 2015, 14:37

par MABYA » 29 Mar 2015, 11:43

"Qui peut bien avoir envie de programmer en pascal ?"
Il parait qu'il y en a encore, à mon époque c'étaient ceux qui avaient préféré le fortran pour débuter et qui évoluait dans un domaine purement scientifique, ils regardaient de haut les autres développeurs mais très rapidement le C s'est imposé... il avait une qualité c'est qu'il se jouait des systèmes, microsoft, apple, unix...
Ce qui me fait plaisir, moi le vieux kon, c'est que la programmation passionne toujours autant.

MABYA
Membre Relatif
Messages: 401
Enregistré le: 13 Mar 2015, 14:37

par MABYA » 29 Mar 2015, 11:54

"qui peut bien avoir envie de programmer en pascal ?" de @fatal error
Il paraît qu'il y en a encore, à mon époque, ils étaient issus du fortran (qui méprisaient les basics) puis avec leur pascal ils regardaient de haut les autres développeurs. Mais dans les milieux scientifiques où ils sévissaient le C et d'autres langages ont remplacé leur pascal, insipide et imbuvable.
Ce qui fait plaisir à un vieux khon comme moi c'est de constater que la passion de programmer existe toujours alors que certains prétendent qu'on a plus besoin de programmer, je ne les ai jamais crus.

Robic
Membre Irrationnel
Messages: 1084
Enregistré le: 03 Mai 2013, 11:00

par Robic » 29 Mar 2015, 12:53

Chombier a écrit:Eh ouais mais c'est ça l'informatique, c'est les types abstraits, les structures de données, les piles, les files, les arbres binaires... C'est la complexité, les algorithmes en o(n^2), ceux o(n log n)... C'est pas faire du python a l'arrache et essayer d'optimiser en bidouillant alors qu'en améliorant l'algorithme sous jacent on gagnerait un ordre de grandeur !

Là tu parles d'informatique professionnelle, pas d'initiation à l'informatique au collège.

Zygomatique a écrit:comme le dit chombier je le trouvais très intéressant en particulier par la structure des opérations à la mode polonaise .... très riche pour apprendre l'ordre et la priorité des opérations .....

OK, il y a une finalité concrète, je comprends mieux.

 

Retourner vers ✎✎ Lycée

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 44 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite