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

Diviseurs en C++ et bonnes pratiques

41 réponses
Avatar
Olivier Miakinen
Bonjour,

Ma principale expérience de C++ consiste en la maintenance de programmes
sous Windows avec Visual C++, sans aucune utilisation
de bibliothèque standard. Je voudrais remédier à cela en m'entraînant
sur Linux (avec gcc je suppose). Or il se trouve que j'ai un petit
problème à résoudre, et je pense que ça pourrait être l'occasion, mais
j'aurais besoin d'un peu d'aide au début pour le faire « à la C++ » et
pas avec les méthodes C que j'ai toujours utilisées jusqu'à présent.

Le « début » en question consiste à partir de la suite des nombres de 1
à 200 (dans un vector, je suppose), pour chaque nombre de déterminer la
liste ordonnée de ses diviseurs (dans d'autres vector sans doute), puis
d'écrire sur stdout toutes les décompositions des nombres en produits de
deux facteurs.

Par exemple, cela pourrait donner ceci :
1 : 1×1
2 : 1×2
3 : 1×3
4 : 1×4 2×2
...
8 : 1×8 2×4
9 : 1×9 3×3
10 : 1×10 2×5
...
36 : 1×36 2×18 3×12 4×9 6×6
...
199 : 1×199
200 : 1×200 2×100 4×50 5×40 8×25 10×20

Je ne cherche pas nécessairement à ce qu'on me mâche tout le boulot,
mais déjà, si quelqu'un pouvait m'indiquer où trouver d'une part les
bonnes pratiques C++ et d'autre part s'il existe une bibliothèque de
maths qui gère les décompositions en nombres premiers et les diviseurs,
ça me serait très utile.

Cordialement,
--
Olivier Miakinen

10 réponses

1 2 3 4 5
Avatar
Stan
On 6 oct, 10:00, James Kanze wrote:

Dans l'ensemble, à juger d'après les candidats que j'interviewe
(parfois pour des postes d'assez haut niveau), les connaissances
réeles de C++ sont prèsque toujours minimal. Je ne crois pas
avoir vu un candidat qui aurait énoncé ma solution, ni même
quelque chose de proche. En revanche, il y en a bien eu qui
savait très bien apprendre, une fois renseignés sur ce qu'on
voulait qu'ils apprennent, et qui s'en tirent fort bien une fois
embauchés.




Comment vous y prenez-vous pour discerner
qu'un canditat qui n'a pas pas la solution sur le champ,
sera néanmoins, une fois en poste, capable d'exploiter
d'autres capacités comme :
trouver la solution optimale parmi plusieurs, ou
apprendre rapidement "une fois renseigné sur ce qu'on
veut qu'il apprenne" ?


--
-Stan
Avatar
Jean-Marc Bourguet
James Kanze writes:

En effet. Je crois que je l'adopterai aussi. Bien que...

Dans l'ensemble, à juger d'après les candidats que j'interviewe (parfois
pour des postes d'assez haut niveau), les connaissances réeles de C++
sont prèsque toujours minimal. Je ne crois pas avoir vu un candidat qui
aurait énoncé ma solution, ni même quelque chose de proche.



Je suis content quand j'ai quelqu'un qui pense a utilise une fonction de
bibliotheque plutot que de reimplementer un algo de tri (c'est courant chez
les debutants, en plus ils se plantent) ou meme donne un code correct...
En passant, j'attends toujours celui qui me sortira

int main() {
return system("sort");
}

qui est la solution que j'aurais donnee, ou au moins signalee, si on
m'avait poser la question. Ce qui m'interesse, c'est la discussion qui
suit (le pb du tri de donnees trop grosses pour tenir en memoire, du tri en
ligne, du changement de criteres, ...)

En revanche, il y en a bien eu qui savait très bien apprendre, une fois
renseignés sur ce qu'on voulait qu'ils apprennent, et qui s'en tirent
fort bien une fois embauchés.



C'est une qualite qu'on cherche aussi plus que la connaissance immediate.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Avatar
Gabriel Dos Reis
James Kanze writes:

[...]

| Mais c'est peut-être lié au contexte. Nous récherchons sur tout
| une maîtrise du calcul numérique, avec des connaissances des
| algorithmes de marché, si possible. Le C++ est important, mais
| pas primordial. (Et en passant, nous recherchons toujours.)

Comment est le marché du travail de l'autre côté de l'Atlant ique ?

(Ici, on note un certain décalage entre l'offre et les compétences
des candidats...)

-- Gaby
Avatar
Gabriel Dos Reis
Jean-Marc Bourguet writes:

| James Kanze writes:
|
| > En effet. Je crois que je l'adopterai aussi. Bien que...
| >
| > Dans l'ensemble, à juger d'après les candidats que j'intervie we (parfois
| > pour des postes d'assez haut niveau), les connaissances réeles de C++
| > sont prèsque toujours minimal. Je ne crois pas avoir vu un candida t qui
| > aurait énoncé ma solution, ni même quelque chose de proc he.
|
| Je suis content quand j'ai quelqu'un qui pense a utilise une fonction de
| bibliotheque plutot que de reimplementer un algo de tri (c'est courant ch ez
| les debutants, en plus ils se plantent) ou meme donne un code correct...

Je ne sais pas comment est l'éducation maintenant, mais à mon pre mier
cours de C++, on avait insisté que j'écrive une liste chainé e d'entiers.
(Je n'y suis plus jamais retourné.) Mon impression est que les
cours passaient le plus clair de leur temps à faire réimplém enter
des abstractions standard, au lieu d'apprendre à résoudre des
problèmes. Je ne serai pas surpris si le débutant pense que le b ut
c'est de tout refaire soi même -- et surtout éviter la biblioth èque
standard (elle pourrait être buguée)...

-- Gaby
Avatar
Jean-Marc Bourguet
Stan writes:

On 6 oct, 10:00, James Kanze wrote:

> Dans l'ensemble, à juger d'après les candidats que j'interviewe
> (parfois pour des postes d'assez haut niveau), les connaissances
> réeles de C++ sont prèsque toujours minimal. Je ne crois pas
> avoir vu un candidat qui aurait énoncé ma solution, ni même
> quelque chose de proche. En revanche, il y en a bien eu qui
> savait très bien apprendre, une fois renseignés sur ce qu'on
> voulait qu'ils apprennent, et qui s'en tirent fort bien une fois
> embauchés.
>

Comment vous y prenez-vous pour discerner qu'un canditat qui n'a pas pas
la solution sur le champ, sera néanmoins, une fois en poste, capable
d'exploiter d'autres capacités comme : trouver la solution optimale parmi
plusieurs, ou apprendre rapidement "une fois renseigné sur ce qu'on veut
qu'il apprenne" ?



On cause... et on est plusieurs a interviewer separement puis a concerter
les avis. Il faut d'apres mon experience pas si longtemps pour discerner
les caracteres.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Avatar
Marc Boyer
Le 06-10-2010, Gabriel Dos Reis a écrit :
Jean-Marc Bourguet writes:
| James Kanze writes:
| Je suis content quand j'ai quelqu'un qui pense a utilise une fonction de
| bibliotheque plutot que de reimplementer un algo de tri (c'est courant chez
| les debutants, en plus ils se plantent) ou meme donne un code correct...

Je ne sais pas comment est l'éducation maintenant, mais à mon premier
cours de C++, on avait insisté que j'écrive une liste chainée d'entiers.
(Je n'y suis plus jamais retourné.) Mon impression est que les
cours passaient le plus clair de leur temps à faire réimplémenter
des abstractions standard, au lieu d'apprendre à résoudre des
problèmes. Je ne serai pas surpris si le débutant pense que le but
c'est de tout refaire soi même -- et surtout éviter la bibliothèque
standard (elle pourrait être buguée)...



Difficile de parler à la place d'un autre, mais la question est
toujours la même: comment placer un cours dans un cursus ?
Je m'attends d'un informaticien qu'en sortie de cursus,
il sache implanter une liste chainée et un tri. Dès lors,
est-ce qu'on place ce type d'apprentissage dans un cours
'algorithmique' ou 'Pascal' ou 'C++' ?

Je m'attends aussi à ce qu'il sache que le principe du
logiciel, c'est de décomposer un problème en modules aux
interfaces claire (même si c'est difficile de demander
à un débutant de savoir le faire sur des problèmes réels).

Après, j'entends souvent des étudiants d'info raler qu'ils
doivent réimplanter des "trucs qui existent déjà" alors
qu'ils ont accepté sans raler de dériver des fonctions
que des milliers d'étudiants ont déjà dérivé avant eux
(et que des logiciels savent dériver tous seuls) où
de refaire des expérience de physique dont on connait
les résultats depuis 2 à 3 siècles.

Marc Boyer
--
En prenant aux 10% des francais les plus riches 12% de leurs revenus,
on pourrait doubler les revenus des 10% les plus pauvres.
http://www.inegalites.fr/spip.php?article1&id_mot0
Avatar
Gabriel Dos Reis
Marc Boyer writes:

| Le 06-10-2010, Gabriel Dos Reis a écrit :
| > Jean-Marc Bourguet writes:
| >| James Kanze writes:
| >| Je suis content quand j'ai quelqu'un qui pense a utilise une fonction de
| >| bibliotheque plutot que de reimplementer un algo de tri (c'est courant chez
| >| les debutants, en plus ils se plantent) ou meme donne un code correct. ..
| >
| > Je ne sais pas comment est l'éducation maintenant, mais à mon premier
| > cours de C++, on avait insisté que j'écrive une liste chain ée d'entiers.
| > (Je n'y suis plus jamais retourné.) Mon impression est que les
| > cours passaient le plus clair de leur temps à faire réimplà ©menter
| > des abstractions standard, au lieu d'apprendre à résoudre des
| > problèmes. Je ne serai pas surpris si le débutant pense que le but
| > c'est de tout refaire soi même -- et surtout éviter la biblio thèque
| > standard (elle pourrait être buguée)...
|
| Difficile de parler à la place d'un autre, mais la question est
| toujours la même: comment placer un cours dans un cursus ?
| Je m'attends d'un informaticien qu'en sortie de cursus,
| il sache implanter une liste chainée et un tri. Dès lors,
| est-ce qu'on place ce type d'apprentissage dans un cours
| 'algorithmique' ou 'Pascal' ou 'C++' ?

Devais-je savoir comment implémenter une liste chaînée
d'entiers avant de savoir resoudre des problèmes de
programmation utilisant des listes chaînées ?

[...]

| Après, j'entends souvent des étudiants d'info raler qu'ils
| doivent réimplanter des "trucs qui existent déjà" alors
| qu'ils ont accepté sans raler de dériver des fonctions
| que des milliers d'étudiants ont déjà dérivé ava nt eux

Je ne vois pas bien le rapport. Pourrais-tu élaborer ?

| (et que des logiciels savent dériver tous seuls) où
| de refaire des expérience de physique dont on connait
| les résultats depuis 2 à 3 siècles.

Les expériences de physique/chimie m'ont appris à avoir une
intuition concrète de certains des principes théoriques appris
en cours.
Je vois mal le lien avec la situaion que j'ai
décrite plus haut. Pourrais-tu élaborer ?

-- Gaby
Avatar
Marc Boyer
Le 06-10-2010, Gabriel Dos Reis a écrit :
Marc Boyer writes:
| Le 06-10-2010, Gabriel Dos Reis a écrit :
| > Je ne sais pas comment est l'éducation maintenant, mais à mon premier
| > cours de C++, on avait insisté que j'écrive une liste chainée d'entiers.
| > (Je n'y suis plus jamais retourné.) Mon impression est que les
| > cours passaient le plus clair de leur temps à faire réimplémenter
| > des abstractions standard, au lieu d'apprendre à résoudre des
| > problèmes. Je ne serai pas surpris si le débutant pense que le but
| > c'est de tout refaire soi même -- et surtout éviter la bibliothèque
| > standard (elle pourrait être buguée)...
|
| Difficile de parler à la place d'un autre, mais la question est
| toujours la même: comment placer un cours dans un cursus ?
| Je m'attends d'un informaticien qu'en sortie de cursus,
| il sache implanter une liste chainée et un tri. Dès lors,
| est-ce qu'on place ce type d'apprentissage dans un cours
| 'algorithmique' ou 'Pascal' ou 'C++' ?

Devais-je savoir comment implémenter une liste chaînée
d'entiers avant de savoir resoudre des problèmes de
programmation utilisant des listes chaînées ?



C'est un peu le serpent qui se mort la queue, le bootstrap, etc.
Mais souvent, on fait commencer par un truc genre
"algorithmique et structures de données".

| Après, j'entends souvent des étudiants d'info raler qu'ils
| doivent réimplanter des "trucs qui existent déjà" alors
| qu'ils ont accepté sans raler de dériver des fonctions
| que des milliers d'étudiants ont déjà dérivé avant eux

Je ne vois pas bien le rapport. Pourrais-tu élaborer ?



Le rapport entre quoi et quoi ? Entre ton expérience
et la mienne ou entre informatique et math ?

| de refaire des expérience de physique dont on connait
| les résultats depuis 2 à 3 siècles.

Les expériences de physique/chimie m'ont appris à avoir une
intuition concrète de certains des principes théoriques appris
en cours.



Moi pas. Mais bon...

Marc Boyer
--
En prenant aux 10% des francais les plus riches 12% de leurs revenus,
on pourrait doubler les revenus des 10% les plus pauvres.
http://www.inegalites.fr/spip.php?article1&id_mot0
Avatar
Gabriel Dos Reis
Marc Boyer writes:

| Le 06-10-2010, Gabriel Dos Reis a écrit :
| > Marc Boyer writes:
| >| Le 06-10-2010, Gabriel Dos Reis a écrit :
| >| > Je ne sais pas comment est l'éducation maintenant, mais à mon premier
| >| > cours de C++, on avait insisté que j'écrive une liste chai née d'entiers.
| >| > (Je n'y suis plus jamais retourné.) Mon impression est que les
| >| > cours passaient le plus clair de leur temps à faire réimpl émenter
| >| > des abstractions standard, au lieu d'apprendre à résoudre des
| >| > problèmes. Je ne serai pas surpris si le débutant pense q ue le but
| >| > c'est de tout refaire soi même -- et surtout éviter la bib liothèque
| >| > standard (elle pourrait être buguée)...
| >|
| >| Difficile de parler à la place d'un autre, mais la question est
| >| toujours la même: comment placer un cours dans un cursus ?
| >| Je m'attends d'un informaticien qu'en sortie de cursus,
| >| il sache implanter une liste chainée et un tri. Dès lors,
| >| est-ce qu'on place ce type d'apprentissage dans un cours
| >| 'algorithmique' ou 'Pascal' ou 'C++' ?
| >
| > Devais-je savoir comment implémenter une liste chaînée
| > d'entiers avant de savoir resoudre des problèmes de
| > programmation utilisant des listes chaînées ?
|
| C'est un peu le serpent qui se mort la queue, le bootstrap, etc.

Je ne vois pas comment. Pourrais-tu y aller pas à pas pour que je
puisse suivre ?

| Mais souvent, on fait commencer par un truc genre
| "algorithmique et structures de données".

Tu fais un cours d'algorithmique et de structures de données
en C++ à des gens qui ne savent pas programmer en C++ ?

| >| Après, j'entends souvent des étudiants d'info raler qu'ils
| >| doivent réimplanter des "trucs qui existent déjà" alors
| >| qu'ils ont accepté sans raler de dériver des fonctions
| >| que des milliers d'étudiants ont déjà dérivé avant eux
| >
| > Je ne vois pas bien le rapport. Pourrais-tu élaborer ?
|
| Le rapport entre quoi et quoi ?

J'ai parlé de quelque chose de précis (cours de C++, liste
chaînees) et tu t'es lancé su « dériver des fonctions. »

J'aimerais comprendre.

-- Gaby
Avatar
Marc Boyer
Le 06-10-2010, Gabriel Dos Reis a écrit :
Marc Boyer writes:
| Mais souvent, on fait commencer par un truc genre
| "algorithmique et structures de données".

Tu fais un cours d'algorithmique et de structures de données
en C++ à des gens qui ne savent pas programmer en C++ ?



En quoi faire le cours d'algorithmique et de structures
de données ?
Je ne sais pas (enfin pas bien) enseigner l'algorithmique
sans langage support. De même pour pour les structures de
données.

| >| Après, j'entends souvent des étudiants d'info raler qu'ils
| >| doivent réimplanter des "trucs qui existent déjà" alors
| >| qu'ils ont accepté sans raler de dériver des fonctions
| >| que des milliers d'étudiants ont déjà dérivé avant eux
| >
| > Je ne vois pas bien le rapport. Pourrais-tu élaborer ?
|
| Le rapport entre quoi et quoi ?

J'ai parlé de quelque chose de précis (cours de C++, liste
chaînees) et tu t'es lancé su « dériver des fonctions. »

J'aimerais comprendre.



J'oubliais que tu n'aimes pas les analogies.
Reprenons ton propos

Gabriel Dos Reis a écrit :
Mon impression est que les
cours passaient le plus clair de leur temps à faire réimplémenter
des abstractions standard, au lieu d'apprendre à résoudre des
problèmes.



D'une part, je n'étais pas à ces cours là, donc je n'ai pas
d'avis dessus.
Ensuite, tu opposes une méthode "réimplémenter des abstractions
standard" à un objectif "apprendre à résoudre des problèmes".
Et puis comme tout cours est un équilibre entre plein de choses
(cours magistral/projet par exemple), celui dont tu parles souffrait
peut-être d'un déséquilibre.

Sinon, mon argument était que dans de nombreux domaines, dont
l'informatique, le débutant commence à "faire ses gammes",
à faire des exercices qui sont loins des problèmes réels,
mais permettent d'aquérir de la technique.
Mais le cas particulier de l'informatique, où la copie
est facile et la ré-utilisation généralement encouragée,
l'élève rale assez souvent (dans mon expérience) d'avoir
à coder un type ou une fonction, alors qu'il lui suffirait
d'aller récupérer une implantation déjà existante pour
résoudre le problème.

Marc Boyer
--
En prenant aux 10% des francais les plus riches 12% de leurs revenus,
on pourrait doubler les revenus des 10% les plus pauvres.
http://www.inegalites.fr/spip.php?article1&id_mot0
1 2 3 4 5