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

Turbo Pascal Discussion :

[TP] Diviseurs d'entiers dans un intervalle donné


Sujet :

Turbo Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 57
    Par défaut [TP] Diviseurs d'entiers dans un intervalle donné
    on se propose de réaliser un programme qui cherche les entiers de l'intervalle [m,n] admettant le plus de diviseurs.avec 5<=m<n<=100
    Il faut ensuite afficher ces entiers avec le nombre de leurs diviseurs
    J'ai biensur essayé mais il me reste un petit probleme,c'est que le programme m'affiche tout les entiers de cet intervalles et non pas ceux que je veux seulement.
    voila mon travail:

    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
    56
    57
    58
    59
    60
    61
    program entier;
    uses wincrt;
    type tab=array [1..100] of integer;
    var m,n:integer;
        t:tab;
        ch1:string;
     
    procedure saisie(var m1,n1:integer);
    begin
     repeat
      write('donner m: ');
      readln(m1);
      write('donner n: ');
      readln(n1);
     until (m1>=5) and (m1<n1) and (n1<=100);
    end;
     
    procedure diviseur(m1,n1:integer;var t1:tab);
    var a,l,i,j,p:integer;
     
    begin
     
    for l:=1 to m1-1 do
    begin
    t1[l]:=0;
    end;
     for i:=m1 to n1 do
       begin
       p:=0;
       for j:=1 to i do
        begin
        if (i mod j)=0 then
           p:=p+1;
        end;
       t1[i]:=p;
       end;
    for a:=m1 to n1 do
    writeln('les nombres de diviseurs de ',a,' sont: ',t1[a]);
    end;
     
    procedure affichage(m1,n1:integer;t1:tab;var ch:string);
    var k:integer;
        ch2:string;
    begin
    ch:='les entiers ayant le plus grand nombre de diviseurs sont: ';
     for k:=m1 to n1 do
      begin
       if t1[k]<t1[k+1] then
       begin
        str((k+1),ch2);
        ch:=ch+ch2+',';
       end;
      end;
    end;
     
    begin
    saisie(m,n);
    diviseur(m,n,t);
    affichage(m,n,t,ch1);
    writeln(ch1);
    end.
    édité:
    voila j'ai corrigé.En fait d'aprés moi,c'est la procedure affichage qui fait défaut...

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 971
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 971
    Par défaut
    Min,
    Citation Envoyé par mah00
    on se propose de réaliser un programme qui cherche les entiers de l'intervalle [m,n] admettant le plus de diviseurs.avec 5<=m<n<=100
    Il faut ensuite afficher ces entiers avec le nombre de leurs diviseurs
    J'ai biensur essayé mais il me reste un petit probleme,c'est que le programme m'affiche tout les entiers de cet intervalles et non pas ceux que je veux seulement.
    voila mon travail:

    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
    56
    57
    program entier;
    uses wincrt;
    type tab=array [1..100] of integer;
    var m,n:integer;
        t:tab;
        ch1:string;
     
    procedure saisie(var m1,n1:integer);
    begin
     repeat
      write('donner m: ');
      readln(m1);
      write('donner n: ');
      readln(n1);
     until (m1>=5) and (m1<n1) and (n<=100);
    end;
     
    procedure diviseur(m1,n1:integer;var t1:tab);
    var a,l,i,j,p:integer;
     
    begin
     
    for l:=1 to m1-1 do
    t1[l]:=0;
     for i:=m1 to n1 do
      p:=0;
      begin
       for j:=1 to i do
        begin
        if (i mod j)=0 then
           p:=p+1;
        end;
       t1[i]:=p;
       end;
    for a:=m1 to n1 do
    writeln('les nombres de diviseurs de ',a,' sont: ',t1[a]);
    end;
     
    procedure affichage(m1,n1:integer;t1:tab;var ch:string);
    var k:integer;
        ch2:string;
    begin
    ch:='les entiers ayant le plus grand nombre de diviseurs sont: ';
     for k:=m1 to n1 do
      if t1[k]<=t1[k+1] then
      begin
       str((k+1),ch2);
       ch:=ch+ch2+',';
      end;
    end;
     
    begin
    saisie(m,n);
    diviseur(m,n,t);
    affichage(m,n,t,ch1);
    writeln(ch1);
    end.
    Leitmotiv : formate ton code correctement

    Je n'ai pas lu en détail, car
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     until (m1>=5) and (m1<n1) and (n<=100);
    la partie (n<=100) devrait être (n1<=100), n étant une variable globale.

    Pour éviter ce genre de problème, prends l'habitude de définir les variables du programme principal après les procédures/fonctions.

    Comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    program tartempion;
     
    { ici, toutes les constantes/types/fonctions procédures }
     
    var
      { toutes les variables du programme principal }
     
    begin { du programme principal }
    ...
    end.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 57
    Par défaut
    a noter une amélioration dans la présentation de mon code quand meme...

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 971
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 971
    Par défaut
    Jio,
    Citation Envoyé par mah00
    a noter une amélioration dans la présentation de mon code quand meme...
    Un peu, mais il n'est pas plus difficile de le faire systématiquement, avec une indentation régulière et cohérente.

    C'est une question d'en prendre l'habitude, ensuite, tu le feras sans même t'en apercevoir.

  5. #5
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 971
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 971
    Par défaut
    Gio,

    Citation Envoyé par mah00
    on se propose de réaliser un programme qui cherche les entiers de l'intervalle [m,n] admettant le plus de diviseurs.avec 5<=m<n<=100
    En fait, le problème est dans ce qu'on vuet bien comprendre dans cet énoncé :

    Faut-il trouver le nombre maximum de facteurs parmi tous ces entiers ?
    Oui, je pense.

    Une fois qu'on a ce maximum, faut-il afficher tous les entiers ayant ce nombre maximum de facteurs ?
    Oui, je pense que c'est cela.

    Auquel cas, ton code est incomplet, puisqu'il se contente de chercher le nombre de facteurs pour tous les entiers, et de les afficher.

    Petite remarque sur le code : il faut essayer de diviser le travail en fonctions élémentaires.

    Ainsi, ta procedure diviseur calcule directement tous les facteurs pour tous les entiers que tu veux gérer.

    Il vaudrait mieux faire quelque chose comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ...
    function nbDiviseursPourUnEntier(n : integer) : integer;
    { qui renverra le nombre de diviseurs de n }
     
    procedure nbDiviseursPourTous(m1,n1:integer;var t1:tab);
    { qui remplira t1 par des appels à nbDiviseursPourUnEntier
      pour chaque entier à gérer }
    ...
    C'est une bonne habitude à prendre, ça rend le code plus facile à écrire/maintenir

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 57
    Par défaut
    voila ce qu'il faut qu'il fasse exactement:
    -saisir un intervalle (les bornes quoi!)
    -chercher les diviseurs de chaques entiers dans cet intervalle
    -afficher ceux qui ont le plus grand nombre de diviseurs
    -afficher ces entiers avec leur diviseurs
    Donc je pense que mon code n'est pas totalement a coté de la plaque...

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/04/2011, 09h31
  2. Réponses: 1
    Dernier message: 20/07/2009, 11h28
  3. Date dans un intervalle donné
    Par comcom94 dans le forum Requêtes
    Réponses: 1
    Dernier message: 02/12/2008, 21h04
  4. Existence de données dans un intervalle
    Par LEK dans le forum Langage SQL
    Réponses: 3
    Dernier message: 29/03/2007, 10h39
  5. Réponses: 16
    Dernier message: 03/03/2006, 20h15

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