Array di strutture con liste.

di il
6 risposte

Array di strutture con liste.

Buonasera,
devo realizzare un array di strutture contenente un tipo char ed una lista.
Per fare ciò ho scritto il seguente codice, però non so se è corretto.

...
#define DIM 36

//Lista che memorizza l'alfabeto morse di un carattere
struct nodo 
{
	char letteraMorse;
	struct nodo *prossimoPtr;
};
typedef struct nodo Nodo;
typedef Nodo *NodoPtr;

//Struttura che contiene un carattere alfanumerico e il relativo codice morse
typedef struct
{
	//"Lettera" contiene le lettere da a-z e i numeri da 0-9
	char lettera;
	struct nodo Nodo;
} Morse[DIM];
...
Mi potreste aiutare?
Grazie.

6 Risposte

  • Re: Array di strutture con liste.

    Semmai
    
    typedef struct
    {
    	char lettera;
    	Nodo morse;
    } Morse;
    
    Morse Alfabeto[DIM];
    
    ma non capisco a cosa ti serva l'altra struttura e la lista ...

    Sinceramente la farei più semplice e senza lista ...

    Per capire meglio cosa intendi, mostra anche un utilizzo dei dati in un main ...
  • Re: Array di strutture con liste.

    Praticamente devo scrivere un programma che traduce dall'inglese al codice Morse e che prende l'input da un file.
    Il file è composto in questo modo:
    
    a:. -
    b:- . . .
    c:- . - .
    d:- . .
    e:.
    ..etc
    x:- . . -
    y:- . - -
    z:- - . .
    0:- - - - -
    1:. - - - -
    ..etc
    8:- - - . .
    
    Pensavo di memorizzare nel campo "lettera" i caratteri alfanumerici che stanno prima dei due punti; mentre nella lista il codice morse. Intendo usare una lista per non sprecare inutilmente memoria, dato che alcune lettere hanno bisogno di un solo carattere(ad esempio la 'e'), mentre altre hanno bisogno di sette caratteri(ed esempio la 'z').
  • Re: Array di strutture con liste.

    Tanto per cominciare perché inserisci gli spazi tra le linee e i punti?

    La z dovrebbe essere semplicemente
    
    --..
    
    ovvero 4 caratteri.

    Poi non sprechi tutto questo spazio se consideri che il puntatore comunque utilizza 4 byte fissi e che la lista complica il codice.

    Quindi ti conviene usare una semplice struttura
    
    typedef struct morse {
      char simbolo;
      char codifica[5];
    }  Morse;
    
    Morse Alfabeto[DIM];
    
  • Re: Array di strutture con liste.

    Nel testo dell'esercizio c'è scritto che non si devono memorizzare dati non necessario, ma se già col puntatore spreco 4 byte allora conviene usare struttura semplice.
    Per quanto riguarda gli spazi, essi sono già presenti nel file fornito dal professore, e quindi non li possiamo togliere.
    Comunque, grazie per l'aiuto.
  • Re: Array di strutture con liste.

    Secondo me proprio per la raccomandazione lui si attende che gli spazi, una volta letti dal file, vengano eliminati. Occupano memoria inutile.
  • Re: Array di strutture con liste.

    Ora ho un altro problema: nella traduzione, se trovo un carattere non-alfanumerico, devo stampare un messaggio di errore(senza stampare la traduzione della riga corrente) e passare alla riga successiva del file.

    File:
    
    a:. -
    b:- . . .
    c:- . - .
    d:- . .
    e:.
    f:. . - .
    g:- - .
    h:. . . .
    i:. .
    j:. - - -
    k:- . -
    l:. - . .
    m:- -
    n:- .
    o:- - -
    p:. - - .
    q:- - . -
    r:. - .
    s:. . .
    t:-
    u:. . -
    v:. . . -
    w:. - -
    x:- . . -
    y:- . - -
    z:- - . .
    0:- - - - -
    1:. - - - -
    2:. . - - -
    3:. . . - -
    4:. . . . -
    5:. . . . .
    6:- . . . .
    7:- - . . .
    8:- - - . .
    9:- - - - .
    ****
    Hey man!
    This is the text to be translated 
    
    Codice:
    
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include <ctype.h>
    #define DIM 36
    #define DIM_COD 6
    #define OFFSET_LETTERE 97
    #define OFFSET_NUMERI 22
    #define SPAZI_LETTERE 3
    #define SPAZI_PAROLE 7
    
    //Struttura che contiene un carattere alfanumerico e il relativo codice morse
    typedef struct
    {
    	//"Lettera" contiene le lettere da a-z e i numeri da 0-9
    	char simbolo;
    	char codifica[DIM_COD];
    } Morse;
    Morse alfabeto[DIM];
    
    void inserimento(FILE *fPtr);
    void stampa(FILE *fPtr);
    void stampa_spazi(int num_spazi);
    //void controllo_puntegaitura(FILE *fTempPtr, char pTemp);
    
    int main(void)
    {
    	FILE *fPtr;
    
    	if((fPtr = fopen("input.txt", "r")) != NULL)
    	{
    		inserimento(fPtr);
    		stampa(fPtr);
    		fclose(fPtr);
    	}
    	else
    		puts("Impossibile aprire il file.");
    
    	return 0;
    }
    
    //Riempe la struttura con i dati del file input.txt
    void inserimento(FILE *fPtr)
    {
    	char cod;
    	for(size_t i = 0; i < DIM; i++)
    	{
    		//Con il parametro "%c%*c" leggo il primo carattere alfanumrico e salto i due punti
    		if(fscanf(fPtr, "%c%*c", &(alfabeto[i].simbolo)) == 1)
    		{
    			unsigned short ind_cod = 0;
    			while(fscanf(fPtr, "%c", &cod) == 1 && cod != '\n')
    			{
    				if(cod != ' ')
    				{
    					alfabeto[i].codifica[ind_cod] = cod;
    					ind_cod++;
    				}
    			}
    		}
    		//---------------------------> le due printf sotto sono da eliminare
    		//printf("Simbolo: %c\n", alfabeto[i].simbolo);
    		//printf("Codifica: %s\nIndice: %ld\n", alfabeto[i].codifica, i);
    	}
    }
    
    //Stampa la traduzione
    void stampa(FILE *fPtr)
    {
    	char temp;
    	//Se la fscanf legge '*', allora mi trovo nel separatore “****”. 
    	//Con il parametro "%c%*s%*c" mi posiziono nella linea successiva.
    	if(fscanf(fPtr, "%c%*s%*c", &temp) == 1 && temp == '*')
    	{
    		int inTemp = 0;
    		
    		while(fscanf(fPtr, "%c", &temp) == 1)
    		{
    			temp = tolower(temp);
    			inTemp = (int)temp;
    							//printf("Temp: %c\nInt: %d\n", temp, inTemp);
    			if(temp != ' ' && temp != '\n')
    			{
    				if(inTemp >= 97 && inTemp <= 122)
    				{
    					printf("%s", alfabeto[inTemp-OFFSET_LETTERE].codifica);
    					stampa_spazi(SPAZI_LETTERE);
    				}
    				else if(inTemp >= 48 && inTemp <= 57)
    				{
    					printf("%s", alfabeto[inTemp-OFFSET_NUMERI].codifica);
    					stampa_spazi(SPAZI_LETTERE);
    				}
    				else
    				{
    					puts("\nErrore nell'input");
    				}
    			}
    			else if(temp == '\n')
    				puts(" ");
    			else
    				stampa_spazi(SPAZI_PAROLE);
    		}
    		puts(" ");
    	}
    	else
    		puts("Errore");
    }
    /*
    //Controlla se nel file è presente un carattere non alfanumerico. Ritorna 0 se il carattere è valido, ed 1 altrimenti.
    void controllo_puntegaitura(FILE *fTempPtr, char pTemp)
    {
    	while(fscanf(fTempPtr, "%c", &pTemp) == 1 && ispunct(pTemp) == 0 && pTemp != '\n')
    	{
    	}
    }
    */
    	
    void stampa_spazi(int num_spazi)
    {
    	for(size_t i = 0; i < num_spazi; i++)
    	{
    		printf(" ");
    	}
    }
    
    Per risolvere il problema pensavo di scorrere una riga due volte(usando due puntatori): se trovo un carattere non-alfanumerico stampo il messaggio d'errore, altrimenti mi posiziono all'inizio della riga e la stampo. Però non saprei come scrivere il codice.

    [EDIT]
    Ho risolto il problema con la funzione fseek.
Devi accedere o registrarti per scrivere nel forum
6 risposte