IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Pascal Discussion :

Décomposition en nombres premiers


Sujet :

Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Tunisie

    Informations forums :
    Inscription : Août 2006
    Messages : 193
    Par défaut Décomposition en nombres premiers
    Salut tout le monde,
    voilà j'ai besoin d'un coup de main pour que je puisse faire cet exercice.
    Voilà l'énoncé :
    Ecrire un programme qui stocke la décomposition en facteurs premiers d'un nombre entier strictement positif dans un tableau et ensuite affiche les éléments de ce tableau sous la forme 18 = 2*3*3.
    Le probléme est dans la 2è procédure !! Aidez moi svp et merci d'avance pour vos réponses.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    program decomposition ;
    uses wincrt ;
    type
        tab=array[1..10] of integer ;
    var
       n : integer ;
     
    procedure saisie (var n : integer );
    begin
    while n > 1 do
    begin
    writeln('Saisir un entier :');
    readln(n);
    end;
     
     
    procedure former ( t: tab ; n : integer ; nb : integer ; di : integer  );   {le probléme est ici svp aidez moi}
    var
       di,nb : integer ;
    Begin
    nb:=0 ;
    di:=2 ;
    while n >1 do
    begin
    if n mod di = 0 then
     begin
     t[nb+1]:= di ;
     n:= n div di ;
     nb:= nb+1 ;
     end;
    else
     di:=di+1 ;
     
    end;
     
     
     
    End;
     
    procedure affiche (t:tab ; n :integer );
    var
       i : integer ;
    begin
    for i:=1 to nb do
     begin
     writeln(t[i] );
     writeln('*');
     end;
    end;
     
    begin
    saisie(n);
    former(t,n);
    affiche(t,n);
    end.

  2. #2
    Membre chevronné Avatar de Haywire
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2006
    Messages : 462
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    program decomposition ;
    uses wincrt ;
    type
        tab=array[1..10] of integer ;
    var
       n : integer ;
     
    procedure saisie (var n : integer );
    begin
       while n > 1 do
          begin 
             writeln('Saisir un entier :');
             readln(n);
          end;
    end; // il manquait un end
     
    procedure former ( t: tab ; n : integer ; nb : integer ; di : integer  );
    var di,nb : integer;
    Begin
       nb:=0;
       di:=2;
       while n >1 do // pas besoin de begin end car le if est considéré comme une instruction unique
          if n mod di = 0 then
             begin
                t[nb+1]:= di;
                n:= n div di;
                nb:= nb+1;
             end
          else di:=di+1;
    end;
     
    procedure affiche (t:tab ; n :integer );
    var i : integer ;
    begin
       for i:=1 to nb do
          begin
             writeln(t[i] );
             writeln('*');
          end;
    end;
     
    begin
       saisie(n);
       former(t,n);
       affiche(t,n);
    end.
    Voilà, j'ai mis les erreur corrigées en commentaires et indenté ton code.

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,
    Citation Envoyé par Mushroom7
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     ...
    procedure former ( t: tab ; n : integer ; nb : integer ; di : integer  );
    ...
       former(t,n);
     ...
    Voilà, j'ai mis les erreur corrigées en commentaires et indenté ton code.
    Tu es sûr que c'est corrigé ?
    Les 2 seules lignes que j'ai laissées montrent que non.

    Pour Wael42

    Réfléchi un peu, et revois ta procédure former.

    Je sais bien que c'est là que tu as un problème, mais regarde bien ton code, contente-toi de passer le paramètres nécessaires, et vérifie ton algorithme.

    Et dans cette même procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure former ( t: tab ; n : integer ; nb : integer ; di : integer  );   {le probléme est ici svp aidez moi}
    var
       di,nb : integer ;
    Begin
    Où as-tu pris cette idée de définir des variables locales portant le même nom que les paramètres ?

    Il faut faire attention à ce que tu fais, sinon tu te retrouveras toujours avec ce genre de problème.

    D'autre part, la dimension de ton tableau est trop petite, vu comment tu veux stocker les diviseurs (1 par case du tableau si j'ai bien compris):
    imagine que tu veuilles les diviseurs de 2048 = 2 puissance 11.
    La taille de ton tableau est déjà dépassée.

    Cet exemple est là surtout pour te montrer que ton algorithme n'est pas bon.

  4. #4
    Membre chevronné Avatar de Haywire
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2006
    Messages : 462
    Par défaut
    En fait je n'ai pas corrigé le programme, mais j'ai tout de suite vu qu'il manquait un end, donc je l'ai ajouté en pensant que l'erreur pouvait être tout simplement ça.
    A part ça je n'ai pas vraiment regardé son programme pour voir s'il y avait d'autres erreurs.

  5. #5
    Membre Expert
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Par défaut
    Bonjour tout le monde
    juste une chose avant de commencer (je crois qu'on le dit souvent mais on va continuer a le dire) Il faut bien indenter son code pour que ça soit plus lisible pour tout le monde et pour sois meme
    Concernant la procedure saisie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure saisie (var n : integer );
    begin
        while n > 1 do
        begin
           writeln('Saisir un entier :');
           readln(n);
        end;
    end;
    - Il manque un end comme l'a dit Mushroom7
    -Tel que tu l'utilise dans le programme principal(tu passes une variable qui n'est pas initialisé et vu la condition dans la procedure tout peux se passer(ex:ne jamais rentrer dans la boucle....)
    -Si c'est une procedure pour saisir un entier regarde bien la condition que tu met
    est ce que ta procedure saisie fait bien ce quetu penses
    -Dans ce cas une fonction serait adapté juste pour retrourné un entier:
    un code assez simple du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
       function lireEntier:integer;
       var n:integer; 
       begin
          repeat
             write('Entrer un entier:');
             readln(n);
          until(n>1);
          lireEntier:=n;
       end;
    thewho a écrit
    Où as-tu pris cette idée de définir des variables locales portant le même nom que les paramètres ?

    Il faut faire attention à ce que tu fais, sinon tu te retrouveras toujours avec ce genre de problème
    Penses a ce que thewho te dit et regle ce probleme et regarde les parametres que tu passes a ta procedure dans le programme prinicipal

    Essai de compiler ton code dans un compilateur Pascal et tu vera les erreurs que le compilateur va te signaler ça va t'aider aussi a corriger petit a petit ton code mais n'oublies pas que Ce n'est pas parce que le code compile qu'il peut faire ce qu'on lui demande de faire
    et une derniere chose dans ta procedure affiche fais attention a tes variables
    Dans le programme principal rien n'est initialise avant l'appel des procedures
    Bon courage et n'hesite pas a revenir pour les questions.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Tunisie

    Informations forums :
    Inscription : Août 2006
    Messages : 193
    Par défaut
    Merci les gars pour vos réponses
    je vais corriger les erreurs ainsi,j'ajouterai le code du programme ce soir
    Merci encore

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,
    Citation Envoyé par krachik
    Essai de compiler ton code dans un compilateur Pascal et tu vera les erreurs que le compilateur va te signaler ça va t'aider aussi a corriger petit a petit ton code mais n'oublies pas que Ce n'est pas parce que le code compile qu'il peut faire ce qu'on lui demande de faire
    Eh bien si, le programme fait toujours ce qu'on lui demande ! (Sauf bug, évidemment)

    Le problème est que ce qu'on lui demande de faire n'est pas forcément ce qu'on voulait faire.
    En clair, erreur d'algorithme, entre autres.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 24
    Dernier message: 27/09/2005, 21h16
  2. [défi n°8]: premiers nombres premiers
    Par javatwister dans le forum Général JavaScript
    Réponses: 41
    Dernier message: 14/06/2005, 10h22
  3. [LG]Calcul des 15 premiers nombres premiers
    Par yffick dans le forum Langage
    Réponses: 12
    Dernier message: 18/09/2004, 14h57
  4. Cripter avec des nombres premiers
    Par clovis dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 14/04/2004, 19h10
  5. premier nombre premier superieur à m=10^100+1
    Par azman0101 dans le forum Mathématiques
    Réponses: 4
    Dernier message: 17/04/2003, 03h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo