Recherche d'un nombre

Discutez d'informatique ici !
Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 08 Oct 2012, 13:25

Bonjour,
Je suis ce sujet avec grand intérêt, et je tenais juste à réaffirmer l'importance considérable de la notion de Boole en informatique. Que l'on appelle ça TRUE ou FALSE, T ou F, 1 ou 0, ça ne change rien, d'ailleurs en C, le type BOOL n'existe pas en tant que type, mais on s'en fiche.
Donc, je conseille vivement à RockLeader de bosser sérieusement l'algèbre de Boole.
D'ailleurs, une machine ne connait que l'algèbre de Boole et ne sait faire que 1 + 1 = 10, puisque la notation binaire en est une application directe.
Mais il faut savoir aussi distinguer cela de
1 || 1 = 1
1 || 0 = 1
1 && 1 = 1
1 && 0 = 0
|| veut dire OU, OR, +, 'parallèle'
&& veut dire ET, AND, [le signe multiplié], 'série'
Les signes | et & peuvent aussi être non-doublés, avec une signification différente : comparaison bit à bit.

Pour éviter toute incompréhension, on peut écrire "1 + 1 = 10" et "1 + 1 = 1" les deux sont bons, mais n'ont pas le même sens, le premier est une addition en base 2 (binaire) le second est un OU logique ou le résultat ne peut être que VRAI ou FAUX (VRAI dans le cas présent).

Il n'est naturellement pas possible d'expliquer tout cela en 5 lignes, mais il me parait indispensable de dominer parfaitement ces notions.



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

par C.Ret » 08 Oct 2012, 17:21

Très juste, excellent consiel, un futur informaticien doit impérativement connaitre et maitriser ces notions.

De la même façon qu'il doit savoir faire additions, soustractions, multiplication et peut-être aussi division dans les base numériques décimales, hexadécimales, octales et binaires; il est tout aussi important qu'il sache de la même façon faire les opération de l'arithmétique logique AND, OR, NOT ou XOR. Sans compter que les opération de maniuplation et translation de bits peuvent aussi rendre service et au moins comprendre le principe d'un (micro)processeur.

Image

De la mêm façon, il doit avoir quelques notions sur command l'on fait ces oération arithmètique et logiques à l'aide des "portes logiques" ou au sein de la jonction "P-N-P" d'un transitor. Car c'est bien là la bse de la révolution technologique historique qui a donné naissance aux "nouvelles technilogies".


Mais sans oublier que l'algorithmique est une science bien plus ancienne que ces technologies, qu'elle fête son troisième millénaire !

L'algorithme ci-dessous a été expliqué par Euclide 300 ans av. J.C. dans ses Eléments
Image
Evidemment Euclide ne l'écrivait pas sous cette forme moderne !


P.S. Dlzlogic dans ton énumération des valeurs booléennes, tu as oublié V et F ainsi que et

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 08 Oct 2012, 17:56

P.S. Dlzlogic dans ton énumération des valeurs booléennes, tu as oublié V et F ainsi que \top et \perp
Tout à fait exact, par contre, pour les 2 derniers, je connaissais pas.
Petit a parte à propos de "GOTO". Cette instruction, habituelle en basic, a été très décriée en particulier pas les programmeurs en C. Cependant elle existe toujours, et les compilateurs évolués testent si elles ne violent pas la logique.
J'ai faits des essais comparatifs (C/C++) entre une série d'instruction if ... else if ... etc. et une séquence comparable (identique en logique) en utilisant switch (...) case: ... Au moins à partir d'un certain nombre (4 ou 5) le switch est incontestablement plus rapide. La seule explication que j'ai trouvée est que le "case:" est en fait une étiquette et le switch() un "goto calculé", donc codé à la compile. Ce type de goto était très utilisé en Fortran (jusqu'au 77, après je sais pas).

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

par Rockleader » 08 Oct 2012, 19:46

fatal_error a écrit:ca n'a rien à voir.

savoir comment ca marche, ca n'a rien à voir avec savoir comment ca s'utilise.

Est-ce que tu sais si tu as le droit d'assigner O à une variable booléenne en ADA?
si tu le sais pas, essaies d'écrire la syntaxe, ou recherche sur le net.

Concernant le problème de compréhension des booléens, prends toi un tutoriel sur l'algebre de boole. Par exemple le sdz



Bon, je crois que je comprend un peu mieux, au final à chaque fois que l'on parle de booléen, on parle de test.


Si j'ai compris ce que veut dire le sdz, si la condition A=B est vérifié, alors on a un booléen TRUE. (que l'on peut coder après plus ou moins comme on veut)



