Recherche d'un nombre

Discutez d'informatique ici !
Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

Recherche d'un nombre

par Rockleader » 02 Oct 2012, 19:30

Je vous explique rapidement l'exercice.

L'utilisateur choisi un nombre qu'il note dans sa tête. La machine essaie alors de trouver le nombre choisi. Elle fait une proposition et l'utilisateur lui signale si le nombre est plus grand plus petit ou égal.



J'insiste sur le fait que le nombre choisi ne doit pas être utiliser comme variable une boucle du genre tant que nombre de la machine n'est pas égal à nombre de l'utilisateur faire.... ça ne marche pas comme ça.





La machine a seulement le droit à 7 essaie pour trouver le nombre (bon c'est compliqué en seulement 7 essaies, je me contenterai d'un programme qui y parvient^^)
Par le biais de la variable Dial, j'indique avec -1; 1 ou 0 ce que le programme fait par la suite. On présume que l’utilisateur fait bien ce qu'on lui dit (c'est pour sa que c'est pas super intéressant...ça sera un programme qui pourra buguer mais ce n’est pas le but de l'exercice.


Voici mon programme, il fonctionne, mais les valeurs que j'affecte à la proposition que dois faire la machine ne sont pas assez précises, voilà donc, si vous avez des idées, merci !


Code: Tout sélectionner
--Recherche d'un nombre entré par l'utilisateur
with entrees_sorties;
use entrees_sorties;
procedure devinette is

v_Min:Integer:=0; -- Valeur minimale 1
v_Max:Integer:=100; -- Valeur maximale 100
Dial:Integer; --Dialogue avec la machine
nbre_Tentative:Integer:=0;
nbre_Choisi:Integer:= (v_Max + v_Min) / 2; --Nombre proposé par la machine

begin
  While (nbre_Tentative /= 7) loop
    put(nbre_Choisi);
    get(Dial);
    if (Dial = -1) then
      nbre_Choisi := nbre_Choisi - (nbre_Choisi)/2;
    elsif (Dial = 1) then   
      nbre_Choisi := nbre_Choisi + (nbre_Choisi)/2;
    else
      put("Le nombre a été trouvé en ");
      put(nbre_Tentative);
    end if;
    nbre_Tentative := nbre_Tentative + 1;
  end loop;
  put("Les 7 tentatives sont écoulées.");
end devinette;
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !



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

par fatal_error » 02 Oct 2012, 20:11

lorsque tu as nbChoisi qui mettons vaut 30.
l'utilisateur te dit le nombre est plus grand.

faut que tu coupes ton intervalles [30;100] en deux...
donc tu proposes (100+30)/2

note: si jamais tu trouves le nombre, tu ne quittes pas le while mais tu redemandes de saisir dial, c'est ballo...
la vie est une fête :)

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 02 Oct 2012, 20:35

fatal_error a écrit:lorsque tu as nbChoisi qui mettons vaut 30.
l'utilisateur te dit le nombre est plus grand.

faut que tu coupes ton intervalles [30;100] en deux...
donc tu proposes (100+30)/2

note: si jamais tu trouves le nombre, tu ne quittes pas le while mais tu redemandes de saisir dial, c'est ballo...


AH ok, je crois que je comprends un peu mieux comment le tourner.


Par contre pour la seconde partie je suis pas d'accord avec ce que tu dis, dès que tu rentres 0 le programme s'arrête puisqu'il comprend ça comme le nombre a été trouvé.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

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

par fatal_error » 02 Oct 2012, 20:55

ah? c'est quoi l'instruction pour sortir du while?

parce que si dial==0, moi je lis
put("Le nombre a été trouvé en ");
put(nbre_Tentative);

rien qui ressemble a un break
la vie est une fête :)

C.Ret
Membre Relatif
Messages: 497
Enregistré le: 02 Juil 2012, 12:33

par C.Ret » 02 Oct 2012, 20:56

Bonjour,

J'ai un peu de mal à saisir le détail de cet algorithme.

Si je comprends bien le nombre à deviner est compris entre 0 et 100.
J'imagine que c'est un nombre entier ?

Avec 7 proposition, on devrait pouvoir trouver le nombre juste.
En effet, si on coupe l'interval en deux à chaque pas, le nombre d'interval maximal (la résolution maximale) serait de 2^7 = 128, ce qui laisse une marge puisque l'on est entre 1 et 100.

