Informatique - Matlab

Le problème exposé dans ce sujet a été résolu.

Bonjour,

Pour mon cours d'informatique je dois faire un programme en Matlab et j'y arrive pas. Je dois créer une fonction qui reçoit deux entiers X et Y et la sortie est W qui nous dis si X est un nombre premier et en le calculant de deux manières différentes suivant des valeurs de Y. Cas 1: Y = 1 -> Vérifier avec une boucle for. Cas 2: Y = 2 -> Vérifier avec une boucle while. Si Y n'est pas 1 ou 2 afficher un message d'erreur "Erreur sur Y!".

Puis je dois faire un document avec la fonction et un avec le script.

Je vois pas comment faire avec les boucles comme ils disent mais voici ce que j'ai fais:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
function W = Prime_Number(X,Y)
X = input('Rentrez une valeur pour A');
j = 0;
for i:1:1:X
    if mod(X, i) == 0
        j++;
    end 
end

if j == 2
    fprintf('X est premier!');
else 
    fprint('X pas premier!');
end

ça c'est ma fonction et pour mon script je vois même pas comment accéder à ce fichier.

En plus je n'utilise pas de boucle while ? Je vois pas comment faire en fait mais l'idée était de voir s'il y avait deux diviseurs et si oui alors le nombre X est premier.

Je comprends pas mais for 1:1:X ça veut dire de 1 à X avec un pas de 1 (on pas i++ en gros). Mais je suis perturbé par ce langage / logiciel et j'ai jamais programmé

Non, ça c'est de 1 à 1 avec un pas de X. Par ailleurs, il faut utiliser un signe = entre la variable de la boucle et le slice qui décrit les valeurs. Donc plutôt for i = 1:X:1, ou encore plus simple for i = 1:X puisque par défaut le pas est de 1. Pas besoin de le préciser dans ton cas, donc.

