Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2011
    Messaggi
    5

    [c] passaggio di matrice tramite puntatori

    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

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    286
    Non è detto, cos'é la "pagina dell'univerità fatta apposta"? un parser, un compilatore? può essere che richieda una sintassi diversa dal tuo compilatore, o magari anche solo una foward declaration, in fin dei conti si tratta solo di un warning dunque compila lostesso, o no?

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2011
    Messaggi
    5
    sinceramente non so cosa sia di preciso la pagina dell'uni, so solo che io ci copio il mio testo e posso solo fare la compilazione... quindi non posso interagire troppo... (presumo che la pagina sia collegata in qualche modo al loro programma di test, infatti ogni tanto da dei warning su righe o funzioni che io non ho scritto)
    come compilatore credo non ci siano problemi xchè tranne la chiamata del main dovrebbe essere tutto C standard senza nessun uso di librerie particolari (il main è così perchè lavoro su visual studio)

    Ps: probabilmente era un'errore nel loro programma di test perchè oggi compila (da una mail di notifica risulta che hanno cambiato il nome ad una funzione -.-)
    quindi direi risolto... chiedo scusa per aver disturbato

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.