Mais, il faut gérer convenablement les valeurs entières en tenant compte de la parité des intervalles puisque l'on ne peut que proposer des valeurs entières!

En fait l'algorithme à utiliser est une sorte de recherche par dichotomie :
Initialement l'intervalle est [a b] avec a=0 et b=100

On propose alors la valeur médiane, m = INT((a+b)/2)

La réponse est -1, 0 ou +1.

Si la réponse est 0 alors on a trouvé la solution est on sort de la boucle.

Si c'est -1 ou +1, on change l'intervalle de recherche en consèquence, soit [a m[ soit ]m b]
Eh! Oui, contrairement à a ou b, m n'est pas une valeur possible !

Le plus simple est je crois de toujours travailler avec un intervalle fermé [a b].
Donc il faut réduire l'intervalle en utilisant par exemple [a m-1] et [m+1 b] suivant la réponse de l'utilisateur.

Concernant la boucle de recherche, personnellement, je continuerais tant que l'intervalle est plus étendu qu'un singleton. C'est à dire que je boucle tant que a-1) ALORS a := m+1
m := FLOOR((a+b)/2)
FIN_BOUCLE

SI (r0) ALORS AFFICHER "Le nombre secret est " m
SI (i7) ALORS AFFICHER "Mais j'ai trouvé trop tard"

**FIN
[/code]

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 03 Oct 2012, 10:30

fatal_error a écrit:ah? c'est quoi l'instruction pour sortir du while?

parce que si dial==0, moi je lis
put("Le nombre a été trouvé en ");
put(nbre_Tentative);

rien qui ressemble a un break


Exact, tu as raison, j'ai pas fait attention à ça.

Pourtant quand je le compile et que je met 0 dès le début ça stoppe bien le programme....enfin ça le stoppe pas, mais il ne continue pas pour autant, en gros il ne fait plus rien, pourtant comme tu dis il devrait me recommencer la boucle vu la manière dont il a été écrit....
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

C.Ret
Membre Relatif
Messages: 497
Enregistré le: 02 Juil 2012, 12:33

par C.Ret » 03 Oct 2012, 14:29

Il y a autre-chose qui me gène dans le programme proposé, c'est que celui-ci n'indique qu'il a trouvé la solution que si l'utilisateur répond par 0.

Or, il peut arriver qu'il ne reste plus qu'une seule solution possible. Dans ce cas, il n'est pas possible d'indiquer la réponse attendre la réponse de l'utilisateur ?


Petit exemple de dialogue hoome-machine obtenu sur mon système ce matin :
Code: Tout sélectionner
SHARP: "Pensez à un nombre entier entre    0. et 100."
Moi     : "Ok" sans rien dire je pense à 26 et j'appuye sur [ENTER]
SHARP: "Est-ce   50 ?"
Moi     : "C'est moins."
SHARP: "Est-ce   24 ?"
Moi     : "C'est plus."
SHARP: "Est-ce   37 ?"
Moi     : "moins."
SHARP: "Est-ce   30 ?"
Moi     : "-"
SHARP: "Est-ce   27 ?"
Moi     : "Un tout petit peu moins"
SHARP: "Est-ce  25 ?"
Moi     : "Non. C'est pas bon. C'est plus que 25."
SHARP: "Le nombre entier est   26."
SHARP: "J'ai trouvé en    6 coups."
SHARP: "Cette fois c'est moi qui pense à un entier"
Moi     : "Non je pars au boulot." ai-je répondu vexé qu'il ait trouvé aussi facilement!!
SHARP: "OK. Bonne journée".




Remarquons que l'on peut voir cet excercice sous lbiais d'un arbre de recherche.
A chaque neoad de l'arbre la réponse de l'utilisateur indique si l'on continue vers le sous-arbre à gauche (- versvaleur inférieur), on s'arrête ( 0 = arrêt car solution trouvée) ou vers le sous-arbre à droite (+ vers valeur supérieur).
Dans ce cas, il faut effectivement 7 niveaux pour décrire l'ensemble des possibilités (de 0 à 127 inclus au maximum).

Code: Tout sélectionner
   0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31...
----------------------------------------------------------------------------------------...
1:                                                                                      ...
                                                                                        ...
2:                                                                                    31...
                                                        -                               ...
3:                                    15                                                ...
                           -                     +                                      ...
4:               7                                            23                        ...
             -       +                                  -            +                  ...
5:       3                11                      19                      27            ...
       -   +            -    +                  -    +                  -    +          ...
6:   1       5       9         13           17          21          25          29      ...
    - +     - +     - +       -  +         -  +        -  +        -  +       -  +      ...
7: 0   2   4   6   8   10   12    14     16    18    20    22    24    26    28    30   ...



On remarquera alors que tous les nombre pairs (et le zéro) se trouve uniquement sur la dernier niveau. Ce qui peut être un bon test de fin d'un tel algorithme.

Mais aussi suggérer qu'un code demandant à l'utilisateur s'il s'agit d'un nombre pair ou impair permettrait d'être un peu plus astucieux ?


Pour l'instant, nous n'avons à chaque fois que coupé l'intervalle de recherche en deux. L'inconvénient est que l'utilisateur va voir proposer à chaque fois les mêmes séries de propositions. En particulier, l'ordinateur commencera toujours par 49 ou par 50 (selon la façon dont est génrée la parité).

Il y a d'autres stratégies, comme par exemple celles qui coupent aléatoirement l'intervalle de recherche en deux parties non égales, ce qui fait varier les valeurs à chaque fois.

Il y a aussi la méthode qui coupe l'intervalle de recherche en trois parties et dont la question est du type "Le nombre secret est-il avant/dans/après l'intervalle [25 75] ?". L'utilisateur répondant -1/0/+1 selon le cas. Dans ce cas, l'ordinateur peut également vérifier que l'utilisateur n'a pas menti (ou ne s'est pas trompé).

Et d'autres jeux possibles, qui ne correspondent plus du tout à l'excercice demandé !

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 03 Oct 2012, 15:19

Ta mainère de réfléchir là dessus est loin d'être bête, malgrès tout, pour mon exercice je suis obligé de procéder comme je l'ai dis plus haut, je ne cherche donc pas à faire un programme efficace mais un programme qui réponde aux exigences pour pas me prendre un commentaire salé sur la façon dont j'ai fait l'algorithme =)


La méthode la plus probable me semble être celle de couper les intervalles en faisant la moyenne à chaque fois.

50
... 1
75
...-1
63



Etc etc


Il y a autre-chose qui me gène dans le programme proposé, c'est que celui-ci n'indique qu'il a trouvé la solution que si l'utilisateur répond par 0.


Je sais bien, et ça me gène aussi, pour tout te dire j'avais commencer à faire une boucle répétant la demande de réponse de l'utilisateur tant que celui ci n'entrait pas 0 -1 ou 1 mais le prof m'a dit de l'enlever ici ça ne sert à rien puisque l'on teste soit même le programme et on suppose qu'on sait comment il marche vu que nous l'avons écrit nous même...

Enfin bref tout ça pour dire que je suis d'accord mais que je ne pourrais pas raisonner comme ça...du moins dans un exercice, si je devais faire ce programme pour moi, je l'aurais fais évidemment...
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

C.Ret
Membre Relatif
Messages: 497
Enregistré le: 02 Juil 2012, 12:33

par C.Ret » 04 Oct 2012, 07:44

Pas de souci, chercher à répondre le plus justement aux spécification de l'excercice est effectivement la priorité n°1.

Ce qui n'enpêche pas de réflèchir transversallement et envisager d'autres solutions ou algorithmes alternatifs.
Même si en fin de compte on choisera celui qui répond et colle au mieux à l'excercice. L'avantage et que l'on le fait en connaissance de cause. Ce qui donne une avance certaine pour la suite :
- soit pour les excercice suivants qui seront certainemetn plus complexes,
- soit pour la suite, lorsque l'on retrouvera une problèmatique similaire, on se rappèlera des l'analyses effectuées, ce qui permettra peut-être de trouver une solution plus efficace ou inovante ...


Comme c'est un excercice, et que donc le travail produit sera évalué (par le prof.) il faut veiller cependant à bien respecter certains points essentiels :

- structurer à outrance son code : en effet c'est en excercice qui est là pour voir si l'on maitrise bien l'imbrication des boucles, si l'on sait structurer son programme;

Quand je corrige le TP de mes étudiant, je pars du principe qu'un code bien structuré indique une bonne analyse et un esprit clair qui a bien compris le problème.

