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 :

Recherche de diviseurs dans un tableau


Sujet :

Turbo Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 21
    Par défaut Recherche de diviseurs dans un tableau
    voila, il s'agit d'écrire un programme Pascal intitulé DivSom, permettant :
    • De saisir un entier n (3<=n<=20)
    • De remplir un tableau T par n entiers positifs non nuls
    • De calculer et d’afficher la somme S de tous les éléments du tableau T
    • De déterminer et d’afficher tous les éléments du tableau T qui sont des diviseurs de la somme S

    voila ce que j'ai fait mais ça ne marche pas:

    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
    program divsom;
    uses wincrt;
    type tab= array[1..100] of integer;
    var t,v:tab; n,sm,i:integer;
    procedure remplissage (var t:tab; var n:integer);
    var i:integer;
    begin
    repeat
    writeln ('donner le nombre de cases');
    readln (n);
    until n in [3..20];
     
    for i:=1 to n do
    begin
    repeat
    writeln ('t[',i,']=');
    readln(t[i]);
    until t[i]>=0;
    end;
     
    end;
     
     
    function somme (t:tab;n:integer):integer;
    var i,s:integer;
    begin
    s:=0;
    for i:=1 to n do
    s:=s+t[i];
    somme:=s;
     
    end;
     
    procedure divisible (t:tab; n:integer;s:integer);
    var i,ss:integer; v:tab;
    begin
    ss:= somme (t,n);
    for i:= 1 to n do
    if t[i] mod ss =0 then v[i]:= t[i];
    end;
     
    begin
    remplissage (t,n);
    sm:= somme (t,n);
    writeln(sm);
    divisible (t,n,sm);
    for i:= 1 to n do
    writeln (v[i]);
    end.

    merci de me dire ce qui cloche parce que ça me donne la somme mais pas les diviseurs

  2. #2
    Expert confirmé

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

    Regarde bien ton programme, en particulier les variables, et tu comprendras (entre autres, une des raisons pour lesquelles les variables globales sont à proscrire).

  3. #3
    Membre averti
    Inscrit en
    Avril 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 21
    Par défaut
    j'ai vérifié mes variables et j'ai fait qq changements mais ça reste non exécutable:
    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
    program divsom;
    uses wincrt;
    type tab= array[1..100] of integer;
    var t,v:tab; n,ss,i:integer;
     
    procedure remplissage (var t:tab; var n:integer);
    var i:integer;
    begin
    repeat
    writeln ('donner le nombre de cases');
    readln (n);
    until n in [3..20];
     
    for i:=1 to n do
    begin
    repeat
    writeln ('t[',i,']=');
    readln(t[i]);
    until t[i]>=0;
    end;
    end;
     
     
    function somme (t:tab;n:integer):integer;
    var i,s:integer;
    begin
    s:=0;
    for i:=1 to n do
    s:=s+t[i];
    somme:=s;
    end;
     
    procedure divisible (t:tab; n:integer);
    var i,ss:integer; v:tab;
    begin
    ss:= somme (t,n);
     
    for i:= 1 to n do
    if t[i] mod ss =0 then v[i]:= t[i];
    end;
     
    begin
    remplissage (t,n);
    ss:= somme (t,n);
    writeln(ss);
    divisible (t,n);
    for i:= 1 to n do
    writeln (v[i]);
    end.



    Qu'est ce qui cloche exactement ? je ne vois pas...

  4. #4
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 466
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 466
    Par défaut
    Comme l'a dit Droggo, tu utilises les mêmes noms de variables pour tes variables locales, tes paramètres de procédure et tes variables globales, ce qui prête à confusion... Renomme les explicitement, et change l'indentation de ton code.

  5. #5
    Membre averti
    Inscrit en
    Avril 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 21
    Par défaut
    Bon voila j'ai enlevé les variables locales que j'avais déjà déclaré en tant que variables globales et ça donne ça:

    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
    program divsom;
    uses wincrt;
    type tab= array[1..100] of integer;
    var t,v:tab; n,ss,i:integer;
     
    procedure remplissage (var t:tab; var n:integer);
    begin
    repeat
    writeln ('donner le nombre de cases');
    readln (n);
    until n in [3..20];
     
    for i:=1 to n do
    begin
    repeat
    writeln ('t[',i,']=');
    readln(t[i]);
    until t[i]>=0;
    end;
    end;
     
     
    function somme (t:tab;n:integer):integer;
    var s:integer;
    begin
    s:=0;
    for i:=1 to n do
    s:=s+t[i];
    somme:=s;
    end;
     
    procedure divisible (t:tab; n:integer);
    var p:integer;
    begin
    p:= somme (t,n);
     
    for i:= 1 to n do
    if t[i] mod p =0 then v[i]:= t[i];
    end;
     
    begin
    remplissage (t,n);
    ss:= somme (t,n);
    writeln(ss);
    divisible (t,n);
    for i:= 1 to n do
    writeln (v[i]);
    end.
    il faut me dire exactement où est le problème
    c'est urgent
    je passe un exam demain et je ne veux pas rester sur un echec

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 62
    Par défaut
    Citation Envoyé par droggo Voir le message
    Voe,

    Regarde bien ton programme, en particulier les variables, et tu comprendras (entre autres, une des raisons pour lesquelles les variables globales sont à proscrire).
    A mon avis ta pas enlever la bonne chose

  7. #7
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Par défaut
    Citation Envoyé par siho90 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    program divsom;]
    procedure divisible (t:tab; n:integer;s:integer);
    var i,ss:integer;
         v:tab;
    begin
    ss:= somme (t,n);
    for i:= 1 to n do
    if t[i] mod ss =0 then v[i]:= t[i];
    end;
    En regardant le premier code que tu as posté, on remarque que tu as utilisé la variable v à l'interieur de la procedure divible. Cette variable est locale et ne peut donc etre accessible de l'exterieur. Quand tu utilise la variable globale v de meme nom dans le programme principale, tu te disais sans doute que c'est le meme v que tu as utilisé dans la procedure divisible. L'erreur viens de là. Ces deux variables sont bien distinctes.
    Pour modifier la valeur de la variable globale v, tu as deux solutions, soit tu vires la variable locale v de la procedure divisible, soit tu passes le tableau v par adresse à ta procedure.
    la deuxieme solution donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    procedure divisible (t : tab; var t2 : tab; n : integer; var taille : integer);
     var i, ss : integer;
    begin
    ss:= somme (t,n);
    taille:=0;
    for i:= 1 to n do
    if t[i] mod ss =0 then
     begin
      t2[i]:= t[i];
      taille:=taille+1;
     end;
    end;
    Il faut aussi savoir que la taille du tableau des diviseurs n'est pas forcement la meme que la taille du tableau contenant tous les nombres.C'est pourquoi j'ai passé la variable taille pour prendre la nouvelle taille.
    D'où le programme principale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    //sm devient la taille du tableau des diviseurs
    divisible (t, v, n, sm);
    for i:= 1 to sm do
    writeln (v[i]);

Discussions similaires

  1. Rechercher un objet dans un tableau d'objet
    Par mikaelm dans le forum Ruby
    Réponses: 6
    Dernier message: 11/06/2007, 17h58
  2. [Tableaux] question recherche et tri dans un tableau
    Par nicopoal dans le forum Langage
    Réponses: 7
    Dernier message: 25/01/2007, 16h41
  3. [Tableaux] Rechercher les doublons dans un tableau
    Par jym_22 dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2006, 09h47
  4. Rechercher une valeur dans un tableau
    Par pafi76 dans le forum Access
    Réponses: 2
    Dernier message: 29/06/2006, 14h23
  5. Faire une recherche de texte dans un tableau de variable
    Par alexxx69 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 19/02/2006, 13h12

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