Bon après, je ne comprends pas bien pourquoi tu fais un input pour la valeur de X (en plus en l'appelant A, variable non introduite dans ton énoncé) alors que tu as déjà une valeur de X qui sera donnée à l'appel de la fonction…

Enfin, tu n'as fait qu'une partie du programme, tu ne testes pas du tout la valeur de Y… Qu'est-ce qui te bloque là-dessus ?

+1 -0

OK. Donc il faut pas faire un input car c'est une fonction et on va l'appeler à partir d'un fichier script ? Pour la valeur de Y, je vois pas du tout ce qu'on me demande en fait car je comprends pas ce qu'elle fait là. On cherche juste à savoir si X est premier ?

Comment est-ce que je peux faire après pour appeler cette fonction dans un autre script d'ailleurs?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
function C = Prime_Number(X,Y)
j = 0;
for i = 1:X
    if mod(X, i) == 0
        j=j+1;
    end 
end

if j == 2
    fprintf('X est premier!');
else 
    fprint('X pas premier!');
end

OK. Donc il faut pas faire un input car c'est une fonction et on va l'appeler à partir d'un fichier script ?

C'est ça, et pour répondre à la question comment, en l'appelant directement, par exemple Prime_Number(3, 1). Il te manque un end à la toute fin de la fonction par contre.

La variable Y est juste là pour choisir une méthode pour tester si X est premier ou non. Si Y vaut 1, tu dois tester la primalité de X avec une boucle for, comme ce que tu as déjà codé. Si Y vaut 2, tu dois tester la primalité de X avec une boucle while. Et si Y ne vaut ni 1 ni 2, il faut renvoyer un message d'erreur.

+1 -0

Donc voici ce que j'ai fais:

 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
function W = Prime_Number(X,Y)
j = 0;

if Y == 1
    for i = 1:X
        if mod(X, i) == 0
            j=j+1;
        end 
    end
end
elseif Y == 2
    while i < (X+1) // Peut-on mettre i<= X en Matlab?
        if mod(X, i) == 0
            j = j+1; // Doit-on changer de variable car elle est utilisée avant?
        end
    end
end

else 
    fprint('Y doit être égal à 1 ou 2!'); //Message d'erreur


if j == 2
    fprintf('X est premier!');
else 
    fprint('X pas premier!');
end

end

Est-ce correct ? Ca ne fonctionne pas chez moi car il me dit "illegal use of reserved keyword "else"" et pareil pour else if.

+0 -0

Tu as les bonnes idées générales, par contre tu as quelque erreurs de syntaxes. Lorsque tu fais un if, il ne doit y avoir qu'un seul end, après les else et elseif. Je t'invite à consulter la documentation sur ce point.

Dans ta boucle while, tu as oublié d'incrémenter i à chaque tour de boucle, tu ne vas jamais sortir de ta boucle en l'état.

+1 -0

Merci beaucoup adri1 ! J'ai encore un problème et je vois pas d'où cette erreur vient dans le while avec la vérification Y = 2 :

 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
function W = Prime_Number(X,Y)
j = 0;

if Y == 1 %Test with the value Y = 1
    for i = 1:X
        if mod(X, i) == 0
            j=j+1;
        end
    end 

elseif Y == 2 %Test with the value Y = 2
    while i <= X+1
      if mod(X, i) == 0
            j = j+1;
      end
     i = i+1;
    end

else 
    fprint('Y doit être égal à 1 ou 2!'); %Error message

end

if j == 2
    fprintf('X est premier!');
else 
    fprint('X pas premier!');
end

end

J'ai pourtant fais attention de mettre l'incrémentation i++ (i= i+1) avant le "end" du while mais Matlab me donne l'erreur ('Error in Prime_Number' while i <= X)

Quand j'essaye de lancer le programme il m'affiche aussi une erreur avec Y == 1 (ligne 4) mais si j'appelle la fonction (X = 2, Y = 1) par exemple ça m'affiche tout de même que 2 est premier (ce qui est correct).

Sais-tu aussi comment on peut appeler la fonction à partir d'un autre script comme me le demande l'énoncé ? Je dois juste faire un fichier avec Prime_Number(X,Y) ? (on me donne pas de valeurs pour X et Y).

Si Y vaut 2, i n'est pas déclaré au moment d'entrer dans la boucle. À aucun moment tu ne lui donnes une première valeur pour initier la boucle. Aussi, tu as un problème de borne dans cette boucle, avec i<=X+1, tu vas aussi faire le test pour X+1.

Sais-tu aussi comment on peut appeler la fonction à partir d'un autre script comme me le demande l'énoncé ? Je dois juste faire un fichier avec Prime_Number(X,Y) ? (on me donne pas de valeurs pour X et Y).

Il suffit juste d'écrire le nom de la fonction pour l'appeler. À la limite pour le coup, tu peux dans ton script faire un input pour demander la valeur de X et de Y, puis appeler Prime_Number avec ces valeurs.

+0 -0

Maintenant que tes problèmes principaux sont réglés, j'aimerais juste pointer quelque chose.

Est-ce que tu penses qu'il est utile de tester la divisibilité avec tous les nombres inférieurs au nombre dont tu testes la primalité ? Par exemple, si tu sais que ton nombre est divisible par 2, est-il utile de tester tous les autres nombres entre 3 et X pour en déduire que X n'est pas premier ? Et si tu sais que ton nombre n'est pas divisible par 2, est-il utile de tester aussi la divisibilité par 4, 6, 8, 10, etc ?

+0 -0

Mon programme marche mais n'est pas optimal?

Exactement.

Mais ça compliquerait l'écriture du code je pense.

Pas forcément énormément. Tu as trois points très faciles à corriger.

  • du moment que tu trouves un diviseur différent de X ou de 1, tu sais que ton nombre n'est pas premier ;
  • une fois la divisibilité par deux testée, tu n'as plus que les nombres impairs entre 1 et X à tester (on sent bien que ce n'est pas encore optimal puisqu'on va par exemple tester 3, 9, 15, etc alors que juste 3 suffirait, mais on vire déjà la moitié des tests en enlevant les nombres pairs, ce qui est simple comme bonjour) ;
  • il existe une borne supérieure (presque) triviale au-delà de laquelle il n'est pas nécessaire de tester la divisibilité, pense au crible d'Eratosthène si tu le connais.
+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte