Bord matrice langage C

Résolu/Fermé
tatouvu - 24 avril 2009 à 13:39
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 25 avril 2009 à 03:32
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
24 avril 2009 à 14:06
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 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 812
24 avril 2009 à 20:02
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
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 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 812
25 avril 2009 à 03:32
Y a de l'écho :-)
0