Bord matrice langage C

Résolu
tatouvu -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour, dans le cadre d'un programme, j'ultilise une matrice simple.
Mais j'ai besoin de considéré les bords comme jointifs, c'est à dire si je prends une matrice 5X5 Donc en C chiffré de 0 à 4 pour i et j ( ligne et colonne ) , et donc si je me place au bord par exemple à la la colonne 5( i=4) , je veux la considérer comme étant voisine de la colonne 4(i=3) ainsi que de la colone 1(i=0)

Je fais ce-ci pour la détection de voisin , exemple

0 0 0 0 0
1 0 0 0 1
0 0 0 0 1
0 0 0 0 0
0 0 0 0 0

Ici le 1 placé en ( 2;5) , je veux déctecté par une boucle que le (3;5) (ça c'est facile ça fait pas intervenir la notion de débordement ) mais aussi le (2;1) sont voisins.

Mon algo actuelle ne prend pas ça en compte ( le débordement )
il donne
for (i=num_ligne-1 ; i=<num_ligne+1 ;i++){
for( j=num_colonne-1; j=<num_colonne+1; j++){
/* 2 Boucles permettant de parcourir les contours de la case, mais ne permettant pas de regarder de l'autre côté si je suis au bord */

Donc ce que je vous demande c'est la boucle permettant de prendre en compte que le bord de droit et comme coller au gauche , et de même pour les bords d'en haut et en bas.

On m'a dit qu'il y avait un moyen en utilisant les modulos, mais je n'ai pas trouvé.

Merci :)
Configuration: Linux Mandriva
Firefox 2.0.0.6

4 réponses

  1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    Salut,

    L'opérateur =< n'existe pas. Il s'agit de l'opérateur <=. (Attention au sens).
    for (i=num_ligne-1 ; i=<num_ligne+1 ;i++){

    Sinon effectivement ceci se fait simplement avec les modulos.
    Par exemple, tu dois t'arranger pour trouver une fonction f(1)=2, f(2)=3, ...f(4)=0.
    Si tu utilises l'incrémentation modulo 5, ceci donne le résultat escompté : (0+1)%5=1, (1+1)%5=2, ..., (4+1)%5=5%5=0.

    Cdlt
    0
  2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Comme le dit fiddy, au moment d'évaluer la case [i][j], tu évalues la case [i%5][j%5] et c'est fini. Attention toutefois à ce que i et j ne prennent pas des valeurs négatives car l'opérateur modulo retournera alors une valeur négative (et génèrera une erreur de segmentation).

    Ca signifie que si tu es dans la ligne (colonne) 0 tu peux avoir un soucis.
    Si tu es sûr que i et j ne seront jamais inférieur à -5 tu peux garantir que tout se passera bien en évaluant [(i+5)%5][(j%5)+5], comme le montre le code qui suit :
    #include <stdio.h>
    #include <stdlib.h>
    
    
    int main(){
        int i;
        for(i=-10;i<=10;++i)  printf("( %3d + 5 ) %% 5 = %3d\n",i,(i+5) % 5);
        return 0;
    }
    

    On a bien :
    ( -10 + 5 ) % 5 =   0
    (  -9 + 5 ) % 5 =  -4
    (  -8 + 5 ) % 5 =  -3
    (  -7 + 5 ) % 5 =  -2
    (  -6 + 5 ) % 5 =  -1
    (  -5 + 5 ) % 5 =   0
    (  -4 + 5 ) % 5 =   1
    (  -3 + 5 ) % 5 =   2
    (  -2 + 5 ) % 5 =   3
    (  -1 + 5 ) % 5 =   4
    (   0 + 5 ) % 5 =   0
    (   1 + 5 ) % 5 =   1
    (   2 + 5 ) % 5 =   2
    (   3 + 5 ) % 5 =   3
    (   4 + 5 ) % 5 =   4
    (   5 + 5 ) % 5 =   0
    (   6 + 5 ) % 5 =   1
    (   7 + 5 ) % 5 =   2
    (   8 + 5 ) % 5 =   3
    (   9 + 5 ) % 5 =   4
    (  10 + 5 ) % 5 =   0

    Bonne chance
    0
  3. loupius
     
    On t'a déjà donné la solution ...
    Les voisins de la case x (que ce soit la ligne ou la colonne, c'est pareil) sont:
    (x+1)%5 et (x+4)%5 en balayant x de 0 à 4.
    0
  4. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Y a de l'écho :-)
    0