/* zTranforme. Exercice1 */
void inverse ( Tableau2d *t )
{
int dmax = t->nlin >= t->ncol ? t->nlin : t->ncol;
int lin, col;
for ( lin = 0; lin < dmax; lin++ )
for ( col = lin; col < dmax; col++ )
swap ( &t->tab[col][lin], &t->tab[lin][col] );
swap ( &t->nlin, &t->ncol );
}
Je suis pas du tout convaincu par ce genre de bricolage (tu inclus ton tableau dans un grand carré et là tu fais l'échange mais c'est affreux parce que si tu as un tableau de 1 ligne et 500 colonnes, tu vas faire grosso modo 25000 opérations au lieu de 500). Ça vient aussi du fait que le problème 'a pas été clairement posé.
#include <stdio.h>
#include <stdlib.h>
#define Max 999
/* fonction pour la saisie securise */
void viderBuffer(void)
{
int c=0;
while (c !='\n' && c!=EOF)
{
c=getchar();
}
}
int lireInt (void)
{
int x;
int erreur=0;
while (erreur==0)
{
erreur=scanf("%d",&x);
if (erreur==0) {printf("Vous trompez pas saisissez un nombre ! RECOMMENCEZ\n");}
viderBuffer();// ici vider buffer
}
return x;
}
/* fonctions pour les matrices affichage, copie, entrée des valeurs*/
void affiche(int tableau[Max][Max],int x,int y)
{
int i,j;
for(i=0;i<x;i++)
{
for (j=0;j<y;j++)
{
printf("%d ",tableau[i][j]);
}
printf("\n");
}
}
void recopie (int tableau[Max][Max],int tableauRecopier[Max][Max] ,int x,int y)
{
int i,j;
for(i=0;i<x;i++)
{
for (j=0;j<y;j++)
{
tableauRecopier[i][j]=tableau[i][j];
}
}
}
void lireDimension (int *x, int *y)
{
*x=lireInt();
*y=lireInt();
}
void lireTableau(int tableau[Max][Max],int x,int y)
{
int i,j;
for(i=0;i<x;i++)
{
for (j=0;j<y;j++)
{
tableau[i][j]=lireInt();
}
printf("\n");
}
}
/* fonctions des exo demandés */
void exo1 (int tableau[Max][Max],int x,int y)
{
int tableau2[Max][Max];
int i,j;
recopie (tableau,tableau2,Max,Max);
for(i=0;i<x;i++)
{
for (j=0;j<y;j++)
{
tableau[i][j]=tableau2[j][i];
}
}
affiche(tableau,x,y);
}
void exo2 (int tableau[Max][Max],int x,int y)
{
int tableau2[Max][Max];
int i,j;
recopie (tableau,tableau2,Max,Max);
for(i=0;i<x;i++)
{
for (j=0;j<y;j++)
{
tableau[i][j]=tableau2[x-1-j][i];
}
}
affiche(tableau,x,y);
}
void exo3(int X)
{
int i,j;
for(i=0;i<X;i++)
{
for (j=0;j<X;j++)
{
if ((i==j)|| j == (X - i-1))
{
printf("# ");
}
else
{
printf("%d ",j);
}
}
printf("\n");
}
}
int main(void)
{
int tableau[Max][Max];
int tableauCopier[Max][Max];
int X;
int Y;
printf("Dimensions du tableau :\n");
lireDimension(&X,&Y);
lireTableau(tableau,X,Y);
recopie(tableau,tableauCopier,Max,Max);
printf("\ntransformation exo 1 :\n");
affiche (tableau,X,Y);
printf("\n");
exo1(tableau,X,Y);
printf("\nrotation a droite de ce meme tableau\n");
recopie(tableau,tableauCopier,Max,Max);
exo2(tableau,X,Y);
printf("\n exo3 \n");
printf("Dimension ?:");
X=lireInt();
exo3(X);
return 0;
}
l'eternelle question qu'en pensez vous ?
PS : pas si evident que cela à trouver une solution. Pour ma part j'ai utilise a chaque fois deux tableaux : un pour le resultat l'autre pour garder le tableau originel !Avez vous trouver une autre solution vu que j'ai vachement de mal a decortiquer les codes de chacun (celui androneus , rien compris, j'ai pataugé dans la semoule )
merci
PS : pas si evident que cela à trouver une solution.
Pour ma part, pour éviter la copie j'échange le contenu du tableau en place, avec les problèmes signalés par candide.
Meteor2, affiche directement le résultat.
Pour cet exercice c'était probablement la solution la plus simple, même si l'affichage n'est généralement pas la finalité.
PS : pas si evident que cela à trouver une solution.
Pour ma part, pour éviter la copie j'échange le contenu du tableau en place, avec les problèmes signalés par candide.
Meteor2, affiche directement le résultat.
Pour cet exercice c'était probablement la solution la plus simple, même si l'affichage n'est généralement pas la finalité.
Citation : darkipod
celui androneus , rien compris,
moi non plus
disons que l'ennonce ne precisait pas si c'est l'affichage ou avoir un tableau transformé comme resultat!
*) Tu ne respectes pas les conventions de nommage :
normalement les macros sont à 99% écrites en majuscules complètes, on n'appelle pas une dimension de tableau x ou y.
*) Le coup des saisies sécurisées, c'est du pipeau, dans la vie réelle c'est infiniment plus subtil et complexe que vider le buffer du clavier et vérifier le retour de scanf. Les saisies sécurisées ne doivent pas être une priorité du programmeur en apprentissage, faut pas confondre la cerise et le gâteau.
*) Ton code ne supporte que les tableaux carrés alors que l'énoncé n'a pas cette contrainte.
*) Ta façon de déclarer les paramètres tableaux 2D n'est pas incorrecte mais est assez peu courante (tu places une dimension inutile).
*) Je trouve le design de ton code (lireInt, liredimension, lireTableau, recopie, exo1) très très confus.
*) Ton code compile sans Warning (c'est déjà ça) mais, surtout, voici une exécution de ton code chez moi :
*) Ta façon de déclarer les paramètres tableaux 2D n'est pas incorrecte mais est assez peu courante (tu places une dimension inutile).
par exemple tu as le prototype
void affiche(int tableau[Max][Max],int x,int y)
La première dimension est inutile.
Essye de visualiser comment est représenté un tableau 2d, tu verras que seul la seconde dimension est utile pour pouvoir passer d'une ligne à l'autre.
ton prototype devient
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.