Inscription / Connexion Nouveau Sujet
Niveau Licence Maths 1e ann
Partager :

algorithme informatique

Posté par
fatimedo
08-06-16 à 15:09

svp comment on peut resoudre cet exercice
ecrire la fonction
appartienet (x:entier , t[]:entier , n:entier ):booleen
qui retourne true si x est un element du tableau t de dimension n
voila mon reponse
ecrire ( "donne le nombre d'element n:");
lire(n);
ecrire("donne la valeur x:");
lire(x);
pour i de 0 a n-1 faire
p<- t[i]
si x=t[i] alore
appartient<- true
sinon
appartient<-false
fin si
fin pour
fin

Posté par
lionel52
re : algorithme informatique 08-06-16 à 15:16

Ok d'après ton programme, je choisis x = 7 et t = [3,7,2]
Ton programme fait ça :

1) x =/= t[1] donc appartient = false
2) x = t[2] donc appartient = true
3) x =/= t[3] donc appartient = false

du coup appartient = false

Posté par
ThierryPoma
re : algorithme informatique 08-06-16 à 15:17

Bonjour,

Ton algorithme est faux. En plus, le choix de la boucle n'est pas efficace.

Bonne journée !

Posté par
fatimedo
re : algorithme informatique 08-06-16 à 15:23

svp monsieu  ThierryPoma corrige mon reponse svp j'ai un exam apres deux jours

Posté par
carpediem
re : algorithme informatique 08-06-16 à 17:41

salut

il serait préférable d'utiliser une boucle while

appartient = false
while x <> t[i]
   i = i + 1
....

Posté par
mdr_non
re : algorithme informatique 09-06-16 à 00:52

bonsoir : )

carpediem,
Ton while est bien problèmatique également, tu débordes en mémoire.

***
fatimedo,
Il existe plusieurs façons de traiter ton problème.
Ta boucle pour peut très bien marcher, il te suffit de sortir de la boucle dès que appartient est vraie.
Tu peux bien entendu utiliser également un do... while ou un while... tout court.

Et on te demande de faire un retour, or toi tu te contentes de changer la valeur de appartient à chaque itération.
Retente à nouveau.

Posté par
boninmi
re : algorithme informatique 09-06-16 à 09:02

carpediem @ 08-06-2016 à 17:41

salut

il serait préférable d'utiliser une boucle while

appartient = false
while x <> t[i]
   i = i + 1
....

Dans ce type de boucle on met toujours en premier dans le test un contrôle du domaine de validité de l'indice. C'est l'enfance de l'art de la programmation des itérations et ça évite que les fusées se crashent, comme c'est arrivé par le passé pour moins que ça (genre erreur d'unité). Mais les mathématiciens pensent qu'ils sont bien au dessus des difficultés posées par l'informatique en général, et la programmation des boucles en particulier, et font fi de ce genre de détail ...
A remarquer que dans ce type d'algorithme tout est dans le test, contrairement à l'illusion courante que tout est dans le corps de la boucle.

Posté par
carpediem
re : algorithme informatique 09-06-16 à 11:54

boninmi @ 09-06-2016 à 09:02

carpediem @ 08-06-2016 à 17:41

salut

il serait préférable d'utiliser une boucle while

appartient = false
while x <> t[i]
   i = i + 1
....

Dans ce type de boucle on met toujours en premier dans le test un contrôle du domaine de validité de l'indice. C'est l'enfance de l'art de la programmation des itérations et ça évite que les fusées se crashent, comme c'est arrivé par le passé pour moins que ça (genre erreur d'unité). Mais les mathématiciens pensent qu'ils sont bien au dessus des difficultés posées par l'informatique en général, et la programmation des boucles en particulier, et font fi de ce genre de détail ...
A remarquer que dans ce type d'algorithme tout est dans le test, contrairement à l'illusion courante que tout est dans le corps de la boucle.


évident : je n'ai donné bien sur que l'idée générale et qu'un brouillon ...

il faut évidemment ensuite écrire un algorithme propre et rigoureux (initialisation propre, et plus généralement contrôle précis des entrées et sorties de boucle)

