Bord matrice langage C
Résolu
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 :)
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:
- Bord matrice langage C
- Langage ascii - Guide
- Langage binaire - Guide
- Pascal langage - Télécharger - Édition & Programmation
- Clc langage jeune ✓ - Forum Réseaux sociaux
- Langage visual basic - Télécharger - Langages
4 réponses
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
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
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 :
On a bien :
Bonne chance
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