- commenter à outrance : cela va de pair avec la structure du code. Ce qui est bien compris s'explique bien; ce qui est mal compris, négligé ou oublié ne donne lieu à aucune explication.

- ne pas chercher à optimiser : pour un excercice de ce type, c'est l'algorithme qu'il faut optimiser, pas le code. Donc, on fait des entrée-sortie claire et bien détaillée, les structure sont mise en évidence. On peut même utiliser des variables booléennes pour simplifier la compréhension des test, implication, imbrications ou sortie boucles

- nommer les procèdures, fonctions et variables de façon très explicite : privilégier les noms longs, rapellé dans le nom le type de donnée (nombre, chaine de caractère, booléen, ...)
Toujours tiliser des noms diffèrent pour des objets diffèrents, même s'ils contiennent ou produise la même information.
Par exemple, ne pas utiliser une variable qui porte le même nom qu'une fonction. Même si les interpréter actuels le permettent, c'est source de confusion et rend la lecture du code ambigüe si ce n'ait pas traitre. L'informatique a mis 150 ans à pouvoir manipuler des objets avec des noms indépendant du hardware ou de soft; il faut profiter de la liberté actuelle pour éviter les contrainte qui ont cassé les pieds aux pioniers.



- avoir un code qui fonctionne : notons que je mets cette contrainte en dernier, comme c'est un excercice d'apprentissage, il peut y avoir des cas où l'algorithme ou son implémentation souffre que quelque imperfaction.
Mais, si les points précèdents sont bien respectés, il sera facile de trouver l'erreur et de la corrigé.
Je ne pénalise les programme disfonctionnant que si le code est illisible, mal commenté, incompréhensible.



Comme tu opte pour la solution dichitomique et prennant à chaque étape la moitier de l'intervalle tu as deux solutions possibles pour la boucle principale :

- La boucle principale modifie (on dit maintient) l'intervalle de recherche en fonction des réponses de l'utilisateur; c'est ce que fait le code que tu as posté. Cependant, tel qu'il est (mal)structuré et organisé, on ne voit pas à sa lecture.


- La boucle principale parcours un arbre de recherche: c'est aussi une façon de faire, car les valeurs seront toujours les même puisque l'intervalle de départ est le même à chaque fois.
Dans ce cas, le code doit mettre en évidence cet arbre.


Dans tous les cas, le code doit être structuré, c'est à dire que l'on doit bien voir la pahse d'initialisation (ce qui est le cas), la boucle de recherche et la phase finale où l'on donne le nombre secret, le nombre de coups et l'éventuelle indication que l'on a pas trouvé.

Dans l'état actuel, la pahse finale est mélée à la boucle ce qui déstructure le code, l'alourdi et si c'était moi qui note ou le passe en revu occasionnerait une sanction.
Ce type d'excercice est souvent évalué sous trois aspect : Analyse - Structuration - Implémentation
Quand je fais un audit il y a en plus Documentation.


La clause de sortie de la boucle doit également être mise en évidence. S'il le faut ne pas hésiter à mettre un commentaire qui indique le mécanisme.

Tel qu'est fait le code actuel, on ne sort de la boucle de recherche que si l'on trouve. La réponse R==0 de l'utilisateur devient donc naturellement une bonne clause de sortie.
Il y a plusieurs façon de faire, quelque soit la solution utilisée, elle doit bien être expliquée et mise en évidence dans le code.


Code: Tout sélectionner
with entrees_sorties;
use entrees_sorties;
procedure Devinette is

;-- Initialisation
v_Min         :Integer:=  0;                -- Valeur minimale intervalle de recherche
v_Max         :Integer:=100;                -- Valeur maximale intervalle de recherche
Dial          :Integer;=  2;                -- Réponse de l'utilisateur (-1,0,+1 et 2=initialisation)
nbre_Tentative:Integer:=  0;                -- Compteur de tentative/propositions
nbre_Choisi   :Integer:= (v_Max + v_Min)/2; --Nombre proposé par la machine

;-- Affichage règle du jeu
put("Pensez à un nombre entier entre ");put(v_Min);put(" et ");put(v_Max);putln(".");