Posté par
Razes
re : algorithme informatique 09-06-16 à 13:46

Tu écris une fonction qui a comme arguments x, t[] et n, donc tu n'as pas besoin de les demander dans la fonction (car ceci suppose qu'ils sont déjà transmis à a fonction comme arguments).

Voici un algorithme (la vérification que ton tableau est non vide, ... est supposée faite avant l'appel de la fonction)

appartienet (x:entier , t[]:entier , n:entier ):booleen
     i<-0
     Faire
               p<- t[i]
               si x=t[i] alors
                         appartient<- true
               sinon
                         appartient<-false
               fin si
               i<- (i+1)
      Tant Que (i<n ou NOT appartient)
Fin

Posté par
mdr_non
re : algorithme informatique 09-06-16 à 13:59

Razes,
Dans ton cas également, l'énoncé demande un retour mais tu n'en fais aucun.
Tu assignes t[i] à p mais utilise ensuite t[i] ? On peut enlever la ligne avec p on gagne de la mémoire.

Après comme je l'ai dit, il suffit d'un petit ajout au code de fatimedo pour que ça soit bon également.

On peut bien sûr faire un code très compact : x == t[i] renvoie un booléen, et ce booléen est justement appartient.

Posté par
carpediem
re : algorithme informatique 09-06-16 à 14:09

à quoi sert l'instruction :: p <-- t[i] ??

et es-tu sur de ton OU ?

i = 0
appartient = faux
Tant que (appartient = faux et i =< n)
  si x = t[i] alors appartient = vrai
  i = i + 1


me semble suffisant ...
j'avais été un peu vite avec mon brouillon précédent ...

Posté par
carpediem
re : algorithme informatique 09-06-16 à 14:12

Citation :
On peut bien sûr faire un code très compact : x == t[i] renvoie un booléen, et ce booléen est justement appartient.
ha oui bien vu ... donc tout simplement :

i = 0
appartient = faux
Tant que (appartient = faux et i =< n)
  appartient = (x == t[i])
  i = i + 1


bien entendu si on veut le rang du tableau c'est facile ...

Posté par
mdr_non
re : algorithme informatique 09-06-16 à 14:14

Le OU de Razes devrait être un ET.

Dans ton code à toi, tu dois avoir i <= n - 1 sinon tu lis une case du tableau qui n'existe pas.

Posté par
lionel52
re : algorithme informatique 09-06-16 à 14:27

Y a aussi le fait que

Tant que (appartient = faux...

c'est plutôt

Tant que (appartient == faux...

Posté par
mdr_non
re : algorithme informatique 09-06-16 à 14:33

Oui, ou non ?
Sur ce point on ne peut pas vraiment se prononcer, il s'agit d'un algorithme après tout.
Et l'auteur semble utiliser <- pour assigner et = pour tester.

Dans mon cas j'avais fait usage de == juste pour faire écho à la syntaxe du C/C++/...

Mais il existe bien des languages ou = simple est un test, visual basic par exemple.

Posté par
mdr_non
re : algorithme informatique 09-06-16 à 14:37

Annule mon précédent message, dans le code de carpediem oui c'est vrai. Il a clairement fait son choix sur = et ==.

Posté par
carpediem
re : algorithme informatique 09-06-16 à 14:48

en fait j'ai repris ta syntaxe ...

a = 2 est une affectation
si a = 2 devient un test (car précédé du si)
Tant que a = 2 est aussi un test (car précédé de tant que ... ou while)

je me fie à la machine qui doit savoir interpréter un = d'affectation d'un = de test !!!!

mais il est vrai que le mélange des deux ne va pas ....

mdr_non @ 09-06-2016 à 14:14


Dans ton code à toi, tu dois avoir i <= n - 1 sinon tu lis une case du tableau qui n'existe pas.


en fait à oui si on considère un tableau de 0 à n - 1 qui donne bien n valeurs ...

j'ai commencé à raisonner ainsi ... puis raisonner à partir de 1 à n ensuite ....

Posté par
Razes
re : algorithme informatique 09-06-16 à 19:51

Voici un algorithme (la vérification que ton tableau est non vide, ... est supposée faite avant l'appel de la fonction)

appartient (x:entier , t[]:entier , n:entier ):booleen
     i<-0
     Faire
                SI x=t[i] ALORS
                         appartient<- true
               SINON
                         appartient<-false
               FIN SI
               i<- (i+1)
      Tant Que (i<n et NOT appartient)
Fin


@mdr_non

Citation :
Dans ton cas également, l'énoncé demande un retour mais tu n'en fais aucun.
Tu assignes t à p mais utilise ensuite t[i] ? On peut enlever la ligne avec p on gagne de la mémoire.

- Pour ce qui est du retour, il y a a boucle FAIRE .... TANT QUE
- Le p ne sert à rien, je l'avais repris de [i]fatimedo
, question mémoire on ne gagne que quelque octets (integer).
- Effectivement il y a un ET au lieu du OU, On a aussi le choix d'utiliser comme condition de sortie de la boucle i<n ET not(appartient) ou not(i=n OU appartient)
-
Citation :
Dans ton code à toi, tu dois avoir i <= n - 1 sinon tu lis une case du tableau qui n'existe pas.
Non, Je n'ai pas écrit ça, ce que j'ai écris c'est i<n qui est juste.

@fatimedo
Ceci est  ton algorithme, je n'ai fait que le corriger. Tu programme en que langage?

Posté par
mdr_non
re : algorithme informatique 09-06-16 à 21:04

Citation :
- Pour ce qui est du retour, il y a a boucle FAIRE .... TANT QUE
Je pense que tu n'as pas compris ce que je voulais dire :
L'énoncé demande qu'un booléen soit retourné à la fin indiquant le résultat.
Or ton code en fait aucun retour du résultat final, il ne fait que calculer silencieusement le résultat final.
Il faut faire un 'Retourner appartient' ou 'Afficher appartient' ou quelque chose du genre à la fin.

Citation :
- Le p ne sert à rien, je l'avais repris de fatimedo, question mémoire on ne gagne que quelque octets (integer).
Oui, ici il s'agissait simplement de comprendre qu'on ne laisse pas trainer des variables qu'on n'utilise pas c'est tout.

Citation :
Non, Je n'ai pas écrit ça, ce que j'ai écris c'est i<n qui est juste.
?
Ce message n'était pas pour toi, il fait suite au message de carpediem, c'était bien pour carpediem.

Posté par
Razes
re : algorithme informatique 09-06-16 à 21:22

Dans ce cas on utilise l'instruction RETURN qui permet d'envoyer une valeur et sortir de la fonction. Nous obtenons un programme court.

appartient (x:entier , t[]:entier , n:entier ):booleen
     i<-0
     Faire
                SI x=t[i] ALORS
                         Return( true )
               FIN SI
               i<- (i+1)
      Tant Que (i<n)
       Return(false )
Fin

Posté par
Razes
re : algorithme informatique 09-06-16 à 21:26

Ou l'écrire ainsi

appartient (x:entier , t[]:entier , n:entier ):booleen
      Pour i de 0 a n-1 Faire
                SI x=t[i] ALORS
                         Return( true )
               FIN SI
               i<- (i+1)
      Fin Pour
      Return(false )
Fin

Posté par
mdr_non
re : algorithme informatique 09-06-16 à 21:30

Oui maintenant ce code est convenable.

رمضان مبارك سعيد

Posté par
Razes
re : algorithme informatique 09-06-16 à 21:41

// En langage C

booleen Appartient(integer x, integer *t, integer n){
    for (int i=0; i<n; i++){
           if (x==t(i)){
                    return 1;
           }
    } //endfor
    return 0;
}


Et merci pur le Ramadan.

Posté par
carpediem
re : algorithme informatique 10-06-16 à 17:13

mdr_non @ 09-06-2016 à 21:30

Oui maintenant ce code est convenable.

رمضان مبارك سعيد


je ne pourrais en dire autant de celui-là ... qui me reste incompréhensible ...



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Inscription gratuite

Fiches en rapport

parmi 1741 fiches de maths

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !