Informatique - Matlab

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

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.

+0 -0
Auteur du sujet

Salut,

je connais pas trop le langage, mais si tu fait simplement :

1
for 1:1

?

Ozmox

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é

+0 -0
Auteur du sujet

Si je fais ça, ça fonctionne pas j'ai une erreur "Unexpected Matlab operator" mais je suppose aussi que je dois retourner la valeur de la fonction à un moment mais je vois pas comment faire.

+0 -0
Staff

Cette réponse a aidé l'auteur du sujet

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 ?

Édité par adri1

I don't mind that you think slowly, but I do mind that you are publishing faster. – W. Pauli

+1 -0
Auteur du sujet

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
+0 -0
Staff

Cette réponse a aidé l'auteur du sujet

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.

I don't mind that you think slowly, but I do mind that you are publishing faster. – W. Pauli

+1 -0
Auteur du sujet

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.

Édité par sotibio

+0 -0
Staff

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.

I don't mind that you think slowly, but I do mind that you are publishing faster. – W. Pauli

+1 -0
Auteur du sujet

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).

+0 -0
Staff

Cette réponse a aidé l'auteur du sujet

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.

I don't mind that you think slowly, but I do mind that you are publishing faster. – W. Pauli

+0 -0
Staff

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 ?

I don't mind that you think slowly, but I do mind that you are publishing faster. – W. Pauli

+0 -0
Auteur du sujet

D'accord je vois ce que tu veux dire. Mon programme marche mais n'est pas optimal? Si X n'est pas divisible par 2 il ne le sera pas non plus par 4, 6, etc. (Nombres pairs). Mais ça compliquerait l'écriture du code je pense.

+0 -0
Staff

Cette réponse a aidé l'auteur du sujet

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.

I don't mind that you think slowly, but I do mind that you are publishing faster. – W. Pauli

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

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