;-- Boucle de recherche
begin
  ;-- Boucle tant que moins de 7 tentatives et réponse utilisateur differente de 0
  ;-- d'où l'importance de l'initialisation de Dial

  While (nbre_Tentative /= 7) && (Dial /= 0) loop
    nbre_Tentative := nbre_Tentative + 1;
    put(nbre_Choisi);                       -- Affiche proposition

    get(Dial);                              -- Obtient réponse utilisateur -1 moins, +1 plus 0 trouvé

    nbre_Choisi := nbre_Choisi + Dial*(nbre_Choisi)/2;
  End loop;

;-- Fin de programme - Affichages des résultats
  if (Dial==0) then
     put("Le nombre a été trouvé en "); putln(nbre_Tentative);
  end if
  if (nbre_Tentative>7) then
     putln("Les 7 tentatives sont écoulées.");
  end if;

end Devinette;

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

par fatal_error » 04 Oct 2012, 10:28

Personnellement je te fustigerais pour ces exigences!!
rapellé dans le nom le type de donnée (nombre, chaine de caractère, booléen, ...)

non, l'utilisateur n'est pas stupide, si on a besoin de differencier les variables, c'est que la fonction est trop longue et qu'il y a trop de variables...

privilégier les noms longs

non une fonction ou variable trop longue pertube. Dans le cas d'une variable, a la rigueur, dans le cas dune fonction, ca denote une violation du SRP.

avoir un code qui fonctionne

ca devrait etre la premiere chose a tester. Un code qui ne fonctionne pas est un code qui n'a pas ete teste et qui denote donc un coding a l'arrache et une incomprehension de ce qu on a ecrit.
je suis d'accord qu'un code mal ecrit est penalisable, mais un code mal ecrit ne vaut pas plus qu'un code bien ecrit si rien n'est presentable.

les commentaires du style Boucle nombre de tenatives, on s'en branle allegrement, ca fait parti du contrat et n'a rien a foutre en plein milieu des lignes de code.


Bon sinon un point plus discutable est celui-ci :voir la pahse d'initialisation
precise bien ton langage, parce que si tu fais ca en C++, tu merites un viol par exemple.
la vie est une fête :)

C.Ret
Membre Relatif
Messages: 497
Enregistré le: 02 Juil 2012, 12:33

par C.Ret » 04 Oct 2012, 11:16

fatal_error a écrit:non, l'utilisateur n'est pas stupide, si on a besoin de differencier les variables, c'est que la fonction est trop longue et qu'il y a trop de variables...


Je suis d'accord avec le principe. En fait, je suis même tout à fait d'accord avec la totalité des idée qui sont donnée ici.
Malheureusement, dans le domaine où j'ai sévi, les exigence de ce type n'émanée pas de l'utilisateur mais des régles imposé par le système qualité-contrôle et les audits de revue de codes.

C'est terrible, des spécialites de la programmation ont besion d'un minimum de commentaire et de précision, les noms bien choisi et une sorte de tradition permet d'échanger des listing bien fait et compréhensible par toute l'équipe.
Par contre, ces listing ne sont pas valables et seront rejeté par des responsables qualité qui bien souvent ne sont pas (ou plus) des programmeurs.



fatal_error a écrit:non une fonction ou variable trop longue pertube. Dans le cas d'une variable, a la rigueur, dans le cas dune fonction, ca denote une violation du SRP.


