Matrice

Fermé
dadou - 22 févr. 2008 à 21:51
Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 - 5 mars 2008 à 10:08
Bonjour,
je cherche une solution à cet exercice.
On souhaite construire une matrice carrée NxN (N vaut au maximum 10, la valeur de N étant saisie par l’utilisateur) dans laquelle le carré le plus externe ne contient que des 1, le carré interne voisin du carré externe ne contient que des 2, et ainsi de suite...

Exemple :

Si N=6, la matrice qu’on veut construire est :

1 1 1 1 1 1

1 2 2 2 2 1

1 2 3 3 2 1

1 2 3 3 2 1

1 2 2 2 2 1

1 1 1 1 1 1

Merci

3 réponses

mamiemando Messages postés 33304 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 octobre 2024 7 794
22 févr. 2008 à 22:36
Oui et donc ? Qu'est ce qui te bloque ?
0
Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 125
22 févr. 2008 à 22:38
Bonjour,

Il me semble que le plus simple est de remplir la matrice ligne par ligne ou colonne par colonne d'ailleurs, c'est un peu kifkif...

Ce que l'on peut observer c'est que dans une ligne, on part de 1, on augmente jusqu'au numéro de la ligne, on stagne puis on redescend. Donc en gros on monte, on écrit n fois le numéro de la ligne où n est la taille de la ligne - 2 * le numéro de la ligne, et on redécompte.

Cela peut se faire en trois boucles pour écrire une ligne: montée, stagne sur le numéro de ligne, descente.
Après il suffit de rajouter une boucle autour pour effectuer la même chose pour chaque ligne.

Sinon on peut écrire le premier quart de la matrice, montée, demi stagne et on le réplique en inversant sur le 2ème quart, puis les deux premiers quarts sur la 2ème moitié de la matrice. Mais ça parait plus compliqué pour rien en réalité. Ce serait rentable si les valeurs à mettre étaient issue d'un calcul faramineux.

Cela t'aide ?

M.
0
mamiemando Messages postés 33304 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 octobre 2024 7 794
22 févr. 2008 à 23:25
C'est juste un double boucle for sur les lignes puis sur les colonnes. Si je suis à la ième ligne, je fais i incrémentations, et je devrais finir cette ligne par i décrémentations. Comme il y a N colonnes il faut que tu restes N-2*i itérations constant avant d'amorcer ces i décrémentations.

Au final quand tu es rendu à la ième ligne
- j'incrémente i fois
- je reste constant N-2*i constant
- je décrémente i fois
(ce qui fait bien N itérations de colonnes par ligne)

A toi de jouer maintenant il ne reste plus qu'à coder ;-)
0
je n'arrive pas à comprendre votre démarche, svp aide moi à déduire le code, je me suis bloqué. merci bien
0
Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 125 > élève
4 mars 2008 à 20:00
Re,

En règle général lorsque l'on travaille avec des tableaux à plus de une dimension, on cherche avant tout une solution qui permette d'effectuer les opérations dimension par dimension. Ici ligne par ligne.

Je mets un squelette pour le code à écrire: (J'espère qu'il n'y a pas d'erreur je n'ai pas de compilateur...)


#include <stdlib.h>
#include <stdio.h>

#define MAX_SIZE 10

unsigned int g_aaMatrix[MAX_SIZE][MAX_SIZE];

void displayMatrix( unsigned int uSize );
void initMatrix( unsigned int uSize );


void main( int atgc, char *argv[] )
{
   unsigned int uSize;

   printf("Saisissez la taille du tableau à afficher. (1 <= s <= %u\n", MAX_SIZE );

   while ( ( scanf( "%u", &uSize ) != 1 ) || ( uSize == 0 ) || ( uSize >= MAX_SIZE ) )
   {
      char c;

      // Vider les caractères résiduels jusqu'à la fin de ligne ou qu'il n'y ait plus de 
      // caractères dans le tampon d'entrée
      do
      {
         c = getchar();
      }
      while ( ( c != '\n')  && ( c != EOF ) );

      printf( "\nValeur invalide, nouvelle saisie\n" );
   }

   initMatrix( uSize );

   displayMatrix( uSize );

   getchar();
}

void displayMatrix( unsigned int uSize )
{
   unsigned int uLine;
   unsigned int uColomn;

   for ( uLine = 0 ; uLine != uSize ; uLine++ )
   {
      for ( uColomn = 0 ; uColomn != uSize ; uColomn++ )
      {
         printf( "%2u ", g_aaMatrix[uLine][uColomn] );
      }
      printf( "\n" );   // new line
   }
}

void initMatrix( unsigned int uSize )
{
   // TODO. :-)
}



Si cela peut t'aider pour le début c'est possible de rajouter une fonction, celle-ci:
void displayLine( unsigned int uLine, unsigned int uSize );


Dis nous où ça coince exactement (algorithme ou passage au code ?) et n'hésite surtout pas à continuer sur ton propre code si tu préfères.

M.
0
Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 125 > Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010
5 mars 2008 à 10:08
Whoops, à la fin ce n'est pas "displayLine" mais bien "initLine"
0