Ciao trek,
nel codice seguente, la funzione "LeggiAdiacenti", accetta i seguenti parametri :
1 - Puntatore alla matrice di interi
2 - Puntatore alla struct "Adiacenti" che contiene un int che rappresenta il numero stesso e un bool che ci dice se il numero è pari o dispari
3 - Puntatore alla struct Totali che contiene i campi per il conteggio dei numeri dispari e pari
4 - Indice della riga
5 - Indice della colonna
6 - Totale delle righe
7 - totale della colonne
Se prendiamo ad esempio la matrice da te indicata:
12 15 16 49 78
48 78 56 14 74
36 12 47 99 41
chiamando la funzione così:
LeggiAdiacenti((int**)pMat, aAd, &Tot, 1, 2, 3, 5);
otteniamo il seguente risultato:
Totale numeri dispari : 4
Totale numeri pari : 4
numeri pari:
16 14 12 78
numeri dispari:
15 49 99 47
se invece chiamiamo la funzione così:
LeggiAdiacenti((int**)pMat, aAd, &Tot, 0, 0, 3, 5);
otteniamo:
Totale numeri pari : 2
Totale numeri dispari : 1
numeri pari :
78 48
numeri dispari :
15
codice:
#include <stdio.h>
#include <stdlib.h>
typedef struct tagAdiacenti
{
int nNum;
bool bPari;
} Adiacenti;
typedef struct tagTotali
{
int nTotPari;
int nTotDispari;
int nTotale;
} Totali;
// 12 15 16 49 78
// 48 78 56 14 74
// 36 12 47 99 41
void LeggiAdiacenti(int **pMat, Adiacenti *pAdiacenti, Totali * pTot, int Riga, int Colonna, int Righe, int Colonne)
{
div_t dt;
if ( (Riga < 0) || (Riga >= Righe) )
{
printf("Indice riga fuori dai limiti\n");
return;
}
if ( (Colonna < 0) || (Colonna >= Colonne) )
{
printf("Indice colonna fuori dai limiti\n");
return;
}
for (int i = 0; i < 8; i++)
{
pAdiacenti[i].nNum = -1;
pAdiacenti[i].bPari = false;
}
pTot->nTotPari = 0;
pTot->nTotDispari = 0;
pTot->nTotale = 0;
if ( Riga > 0 )
{
if ( Colonna > 0 )
{
pAdiacenti[0].nNum = pMat[Riga-1][Colonna-1];
pTot->nTotale++;
dt = div(pAdiacenti[0].nNum, 2);
if ( dt.rem == 0 )
{
pAdiacenti[0].bPari = true;
pTot->nTotPari++;
}
else
{
pTot->nTotDispari++;
}
}
pAdiacenti[1].nNum = pMat[Riga-1][Colonna];
pTot->nTotale++;
dt = div(pAdiacenti[1].nNum, 2);
if ( dt.rem == 0 )
{
pAdiacenti[1].bPari = true;
pTot->nTotPari++;
}
if ( Colonna < Colonne - 1)
{
pAdiacenti[2].nNum = pMat[Riga-1][Colonna+1];
pTot->nTotale++;
dt = div(pAdiacenti[2].nNum, 2);
if ( dt.rem == 0 )
{
pAdiacenti[2].bPari = true;
pTot->nTotPari++;
}
else
{
pTot->nTotDispari++;
}
}
}
if ( Colonna < Colonne - 1)
{
pAdiacenti[3].nNum = pMat[Riga][Colonna+1];
pTot->nTotale++;
dt = div(pAdiacenti[3].nNum, 2);
if ( dt.rem == 0 )
{
pAdiacenti[3].bPari = true;
pTot->nTotPari++;
}
else
{
pTot->nTotDispari++;
}
}
if ( Riga < Righe - 1 )
{
if ( Colonna < Colonne - 1 )
{
pAdiacenti[4].nNum = pMat[Riga+1][Colonna+1];
pTot->nTotale++;
dt = div(pAdiacenti[4].nNum, 2);
if ( dt.rem == 0 )
{
pAdiacenti[4].bPari = true;
pTot->nTotPari++;
}
else
{
pTot->nTotDispari++;
}
}
pAdiacenti[5].nNum = pMat[Riga+1][Colonna];
pTot->nTotale++;
dt = div(pAdiacenti[5].nNum, 2);
if ( dt.rem == 0 )
{
pAdiacenti[5].bPari = true;
pTot->nTotPari++;
}
else
{
pTot->nTotDispari++;
}
if ( Colonna > 0 )
{
pAdiacenti[6].nNum = pMat[Riga+1][Colonna-1];
pTot->nTotale++;
dt = div(pAdiacenti[6].nNum, 2);
if ( dt.rem == 0 )
{
pAdiacenti[6].bPari = true;
pTot->nTotPari++;
}
else
{
pTot->nTotDispari++;
}
}
}
if ( Colonna > 0 )
{
pAdiacenti[7].nNum = pMat[Riga][Colonna - 1];
pTot->nTotale++;
dt = div(pAdiacenti[7].nNum, 2);
if ( dt.rem == 0 )
{
pAdiacenti[7].bPari = true;
pTot->nTotPari++;
}
else
{
pTot->nTotDispari++;
}
}
}
int main(int argc, char* argv[])
{
int nRighe = 3;
int nColonne = 5;
Adiacenti aAd[8];
int **pMat;
Totali Tot;
// allochiamo lo spazio per le righe della matrice
pMat = (int**)malloc(nRighe * sizeof(int*));
//allochiamo lo spazio per le colonne della matrice
for ( int y = 0; y < nRighe; y++ )
pMat[y] = (int*)malloc(nColonne * sizeof(int));
pMat[0][0] = 12;
pMat[0][1] = 15;
pMat[0][2] = 16;
pMat[0][3] = 49;
pMat[0][4] = 78;
pMat[1][0] = 48;
pMat[1][1] = 78;
pMat[1][2] = 56;
pMat[1][3] = 14;
pMat[1][4] = 74;
pMat[2][0] = 36;
pMat[2][1] = 12;
pMat[2][2] = 47;
pMat[2][3] = 99;
pMat[2][4] = 41;
//LeggiAdiacenti((int**)pMat, aAd, &Tot, 1, 2, 3, 5);
LeggiAdiacenti((int**)pMat, aAd, &Tot, 0, 0, 3, 5);
int i;
printf("Totale numeri pari : %d\nTotale numeri dispari : %d\n\n", Tot.nTotPari, Tot.nTotDispari);
// stampa i numeri pari
printf("numeri pari:\n");
for(i = 0; i < 8; i++)
if ( (aAd[i].nNum != -1) && (aAd[i].bPari) )
printf("%d ", aAd[i].nNum);
// stampa i numeri pari
printf("\n\nnumeri dispari:\n");
for(i = 0; i < 8; i++)
if ( (aAd[i].nNum != -1) && (!aAd[i].bPari) )
printf("%d ", aAd[i].nNum);
// Deallochiamo
for (int k = 0; k < nRighe; k++)
free(pMat[k]);
free(pMat);
return 0;
}