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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 35
    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
    8 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 8 049
    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
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 35
    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
    8 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 8 049
    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
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 35
    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
    8 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 8 049
    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]

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