Oui, là aussi, il faut trouver l'équilibre entre des noms trop courts sans signification (hors l'habitude ou la "tradition") et des noms trop long (source d'erreur). L'efficacité de l'interprétereur ou la taille du fichier n'entrant pas en considération.
En pratique, les cahers des charges, spécifications mais surtout la norme impose le format des noms et surtout cela doit correspondre exactement aux documents externes (spécification de besoin, plan d'audit, etc...)



fatal_error a écrit:ca devrait etre la premiere chose a tester. Un code qui ne fonctionne pas

Ah! Si seulement tous les programmes qui ne fonctionnent pas pouvaient être rejetés très tôt dans le cycle de développement et surtout lors des validations et intégration.

Ma remarque concernant un code qui ne fonctionne pas qui n'est pas sanctionné, ne concerne que le cas d'excercices et d'apprentissages. Bien évidemment par la suite (évaluations) et surtout réalisations professionelles c'est une autre histoire.

fatal_error a écrit:je suis d'accord qu'un code mal ecrit est penalisable, mais un code mal ecrit ne vaut pas plus qu'un code bien ecrit si rien n'est presentable.


Interessant, je vais méditer cela à la prochaine séance de TP que j'aurais à animer.


fatal_error a écrit:es commentaires du style Boucle nombre de tenatives, on s'en branle allegrement, ca fait parti du contrat et n'a rien a foutre en plein milieu des lignes de code.


Ce n'est pas le point de vue de tout le monde. Ce qui me casse les pieds aussi c'est que les normes en vigueur dans les industries que j'ai pratiqué imposé ce type de commentaire.

Mais, je suis d'accord, la pertinence de mes commentaires sont discutables, c'est le problème avec un excercice, on ne répond pas strictement à un cahier des charge où à une spécification de besoin précise.
Dans la pratique, il est plus facile de voir quel commentaire insérer, ils doivent en tout point suivre la description de la démarche rédigée dans la STBL.



fatal_error a écrit:Bon sinon un point plus discutable est celui-ci :voir la pahse d'initialisation
precise bien ton langage, parce que si tu fais ca en C++, tu merites un viol par exemple.



Effectivement, il y a des languages où déclaration et initialisation doivent être parfaitement disjoint.
Et d'autres contraintes lié à l'implémentation ou à l'interpréter, ou à tout un tas d'autres containtes provenant de l'environnment de développement...

Dommage, qu'il n'existe pas un pseudo-language de programmation universel, réaliser ce type d'excercice en deux temps ; établir l'algorithme indépendemment d'écrire le programme dans un language et un environnemetn donné peut être très enrichissant.
Surtotu quand on fini par se rendre compte que le "meilleur" algorithme peut dépendre du language, de l'environnement ou de la machine destinataire !


Enfin, la critique est utile, elle peut être consructive.

Comment envisagerais-tu de rédiger ce code (en ADA ou en C++) avec commentaire, noms de varaible etc ... ?

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

par fatal_error » 04 Oct 2012, 12:48

En pratique, les cahers des charges, spécifications mais surtout la norme impose le format des noms et surtout cela doit correspondre exactement aux documents externes (spécification de besoin, plan d'audit, etc...)

oui, c'est pas une raison pour imposer du typage sur le nom de la variable. Ca va en plus a l'encontre de la prog generique.

Ma remarque concernant un code qui ne fonctionne pas qui n'est pas sanctionné, ne concerne que le cas d'excercices et d'apprentissages.

oui, moi aussi.

Sinon qqch comme ca
Code: Tout sélectionner
#include
#define NB_AUTH_TRIES 7
/*
    user is asked to enter 0, -1 or 1
    0 means number is found
    1 means number to find is greater than actual guess
    -1 means number to find is less than actual guess
    note: any other value lead to undefined behaviour
   
    nbTries is max of tries findNumber can do
    Description
        Try a guess for nbTries times
            - output actual guess
            - ask the user to enter 0, 1 or -1
            -> if user entered 0, returns true
            - otherwise try another guess
    returns value:
      true if number has been correctly guessed
      false if not
*/
bool findNumber(size_t nbTries, size_t min, size_t max, int &numberToFind){
    for(size_t i=0; i>userInstruction;
        if(userInstruction==0){
            numberToFind=nbGuessed;
            return true;
        }else if(userInstruction==1){
            min=nbGuessed;
        }else if(userInstruction==-1){
            max=nbGuessed;
        }
        nbGuessed=(min+max)/2;
    }
    return false;
}
int main(){
    int numberToFind;
    if(findNumber(NB_AUTH_TRIES,0,100, numberToFind)){
        std::cout<<"guessed it is "<<numberToFind<<std::endl;
    }else{
        std::cout<<"you owned me"<<std::endl;
        char ffff;
        delete &ffff;
    }
    return 0;
}






edit: je ne cite evidemment que les points ou je suis pas trs d'accord, quand je cite pas c'est que chui ok (ou que j'abandonne, mais c'est pas le cas ici :lol3: )
la vie est une fête :)

C.Ret
Membre Relatif
Messages: 497
Enregistré le: 02 Juil 2012, 12:33

par C.Ret » 04 Oct 2012, 17:17

OK, c'est pas mal.

J'aime bien les commentaires qui rapellent ce que ça fait et surtout les valeurs retournées. C'est effectivement très important surtout en C où il y constamment des échanges entre routines ou l'environnement appellant et appelé(e).

Et effectiveùment, mes commentaires semblent un peu léger par rapport au séieux de ces derniers.

Bon, j'espère que nos échanges vont donner des idées et aider Rockleader à ce faire une idée de la spécialité vers laquelle il se dirige. :happy2:

LeJeu
Membre Irrationnel
Messages: 1142
Enregistré le: 24 Jan 2010, 21:52

par LeJeu » 04 Oct 2012, 17:45

fatal_error a écrit:
std::cout<<"you owned me"<<std::endl;
char ffff;
delete &ffff;


Je connaissais l'ordinateur qui devient fou ( HAL dans 2001 Odyssée de l'espace) parce qu'il était obligé de mentir
Mais pas encore le programme qui se suicide parce qu'il ne trouvre pas la soluce

"Le prof d'info m'a tuer" aurait eu aussi beaucoup d'allure


Rockleader a écrit:Ta mainère de réfléchir là dessus est loin d'être bête, malgrès tout, pour mon exercice je suis obligé de procéder comme je l'ai dis plus haut, je ne cherche donc pas à faire un programme efficace mais un programme qui réponde aux exigences pour pas me prendre un commentaire salé sur la façon dont j'ai fait l'algorithme =)

