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 :

Trier les colonnes d'une matrice de caractères


Sujet :

Turbo Pascal

  1. #1
    Candidat au Club
    Femme Profil pro
    Développeur décisionnel
    Inscrit en
    Mai 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur décisionnel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Trier les colonnes d'une matrice de caractères
    Afin d'auditer son système informatique une société décide d'évaluer les mots de passe de ses employés. Pour ce faire on doit remplir une matrice qui contient les mots de passe cryptés. Un mot de passe est composé de 8 caractères. Le procédé d'évaluation passe par les étapes suivantes :

    1. Remplir une matrice M. On distribue les caractères du mot de passe dans chaque ligne de la matrice.
    2. Pour décrypter les mots de passe on procède à un tri de la matrice en ordre croissant par colonne.


    Exemple :

    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    m	3	A	O	s	M	*	$
    $	2	u	L	o	r	1	a
    1	o	B	l	y	s	a	]
    [	*	B	n	i	7	3	2

    Après le tri des colonnes, la matrice devient :

    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $	*	A	L	I	7	*	$
    1	2	B	O	o	M	1	2
    [	3	B	l	s	s	3	]
    m	o	u	n	y	r	a	a

    J'ai proposé cette solution mais ç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
    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
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    program tp;
    uses wincrt;
    type 
     
    	mat=array[1..10,1..10]of char;
    tab=array[1..100] of char;
    var
    t:tab;
     
    	m:mat;
    	n,c,k:integer;
     
     
    	var
    		i,j:integer;
        begin
    		writeln('n=');
    		readln(n);
    repeat    
    		writeln('c=');
    		readln(c);
    until(c<=8);    
    		for i:=1 to n do
    			begin
    			for j:=1 to c do
    begin
    				writeln('m[',i,j,']=');
    		readln(m[i,j]);
    end;
    end;
    end;
    procedure tri(var t:tab;k:integer);
    var i:integer;
    temp:char;
        permuter:boolean;
    begin
         repeat
               permuter:=false;
               for i:=1 to n-1 do
               begin
                    if ord(t[i])>ord(t[i+1]) then
                    begin
                         temp:=t[i];
                         t[i]:=t[i+1];
                         t[i+1]:=temp;
    permuter:=true;
                    end;
               end;
     
         until (permuter=false);
    end;
    procedure affiche_t(t:tab;k:integer);
    	var
    		i:integer;
        begin
    		for i:=1 to k do
    begin
     
    				              writeln(t[i]);
     
    end;
                end;
     procedure regrouper (var m:mat; var n,c:integer;t:tab;k:integer);
    		var
    			l,i,j:integer;
    		begin
    			l:=0;
     
    				for i:=1 to n do
    		               begin
     
    			             for j:=1 to c do
    begin
    l:=l+1;
    								m[j,i]:=t[l];
     
                            end;
                    end;
    end;    
    procedure eclater(m:mat;n,c:integer;var t:tab;var k:integer);
    var
    i,j:integer;
    	begin
     
     
    				for i:=1 to n do
    begin
     
    			k:=0;
                 					for j:=1 to c do
                      begin
                                        k:=k+1;
    								 t[k]:=m[j,i];
     
     
    writeln(t[k]);
    end;
    tri(t,k);
    writeln('tableau n',i,'apres tri');
       affiche_t(t,k);    
    regrouper(m,n,c,t,k);
     
     
                end;
     
     
          end;
     
     
     
     
     
     
    procedure affiche_m(m:mat;n,c:integer);
    	var
    		i,j:integer;
        begin
    		for i:=1 to n do
    begin
    			for j:=1 to c do
    				              write(M[i,j]);
    				              writeln;
    end;
                end;
     
     
     
     
    begin
     
    	remplir(m,n,c);
    	affiche_m(m,n,c);
    	eclater(m,n,c,t,k);
     
    	affiche_m(m,n,c);
     
     
    end.

  2. #2
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    Salut

    Bon quelques soucis dans ton code.
    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
     
    //// il manque la declaration d'une procedure 
    var
      i,j:integer;
    Begin
       writeln('n=');
       readln(n);
      repeat 
         writeln('c='); readln(c);
      until(c<=8);
     
      for i:=1 to n do
      begin
        for j:=1 to c do
        begin
           writeln('m[',i,j,']='); readln(m[i,j]);
        end;
      end;
    end;
    De plus change le nom de tes variables globales et locales, à la fin on perd un peu le fil.
    Exemple : pour le tableau => TTab
    pour la matrice TMat
    idem pour les variables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      GlobTab : TTab;
      GlobMat : TMat ;
      ...
    Ensuite le code de regroupement ou d'éclatement de ta matrice peut être nettement amélioré. À savoir qu'en Pascal array[1..100] est identique à array[1..10,1..10].
    Je préfère utiliser des tableaux dynamiques :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      TTab = array of Char ;
      TMat = Array of  TTab;
      ...
      GlobTab :  TTab; 
      GlobMat :  TMat;
      ...
      Setlength(GlobTab ,n*c);
      Setlength(GlobMat,n,c); 
      ...
    Donc nous pouvons directement calculer l'indice sans passer par une variable intermédiaire

    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
    procedure regrouper (var m:Tmat; var n,c:integer;t:Ttab);
    var
      i,j:integer;
    begin
      for i:=0 to n-1 do
        for j := 0 to c-1 do
          m[j,i]:=t[i*n+j];
    end;
    
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    12
     
    a l'inverse on peut aussi retrouver
    procedure regrouper (LocMat :Tmat; var n,c:integer;var VLocTab:Ttab); var i,j:integer; begin for i:=0 to n-1 do for j := 0 to c-1 do VLocTab[i*n+j] := LocMat[j,i]; end;
    Ensuite ton tri est un tri à bulle :

    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
     
    procedure TriBulle (var VLocTab :Ttab; n,c:integer) ; 
    var i, j, t : integer; 
    K : Integer;
    begin 
      K := n*c
      for i := K-1 downto 0 do 
        for j := 2 to i do 
          if VLocTab[j-1] > VLocTab[j] then 
          begin 
            t := VLocTab[j-1]; 
            VLocTab[j-1] := VLocTab[j]; 
            VLocTab[j] := t; 
         end; 
    end;
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Procedure MainProcess;
       regrouper (GlobMat,n,c,GlobTab);
       tri(t,k);
        writeln('tableau n',i,'apres tri');
        affiche_t(GlobTab,n,c); 
        regrouper(GlobMat,n,c,GlobTab);
       ...
    Je n'ai pas vérifié mon code pour les limites mais l'esprit est là.
    En regardant bien le code tu dois pouvoir continue?
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  3. #3
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Salut pour ta matrice si je comprend bien chaque colonne est un caractère du mot de passe et les lignes les utilisateurs, c'est bien ça ?

    Donc question, peut-être bête, mais en quoi le fait de trier tes données te permet d'évaluer les mots de passes ? je pige pas

    Une petite discussions intéressante sur le sujet ici https://www.developpez.net/forums/d1...exite-d-passe/

    Comment tester la fiabilité d'un mot de passe ?
    1. Nombre de caractères minimum 8
    2. Le mdp contient t-il des majuscules ? si oui combien ? quel est le ratio ?
    3. Le mdp contient t-il des minuscules ? si oui combien ? quel est le ratio ?
    4. Le mdp contient t-il des chiffres ? si oui combien ? quel est le ratio ?
    5. Le mdp contient t-il des caractères spéciaux ? si oui combien ? quel est le ratio ?


    Après tu peux calculer un indice de fiabilité en fonctions de ces données.

    Il existe un tas d'exemple sur le sujet notamment en Javascript et PHP sur le web

    Autre truc bête mais un mot de passe brut de 8 caractères ne fait pas forcémment la même longueur (8 caractères) lorsque celui-ci est crypté. Et de plus tester un mot de passe crypter n'as aucun sens pour moi.

    A+

    EDIT : Ta société ferai mieux de tester l'efficacité des mots de passe lorsque l'employé le saisi. (C'est d'ailleurs comme ça que font la majorité des sites web, qui mettent en place ce genre de test). La fiabilité de tes mots de passe dépend également de l'algorithme de cryptage mise en place (md5,sha1, md5crypt, BCrypt ect....)
    cf : https://www.enovanet.fr/pages/blogde...?lang=fr&no=24 et https://pwdtest.bee-secure.lu par exemple
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  4. #4
    Candidat au Club
    Femme Profil pro
    Développeur décisionnel
    Inscrit en
    Mai 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur décisionnel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Tri des colonnes d'une matrice
    Bonjour,

    Je souhaiterais trier les colonnes d'une matrice, pourriez-vous m'indiquer comment faire s'il vous plait ?

    Voici un exemple :

    2 11 3
    1 10 1
    3 12 0

    La matrice triée sera :

    1 10 0
    2 11 1
    3 12 3

    Merci d'avance.

  5. #5
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Bonjour,
    un algorithme de tri à bulle pour chaque colonne devrait faire l'affaire à mon avis regardes ici http://jean-pierre.moreau.pagesperso...fr/p_sort.html --> BUBBLE.Pas cela devrait t'aider.

    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  6. #6
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Avec mon ami google je suis tombé la dessus


    Sinon n'oublis pas de consulter également le wiki de free pascal : http://wiki.freepascal.org/Bubble_sort il y a énormément d'informations. Car je suppose que c'est par rapport a tes cours
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  7. #7
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut

    au vu des données un simple trie par denombrement serais bien plus efficace
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  8. #8
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    En toute chose l'important est de commencer par le début.

    Personnellement j'aurais commencé par écrire une procédure qui remplit aléatoirement une matrice, de façon à ne pas avoir à saisir des valeurs au clavier à chaque fois que je veux essayer mon programme.

    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
     
    const
      NColonnes = 8;
      NLignes = 4;
     
    type
      TMatrice = array[1..NColonnes, 1..NLignes] of char;
     
    procedure Remplir(var aMatr: TMatrice);
    var
      x, y: integer;
    begin
      for x := 1 to NColonnes do
        for y := 1 to NLignes do
          aMatr[x, y] := char(Ord('a') + Random(26));
    end;
     
    procedure Afficher(const aMatr: TMatrice);
    var
      x, y: integer;
    begin
      for y := NLignes downto 1 do
      begin
        for x := 1 to NColonnes do
          Write('  ', aMatr[x, y]);
        WriteLn;
      end;
    end;
     
    var
      m: TMatrice;
     
    begin
      Randomize;
      Remplir(m);
      Afficher(m);
      ReadLn;
    end.
    Ensuite, j'aurais essayé d'écrire une procédure qui affiche le contenu d'une seule colonne.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

Discussions similaires

  1. modification des colonnes d'une matrice
    Par Minouchka dans le forum C
    Réponses: 5
    Dernier message: 05/04/2009, 11h28
  2. Réponses: 11
    Dernier message: 11/09/2007, 12h25
  3. Somme des colonne d'une matrice
    Par nessing dans le forum C++Builder
    Réponses: 3
    Dernier message: 09/08/2007, 13h41
  4. tri des valeurs d'une matrice
    Par suzanne loubert dans le forum Langage
    Réponses: 2
    Dernier message: 07/12/2005, 03h47
  5. Tri des colonnes d'une DBGRID
    Par Atrebate62 dans le forum Bases de données
    Réponses: 3
    Dernier message: 31/05/2004, 12h20

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