Par contre ce que je comprends pas, c'est en quoi on exprime au niveau du code un booléen par une condition vérifié ou non comme semble le dire le sdz.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 08 Oct 2012, 20:42

Il est vrai que les booléens servent souvent en matière de test, mais dans le "boite noire" montées par C.Ret, c'est le fonctionnement élémentaire d'un ordinateur.
Je pense qu'avant d'essayer de faire des conclusions de compréhension un peu hâtive, il faut bien assimiler un certain nombre de notions de l'algèbre de Boole.
La caractéristique d'un Booléen est qu'il ne comporte que 2 états, Vrai ou Faux. Comme un interrupteur électrique, allumé ou éteint.

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

par C.Ret » 08 Oct 2012, 22:07

Rockleader a écrit:Par contre ce que je comprends pas, c'est en quoi on exprime au niveau du code un booléen par une condition vérifié ou non comme semble le dire le sdz.


Il y a la logique de Boole d'une part qui est fondatrice des techniques numériques et processeurs qui, comme l'expliqué Dlzlogic, ne savent que faire des opérations logiques sur les bits (grâce aux "portes logiques" qui sont assemblé en additionneurs et tout un tas d'aute opérateur élémetaires dans les microprocesseurs et autre milles-pattes comme celui que j'ai montré dans mon illustration.


Par contre, dans les programmes, on comprends mieux l'usage des Variables Booléennes quand on comprend les circonstances où on les utilise :

Supposons que l'on écrive un programme dans lesquel on est tout le temps en train de vérifier la même chose; utiliser une variable booléenne permet de ne faire qu'une seule fois le test et de mémoriser le résultat.

C'est le même avantage que de mettre la valeur d'un nombre dans une variable; on ne fait le calcul qu'une seule fois et on le mémorise pour l'utiliser ailleurs dans le programme.

Une variable booléenne fonctionne exactement de la même manière, sauf qu'elle n'a pas de "valeur", uniquement deux états, l'un Vrai et l'autre Faux.

On peut donc grandement simplifier l'écriture du programme:

Per exemple:
Code: Tout sélectionner
put("Entrez trois entiers")
get(x:Integer);
get(y:Integer);
get(z:Integer);

TousDiff:Boolean := (x  y) AND (xz) AND (y z );
BienTrie:Boolean:=  ((x y) AND (xz) AND (y z ) ) ,  utiliser astucieusement les bonnes varaibles booléennes permet de faire des choses plus compliquée ou vérifier le bon fonctionnement de son programme,...

On peut aussi, come je l'ai fait dans le programme des nombres premiers, utiliser un tableau de valeur booléennes (pour marqué les nombres élimié par le cribble)

On au contraire utiliser une unique varaible booléenne dans une boucle pour obtenir un résult (booléen) à partir d'un tableau de données :

[code]
ARRAY   Tab OF Integer RANGE 1..100 ;
...
TousPos:Boolean := True;
...
LOOP
   ...
   IF Tab(i) <= 0 THEN b := False
   ...
END LOOP
IF TousPos THEN PUT ("Tous les éléments de TAB sont strictement positifs")


Dans ce cas, utiliser une variable booléenne est un des moyens pour utiliser un IF .. THEN qui s'applique à une collection d'objets (ici les élément d'un tableau).
Il y a d'utre façon, on peut aussi créer une fonction booléenne, c'est à dire une fonction qui renvoit une valeur booléenne.



Est-ce plus clair ?

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

par Rockleader » 10 Oct 2012, 10:36

Est-ce plus clair ?


Oui merci, je ne crois pas avoir encore tout compris, mais c'est un peu moins flou.



J'ai encore une autre question, totalement sans rapport, qui m'est venu à l'sprit après mon cours d'aujourd'hui.

Je réalisais un programme qui avait besoin à moment donné de calculer une racine carré, comme je ne connaissais pas de fonction prédéfinies pour la calculer, j'ai décidé d'utiliser la puissance 1/2.

Seulement mon prof est venu nous dire que les puissance ne pouvait pas prendre des flottants comme 1/2, mais qu'il y avait bien la fonction sqrt.


D'où ma question, si la puissance 1/2 ne marche pas, comment le programmeur qui a réalisé la fonction square root, sqrt pour les intimes a t'il réussi à définir la racine carré autrement que par la puissance... :hein:
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 10 Oct 2012, 11:19

Rockleader a écrit:Oui merci, je ne crois pas avoir encore tout compris, mais c'est un peu moins flou.



J'ai encore une autre question, totalement sans rapport, qui m'est venu à l'sprit après mon cours d'aujourd'hui.

Je réalisais un programme qui avait besoin à moment donné de calculer une racine carré, comme je ne connaissais pas de fonction prédéfinies pour la calculer, j'ai décidé d'utiliser la puissance 1/2.

Seulement mon prof est venu nous dire que les puissance ne pouvait pas prendre des flottants comme 1/2, mais qu'il y avait bien la fonction sqrt.


D'où ma question, si la puissance 1/2 ne marche pas, comment le programmeur qui a réalisé la fonction square root, sqrt pour les intimes a t'il réussi à définir la racine carré autrement que par la puissance... :hein:

Bonjour,
Pour ce qui est du C/C++, ll ne me viendrait pas à l'esprit de faire A² autrement que A*A.
Pour le reste, la fonction sqrt est très connue, pas seulement des intimes pour les puissances, il y a pow() qui admet (et même attend) du flottant, exp() etc.
La fonction est facile et très amusante à développer avec les opérations élémentaires (if, +, *, /).
Je suppose que ça devrait faire l'objet d'un exercice prochain.

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

par Rockleader » 13 Oct 2012, 20:19

Ayant un peu de temps libre j'essaie d'appliquer un booléen dans un de mes programmes de tp, mais je rencontre quelques soucis au niveau de ma boucle.

Disont que c'est surtout au niveau de l'opérateur logique.


En fait, j'aimerais que la boucle continue tant que le compteur n'est pas arrivé jusqu'au bout, mais qu'elle s'arrête dès que mon booléen prend la valeur que je veux.


Voici ce que j'ai fais pour l'instant:

Code: Tout sélectionner
with entrees_sorties; use entrees_sorties;
procedure appartient is
   e, n, cpt, nbLu : Integer;
   trouve : Boolean;
begin -- indique si un entier e se trouve parmi n entiers lus
   put("Quel element doit-on chercher? ");
   get(e);
   put("Nombre d'entiers a traiter? ");
   get(n);
   cpt := 0;
   trouve := TRUE;
   while ((cpt < n) or not trouve) loop
      put("Prochain entier a traiter? ");
      get(nbLu);
      cpt := cpt + 1;
      trouve := (nbLu = e);
      put("Compteur =");put(cpt);new_line;
      put(trouve);
      new_line;
   end loop;
   if trouve then put("trouve");
   else put("pas trouve");
   end if;
end appartient;



Ici avec un "ou", la boucle ne s'arrête pas puisque la condition sur le compteur reste vrai. Un "et" ne marcherait pas non plus, car trouve vaudrait true au début et non false, par conséquent il n'entre pas dans la boucle...


Du coup je sais pas trop comment faire...
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 » 13 Oct 2012, 20:31

tu veux faire ta boucle tant que le compteur n'est pas atteint ET que tu n'as rien trouvé.

Tu n'as qu'à initialiser ta variable trouve correctement.
la vie est une fête :)

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

par Rockleader » 13 Oct 2012, 20:41

fatal_error a écrit:tu veux faire ta boucle tant que le compteur n'est pas atteint ET que tu n'as rien trouvé.

Tu n'as qu'à initialiser ta variable trouve correctement.



J'ai initialisé trouve avec false, et dans la condition j'ai mis un ET.

C'est bon ça marche, mais je comprends pas pourquoi =)

EN effet puisque je dis

tant que

compteur < une valeur (ok) ET not trouve (not false ce qui veut dire true non ?) Or trouve à ce moment là vaut false... :mur: donc pourquoi ça boucle...

J'ai surement pas compris un truc, mais au moins je vais le comprendre avec cet exo.
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 » 13 Oct 2012, 20:57

trouve vaut false,
not trouve vaut true
compteurcompteur true ET true <=> true
tu boucles
la vie est une fête :)

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