Fatal error te montre que tu trompes particulièrement sur ce coup là : on peut faire un programme qui répond aux exigences et efficace !!!

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 04 Oct 2012, 18:16

Aujourd'hui grosse déception en cours d'info, on a un programme à faire, dedans il y avait des puissances à mettre...j'utilise donc le " ** " et là le prof me dis que ça ne fera pas de puissance...

Il me soutenait que le seul code pour faire une puissance c'était le chapeau ^ mais que ça ne marchait pas en ada...il a fallu que je lui fasse un programme de test pour que le prof me croit sur parole que la puissance se faisait bien ** ... autrement il nous aurait fait écrire x*x*x....un peu limité, surtout si la puissance avait été dans le genre de 2000...


Bref tout ça pour dire que, on a beau être camé en programmation, on peut pas connaître tout de tout les langages. (bizarre qu'il ne l'est pas su quand même parce qu'on fait la puissance de la même manière en python et même en c si mes souvenirs sont bons...)



Donc un langage vers lequel m'orienter, pour le moment je peux pas vous dire vu que en cours on nous fais faire que de l'ada.


Mais une chose est sur, j'ai pour projet irréaliste et téméraire de lancer la création d'un mmorpg...ou pour être plus préscis, j'ai l'idée d'un projet =)
Donc personnellement, je vais surtout chercher à acquérir des langages qui me permettront d'arriver à réaliser ce rêve au sein d'une équipe. D'après mes humbles connaissances il me semble que pour ce genre de choses c'est le java le plus plébiscité...





J'avais une question, est il possible de faire tourner un programme ou dirais je plutot un logiciel qui serait composé d'une sous multitude de programme venant de différent langages.


Attention je dis pas mélanger les langages dans un même programme mais comment dire créer un logiciel dont les applications aurait été réalisés avec des langages différents.

Je suppose que c'est possible, mais je vois pas encore très bien comment faire.


Voilà, avec tout ça il n'y a plus trop de rapport avec le sujet de départ mais c'est tellement intéressant -:)
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

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

par fatal_error » 04 Oct 2012, 19:02

concernant la puissance, faut pas trop prendre ton prof pour un con. Si tu lui montres que 2**3 ca fait 8 et 3**4 81, il va truster. L'idée était plutot probablement de vous faire coder la fonction puissance, et de te mettre au défi de lui montrer que ** fait bien la même chose...

concernant le langage bien usé
1 ) le java c'est de la merde.
2 ) afin dêtre un peu plus objectif, le java c'est pour les débutants
3 ) afin d'être un peu plus objectif, c'est pas fait pour les applications qui nécessitent de tourner vite. Certains diront oui mais bientot yaura des grosses machines, mais c'est un peu nulachier comme argument, quand t'as des langages aussi expressifs et plus efficaces.
4 ) java c'est suffisant pour un jeu en 2D, par exemple, en 3D, ca devient osé.
5 ) c++, c'est bien pour les jeux. html5 si tu te les joue dans le navigateur.
note: oui java ya du bon aussi, mais quand je les vois qui débarquent pour faire du c++,... :marteau:

