Bord matrice langage C

Résolu
tatouvu -  
mamiemando Messages postés 33774 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 :)
A voir également:

4 réponses

fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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
mamiemando Messages postés 33774 Date d'inscription   Statut Modérateur Dernière intervention   7 883
 
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
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
mamiemando Messages postés 33774 Date d'inscription   Statut Modérateur Dernière intervention   7 883
 
Y a de l'écho :-)
0