Ciao, sono nuovo ma ultimamente ho letto molto su questo forum... e mi ha aiutato parecchio, ma non riesco a risolvere un'esercizio assegnatoci all'università.
il mio problema è che (penso) gestisco in modo errato le matrici ed il passaggio a funzioni.
(edit: preciso che ho gia cercato il passaggio tramite puntatori ma non riesco a capire in questo specifico caso come fare)
il testo dell'esercizio è il seguente:
Data una tabella bidimensionale mat N x N (N > 2) di parole di lunghezza variabile e un intero positivo k, scrivere una procedura contaParole che conta quante parole cominciano e finiscono con le stesse k lettere in ciascuna delle quattro parti ottenute suddividendo la tabella in base alla diagonale principale e secondaria. Le parole sulle diagonali non devono essere conteggiate.
il prototipo che devo rispettare è:
codice:
void contaparole(char *mat[][N], int k, int *nord, int *est, int *sud, int *ovest)
ed ho scritto il seguente codice:
codice:
#include <string.h>
void diagonali (int mat2[N][N]);
/*Ausiliare di coordinate, setta tutte le diagonali a 4 e divide est e ovest (rispettivamente 2 e
3)*/
void coordinate (int mat2[N][N]);
/*Imposta la coordinata sulla cella: 0: Nord, 1: Sud, 2: Est, 3: Ovest, 4: Diagonale*/
int uguali(char *stringa, int k, int len);
/*Ausiliare di contaparole, 1 se la parola inizia e finisce con k lettere =, 0 se no*/
void contaparole(char *mat[][N], int k, int *nord, int *est, int *sud, int *ovest)
{
int i,j,len;
int mat2[N][N];
int n,s,e,o;
n=s=e=o=0;
coordinate(mat2);
for (j=0;j<N;j++) //riga
{
for (i=0;i<N;i++) //colonna
{
len=strlen(mat[j][i]);
if (k<len && mat2[j][i]!=4)
{
if(uguali(mat[j][i],k,len))
{
switch (mat2[j][i])
{
case 0:
n++;
break;
case 1:
s++;
break;
case 2:
e++;
break;
case 3:
o++;
break;
case 4:
break;
}
}
}
}
}
*nord=n;
*sud=s;
*est=e;
*ovest=o;
}
int uguali(char *stringa, int k, int len)
/*Ausiliare di contaparole, 1 se la parola inizia e finisce con k lettere =, 0 se no*/
{
int i, ok=0;
for(i=0;i<k;i++)
{
if(stringa[i]==stringa[(len-1)-i])
ok++;
else
ok=0;
}
return (ok==k)? 1:0;
}
void coordinate (int mat2[N][N])
/*Imposta la coordinata sulla cella:
0: Nord
1: Sud
2: Est
3: Ovest
4: Diagonale
*/
{
int i=0,j=0,i_max,i_min;
diagonali(mat2);
for (j=0;j<(N);j++) //riga
{
i_min=j;
i_max=(N-1-j);
if(j<((N-1)/2))
for (i=0;i<=(N/2);i++) //colonna
{
if(mat2[j][i_min]!=4)
mat2[j][i_min]=0;
if(mat2[j][i_max]!=4)
mat2[j][i_max]=0;
i_min++;
i_max--;
}
if(j>(N/2))
for (i=(N/2);i>=0;i--) //colonna
{
if(mat2[j][i_min]!=4)
mat2[j][i_min]=1;
if(mat2[j][i_max]!=4)
mat2[j][i_max]=1;
i_min--;
i_max++;
}
}
}
void diagonali (int mat2[N][N])
/*Ausiliare di coordinate, setta tutte le diagonali a 4 e divide est e ovest (rispettivamente 2 e 3)*/
{
int i=0,j=0;
for (j=0;j<N;j++) //riga
for (i=0;i<N;i++) //colonna
{
if(i<(N/2))
mat2[j][i] = 3;
else
mat2[j][i] = 2;
if ((j==i)||(i==(N-1-j)))
mat2[j][i] = 4;
}
}
io mi son creato un main per testare il programma:
codice:
#define N 3
int _tmain(int argc, _TCHAR* argv[])
{
int nord,est,ovest,sud;
int i,j,k;
char *mat[N][N];
mat[0][0]="aaaaa";
mat[0][1]="abdcba";
mat[0][2]="abba";
mat[1][0]="abab";
mat[1][1]="bb";
mat[1][2]="abbccabb";
mat[2][0]="abba";
mat[2][1]="aabbaa";
mat[2][2]="aaaa";
printf("tabella inserita:\n");
for (j=0;j<N;j++) //riga
{
for (i=0;i<N;i++) //colonna
{
printf ("%s\t",mat[j][i]);
}
printf("\n");
}
printf("inserire k: ");
scanf("%d",&k);
printf("\n");
contaparole(mat,k,&nord,&est,&sud,&ovest);
printf("nord:%d \nsud:%d \nest:%d \novest:%d\n",nord,sud,est,ovest);
return 0;
}
il mio problema è che mentre, con il mio main funziona tutto alla perfezione nessun warning e gira, quando lo consegno (in una pagina dell'univerità fatta apposta) mi da i seguenti warning:
Test.c:30: warning implicit declaration of function ‘contaParole’
quindi penso che di aver gestito male il passaggio della matrice char *mat[][N] nella funzione contaparole..
qualcuno mi può illuminare??
grazie a tutti in anticipo