Concernant la communication avec des applications issues chacune de différent langage, regarde du côté des IPC (inter process communication)
la vie est une fête :)

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 04 Oct 2012, 19:11

Ok dac je vais aller voir ça.


Donc, au final le C reste la référence, et le html c'est toujours utile à maitriser.

Quand à l'histoire de la puissance, c'était pas du tout le but, c'est juste que j'ai voulu en utiliser une à un endroit pour pas écrire un gros nombre. Mais bon, il faisait peut être exprès car il voulait pas que les autres le sachent, peut être qu'ils veulent pas qu'on utilise la puissance tant qu'il nous ont pas appris à l'utiliser...
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

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

par fatal_error » 04 Oct 2012, 19:15

Donc, au final le C reste la référence

je ne dirai ni oui ni non.
certains oui car bonnes bases, d'autre non car mauvaise habitudes (risque de ne pas faire de la POO), d'autres syntaxe trop complexe pour débuter, d'autres au contraire permettre de bien comprendre...

bref les avis sont mitigés et les arguments vastes. Si tu supportes d'apprendre le C, je crois que t'es du bon côté.
la vie est une fête :)

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 04 Oct 2012, 19:36

fatal_error a écrit:je ne dirai ni oui ni non.
certains oui car bonnes bases, d'autre non car mauvaise habitudes (risque de ne pas faire de la POO), d'autres syntaxe trop complexe pour débuter, d'autres au contraire permettre de bien comprendre...

bref les avis sont mitigés et les arguments vastes. Si tu supportes d'apprendre le C, je crois que t'es du bon côté.



Je me rappelle que j'avais commencé à l'apprendre sur le site du zéro il y a deux trois ans..donc j'étais en début seconde. J'ai fais tous les chapitres jusqu'au pointeurs où j'ai décroché.

Je me rappelle être venu ici à peu près à la même époque, c'est alors que sve@r avait essayé de m'expliquer ça, mais j'avais pas encore compris, il m'avait dis toutefois d'après mes souvenirs qu'une fois qu'on a compris l'utilité des pointeurs, on a fait le plus dur en C.

Mais bon, c'était il y a quelques temps, et même si je n'avais pas compris à l'époque et que j'avais laissé tomber, ça ne m'a pas dégoûté pour autant, je me suis simplement dis que je comprendrais peut être un peu mieux un fois que j'aurais un vrai cours là dessus.


Tout ça pour dire que le C me dérange pas plus que ça du moins pour le peu que j'ai vu.






(Bon, je sais le site du zero c'est pas le top de la référence, mais la partie sur le C faite par mathéo est quand même pas trop mal expliqué, du moins j'avais trouvé ça pas mal pour débuter).



Après je sais pas, c'est peut être le fait d'avoir commencé par faire de la prog en C qui fait que ça me parait pas si dur que ça...
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

LeJeu
Membre Irrationnel
Messages: 1142
Enregistré le: 24 Jan 2010, 21:52

par LeJeu » 04 Oct 2012, 19:39

fatal_error a écrit:je ne dirai ni oui ni non.
.


Salut, je vous lis avec intérêt.

Rockleader, je miserais plus sur l'algo que sur le langage, c'est le nerf de la guerre, le programme de Fatal error ci-dessus est un modèle du genre, quand je lis , je ne vois que l'algo , en fait ce que C-ret proposais au départ.

Bien sûr ensuite le stockage, le traitement des données est plus ou moins efficient, liste chainée à la main ? objet liste ? il faut l'avoir fait à la main une fois pour voir ce qui est caché derrière une ligne de code .... et mine de rien le langage cache un peu tout ça...

En tous cas il n'y a pas d'impasse : si tu domines dans un langage , "tu es du bon côté" comme dis Fatal Error..

Apres pour le mmorpg... tu mets la barre un peu haut

PS1 - le pb de mixer les langages est bien sûr et toujours la représentation des données, du VB et du C ensemble , ca se fait mais faut dominer 'l’interfaçage'...tu arrives vite a devoir causer en 'ASCII' car le binaire de chaque langage se trouve vite incompatible et comme dit Fatal Error à un moment ca devient plus simple de faire causer des process "à distance"

PS2 - sinon Fatal error baratine grave ; le comportement de son programme n'est absument pas indéterminé si on répond autre que 0 1 ou -1, disons plutôt qu'il ne donne pas le résultat intuitivement attendu ...

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 2 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