Afficher une diagonale d' un tableau

Fermé
muntu - 6 août 2010 à 06:56
 winie - 6 août 2010 à 17:26
Bonjour,

Je suis nouveau en programmation, s'il vous plait, est ce que quelqu'un veut bien m'aider ?
je voudrais afficher un tableau en bouleversant les cases mais tout en gardant la diagonale en place. Au fait mon problème c'est que lorsque mon tableau est de 3 lignes et 3 colonnes, ça va bien mais quand c'est au delà, il va pas jusqu'au bout.

Pour être plus explicite :

Voici mon tableau mon tableau lorsque j'ai tab[3][3] :

14 10 5

13 8 3

87 24 113

Et voici ce que je veux avoir :

113 3 5

13 8 10

87 24 14

Mais lorsque j'ai tab[4][4] par exemple (quand c'est de 3 lignes et 3 colonnes ) :

voici mon tableau d'origine

14 3 9 5

40 8 13 12

11 6 42 75

80 62 17 77

Ce que j'ai après bouleversement :

42 75 9 5
17 8 13 12
11 6 14 3
80 62 40 77


On voit bien que le changement ne s'applique pas jusqu'à la dernière colonne.

Voici mon code qui me permet de bouleverser mon tableau :

var est la valeur de la ligne et de la colonne; donc si j'ai tab[4][4]; var = 4;

for(int i=0,I1=1,I2=2;i<tab.length; i++,I1++,I2++)
{
for(int j=0,J1=1,J2=2,J3=3;j<tab.length; j++,J1++,J2++,J3++)
{
temp=tab[i][j];

if(j < var && i< var){

if(J1==var)

{

tab[i][j] = tab[I1][J1];

tab[I1][J1]=temp;

}
else {

tab[i][j] = tab[I2][J2]; tab[I2][J2]=temp;


}

var--;}


System.out.print("\t"+tab[i][j]);

}System.out.println("");
}


}


merci d'avance !
A voir également:

7 réponses

Leviathan49 Messages postés 257 Date d'inscription jeudi 10 juin 2010 Statut Membre Dernière intervention 22 juillet 2011 70
Modifié par Leviathan49 le 6/08/2010 à 08:50
Sans faire aussi compliqué :
int n = 4; 
for(int i=0;i<n:i++) 
{ 
    for(int j=0;i<n:i++) 
    { 
         if((i+j)!=n-1) 
         { 
             int tmp = tab[i][j]; 
             tab[i][j] = tab[j][i]; 
             tab[j][i] = tmp; 
         } 
    } 
}
0
commentcamarcheeay Messages postés 667 Date d'inscription mercredi 24 février 2010 Statut Membre Dernière intervention 30 mars 2020 86
Modifié par commentcamarcheeay le 6/08/2010 à 09:11
Bonjour,
Le code que tu as donné est celui de la transposée d'une matrice, ce n'est pas ce qui a été demandé.
Mais le principe est bon!
0
commentcamarcheeay Messages postés 667 Date d'inscription mercredi 24 février 2010 Statut Membre Dernière intervention 30 mars 2020 86
Modifié par commentcamarcheeay le 6/08/2010 à 10:56
Bonjour,

Je voie que tu es entré dans une boucle complexe. Certes, comme ton tableau est en deux dimensions, tu vas avoir besoin de deux boucles imbriquées, mai le fait d'utiliser trop de paramètres n'est pas en ta faveur.

Avant de commencer à réfléchir programmation, il faut bien définir le problème. Le problème que tu cherches à résoudre est celui de trouver le miroir d'une transposée d'un miroir d'une matrice carrée.
exemple pour une matrice 2x2 :

1a-1b     m     1b-1a    t    1b-2b    m   2b-1b    
2a-2b   --->    2b-2a  --->   1a-2a  --->  2a-1a 


On va considérer les notations suivantes :
tab est ta matrice, i est son indice de ligne et j son indice de colonne.
i : varie de 0 à n
j : varie de 0 à n

t(tab)[i][j] = transposée(tab)[i][j] = tab[j][i]
m(tab)[i][j] = miroir(tab)[i][j] = tab[i][n-j]

Donc, on va composer une fonction miroir o transposée o miroir
On a
m(t(m(tab)))[i][j] = t(m(tab))[i][n-j] 
                   = m(tab)[n-j][i] 
                   = tab[n-j][n-i] 

Finalement, tu cherches un algorithme qui transforme tab[i][j] en tab[n-j][n-i]

Je mettrai le code dans le prochain message.

C. Taha
0
commentcamarcheeay Messages postés 667 Date d'inscription mercredi 24 février 2010 Statut Membre Dernière intervention 30 mars 2020 86
Modifié par commentcamarcheeay le 6/08/2010 à 10:57
Voici le code comme promis :

int n = length(tab)-1;  
if(n != length(tab[0])-1){system.out.print("message d'erreur")}  

for(int i=0 ; i<n ; i++)   
{   
    for(int j=0 ; j<n-i ; j++)   
    {  
         int tmp = tab[i][j];  
         tab[i][j] = tab[n-j][n-i];  
         tab[n-j][n-i] = tmp;  
    }   
}  


C. Taha
0
merci à vous pour vos réponses, seulement, ça marche pas, pour le code de Leviathan49 ça va pas, et pour le commentcamarcheeay, j'ai l'impréssion que c'est du bon, sauf k'il n'affiche pas tout.

voici ce k j'ai donc fait avec le code de commentcamarcheeay

int n = tab.length-1;
if(n != tab[0].length-1){System.out.print("message d'erreur");}

for(int i=0;i<n;i++)
{ //int ;
for(int j=0;j<n-i;j++)
{// int test2=tab.length-j;

int tmp = tab[i][j];
tab[i][j] = tab[n-j][n-i];
tab[n-j][n-i] = tmp;
System.out.print("\t"+tab[i][j]);


}System.out.println("");
}

}

et qu'il medonne c'est :

5 15 4
116 104
7
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Leviathan49 Messages postés 257 Date d'inscription jeudi 10 juin 2010 Statut Membre Dernière intervention 22 juillet 2011 70
6 août 2010 à 14:00
int n = tab.length-1;
if(n != tab[0].length-1){System.out.print("message d'erreur");}

for(int i=0;i<n;i++)
{ //int ;
    for(int j=0;j<n-i;j++)
    {// int test2=tab.length-j;

        int tmp = tab[i][j];
        tab[i][j] = tab[n-j][n-i];
        tab[n-j][n-i] = tmp;
    }
}

for(int i=0 ; i<n ; i++)   
{   
    for(int j=0 ; j<n ; j++)   
    {  
        System.out.print(tab[i][j]+"\t"); 
    }
   System.out.print("\n"); 
} 
Non, non le code de commentcamarcheeay marche c'est juste que tu lui demande d'afficher que la moitié du tableau ^^
0
Excusez-moi, je me suis trompé, pour lire il faut créer une nouvelle boucle.

Merci beaucoup, commentcamarcheeay et à tous ceux qui ont tenté à me dépanner.

Merci encore, à+++++++++++

vive comment ça marche
0
je connais pas trop grande chose en programmation voici le programme lecompilateur ne veut pas executer pour moi quelqu'un peut m'aider s'il vous plait.

#include <conio.h>
#include<iostream.h>
class produit{
float prixtotal ;
int qte;
char nom[10];
public:
void afficher();
produit(float x,int quantite,char *w){
prixtotal=x;
qte=quantite;
nom=w;}
};

void main(){
clrscr();
produit p;
char c;
intx a;
float z;
cin>>c>>a>>z;

void produit::afficher();
{cout<<nom;
cout<<qte;
cout<<nom;}
0