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 :

Comptage de valeurs identiques dans un vecteur [Turbo Pascal]


Sujet :

Turbo Pascal

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 31
    Points : 11
    Points
    11
    Par défaut Comptage de valeurs identiques dans un vecteur
    Bonjour,

    j'ai eu un examen sur le Pascal et l'énoncé était assez compliqué...
    Je n'ai pas réussi à le faire et je dois donc recommencer...

    Le voici :
    -Faire un vecteur de N nombre (au choix, max 20) entier compris entre 20 et 30 inclus choisies par le programme.

    -Afficher le résultat

    -Faire un vecteur qui répertorie les chiffres identiques et indique leur répétition.


    exemple:

    21 22 25 23 30 21 24 24 25 30 (affichage des valeurs aléatoires)

    21 2 22 1 25 2 23 1 30 2 24 2 (affichage du vecteur avec nombre de rep)

    Donc 21 apparaît 2 x, 22 1x etc... (dans l'ordre affichage donc non trié !!)

    -Afficher le résultat

    Il faut faire tous ces points par une fonction avec en plus un menu pour la demande du nombre de valeur...

    EN résumé :

    -Debut
    -Menu(fct)
    -Recherche 1 (fct)
    -Affichage 1 (fct)
    -Recherche 2 (fct)
    -Affichage 2 (fct)
    -Fin
    La où j'ai surtout du mal c'est lors du comptage du nombre de répétitions et affichage 2...

    Merci à vous si vous savez m'aider !!

  2. #2
    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
    Points : 2 501
    Points
    2 501
    Par défaut
    Je vais essayer de te donner un tuyau pour le comptage de l'occurrence des nombre.

    Nous allons utilise le nombre -1 comme un nombre nul, c'est à dire ne pouvant faire partie des nombres contenus dans le tableau au départ.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    pour i de 1 à MaxTab
     si (tableau[i]<>-1) alors 
      nombre=tableau[i];
      compteur:=0;
      pour j de 1 à MaxTab
        si (nombre=tableau[j])
         compteur:=compteur+1;
         tableau[j]:=-1; //on vient de compter ce nombre donc on le met hors circuit
        finSi
      finPour
      ecrire("{"+nombre+" : "+compteur+" }"); //affichage du nombre et de son occurence
     finSi
    finPour
    Affichera par exemple :{21:2} {22: 1} {25: 2}.
    Et le tout se fait avec un temps proportionel à O(maxTab²).

  3. #3
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Noe,

    Si tu as fait un - même petit - tour sur le forum, tu dois savoir qu'on ne te donnera pas le programme "clés en mains".

    Alors, montre-nous ce que tu as fait, où et pourquoi tu coinces ...
    Si les cons volaient, il ferait nuit à midi.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 31
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par droggo Voir le message
    Noe,

    Si tu as fait un - même petit - tour sur le forum, tu dois savoir qu'on ne te donnera pas le programme "clés en mains".

    Alors, montre-nous ce que tu as fait, où et pourquoi tu coinces ...
    J'en suis bien conscient et je ne voudrais pas non plus mais comme je l'ai dit plus haut je coince au niveau de la recherche 2.

    Donc j'arrive à faire un vecteur avec les nombres compris en tre 20 et 30.
    Mais après je ne sais vraiment pas comment faire pour compter les nombres et afficher le resultat...
    Je compte le premier mais si je continue et que je rencontre encore le meme chiffre comment faire pour qu'il ne soit pas compte ?
    Et comment decaler les resultats dans le tableu final (une fois sur deux chiffre et repetitions)

  5. #5
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Boe,

    Alors, retour "à la base" : papier + crayon.

    Tu écris une série de valeur, et tu notes comment tu résous le problème à la main : tu as un algorithme qui fonctionne (pas forcément le meilleur au point de vue informatique, mais qui fonctionne, et c'est ça l'important dans un premier temps).
    Si les cons volaient, il ferait nuit à midi.

  6. #6
    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
    Points : 2 501
    Points
    2 501
    Par défaut
    Quant à l'algorithme que j'ai donné, on peut diviser le temps par deux en commençant la deuxieme boucle à i.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    pour j de i à MaxTab
      ...
    Comme droggo l'as dit, le meilleur moyen c'est de faire un exemple sur papier et essayer de le résoudre à la main. Si on réussit la résolution à la main, on essaie de revoir toutes les étapes par lesquelles on y es passé, et ensuite bâtir un algorithme qui tente de faire la même chose.

    Mais pourquoi ne posterais tu pas le code que tu as dejà fait? Meme là où tu te bloques, poste le code et explique ce qui te bloque. On pourra alors t'aider à trouver une solution.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 31
    Points : 11
    Points
    11
    Par défaut
    je m'y suis mis mais je ne sais pas comment copier coller avec turbo pascal...
    J'ai regardé le tuto pour cette action mais impossible.
    Je réduis en fenêtre et si je fais "copy" rien ne se passe.
    J'ai essayé avec pascal 7.0 mais cela ne change rien du tout...

    je vous tiens au courant.

    merci

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Il suffit d'ouvrir le fichier .pas qui contient la source avec un éditeur de texte traditionnel.
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 31
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par darrylsite Voir le message
    Quant à l'algorithme que j'ai donné, on peut diviser le temps par deux en commençant la deuxieme boucle à i.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    pour j de i à MaxTab
      ...
    Comme droggo l'as dit, le meilleur moyen c'est de faire un exemple sur papier et essayer de le résoudre à la main. Si on réussit la résolution à la main, on essaie de revoir toutes les étapes par lesquelles on y es passé, et ensuite bâtir un algorithme qui tente de faire la même chose.

    Mais pourquoi ne posterais tu pas le code que tu as dejà fait? Meme là où tu te bloques, poste le code et explique ce qui te bloque. On pourra alors t'aider à trouver une solution.
    Voila mon début de programme qui marche +-
    Je suis bloqué comme je vous l'ai dit au niveau du deuxième vecteur.
    Dans ce début de code j'ai fait que pour le premier nombre avec sa repetition et déjà ça, ça ne va 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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    program exam;
    uses crt;
     
    var tab:array[1..50] of integer;
     
    procedure cherche;
    var m,n,i: integer;
     
    begin
     
    repeat
    writeln('cmb de nombre');
    writeln('');
    readln(n);
    until(n<=50);
     
    for i:=1 to n do
            begin
                    m:=random(10);
                    m:=m+20;
                    tab[i]:=m;
            end
    end;
     
    procedure affichage;
    var i,n: integer;
     
    begin
     
     
    writeln('');
    writeln('voici le vecteur choisi : ');
    writeln('');
     
    for i:=1 to n do
            begin
                    write(' ',tab[i]);
            end
    end;
     
    procedure tri;
    var i,j,compt,n: integer;
     
    begin
     
    compt:=1;
    for i:=1 to n do
            begin
                    for j:=2 to n do
                            begin
                                    if tab[i]=tab[j] then
                                    begin
                                    compt:=compt+1
                                    end
                            end
            end
    end;
     
    procedure affichage2;
    var compt: integer;
     
    begin
            writeln('');
            writeln('');
            writeln('voici le nouveau vecteur :');
            writeln('');
            writeln(tab[1],' ',compt)
    end;
     
    begin
     
    cherche;
    affichage;
    tri;
    affichage2;
     
    readkey;
    end.
    Pour terminer, je ne sais pas trop la différence entre une procédure et un fonction si ce n'est le nombre de valeur en sortie mais je m'embrouille complètement.

    J'espère vous avoir mieux expliqué mon problème...

  10. #10
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Boa,

    Premier coup d'œil rapide :

    - tu utilises systématiquement des variables non initialisées, le programme fait donc n'importe quoi

    - tes procédures ne font que mettre à jour des variables locales, sans communication avec l'extérieur, et il n'y a donc aucune relation entre elles (excepté tab, mais ça ne suffit pas)

    - utilisation de variable globale (tab) : à proscrire ! Une procédure/fonction doit recevoir en paramètre tout ce dont elle a besoin.


    La différence entre une procédure et une fonction est qu'une fonction renvoie une valeur, c'est aussi simple que ça.
    Si les cons volaient, il ferait nuit à midi.

  11. #11
    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
    Points : 2 501
    Points
    2 501
    Par défaut
    Dejà, il faut savoir choisir des noms qui parlent d'eux meme pour tes fonctions et procedure. Par exemple la premiere procedure, tu l'appelles recherche, alors que ce qu'elle fait c'est initialisé le tableau des valeurs choisies au hazard.
    Aussi, la procedure appelée tri, doit normalement compter le nombre de fois qu'apparait un chiffre donné.

    Voici ce que je te propose :
    • Renomme tes procedures et fonctions convenablement.

    • Revois ton cours sur les procedures et les fonctions, notament sur le passage de parametre

    Ensuite tu peux essayer d'arranger ton code comme suit :
    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
     
    program utilisationTableau;
     
     const max=50; //taille maximale du tableau
     
     type vecteur= array[1..Max] of integer;
     
     procedure initialiser(var tab : vecteur);
     //choisit les valeur au hazard pour les elements du tableau tab
     
    procedure affichage(tab : vecteur);
     //affiche les elements du tabeau tab
     
    procedure valeurDistinctes(var tab: vecteur; var taille : integer);
     //determine les differents nombres contenus dans le tableau, et donne la vrai taille du tableau
     
    function compterOccurence(nb : integer; tab : tableau);
    //compte le nombre de fois que le nombre nb apparait dans le tableau tab
     
    procedure affichage2(tab : vecteur);
    //affiche les elements du tableau avec leurs occurences
     
    Begin
    //...
    End.
    L'algorithme pour l'affichage des nombres avec leurs occurence peut alors se faire comme suit: on determine les differents nombres dans un tableau soit t1, on utilise alors la fonction compterOccurence pour connaitre le nombre de fois qu'apparait le nombre t1[i] dans le precedant tableau.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 31
    Points : 11
    Points
    11
    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    program exam;
    uses crt;
     
    var tab,vect:array[1..50] of integer;
        x,compt: integer;
        cond: boolean;
     
    procedure cherche; (*defini un vecteur de n nbre*)
    var m,n,i: integer;
     
            begin
     
                    repeat
                            writeln('Combien voulez vous de nombre ?');
                            writeln('');
                            readln(n);
     
                    until(n<=50);
     
                    for i:=1 to n do
     
                    begin
                            m:=random(10);
                            m:=m+20;
                            tab[i]:=m;
                    end
            end;
     
    procedure affichage; (*affiche le vecteur defini*)
    var i,n: integer;
     
            begin
     
     
                    writeln('');
                    writeln('Voici le vecteur choisi : ');
                    writeln('');
     
                    for i:=1 to n do
                            begin
                                    write(' ',tab[i]);
                            end
            end;
     
     
    procedure tri;  (*tri le vecteur pour séparer les nbr de leur repetition*)
    var i,v,j,n: integer;
    begin
     
                    cond:=true;
                    x:=1;
     
                    for i:=1 to n do
                    begin
     
                            for v:=(i-1) downto 1 do
                            begin
                                    if tab[i]=tab[v] then
                                    begin
                                            cond:=false;
                                    end;
                            end;
     
                            compt:=1;
     
                            if cond=true then
                            begin
     
                                    for j:=i+1 to n do
                                    begin
     
                                            if tab[i]=tab[j] then
                                            begin
                                                    compt:=compt+1;
                                            end;
     
                                    vect[x]:=tab[i];
                                    vect[x+1]:=compt;
                                    x:=x+1;
                                    end;
                            end;
                    end;
    end;
     
    procedure affichage2; (*affiche le vecteur final*)
    var i: integer;
    begin
            writeln('');
            writeln('');
            writeln('voici le nouveau vecteur :');
            writeln('');
     
                    for i:=1 to x do
                    begin
                            writeln(' ',vect[i]);
                    end;
    end;
     
    begin (*debut du programme principal*)
     
    cherche;
    affichage;
    tri;
    affichage2;
     
    readkey;
    end.
    Voila j'ai fait le code complet mais cela ne fonctionne pas.
    J'ai changé certaines choses et la disposition pour la clarté.

    Mon principe est le suivant:

    j'utilise "cond vrai " dans la verification du nombre. S'il est deja present dans le vecteur dans un position anterieure alors "cond faux" et je passe au nombre suivant.

    Desole Darrylsite, je n'avais pas vu ton message !!!
    Je vais faire les modifications...

  13. #13
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Noa,

    Au passage, prends l'habitude de bien présenter ton code.

    Indenter, c'est bien, mais il faut soigner quand même : une tabulation de 8 caractères à chaque indentation, c'est trop, car ça disperse le code sur l'écran.

    2 ou 4 caractères sont largement suffisant, exemple avec ton dernier code (non vérifié/corrigé )

    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    program exam;
     
    uses crt;
     
    var 
      tab, vect: array[1..50] of Integer;
      x, compt: Integer;
      cond: Boolean;
     
    procedure cherche; (*defini un vecteur de n nbre*)
    var 
      m, n, i: Integer; 
    begin 
      repeat
        Writeln('Combien voulez vous de nombre ?');
        Writeln('');
        Readln(n);
      until (n <= 50);
     
      for i := 1 to n do
      begin
        m      := Random(10);
        m      := m + 20;
        tab[i] := m;
      end
    end;
     
    procedure affichage; (*affiche le vecteur defini*)
    var 
      i, n: Integer; 
    begin  
      Writeln('');
      Writeln('Voici le vecteur choisi : ');
      Writeln('');
     
      for i := 1 to n do
      begin
        Write(' ', tab[i]);
      end
    end;
     
     
    procedure tri;  (*tri le vecteur pour séparer les nbr de leur repetition*)
    var 
      i, v, j, n: Integer;
    begin 
      cond := true;
      x := 1;
     
      for i := 1 to n do
      begin 
        for v := (i - 1) downto 1 do
        begin
          if tab[i] = tab[v] then
          begin
            cond := false;
          end;
        end;
     
        compt := 1;
     
        if cond = true then
        begin 
          for j := i + 1 to n do
          begin 
            if tab[i] = tab[j] then
            begin
              compt := compt + 1;
            end;
     
            vect[x] := tab[i];
            vect[x + 1] := compt;
            x := x + 1;
          end;
        end;
      end;
    end;
     
    procedure affichage2; (*affiche le vecteur final*)
    var 
      i: Integer;
    begin
      Writeln('');
      Writeln('');
      Writeln('voici le nouveau vecteur :');
      Writeln('');
     
      for i := 1 to x do
      begin
        Writeln(' ', vect[i]);
      end;
    end;
     
    begin (*debut du programme principal*)
     
      cherche;
      affichage;
      tri;
      affichage2;
     
      readkey;
    end.
    Et je constate que tu continues à utiliser des variables non initialisées.

    Quand tu écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure affichage; (*affiche le vecteur defini*)
    var 
      i, n: Integer; 
    begin  
      Writeln('');
      Writeln('Voici le vecteur choisi : ');
      Writeln('');
     
      for i := 1 to n do
      begin
        Write(' ', tab[i]);
      end
    end;
    la variable n est locale à cette procédure affichage, et n'a donc rien à voir avec tes autres variables n déclarées dans les autres procédures.
    Si les cons volaient, il ferait nuit à midi.

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 31
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    Alors voila mon dernier code.
    J'ai essayé de respecter au mieux vos coseils et j'ai relu mon cours sur les procédures et fonctions...
    Mais cela ne marche toujours malgré mes améliorations avec lesquelles j'étais pourtant certain de m'approcher du but !!

    pffff

    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    program TableauRepetition;
    uses crt;
     
    const max=50;
     
    type vecteur=array[1..max] of integer;
     
    var n,pos,compt: integer;
     
     
    procedure initialiser(var x: integer); (*defini un vecteur de n nbre*)
    var tab: vecteur;
        i,m: integer;
    begin
     
       for i:=1 to x do
          m:=random(10);
          m:=m+20;
          tab[i]:=m;
     
     
    end;
     
    procedure affichage(var x: integer); (*affiche le vecteur defini*)
    var tab: vecteur;
        i: integer;
    begin
     
       writeln('');
       writeln('Voici le vecteur choisi : ');
       writeln('');
     
       for i:=1 to x do
       begin
          write(' ',tab[i]);
       end
     
    end;
     
     
    procedure comptage(var x: integer);  (*recherche le nombre de fois que chaque nombre est repete*)
    var tab,vect: vecteur;
        cond: boolean;
        i,j: integer;
    begin
     
       cond:=true;
       pos:=1;
     
       for i:=1 to x do
       begin
     
          if i<>1 then
             for j:=(i-1) downto 1 do
             begin
                if tab[i]=tab[j] then
                begin
                cond:=false;
                end;
             end;
     
          if cond=true then
          begin
             compt:=1;
             if i=x then
             begin
                vect[pos]:=tab[i];
                vect[pos+1]:=compt;
             end
     
             else
             begin
                for j:=i+1 to x do
                begin
                   if tab[i]=tab[j] then
                      compt:=compt+1;
     
                end;
     
                vect[pos]:=tab[i];
                vect[pos+1]:=compt;
                pos:=pos+2;
             end;
     
          end;
       end;
    end;
     
    procedure affichage2; (*affiche le vecteur final*)
    var vect: vecteur;
        i: integer;
    begin
       writeln('');
       writeln('');
       writeln('voici le nouveau vecteur :');
       writeln('');
     
       for i:=1 to (pos-1) do
       begin
          write(' ',vect[i]);
       end;
    end;
     
    begin (*debut du programme principal*)
     
       repeat
          writeln('Combien voulez vous de nombre dans le vecteur ?');
          readln(n);
       until (n<=max);
     
       initialiser(n);
       affichage(n);
       comptage(n);
       affichage2;
     
    readkey;
    end.

  15. #15
    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
    Points : 2 501
    Points
    2 501
    Par défaut
    je vois dejà une grande difference entre le prototype des fonctions que je t'ai proposés et ce que tu as fait. Par exemple :
    tu as ecrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    procedure initialiser(var x: integer);
    Le but de la procédure est d'initialiser un élément de type vecteur, c'est à dire ton tableau de Max éléments.
    Voici ce que devrait etre cette procdure en réalité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure initialiser(var tab: vecteur; n : integer); (*defini un vecteur de Max nbre*)
     var   i : integer;
    begin
     
       for i:=1 to n do
          tab[i]:=random(10)+20;
     
    end;
    Si je fais pareil pour affichage : le but est d'afficher le vecteur passé en paramètre à la procédure.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    procedure affichage(tab: vecteur; n : integer); (*affiche le vecteur defini*)
     var  i: integer;
    begin
     
       writeln();
       writeln('Voici le vecteur choisi : ');
       writeln();
     
       for i:=1 to n do
          write(' ', tab[i]);
     
    end;
    Le rôle d'un paramètre est de donner des informations à la procédure, ou de prendre des informations traitées dans une procédure.
    Quand on passe un parametre par valeur, sans le mot var on s'attend à ce que la procedure utilise cette information. par contre si on le passe par reference avec le mot var, la valeur de la variable doit etre modifiée afin de recuperer une information.

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 31
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par darrylsite Voir le message
    Le but de la procédure est d'initialiser un élément de type vecteur, c'est à dire ton tableau de Max éléments.
    Voici ce que devrait etre cette procdure en réalité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure initialiser(var tab: vecteur; n : integer); (*defini un vecteur de Max nbre*)
     var   i : integer;
    begin
     
       for i:=1 to n do
          tab[i]:=random(10)+20;
     
    end;
    Si je fais pareil pour affichage : le but est d'afficher le vecteur passé en paramètre à la procédure.


    Le rôle d'un paramètre est de donner des informations à la procédure, ou de prendre des informations traitées dans une procédure.
    Quand on passe un parametre par valeur, sans le mot var on s'attend à ce que la procedure utilise cette information. par contre si on le passe par reference avec le mot var, la valeur de la variable doit etre modifiée afin de recuperer une information.
    Merci pour les info je comprends mieux masi voici sur quoi je me suis basé (vu dans mon cours):

    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
    procedure echangeplus(var x,y: integer; n :real)
    var temp: real;
    begin
       temp:=x;
       x:=y+n;
       y:=temp+n;
    end;
     
    begin
    ...
    a:=5;
    b:=7;
    c:=9;
    echangeplus(a,b,c);
    ...
    end.
    Alors je comprends ton exemple mais je vois que dans celui de mon cours, pendant l'appel de la procedure on defini x,y et n avec a,b et c !
    Donc on donne a la procedure avec quelles valeurs travailler.

    Or ici ce que tu me demande c'est de passer "tab" comme valeur par adresse mais il faut bien lui donner une valeur antérieurement ! Si je suis mon exemple...

    Et je j'essaye de compiler en ne mettant que "initialiser(n)" j'ai un "type mismatch"....

    Merci

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 31
    Points : 11
    Points
    11
    Par défaut
    Bonjour !!

    Voila j'ai fait les modifications nécessaire et j'ai réussi !
    Le programme marche nikel.
    J'ai maintenant bien compris les rôles joués par les paramètres dans la proccédure (par adresse et par valeur).

    Merci pour votre aide.

    Voici le code "final" (qui peut etre amélioré j'en suis sur...)

    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    program TableauRepetition;
    uses crt;
     
    const max=50;
     
    type vecteur=array[1..max] of integer;
     
    var n,pos,compt: integer;
        tab,vect: vecteur;
     
     
    procedure initialiser(var tab: vecteur; n: integer); (*defini un vecteur de n nbre*)
    var i: integer;
    begin
       for i:=1 to n do
       tab[i]:=random(10)+20;
    end;
     
     
    procedure affichage(tab: vecteur; n: integer); (*affiche le vecteur defini*)
    var i: integer;
    begin
       writeln('');
       writeln('Voici le vecteur choisi : ');
       writeln('');
       for i:=1 to n do
          write(' ',tab[i]);
    end;
     
     
    procedure comptage(var vect: vecteur; tab: vecteur; n: integer);  (*recherche le nombre de fois que chaque nombre est repete*)
    var cond: boolean;
        i,j: integer;
    begin
       pos:=1;
     
       for i:=1 to n do
       begin
          cond:=true;
          if i<>1 then
             for j:=(i-1) downto 1 do
             begin
                if tab[i]=tab[j] then
                begin
                cond:=false;
                end;
             end;
     
          if cond=true then
          begin
             compt:=1;
             if i=n then
             begin
                vect[pos]:=tab[i];
                vect[pos+1]:=compt;
                pos:=pos+2;
             end
     
             else
             begin
                for j:=i+1 to n do
                begin
                   if tab[i]=tab[j] then
                      compt:=compt+1;
                end;
     
                vect[pos]:=tab[i];
                vect[pos+1]:=compt;
                pos:=pos+2;
             end;
     
          end;
       end;
    end;
     
    procedure affichage2(vect: vecteur); (*affiche le vecteur final*)
    var i: integer;
    begin
       writeln('');
       writeln('');
       writeln('voici le nouveau vecteur :');
       writeln('');
       for i:=1 to (pos-1) do
       write(' ',vect[i]);
    end;
     
    begin (*debut du programme principal*)
    randomize;
       repeat
          writeln('Combien voulez vous de nombre dans le vecteur ? (Max 50)');
          readln(n);
       until (n<=max);
     
       initialiser(tab,n);
       affichage(tab,n);
       comptage(vect,tab,n);
       affichage2(vect);
     
    readkey;
    end.

  18. #18
    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
    Points : 2 501
    Points
    2 501
    Par défaut
    Tu peux biensur faire quelques amelioration :
    Dans les condition des structure if, il est inutile de mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     if condition=true then
    tu peux mettre directement
    Ceci se justifie par le fait que condition est dejà une valeur booleenne qui a donc la valeur true ou false.
    De meme pour faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if condition=false then
    tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if not confition then
    Autre chose, je crois qu'il peut avoir des problemes dans ta procedure comptage. je suppose que tu crée un nouveau vecteur contenant tous les nombres du tableau de depart avec leurs occuences. Alors si on a un tableau de n elementsn la taille du nouveau vecteur est donc 2*n. Si 2*n est superieur à Max, on aura biensur un debordement d'indice. A moins que je ne comprenne pas ta logique.

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 31
    Points : 11
    Points
    11
    Par défaut
    On peut placer par exemple ici 50 éléments dans le premier vecteur.
    Mais le deuxième ne pourra en contenir maximum 20 (10 nombres plus leur rep) si tous les nombres entre 20 et 30 sont utilisés.

    Mais ici je n'aurais jamais débordement d'indice pour le deuxième vecteur ou alors je ne vois pas trop ce que tu veux me dire...

  20. #20
    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
    Points : 2 501
    Points
    2 501
    Par défaut
    Citation Envoyé par junko21 Voir le message
    On peut placer par exemple ici 50 éléments dans le premier vecteur.
    Mais le deuxième ne pourra en contenir maximum 20 (10 nombres plus leur rep) si tous les nombres entre 20 et 30 sont utilisés.

    Mais ici je n'aurais jamais débordement d'indice pour le deuxième vecteur ou alors je ne vois pas trop ce que tu veux me dire...
    ok, c'est que je pensais à un truc plus general.
    D'apres ton code qu'afficherait le vecteur suivant : 20, 21, 25, 21, 21, 20 ?
    affichera t- il : 20 :2, 21:3, 25:1, 21:3, 21:3, 20:2?
    Si c'est le cas, tu n'as pas encore répondu à la question. car la reponse doit etre :20 :2, 21:3, 25:1

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [AC-2003] Valeur identique dans 2 sous-formulaires
    Par lucas-18 dans le forum IHM
    Réponses: 7
    Dernier message: 30/09/2009, 18h30
  2. Comptage de valeurs contenues dans autre colonne
    Par Ludwig_von_88 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 10/06/2009, 20h33
  3. Réponses: 8
    Dernier message: 28/12/2008, 17h08
  4. Lire des valeurs spécifiques dans un vecteur
    Par HOLLY dans le forum MATLAB
    Réponses: 4
    Dernier message: 28/06/2008, 14h04
  5. recherche de valeur identique dans un tableau
    Par jean tof dans le forum Langage
    Réponses: 9
    Dernier message: 20/06/2006, 13h33

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