Rockleader a écrit:Voilà ma version finalisé de ce programme, qui marche bien, j'ai tenu en comptes des conseils pour sortir de la boucle.
Je me joins au remarques de Fatal-Error surtout concernant le nom des variables. Et je dois reconnaitre aussi que sa philosophie concernant les commentaires rendu superflus par l'usage de noms de variable/procédure approprié est bonne.
Concernant la sortie de la boucle par un BREAK, c'est quelque chose qui peut être très bien fait.
Par contre, dans le cas de cet excercice, il faut bien se rendre à l'évidence que ce n'est pas le nombre de propositions que fait le programme qui est le facteur limitant, mais plutôt la réponse de l'utilisateur.
Si l'on ne devait utiliser qu'une seule variable, l'indicateur de sortie serait bien une réponse égale à 0.
Autre chose qui me choque c'est que le message qui affiche que la réponse n'a pas était trouvée avant les 7 proposition est dans une clause IF ... THEN qui ne teste pas le nombre de propositions, mais la réponse de l'utilisateur ??
Dans mon exemple, je teste bien la valeur donnée par l'utilisateur pour indiquer le nombre secret lorsqu'il a été trouvé par l'ordinateur tout seul et éviter de le faire si l'utilisateur vient de répondre 0. Car alors c'est évident que le nombre secret a été trouvé, l'utilisateur vient de le voir s'afficher.
Et mon algorithme boucle autant de fois que nécessaire, d'où le test sur le nombre de propositions pour indiquer l'éventuel dépassement.
Afin, en ADA il n'ya pas de BREAK, mais il existe une instruction EXIT ... WHEN :
- Code: Tout sélectionner
Sys_Prop := 50;
Nb_Prop := 0;
Seek_Loop :
LOOP
Nb_Prop := Nb_Prop +1
PUT(Sys_Prop);
GET(User_Rep);
EXIT Seek_Loop WHEN User_Rep == 0;
Sys_Prop := Sys_Prop + SGN( User_Rep) * (Sys_Prop / 2);
END LOOP Seek_Loop;
P.S.: Je fais expres de mettre des noms Composé_Avec_Le_Underscore_Et_Des_Majuscule car cela est souvent l'usage dans les communauté ADA que j'ai fréquenté; d'ailleurs c'était une obligation dans certains cahiers des charges pour l'industrie d'armement.
Mais, ce n'est pas l'usage en C/C++ ... je sais chacun ses défauts !!
Concernant les nombres premiers , tout nombre est soit premier, soit composé (ou multiple) (c'est plus élégant que "pas premier" - et surtout cela montre que l'on a fait un minimum de recherche et de préparation au sujet !).
En ADA quand on connait les bornes d'une boucle, on peut utiliser
- Code: Tout sélectionner
FOR i IN A..B LOOP
...
END LOOP
Je pense, que ce que demande le prof n'est pas de changer l'algorithme ou de trouver une méthode plus astucieuse pour détecter les nombre premier. Bien que cela soit tout à fait possible.
Dans un premiers temps, il faut observer le déroulement du code et voir où sont les boucles (surtout imbriquée), combien de fois chaque boucle est recommencer et comprendre la dynamique de tout cela (profiler).
Apparement D est un compteur, mais il compte quoi ? Est-il nécessaire pour chaque Val testée de compter tous les multiples ? Ne peut-on pas s'arrêter dès que le premier facteur est détecté ?
Par ailleurs, la variable C recommence à 2 pour chaque élément de l'intervalle [A B].
Ensuite la boucle de C fait 2,3,4, 5, ... Mais à quoi sert de tester 4 si on a déjà testé avec 2 ?
Pareil avec 3, tester ensuite par 6 ou 9 c'est pas bien malin...
Il y a peut-être une série de valeur à utiliser pour C qui permettrait de ne rien oublier mais avec bien moins de valeurs testé ?
De même pour la condition de fin, est-il nécessaire d'aller jusqu'à C < Val ? Supposons que la valeur Val soit un nombre composé, à un moment, Val est multiple de C; il existe donc un entier k tel que Val = C * k. On a testé C par valeur croissante à partir de 2 , donc on sait que k est supérieur ou égal à C. S'il était plus petit, on aurait déjà eut une division juste.
Il y a peut-être aussi quelque chose à faire pour ne pas avoir à refaire tout depuis le début à chaque valeur de l'intervalle.
Par exemple, si A est pair, alors A+2, A+4, etc... jsuqu'à B le seront aussi. Il est peut-être plus malin :
-I- de ne pas refaire la boucle concernant C "bêtement" en recommencant sans tenir compte des résultats précèdents ? Mais cela fait partie de la réflexion ci-dessus concernant les valeur de C à utiliser
-II- à ne pas tester les multiples suivant un nombre composé détecté.
Pour y voir plus clair, prenons un exemple concret :
Je veux déterminer les nombres premiers (et composés) entre 10 et 20 :
L'algorithme commence avec Val =10
On commence avec C = 2, test Val MOD 2
On remarque que cela est vrai aussi si par exemple A est multiple de 3, alors on sait déjà A+3, A+6, A+9, ... le seront aussi !