OVH Cloud OVH Cloud

La torture des tortues

22 réponses
Avatar
sphincer
Bonjour.

Avant de me lancer, comme je débute en C++, j'aimerais bien avoir des
suggestions pour traiter la chose suivante :

les données :
nb Tortues, définies par nom, famille, de 0 à 10 valeurs de longévité.

Je pense,Tortues sera un enregistrement :
( nom <chaine caractères> ,
famille <chaine caractères>,
longevite <Tableau de 1 à 10 Entiers>,
MoyenneLongevite <Reel> )

1 ébauche d'algo :

TantQue il y-a une Tortue à entrer
saisie(nom)
saisie(famille)
si pas_DejaEntree(nom,famille) -- on vérifie que les
-- caractéristiques n'ont pas -- déjà été fournies,
-- (même nom, même famille)

ajoute_Enregistrement(nom, famille)

SaisieLongevités(Tortue)-- 10 longévités
-- de 1 à 150 ans,
-- ou 200 si non renseigné
-- (prévoir les erreur d'entrée)

CalculMoyenne(Tortue) -- calcul de la moyenne
-- des longévités entrées
-- comprises entre 1 et 150
finsi
finTantQue

Affiche_Classe (Tortue,nom) -- classe et affiche les tortue
-- par nom

Affiche_Classe (Tortue,moyenne) -- classe et affiche les tortue
-- par moyenne de longevité

Affiche_Classe1 (Tortue,moyenne,60) -- classe et affiche les tortue
-- dont moyenne_longevite > 60

Affiche_Classe2(Tortue,longevite,5) -- classe et affiche
-- les 5 + grandes longevités

Affiche_Classe2(Tortue,moyenne,8) -- classe et affiche
-- les 8 + grandes moyennes de
-- longevités


Si vous avez des exemples/suggestions, les plus simples qui soient (je
suis une bille en programmation, alors faut que je puisse comprendre),
merci de m'en faire part :)

Vous pouvez envoyer directement à mon mail Sphincer(@free.fr)

Grand merci pour vos aides.

10 réponses

1 2 3
Avatar
Pierre Maurette
Bonjour,

Avant de me lancer, comme je débute en C++, j'aimerais bien avoir des
suggestions pour traiter la chose suivante :
[...]
Si vous avez des exemples/suggestions, les plus simples qui soient (je
suis une bille en programmation, alors faut que je puisse comprendre),


Je ne suis pas certain que C++ soit le langage le plus adapté pour débuter.
En fait je suis presque certain du contraire... Pourquoi ne pas utilise Java,
C#, Python ou Basic ?
* Soit le "scope of work" est de découvrir C++ et alors les tortues ne

sont pas un bon exemple (ou alors très incomplet). En effet,
contrairement aux exemples animaliers habituels (que je n'aime pas
trop, mais peu importe), il ne s'agita pas d'une classe Animal dont
dériverait une classe Tortue puis des classes TortueLuth,
TortueDeHermann, etc.
* Soit sphincter est herpétophile, et il doit résoudre son problème de
classement de reptiles. L'outil idéal n'est alors ni C++, ni C#, ni
Java, etc. mais un gestionnaire simple de données. Ça peut être Access
s'il le possède. Les Affiche_Classe() ne sont que des requêtes simples.

--
Pour répondre directement: enlever une lettre sur deux
wwaannaaddoooo -> wanadoo

Pierre Maurette


Avatar
Richard Delorme

Je sais que ce genre de question peut lancer une guerre et est
peut-être simplement un troll, mais j'ai une nouvelle réponse
depuis quelques temps et je veux la diffuser ici.


Par curiosité, quelle est cette réponse ?


Elle suivait :

Que peut-on faire de spécial avec ces langages qu'on ne peut pas
faire avec C++ et qui est _important pour un débutant_ ?




C'est ce que j'appelle une question, pas une réponse ;-)


Du graphisme, par exemple. Mais le problème ne se pose pas dans ce
que permettent de faire ces langages, mais plus dans la simplicité
des langages.


Un débutant ne fait pas de graphisme.


Pourtant, ce livre sur l'apprentissage de la programmation en Python
(donc pour débutants), aborde le graphisme assez vite (au milieu de
l'ouvrage) : http://www.ulg.ac.be/cifen/inforef/swi/python.htm
Faire du graphisme en Python, en Java ou en Visual Basic est
relativement accessible. Le "débutant ne fait pas de graphisme" ne
s'applique qu'au C++.

(En sens inverse, il y a plein de choses simples qu'on peut faire
avec C++, très simplement et pas avec plusieurs de ces langages.
Il vous faut des exemples ?)


S'ils peuvent améliorer ma culture, je veux bien.


double nb;
cin >> nb;

Ça me semble déjà beaucoup :-)


