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 :

Programme manipulation de matrice


Sujet :

Pascal

  1. #1
    En attente de confirmation mail
    Inscrit en
    Mars 2009
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 35
    Points : 33
    Points
    33
    Par défaut Programme manipulation de matrice
    bonjour,
    pouvez-vous m'aidez a faire un programme qui transforme une matrice simple (carré) en la meme matrice sauf qu'on doit prendre le losange qui est dont le tableau et le remplir en 0 exemple:
    nous avons un tableau [5,5]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    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
    tous ce qui est en rouge doit devenir des 0
    après l'exécution il doit affiché:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    1	 2	 0	 4	 5
    6	 0	 0      0       10
    0	0	0	0	0
    16	0	0	0	20
    21	22	0	24	25
    d'après moi en doit prendre les diagonale des quatres petites matrice pour tracés le losange mais pour le remplir ,je c'est pas?
    voila:

    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
    program matrice;
    uses crt;
    var
    a : array [1..50,1..50] of integer;
    m,i,j,n : integer;
    begin
    gotoxy (10,10);
    textcolor (3);
    textbackground (12);
    write;
    writeln ('                       donner la taille du tableau                ');
    write;
    readln (n);
    write;
    writeln ('                  donner les valeur du tableau');
    for i:=1 to n do
        begin
             for j:=1 to n do
             read (a[i,j]);
        end;
    m:= n div 2;
     
         for i:=1 to m do
             begin
             for j:=1 to m do
                 a[m-i+1,m-j+1]:=0;
             end;
     
         for m:=n div 2 to n do
                begin
                for j:=1 to m do
                    a[i,i]:=0;
                end;
     
         for i:=1 to m do
               begin
               for m:= n div 2 to n do
                   a[i,i]:=0;
               end;
         for m:=n div 2 to n do
               a[n-m+1,n-m+1]:=0;
     
    write;
    writeln ('                       le tableau apres ');
    for i:=1 to n do
        begin
             for j:=1 to n do
             writeln (a[i,j]);
        end;
    end.

    MERCI POUR VOTRE AIDE.

  2. #2
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 939
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Il y a moyen de faire plus simple.

    La première chose à faire est de calculer l'indice de la médiane, qui vaut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Centre := n div 2 + n mod 2;
    Ensuite, essaye de faire ton exercice sur papier, en raisonnant ligne par ligne (par exemple, sur une matrice 7 * 7) :
    • Ligne 1 : mettre à 0 la cellule du milieu (d'indice Centre)
    • Ligne 2 : mettre à 0 de (Centre - 1) à (Centre + 1)
    • Ligne 3 : mettre à 0 de (Centre - 2) à (Centre + 2) - Tu repères la variable qui s'incrémente ?
    • Ligne 4 (médiane) : mettre à 0 de (Centre - 3) à (Centre + 3), c'est-à-dire la ligne complète
    • Ligne 5 : mettre à 0 de (Centre - 2) à (Centre + 2) - La variable se décrémente à présent
    • Ligne 6 : mettre à 0 de (Centre - 1) à (Centre + 1)
    • Ligne 7 : mettre à 0 la cellule du milieu, c'est-à-dire de (Centre - 0) à (Centre + 0)

    Avec ceci, tu devrais trouver un algorithme assez simple avec deux boucles imbriquées : la boucle externe, qui fait varier le n° de ligne de 1 à n, et la boucle interne qui fait varier la distance par rapport au centre, d'abord positivement puis, lorsque le n° de ligne dépasse la médiane, négativement.

    Pour terminer, il faut envisager le cas d'une matrice de largeur paire et ajouter un test dans chacune des boucles imbriquées pour gérer ce cas.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  3. #3
    En attente de confirmation mail
    Inscrit en
    Mars 2009
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 35
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par Alcatîz Voir le message
    Bonjour,

    [*]Ligne 1 : mettre à 0 la cellule du milieu (d'indice Centre)[*]Ligne 2 : mettre à 0 de (Centre - 1) à (Centre + 1)[*]Ligne 3 : mettre à 0 de (Centre - 2) à (Centre + 2) - Tu repères la variable qui s'incrémente ?[*]Ligne 4 (médiane) : mettre à 0 de (Centre - 3) à (Centre + 3), c'est-à-dire la ligne complète
    bonsoir;
    pour les quartes première ligne j'ai pu réaliser le programme mais pour les autre ligne (i> médiane) j'ai fait la négation du premier semi losange ,lors de l'exécution le pascal c'est bloqué et j'ai pas enregistré en tout cas j'ai ressayais de le refaire et voila ce que a donné :
    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
    program matrice;
    uses crt;
    var
    a : array [1..50,1..50] of integer;
    k,centre,i,j,n : integer;
    begin
     
    gotoxy (10,10);
    textcolor (3);
    textbackground (12);
    write;
    writeln ('                       donner la taille du tableau                ');
    write;
    readln (n);
    write;
    writeln ('                  donner les valeur du tableau');
    for i:=1 to n do
        begin
             for j:=1 to n do
             read (a[i,j]);
        end;
    centre:=( n div 2+ n mod 2);
    for i:=1 to (n div 2 +n mod 2) do
        begin
             for j:=1 to n do
            begin
             if  j<=(n div 2 + n mod 2) then
                 begin
             a[i,centre]:=0;
             centre:=centre-1;
                 end
             else
                 begin
             a[i,centre]:=0;
             centre:=centre+1;
                 end;
            end;
        end;
     
     
    write;
    writeln ('                       le tableau apres ');
    for i:=1 to n do
        begin
             for j:=1 to n do
             writeln (a[i,j]);
        end;
    Readln;
     
    end.
    j'espère que c'est pas trois demandé de voir qu'est-ce-que il me manque dans la boucle pour transformé le premier semi-losanage?,svp

  4. #4
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 939
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Allez, tu n'es pas loin de la solution.

    Tu as déclaré un indice k, tu peux l'utiliser. Dans ce qui suit, i est le n° de ligne, j la "distance" par rapport à la médiane verticale et k simplement le n° de colonne des cellules à zéroter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      j := 0;
      for i := 1 to n do
        begin
          for k := (Centre - j) to (Centre + j) do
            a[i,k] := 0;
          if i < Centre
             then { Le losange s'élargit }
               j := j + 1
             else { La médiane est dépassée, le losange rétrécit }
               j := j - 1;
        end;
    Autre chose : tu affiches deux fois ta matrice et écris donc deux fois le même code. Ce serait une bonne chose de créer une procédure qui affiche la matrice et d'appeler celle-ci deux fois.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  5. #5
    En attente de confirmation mail
    Inscrit en
    Mars 2009
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 35
    Points : 33
    Points
    33
    Par défaut

    Citation Envoyé par Alcatîz Voir le message
    Autre chose : tu affiches deux fois ta matrice et écris donc deux fois le même code. Ce serait une bonne chose de créer une procédure qui affiche la matrice et d'appeler celle-ci deux fois.
    J'ai pas bien compris ce que tu veut dire par affiché la matrice deux fois ,j'ai fait une procédure et voila ce que sa a donné:
    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
    program matrice;
    uses crt;
    type mat = array [1..50,1..50] of integer;
    var
    a : array [1..50,1..50] of integer;
    centre,i,j,n : integer;
    procedure losange (i,j : integer;a: mat);
    var k : integer;
    begin
    j:=0;
    centre:=( n div 2+ n mod 2);
    for i:=1 to (n div 2+n mod 2) do   {normalement c'est ca et c'est tout les ligne 1--->n,mais lors de l'execution c'est le meme resultat en-tout-ca sa m'aide pour faire l'autre moitié}
     
        begin
             for k:=(centre-j) to (centre+j) do
            begin
             a[i,k]:=0;
             if i<(n div 2 +n mod 2) then
             begin       {je doit faire un begin et un end pour que je puisse écrire else pourquoi je c'est pas?,  'pourtant j'ai qu'une seul instruction'}
             j:=j+1;
             end
             else
             begin
             j:=j-1;
             end;
            end;
        end;
    end;
    aussi pour appelai la procédure j'ai une erreur de type car la procédure ne peut pas avoir comme en sortie ou entré des type structuré encore moins un tableau a deux D.

  6. #6
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 939
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Ahum, je ne sais pas pourquoi, j'ai cru que tu affichais la matrice deux fois : avant et après la transformation. Désolé, oublie cette histoire de procédure.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  7. #7
    En attente de confirmation mail
    Inscrit en
    Mars 2009
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 35
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par Alcatîz Voir le message
    Ahum, je ne sais pas pourquoi, j'ai cru que tu affichais la matrice deux fois : avant et après la transformation. Désolé, oublie cette histoire de procédure.
    hahaha, lol tu ma envoyé contre pied ,bref c'est pas grave,moi ce que je voulez surtout comprendre c'est pourquoi vous avez fait en
    et lord du résultats il affiche rien que la moitié de la matrice, je c'est pas tros mais je panse que c'est ça le probleme normalement l'algorithme que tu m'a donner il doit affiché ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    1	 2	 0	 4	 5
    6	 0	 0      9       10
    0	0	0	0	0
    16	17	18	0	20
    21	22	0	24	25
    ????? " je me suis perdu lol"

  8. #8
    En attente de confirmation mail
    Inscrit en
    Mars 2009
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 35
    Points : 33
    Points
    33
    Par défaut
    J'ai éssaiyé de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for i:=1 to (n div 2 + n mod 2) 
    begin
    .
    .
    .
    ....end;
    la premier boucle ensuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i:=(n div 2 + n mod 2)
    beg........end;
    affiché le tableau a
    et il maffiche rien que la premier moitié de la matrice
    si comme si que la deuxième boucle est en plus.

  9. #9
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 939
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Le code ci-dessous fonctionne pour une matrice de taille impaire. Pour gagner du temps, je la remplis avec des nombres aléatoires (non nuls) au lieu de saisir les éléments au clavier et tu remarqueras que j'ai fait une procédure qui affiche la matrice avant et après la modification.
    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 Losange;
     
    Uses Crt;
     
    Type Mat = Array [1..50,1..50] of Integer;
     
    Var a : Mat;
        n, Centre : Integer;
        i, j, k : Integer;
     
    Procedure Affichage (Matrice : Mat; Largeur : Integer);
    (* Affichage de la matrice *)
    Var i, j : Integer;
    Begin
      for i := 1 to Largeur do
        begin
          for j := 1 to Largeur do
            Write(Matrice[i,j]:3);
          WriteLn;
        end;
    End;
     
    Begin
      Randomize;
      (* Lecture de la largeur de la matrice *)
      Write('Largeur de la matrice (max 50) : ');
      ReadLn(n);
      (* Remplissage aléatoire *)
      for i := 1 to n do
        for j := 1 to n do
          a[i,j] := Random(9) + 1;
      (* Affichage de la matrice avant modification *)
      WriteLn;
      WriteLn('Matrice avant modifications :');
      Affichage(a,n);
      (* Calcul de l'indice de la médiane *)
      Centre := n div 2 + n mod 2;
      (* Remplissage du losange central par des 0 *)
      j := 0;
      for i := 1 to n do
        begin
          for k := (Centre - j) to (Centre + j) do
            a[i,k] := 0;
          if i < Centre
             then   { Haut de la matrice : le losange s'élargit }
               j := j + 1
             else   { Bas de la matrice : le losange rétrécit }
               j := j - 1;
        end;
      (* Affichage de la matrice modifiée *)
      WriteLn;
      WriteLn('Matrice après modifications :');
      Affichage(a,n);
      ReadLn;
    End.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  10. #10
    En attente de confirmation mail
    Inscrit en
    Mars 2009
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 35
    Points : 33
    Points
    33
    Par défaut
    Merci bcp GG Programme

Discussions similaires

  1. Manipulation de matrice dans sous programme
    Par itectesa dans le forum C
    Réponses: 5
    Dernier message: 07/12/2009, 22h05
  2. manipulation des matrices sous SSRS
    Par linram dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 09/07/2007, 12h31
  3. [Manipulation de matrices] Elements adjacents
    Par Opérateur dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 25/11/2006, 11h30
  4. Fonctions manipulant des matrices
    Par panda31 dans le forum C
    Réponses: 24
    Dernier message: 14/06/2006, 10h28
  5. Manipulation de matrices.
    Par TeKa dans le forum C
    Réponses: 28
    Dernier message: 16/11/2005, 15h53

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