par Rockleader » 13 Oct 2012, 21:11

Autrement dit, on pourrait dire que l'on boucle tant que "c'est vrai que c'est faux :hum: ?"
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 » 13 Oct 2012, 21:17

"c'est vrai que c'est faux ?"

tu te poses des questions métaphysiques mais je suis quand même curieux du raisonnement avec lequel tu es parvenu à poser cette question.

not false vaut true
not true vaut false
la vie est une fête :)

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

par Rockleader » 13 Oct 2012, 21:28

fatal_error a écrit:tu te poses des questions métaphysiques mais je suis quand même curieux du raisonnement avec lequel tu es parvenu à poser cette question.

not false vaut true
not true vaut false



Ben dans mon algo, puisque trouve vaut false, not trouve vaut true.

Or trouve c'est nbLu = e. donc not trouve c'est nbLu non égal à e.

Donc la boucle se répète tant qu'il est vrai que la condition nbLu = e n'est pas bonne.

Je sais pas si je m'exprime bien, enfin je pense avoir compris et c'est bien là l'essentiel.
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 » 13 Oct 2012, 21:39

ouais enfin bon de là à dire
on boucle tant que "c'est vrai que c'est faux ?"

...

si t'as compris c'est bon.
si t'as pas compris c'est pas avec ce genre de phrases mystiques que tu vas pouvoir avancer mais avec les raisonnements comme tu viens de le faire.