En Python, l'équivalent amélioré :

nb = input("Entrez un nombre > ")

C'est plus simple parce que c'est :
- plus clair : pas d'éléments de syntaxe superflus comme le ';', de
symboles obscures comme le '>>'.
- plus court : pas de déclaration de variable.
- complet : la ligne en Python constitue un programme complet (inutile
je suis d'accord), tandis qu'il manque beaucoup de choses dans l'exemple
en C++ (fonction main(), using namespace std, #include <iostream>, etc.)

C'est aussi beaucoup plus puissant :
- On a le droit à un prompt.
- Si elle est disponible, python utilise la bibliothèque GNU readline
pour la saisie, on dispose donc de toute sa puissance (historique, etc.)
- l'expression saisie est évaluée, on peut donc taper un nombre, un nom
de variable, une addition, ou n'importe quoi de plus compliqué...
- nb prend le type de ce qui est saisi, mais on peut toujours s'assurer
que c'est bien un nombre flottant :

if type(nb) != float: raise TypeError, "Ce n'est pas un nombre..."

(ceci dit, je ne connais pas assez Python pour savoir si c'est
simple ou non dans ce langage, mais encore une fois, je ne dis
pas que les autres langages sont mauvais, je demande simplement
ce qu'ils ont de plus que C++, pour les vrais débutants...)


A mon avis, il manque à C++ une documentation accessible (c'est surtout
vrai pour g++/linux, la bibliothèque standard n'est pas dans le manpage,
ni dans info et il n'y a pas grand chose de valable sur le web), des
messages d'erreur simple et compréhensible.
Il manque sans doute aussi des tutoriels en français de qualité, alors
qu'il existe des choses très pédagogiques pour Python et Java. Le
problème de C++ est que soit le document est simple d'accès mais manque
de rigueur, soit est rigoureux mais difficile.

--
Richard



Avatar
Pierre Maurette
Bonjour.

Avant de me lancer, comme je débute en C++, j'aimerais bien avoir des
suggestions pour traiter la chose suivante :

les données :
nb Tortues, définies par nom, famille, de 0 à 10 valeurs de longévité.
Il y a dès le départ, indépendamment du langage choisi (à priori, le

choix de C++ est un préalable ?) un problème d'analyse, de
structuration de vos données.


Je pense,Tortues sera un enregistrement :
OK, selon le langage, ce pourra être un record, une struct, une class,

voire une "fiche" de données, mais le problème de fond est le même,
c'est de faire une petite base de données cohérente. Pour l'instant,
elle ne l'est pas vraiment.


( nom <chaine caractères> ,
A priori, pourquoi pas ...


famille <chaine caractères>,
famille est un choix parmi un nombre fini de possibilités,

éventuellement évolutif. On peut imaginer une saisie présentant les
familles en liste, plus éventuellement un choix "Nouvelle famille", ou
une saisie suivie d'une demande de confirmation "Ajouter à la liste des
familles ?". Vous avez donc à ajouter à votre "base" un nouvel objet,
une liste de familles. Ce pourra être un fichier dans un SGDB, une
enum, un objet bien choisi de la STL, par exemple. Quoi qu'il en soit,
vous ne stockerez dans chaque tortue qu'une clé d'accès à un item
particulier de cet objet.

longevite <Tableau de 1 à 10 Entiers>,
A peu près la même chose que pour famille. A ceci près que le nombre

d'items semble fixe. Vous pourriez gérer un ensemble (volontairement
imprécis, tableau, STL, etc.) de structures contenant les deux bornes
(entiers ou réels) et la valeur centrale utilisée pour les calculs, per
exemple 100, 109, 104.5 pour les bestioles dont l'espérance de vie est
entre "100 et 110" ans. Ce sont à priori des constantes. Comme pour
famille, vous ne stockez qu'un entier entre 0 et 9 (ou 1 et 10).


MoyenneLongevite <Reel> )
Là, je ne comprends pas. Dans votre ébauche d'algo, vous semblez écrire

qu'il n'y a qu'une seule moyenne pour l'ensemble des bestioles, ce qui
est logique. Si Tortues est une classe, il s'agira d'une donnée dite
"de classe", déclarée par le mot clé static. Elle pourrait également ne
pas exister, et être calculée à la demande. Sinon, elle sera calculée à
chaque modification (ajout, modification, retrait) de la base.
Mais alors, je ne comprends pas les fonctions Affiche_Classe
(Tortue,moyenne) et Affiche_Classe1 (Tortue,moyenne,60).

1 ébauche d'algo :

TantQue il y-a une Tortue à entrer
saisie(nom)
saisie(famille)
si pas_DejaEntree(nom,famille) -- on vérifie que les
-- caractéristiques n'ont pas -- déjà été fournies,
-- (même nom, même famille)
Apparemment, vous acceptez plusieurs fois le même nom, si les familles

sont différentes. Le nom n'est donc pas un identifiant unique. Il n'y a
d'ailleurs pas de champ représentant à lui seul un identifiant unique.
C'est le point intérressant de votre problème. Vous aurez plusieurs
solutions, selon que vous privilégiez la compacité de la base, la
vitesse, la simplicité. L'identifiant unique sera (fait à partir de )
la concaténation du nom et d'une chaîne issue de famille. Vous pouvez
le fabriquer à chaque utilisation. Vous pouvez le stocker en plus de
nom et famille (redondance). Vous pouvez également le stocker tout
seul, et extraire à la demande nom et famille, mais c'est très moyen.
LA première solution est peut être la bonne, surtout si vous avez
besoin par ailleurs d'une fonction vous permettant de chercher un nom
dans une famille donnée, ce qui est probable.

--
Pour répondre directement: enlever une lettre sur deux
wwaannaaddoooo -> wanadoo

Pierre Maurette

Avatar
Matthieu Moy
"Michel Michaud" writes:

Dans le message ,
"Michel Michaud" writes:

Que peut-on faire de spécial avec ces langages qu'on ne peut pas
faire avec C++ et qui est _important pour un débutant_ ?


Mauvaise question. Penses plutôt à


Ce n'est pas la mauvaise question, c'est ma (une ?) réponse à la
remarque qui dit que C++ n'est pas bon pour un débutant...


C'est que tes critères de choix de language pour un débutant ne sont
pas les miens en tous cas.

« Que peut-on faire de dangereux ou quelles mauvaises habitudes peut
prendre un débutant avec C++ et qu'on ne pourrait pas faire avec
tous ces langages ? »


J'attends une réponse


Tu peux regarder ça par exemple.

http://www-verimag.imag.fr/~moy/c_collection/

Et à titre d'exercice, essayer de faire les mêmes conneries dans un
langage comme Ada ou Java.

Et il ne faut pas dévier la question : si on me dit que C++ n'est
pas bon pour un débutant, je demande des explications. Poser une
autre question n'est pas une réponse.


Ben si. C++ est un langage fourre tout, il y a à peu près toutes les
fonctionalités que tu puisse attendre d'un bon langage, mais il y a
aussi à peu près tous les pièges que tu puisses attendre d'un mauvais
langage.

Ton explication du fait que C++ est un bon langage pour débutant tient
dans une question. Pourquoi les autres n'auraient pas le droit de
poser des questions ?

--
Matthieu



Avatar
kanze
Michel Michaud wrote:
Dans le message
,
Michel Michaud wrote:
Que peut-on faire de spécial avec ces langages qu'on ne
peut pas faire avec C++ et qui est _important pour un
débutant_ ?


La question se pose en sens inverse, non ? Qu'est-ce qu'il faut


Pourquoi faudrait-il poser la question en sens inverse. Si
quelqu'un dit que C++ n'est pas bon pour un débutant, je
demande des explications... Poser une autre question n'est pas
une réponse et indique simplement que l'affirmation de base
était peut-être gratuite.


Oui, mais le problème n'est pas, à mon avis, ce qu'on peut faire
de spécial -- si on parle vraiment du b a ba de la
programmation, il y a beaucoup de langages qui ont tout ce qu'il
faut. Et plus -- à la rigueur, des classes, des templates, des
exceptions... sont tous des choses dont un débuttant n'a pas
besoin au début.

En théorie, au moins. Dans la pratique, pour écrire un programme
en Java, même le plus simple, il faut bien pouvoir définir une
classe avec une fonction statique. En C++, il faut bien savoir
définir une fonction. Et faire un #include. En Ada, je crois
qu'il y a une histoire des with et des use, en plus de la
définition d'une procedure.

En Pascal, Fortran ou Basic, il n'y a rien. (Enfin, en Pascal,
il faut bien un bloc.) En Scheme non plus.

Évidemment, cet aspect n'est pas le seul à considérer. Mais il
permet à écarter bien plus de langages que le tien.

apprendre de spécial (propre au langage) avant de pouvoir
écrire des programmes simples et corrects ? Donc, par
exemple, pour commencer en Java, il faut avoir aborder des
classes et des fonctions statiques (ce qui est prèsqu'une
contradiction) avant de pouvoir commencer --


Oui en ce sens-là, ce sont des avantages de C++ comme je le
laissais entrevoir dans mon message. J'avais dit

« (En sens inverse, il y a plein de choses simples qu'on peut
faire avec C++, très simplement et pas avec plusieurs de ces
langages. Il vous faut des exemples ?) »


D'accord, mais c'était un deuxième point. Tu as commencé par
suggérer qu'il y avait des choses qui manquaient dans les autres
langages, non qu'il y avait des choses en trop qu'on ne pouvait
pas éviter.

Mais je ne veux pas dévier la question : on dit que C++ n'est
pas bon pour un débutant. Je veux bien, mais qu'on me dise ce
qui rend Java ou autres meilleurs pour ce rôle...


Et si on disait que tous les deux ont des défauts majeurs dans
ce rôle ? Pas les même, évidemment, mais ni l'un ni l'autre
n'est parfait. Loin de là.

Maintenant, comme tu sais, on peut contourner ces défauts. Dans
les deux cas, et au prix d'un certain effort de l'enseignant. Et
on peut avoir d'autres raisons pour préférer enseigner un
langage ou un autre. Scheme est très élégant, mais si un des
buts de l'enseignement est de déboucher rapidement à un emploi,
il n'est peut-être pas le plus indiqué.

Personnellement, dans un enseignement « long », disons dans une
école d'ingenieur, pour des futurs informaticiens, je ne crois
pas que le C++, ni le Java, serait le premier langage -- je
chercherais soit dans la famille de Pascal (peut-être Ada), soit
dans la famille de Lisp (mais je ne m'y connais pas assez bien
pour juger). Je n'avancerais aux langages plus pratique qu'une
fois que les élèves aient acquis les bonnes habitudres.

Mais ce genre de choix ne vaut que pour un enseignement long, où
on serait amené de toute façon à aborder plusieurs langages.

en C++, les fonctions, mais aussi quelques petits détails
sur les comportements indéfinis (ne pas modifier un objet
deux fois dans la même expression), et la


Ce sont des détails qui ne touchent pas les débutants... Je
parle de comportements indéfinis à mes élèves de temps en
temps, mais ce n'est pas pour les empêcher de faire ce qu'ils
auraient naturellement l'intention de faire. Plutôt pour leur
confirmer qu'ils ont raison de vouloir éviter certaines choses
qui ne leur semblent pas très sûres.


Que les élèves n'apprenent pas l'expression « comportement
indéfini », je veux bien. Mais il faut bien qu'ils apprenent,
par exemple, qu'on ne peut pas renvoyer un tableau local, ou une
référence à une variable locale. Et qu'il ne faut pas modifier
le même objet plusieurs fois dans la même expression. Et pas mal
d'autres choses semblables.

syntaxe des déclarations (pour reconnaître quand on a
déclaré une fonction, et non une variable.


Encore une fois, c'est un cas qui ne touche vraiment pas les
débutants... Un débutant ne sait pas ce qu'est une fonction :
il ne veut ni en faire, ni savoir comment en déclarer une, ni
comment choisir ce qui devrait en être une et ce qui serait
les paramètres.


AMHA, un débuttant doit arriver au niveau de déclarer ses
propres fonctions très, très vite. Particulièrement en C++ -- un
programme C++ sans au moins une fonction, ça n'existe pas.

Mais ce n'est pas là la question. Le problème, c'est quand
l'élève veut définir une variable initialisée (et tu ne vas pas
me dire que la définition des variables, ni leur initialisation,
ne concerne pas les débuttants). Et que ça définition s'avère en
fait être une déclaration de fonction. Et que le message du
compilateur est complètement incompréhensible pour l'élève.

L'idée de faire son programme en un gros bloc lui plaît assez
en fait !


Et c'est probablement la première chose qu'il faut lui
désapprendre, alors. Quand j'ai donné des cours de C, on était
aux fonctions dès la troisième leçon.

Et le copier-coller semble leur meilleur ami.

Je suis heureux de pouvoir faire 150 pages de mon livre
d'introduction à la programmation (environ le tiers) avant
d'introduire la notion de modularité dans le code.


Alors, de quoi est-ce que tu parle ? Il ne doit pas falloir
autant que ça pour présenter les structures de contrôle de flux
et des déclarations de base (int, double, etc.).

Il y a beaucoup à faire avant d'y arriver, si on veut pouvoir
se concentrer sur ce point à partir de ce moment. Si faire des
boucles ou un série de conditions complexes est encore un
problème, je ne veux pas faire des fonctions... pas encore !


Je suppose que ça dépend des élèves. Les seules fois que j'ai
donné des cours, c'était à des adultes, des ingénieurs en
électronique. Donc, le niveau de base y était ; il ne manquait
que la connaissance de l'informatique. J'ai pû couvrir if, while
et for dans à peu près deux heures, sans trop de problèmes. En
ce qui concernait les déclarations, j'ai laissé des struct
(c'était un cour de C) et les types composés (comme les
pointeurs) pour après les fonctions. Quant aux équations, j'ai
bien listé tous les opérateurs, avec leur précédance, avant,
mais pour revenir plus tard dans les détails. (Pour des
débuttants non électronicien, je crois que j'aurais même laisser
tomber certains opérateurs, comme le & et le |, au moins dans un
premier temps.)

(À part ce dernier, je ne dis pas qu'il ne faut pas les
apprendre, quelque soit le langage du début. Mais c'est
peut-être un peu exagéré d'exiger l'apprentissage des
classes et des fonctions statiques avant de pouvoir écrire
quoique ce soit.)


On te répondra qu'ils (les débutants) peuvent faire ça sans
comprendre ce que c'est.


C'est un point de vue. C'est même nécessare, au moins en partie.
Mais alors, où est le problème avec Java ?

Si je me rappelle bien, c'est toi qui m'a présenté cet argument
la première fois. Qu'il fallait trop de « magie » pour démarrer
l'enseignement en Java. Seulement, il en faut aussi pour le C++.
À la fin, il n'y a que Basic de vrai :

10 WRITE "Hello, world!"

Sauf qu'il y a ce numéro de ligne. (Enfin, dans les Basic que
j'ai connu.)

Je trouve que le problème est de nier par la suite l'existence
ou l'utilité de la notion de fonctions (ou variables)
globales, surtout dans des langages qui abusent des classes
pour y mettre des fonctions statiques...


Dans la mesure où tu ne parles pas de la modularisation... On
met les fonctions dans la même classe que main. On leur dit que
le mot clé « class » sert à donner un nom au programme, et que
le mot clé « static » sert à dire qu'une définition de fonction
va suivre.

Je plaisante, évidemment, mais c'est pour dire que la position
de rebattre sur du copier/coler sans explication a ses limites.
Personnellement, quand j'ai enseigné le C, dès la présentation
du hello, world, j'ai bien dit que main était une fonction, que
ce que c'était une fonction (en très gros, mais avec la promesse
d'y revenir), et pourquoi il fallait l'include (pour rendre
accessible les fonctions systèmes, sans entrer en détail de
comment il marchait).

Ça tenait peut-être du niveau de départ des élèves (des
ingénieurs), mais ça marchait très bien.

On ne peut dire qu'il faut faire des classes, expliquer la POO
et l'intérêt des classes et en même temps faire des classes
qui n'en sont pas selon les principes qu'on vient d'expliquer.


Mais le même problème se pose, à la rigueur, vis-à-vis des
fonctions en C++. Ou des blocs en Pascal. Dans tous les cas, il
faut trouver un compromis -- ne rien en dire du tout me semble
pas une bonne solution, mais tout dire ne marche pas non plus.

Et sur ce point, la différence entre le C++ et le Java est une
de dégrée, et non une de principe. Tu peux bien dire que Java
exige trop, et C++ non, mais où on met la ligne est rélativement
arbitraire. J'avoue que je n'écarterai pas Java pour cette
raison. Je prendrais en note qu'il est plus lourd que le C++, à
cet égard, mais ça ne ferait qu'une partie de l'évaluation.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34



Avatar
kanze
Richard Delorme wrote:
Du graphisme, par exemple. Mais le problème ne se pose pas
dans ce que permettent de faire ces langages, mais plus
dans la simplicité des langages.


Un débutant ne fait pas de graphisme.


Pourtant, ce livre sur l'apprentissage de la programmation en
Python (donc pour débutants), aborde le graphisme assez vite
(au milieu de l'ouvrage) :
http://www.ulg.ac.be/cifen/inforef/swi/python.htm Faire du
graphisme en Python, en Java ou en Visual Basic est
relativement accessible. Le "débutant ne fait pas de
graphisme" ne s'applique qu'au C++.


Je ne sais pas exactement ce qu'on entend ici sous
« graphisme », mais je crois que le point de Michel, c'est
qu'une application réele graphique n'est pas abordable par un
débuttant. Pour diverses raisons -- en Java, pour commencer, une
telle application est forcément multithread, et je vois mal un
débuttant aborder le threading.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34



Avatar
Richard Delorme
Richard Delorme wrote:


Du graphisme, par exemple. Mais le problème ne se pose pas
dans ce que permettent de faire ces langages, mais plus
dans la simplicité des langages.





Un débutant ne fait pas de graphisme.




Pourtant, ce livre sur l'apprentissage de la programmation en
Python (donc pour débutants), aborde le graphisme assez vite
(au milieu de l'ouvrage) :
http://www.ulg.ac.be/cifen/inforef/swi/python.htm Faire du
graphisme en Python, en Java ou en Visual Basic est
relativement accessible. Le "débutant ne fait pas de
graphisme" ne s'applique qu'au C++.



Je ne sais pas exactement ce qu'on entend ici sous
« graphisme », mais je crois que le point de Michel, c'est
qu'une application réele graphique n'est pas abordable par un
débuttant. Pour diverses raisons -- en Java, pour commencer, une
telle application est forcément multithread, et je vois mal un
débuttant aborder le threading.


Pour des exemples de débutant, je pense que l'on peut s'en passer. Dans
les exemples données ici :
http://www.apl.jhu.edu/~hall/java/Swing-Tutorial/
je ne vois pas beaucoup de multitâche, juste un minimum de programmation
évenementiel dont on peut ignorer les détails d'implémentation. Après,
pour des vrais programmes professionnels, il vaut mieux connaître
comment fonctionne le multitâche, il est vrai.

Toutefois, Java n'est peut-être pas le meilleur exemple de simplicité
pour le débutant. En Python, le Hello, World fenêtré n'est guère plus
compliqué que le Hello, World textuel du C++ :

#----------8<-----------------
from Tkinter import *

root = Tk()
w = Label(root, text="Hello, world!")
w.pack()
root.mainloop()
#----------8<-----------------

Je ne dis pas que cet exemple doit être le premier abordé pour apprendre
la programmation, mais je pense franchement qu'il peut être vu assez
rapidement, après quelques jours d'apprentissage seulement. Je pense
qu'il peut aussi être appris de manière autodidacte, par un lycéen par
exemple.

A mon avis il est très frustrant d'être initié à la programmation et de
ne jamais écrire quelquechose qui ressemble à un vrai programme.

--
Richard




Avatar
James Kanze
Richard Delorme wrote:

Je ne sais pas exactement ce qu'on entend ici sous « graphisme
», mais je crois que le point de Michel, c'est qu'une
application réele graphique n'est pas abordable par un
débuttant. Pour diverses raisons -- en Java, pour commencer,
une telle application est forcément multithread, et je vois
mal un débuttant aborder le threading.



Pour des exemples de débutant, je pense que l'on peut s'en
passer. Dans les exemples données ici :


http://www.apl.jhu.edu/~hall/java/Swing-Tutorial/


je ne vois pas beaucoup de multitâche, juste un minimum de
programmation évenementiel dont on peut ignorer les détails
d'implémentation.


Du tutorial de Sun
(http://java.sun.com/docs/books/tutorial/uiswing/learn/example1.html),
« Example One: Your First Swing Program" :

This is one of the simplest Swing applications you can
write. It doesn't do much, but the code demonstrates the
basic code in every Swing program:

1. Import the pertinent packages.
2. Set up a top-level container.
3. Display the container.
4. Be thread-safe.

Note bien le point quatre ! Et ils en parlent encore dans la
page.

(En passant, je signale qu'ils ont changé la technique depuis
que j'ai appris Swing de ce tutorial. Sans doute parce que la
façon qu'ils décrivaient avant n'était pas thread safe.)

Après, pour des vrais programmes professionnels, il vaut mieux
connaître comment fonctionne le multitâche, il est vrai.


C'est un peu pourquoi j'ai soulevé la question de ce qu'on veut
dire par « graphisme ». Si c'est juste pour afficher du texte
dans une fenêtre, effectivement, un débuttant y arrive en Java.
Mais dès qu'on veut quelque chose d'interactif, avec des entrées
de l'utilisateur qui font quelque chose, on est amené à se
servir des threads worker. Pas vraiment difficile, mais il a
fallu trois versions avant que Sun le fasse correctement.

Toutefois, Java n'est peut-être pas le meilleur exemple de
simplicité pour le débutant.


Il y en a pire. Mais il y a certainement mieux, aussi.

En Python, le Hello, World fenêtré n'est guère plus compliqué
que le Hello, World textuel du C++ :


En général, pour un débuttant, il y a un certain avantage d'être
libéré de la nécessité de compiler. Si le but est simplement
d'apprendre programmer, j'aurais bien une tendance à préférer
un langage interprété, rien que pour ça. Mais ce n'est qu'un
paramètre parmi tant.

#----------8<-----------------
from Tkinter import *


root = Tk()
w = Label(root, text="Hello, world!")
w.pack()
root.mainloop()
#----------8<-----------------


Je ne dis pas que cet exemple doit être le premier abordé pour
apprendre la programmation, mais je pense franchement qu'il
peut être vu assez rapidement, après quelques jours
d'apprentissage seulement. Je pense qu'il peut aussi être
appris de manière autodidacte, par un lycéen par exemple.


A mon avis il est très frustrant d'être initié à la
programmation et de ne jamais écrire quelque chose qui
ressemble à un vrai programme.


Dans le cours de C que j'ai donné, au bout de douze semaines
(avec quatre heures de cours par semaine), on écrivait un make.
C'était un autre époque, et l'audience du cours n'était
peut-être pas la même, mais il faut dire que ça ressemblait bien
à un vrai programme. Malgré sa date, je trouve que « Software
Tools in Pascal », de Kernighan et Plauger (dont je me suis
inspiré pour mon cours) reste l'exemple de comment faire un bon
cours d'informatique.

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34


Avatar
Michel Michaud
Dans le message 42983696$0$304$,

Je sais que ce genre de question peut lancer une guerre et est
peut-être simplement un troll, mais j'ai une nouvelle réponse
depuis quelques temps et je veux la diffuser ici.


Par curiosité, quelle est cette réponse ?


Elle suivait :

Que peut-on faire de spécial avec ces langages qu'on ne peut
pas faire avec C++ et qui est _important pour un débutant_ ?




C'est ce que j'appelle une question, pas une réponse ;-)


D'accord, alors : on ne peut rien faire de spécial avec ces langages
qu'on ne peut pas faire avec C++ et qui est important pour un débutant. :-)

[...]
Pourtant, ce livre sur l'apprentissage de la programmation en
Python (donc pour débutants), aborde le graphisme assez vite
(au milieu de l'ouvrage) :
http://www.ulg.ac.be/cifen/inforef/swi/python.htm
Faire du graphisme en Python, en Java ou en Visual Basic est
relativement accessible. Le "débutant ne fait pas de graphisme" ne
s'applique qu'au C++.


Non, s'applique à tous les débutants qui veulent apprendre à programmer
plutôt qu'à faire de jolis dessins, quelque soit le
langage de programmation.

[...]
En Python, l'équivalent amélioré :


Je ne connais pas assez Python alors je n'ai rien contre Python, à
part le fait qu'il n'est pas utiliser dans l'industrie suffisamment
pour que j'en fasse « le langage » des débutants. C'est une simple
question de temps dans le cadre d'une formation bien déterminée,
alors je l'avoue, peut-être que pour quelqu'un qui veut simplement
apprendre en dilettante, il pourrait être supérieur à C++.

[...]
- plus court : pas de déclaration de variable.


Désolé, mais je ne vois pas ça comme une amélioration. Tout
comme plusieurs autres points que tu as soulignés. Mais je ne
connais pas assez Python pour me faire une idée précise alors
je ne passerai pas d'autres commentaires :-|

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/




Avatar
Michel Michaud
Dans le message ,
Michel Michaud wrote:
Pourquoi faudrait-il poser la question en sens inverse. Si
quelqu'un dit que C++ n'est pas bon pour un débutant, je
demande des explications... Poser une autre question n'est pas
une réponse et indique simplement que l'affirmation de base
était peut-être gratuite.


Oui, mais le problème n'est pas, à mon avis, ce qu'on peut faire
de spécial -- si on parle vraiment du b a ba de la programmation,
il y a beaucoup de langages qui ont tout ce qu'il faut.


Ça dépend du b.a.-ba... De toute façon, je n'ai pas dit que les
autres ne les avaient pas (même si...). Mais on prétendait que
d'autres que C++ offraient plus.

Et plus -- à la rigueur, des classes, des templates, des
exceptions... sont tous des choses dont un débuttant n'a pas
besoin au début.


Tout à fait... sauf peut-être les templates si on n'a pas de
notions autres de vecteurs dynamiques qui ne contiennent pas
seulement des références/pointeurs vers un type de base
« object »... Là c'est trop pour un débutant :-)

[...]
Oui en ce sens-là, ce sont des avantages de C++ comme je le
laissais entrevoir dans mon message. J'avais dit

« (En sens inverse, il y a plein de choses simples qu'on peut
faire avec C++, très simplement et pas avec plusieurs de ces
langages. Il vous faut des exemples ?) »


D'accord, mais c'était un deuxième point. Tu as commencé par
suggérer qu'il y avait des choses qui manquaient dans les autres
langages, non qu'il y avait des choses en trop qu'on ne pouvait
pas éviter.


Non, j'ai commencé par dire que les autres n'offraient rien de
plus que C++ pour les débutants. J'ai clairement demandé qu'on
me dise ce que les autres offraient de plus...

[...]
Et si on disait que tous les deux ont des défauts majeurs dans
ce rôle ? Pas les même, évidemment, mais ni l'un ni l'autre
n'est parfait. Loin de là.


Peut-être que tous les langages ont des inconvénients. Alors
je dirai que comme C++ offre plus de choses, par son côté
multiparadigme, il a un avantage.

[...]
en C++, les fonctions, mais aussi quelques petits détails
sur les comportements indéfinis (ne pas modifier un objet
deux fois dans la même expression), et la


Ce sont des détails qui ne touchent pas les débutants... Je
parle de comportements indéfinis à mes élèves de temps en
temps, mais ce n'est pas pour les empêcher de faire ce qu'ils
auraient naturellement l'intention de faire. Plutôt pour leur
confirmer qu'ils ont raison de vouloir éviter certaines choses
qui ne leur semblent pas très sûres.


Que les élèves n'apprenent pas l'expression « comportement
indéfini », je veux bien.


Tu as lu ça où dans mon message ?

[...]
AMHA, un débuttant doit arriver au niveau de déclarer
ses propres fonctions très, très vite. Particulièrement
^^^^^^^^^^^^^^^^^^^^^


en C++ -- un programme C++ sans au moins une fonction, ça
n'existe pas.


Mais ce n'est pas une fonction que je mettrais dans le
groupe « ses propres fonctions ». Non, on n'a pas besoin de
faire des fonctions personnelles rapidement en C++... Pas
plus rapidement que c'est nécessaire !

Mais ce n'est pas là la question. Le problème, c'est quand
l'élève veut définir une variable initialisée (et tu ne vas pas
me dire que la définition des variables, ni leur initialisation,
ne concerne pas les débuttants). Et que ça définition s'avère en
fait être une déclaration de fonction. Et que le message du
compilateur est complètement incompréhensible pour l'élève.


Ça n'arrive pas à un débutant. Tu peux essayer de trouver un
exemple pour me contredire ?

L'idée de faire son programme en un gros bloc lui plaît assez
en fait !


Et c'est probablement la première chose qu'il faut lui
désapprendre, alors. Quand j'ai donné des cours de C, on était
aux fonctions dès la troisième leçon.


Bravo pour toi, tes élèves devaient être des génies... ou déjà
connaître ce qu'est une variable, une constante, etc., et
comment combiner les structures de contrôle pour obtenir le
résultat désiré. Ou alors, tes cours n'ont fait que survoler la
matière qu'ils ont appris par eux-mêmes ensuite :-)

[...]
Je suis heureux de pouvoir faire 150 pages de mon livre
d'introduction à la programmation (environ le tiers) avant
d'introduire la notion de modularité dans le code.


Alors, de quoi est-ce que tu parle ?


http://www.gdzid.com/Tdm1.txt

[...]
Je suppose que ça dépend des élèves. Les seules fois que j'ai
donné des cours, c'était à des adultes, des ingénieurs en
électronique. Donc, le niveau de base y était ; il ne manquait
que la connaissance de l'informatique. J'ai pû couvrir if, while
et for dans à peu près deux heures, sans trop de problèmes.


Moi aussi je pourrais enseigner ça en peu de temps, mais est-ce
que des élèves moyens peuvent l'apprendre aussi vite ? Je t'assure
que non !

[...]
Mais alors, où est le problème avec Java ?


Je dirais que pour moi, c'est la complexité initiale des
entrées-sorties de base qui est un gros problème. Et lorsque le
besoin de faire des fonctions arrivent, le manque aux niveaux des
types de paramètres, particulièrement combiné avec les types
références obligatoires sur tout autre chose que les types de base.

Sur ces points d'ailleurs, j'avoue que C# a un avantage sur C++
(pour ceux qui ne connaissent pas C#, on a des paramètres d'entrée,
mais aussi des paramètres de sortie et d'entrée-sortie qu'il faut
qualifier autant à l'appel qu'à la déclaration; C# a aussi une
forme de struct en plus des class)...

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/



1 2 3