si tu veux tester que t'as bien saisi, essaies de te debrouiller avec une condition OU à la place de ET :)
la vie est une fête :)

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

par Rockleader » 13 Oct 2012, 21:53

Oui, mais si je mets un "ou", le cas où mon compteur sera inférieur au nombre de tentative sera toujours vraie même si le nombre est trouvé. Donc au final la boucle ne s'arrêtera pas, ce qui s'est produit avec le programme que j'ai testé plus haut en fait.
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 » 13 Oct 2012, 22:12

c'est pe un peu plus subtile que remplacer stupidement et par ou.
Joues avec les négations
la vie est une fête :)

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

par Rockleader » 13 Oct 2012, 22:45

fatal_error a écrit:c'est pe un peu plus subtile que remplacer stupidement et par ou.
Joues avec les négations



Même sans parler programmation, j'arrive pas à concevoir au niveau de l'algorithme en pseudo code comment on pourrait faire passer ça avec un ou. EN jouant avec les négations comme tu dis, pour que la boucle s'arrête il faudrait que les deux conditions soient fausses. Or celle sur le compteur est toujours vrais.




D'ailleurs en parlant de ça, comme je suis dans ma période question sur les booléens =)

La condition du compteur < un nombre donné. On est daccord, la valeur du compteur va changer, mais au final la condition sera soit vrais soir fausse. Donc, on pourrait aussi l'interpréter comme un booléen non ? Ou du moins je suppose que la machine traduit la condition sous une forme booléenne, soit la condition est vrai soit elle est fausse et ce peu importe les valeurs à l'intérieur non ?


Auquel cas, est ce que toutes les conditions utilisé dans des boucles ou des conditions simples de if ne sont elles pas un moyen de traduction entre l'homme qui utilise les dites conditions et la machine qui interprète sous la forme de booléen, soit vrais soit faux ?





Bon voilà, désolé mes questions doivent vous paraître bien stupides, mais elles me semblent pourtant capitales si je veux bien comprendre cette notion de booléen, quitte à ce que je sois dans le faux, autant que je comprenne ce qui est faux dans mon raisonnement.



Merci encore !
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 » 13 Oct 2012, 22:54

La condition du compteur < un nombre donné....

Effectivement, une condition vaut soit vrai, soit faux.
c'est rassurant.

Auquel cas, est ce que toutes les conditions utilisé dans des boucles ou des conditions simples de if.

c'est la même chose, tu peux parler de conditions tout court.

que tu écrives
if True
ou
Trouve = True
if Trouve
ou
Trouve = False
if not Trouve
ou
if Trouve et not (not (Trouve) )
c'est la même chose, toutes tes conditions valent au final une valeur boolenne (ici, True)
la vie est une fête :)

 

Retourner vers ϟ Informatique

Qui est en ligne

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