Indice del forum Olimpo Informatico
I Forum di Zeus News
Leggi la newsletter gratuita - Attiva il Menu compatto
 
 FAQFAQ   CercaCerca   Lista utentiLista utenti   GruppiGruppi   RegistratiRegistrati 
 ProfiloProfilo   Messaggi privatiMessaggi privati   Log inLog in 

    Newsletter RSS Facebook Twitter Contatti Ricerca
Aiuto linguaggio C
Nuovo argomento   Rispondi    Indice del forum -> Programmazione
Precedente :: Successivo  
Autore Messaggio
kiara91
Mortale pio
Mortale pio


Registrato: 31/01/14 17:56
Messaggi: 20

MessaggioInviato: 31 Gen 2014 18:03    Oggetto: Aiuto linguaggio C Rispondi citando

Ciao a tutti, ho trovato questo forum cercando un aiuto in rete per un progetto di informatica (precisamente si algoritmi) che devo svolgere in linguaggio C.

Ovviamente non chiedo che qualcuno lo faccia al posto mio, ma avendo basi abbastanza scarse di programmazione vorrei chiedervi se potreste darmi una mano a procedere un po' alla volta.

Se è possibile e qualcuno ha voglia di aiutarmi vi sarei grata infinitamente e potrei iniziare a postare il testo del progetto e un po' di idee/dubbi che avevo a riguardo.

Grazie a tutti Smile
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 10006
Residenza: Tokelau

MessaggioInviato: 03 Feb 2014 15:48    Oggetto: Rispondi citando

Google è tuo amico... prova cercando "Tutorial programmazione C" per iniziare...

Ciao
Top
Profilo Invia messaggio privato HomePage
kiara91
Mortale pio
Mortale pio


Registrato: 31/01/14 17:56
Messaggi: 20

MessaggioInviato: 10 Feb 2014 01:50    Oggetto: Rispondi citando

Grazie SverX..ho trovato con google una guida. L'ho studiata qualche giorno e ho ripreso confidenza con alcune cose che avevo dimenticato, in particolare con le liste che penso siano la struttura più adeguata a svolgere il mio progetto.

Infatti quello che dovrei fare è memorizzare dei dati contenuti in un file in modo tale da poter fare ricerche su questi dati.

Supponiamo che il file su cui devo lavorare (non è così ma vorrei semplificare un po' la spiegazione) contiene 2 classi di oggetti, diciamo Titoli di libri e Argomenti trattati. Ad ogni Titolo è associata una serie di Argomenti trattati all'interno di quel libro.

Voglio costruire un programma in C che prendendo in input il nome di un argomento mi dia in output i titoli dei libri in cui è trattato e viceversa prendendo in input un libro mi dia in output gli argomenti trattati al suo interno.

La struttura di dati che penso possa essere la più idonea (ma correggetemi se sbaglio perchè ancora non sono molto pratica) è un dizionario. Il file è di grandi dimensioni e vorrei chiedervi qualche suggerimento su come implementare questa struttura.

Dunque quello intendo fare è:

- aprire il file con fopen
- attraverso fgets memorizzare tutti i titoli dei libri in una lista di liste
--(ogni elemento della lista sarà una lista che contiene nel primo campo il Titolo del libro e nei successivi gli argomenti trattati)

E' la strada giusta o mi sto perdendo? Embarassed
Spero di avere il vostro aiuto, grazie Smile
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 10006
Residenza: Tokelau

MessaggioInviato: 10 Feb 2014 10:18    Oggetto: Rispondi citando

Sì, direi che per memorizzare i titoli e gli argomenti va bene una lista multipla, ovvero una lista semplice con i titoli dove ogni elemento è la testa di una lista di argomenti correlati (qui c'è uno schema, in questo caso le liste sono addirittura bidirezionali, tu magari non ne hai bisogno...)

Per il dizionario... vuoi fare una ricerca fulltext? Shocked
Top
Profilo Invia messaggio privato HomePage
kiara91
Mortale pio
Mortale pio


Registrato: 31/01/14 17:56
Messaggi: 20

MessaggioInviato: 10 Feb 2014 12:59    Oggetto: Rispondi citando

grazie ancora SverX..cosa intendi per ricerca fulltext? Embarassed
Top
Profilo Invia messaggio privato
kiara91
Mortale pio
Mortale pio


Registrato: 31/01/14 17:56
Messaggi: 20

MessaggioInviato: 11 Feb 2014 11:44    Oggetto: Rispondi citando

Rieccomi, prima di procedere vorrei chiarirmi un dubbio riguardante alcune operazioni sulle liste.

Ho definito il tipo lista in questo modo

Codice:
struct EL {
  int dato;
  struct EL *succ;
};


dopodichè ho creato una funzione InserisciInCoda che agisce nel modo ovvio

Codice:
void InserisciInCoda(ListaDiElementi *lista, int x){
  ListaDiElementi aux;
  ListaDiElementi ultimo;
  aux=malloc(sizeof(ElementoLista));
  aux->dato=x;
  aux->succ=NULL;
  if(*lista==NULL) *lista=aux;
  else {
    ultimo=*lista;
    while(ultimo->succ!=NULL) {
      ultimo=ultimo->succ;
    }
    ultimo->succ=aux;
  }


Quello che mi chiedo è perchè se uso la malloc funziona mentre se non la uso e implemento la funzione in questo modo

Codice:
void InserisciInCoda(ListaDiElementi *lista, int x){
  ListaDiElementi aux;
  ListaDiElementi ultimo;
  ElementoLista EL;
  aux=⪙
  aux->dato=x;
  aux->succ=NULL;
  if(*lista==NULL) *lista=aux;
  else {
    ultimo=*lista;
    while(ultimo->succ!=NULL) {
      ultimo=ultimo->succ;
    }
    ultimo->succ=aux;
  }


non funziona più..

Sarò stupida ma davvero non riesco a capire..la memoria la alloco ugualmente definendo la variabile EL giusto? Allora perchè non va?+

Grazie ancora a tutti
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 10006
Residenza: Tokelau

MessaggioInviato: 12 Feb 2014 11:26    Oggetto: Rispondi citando

con "fulltext" si intende quando vuoi cercare una parola (o un set di parole) all'interno dei testi di alcuni/tutti i campi testo di un archivio... se devi fare una cosa di questo tipo allora sì, ti serve un dizionario, e un indice fulltext.

il problema di non usare la malloc() è dovuto al fatto che se definisci una variabile all'interno di una funzione, questo spazio è allocato nello stack, e viene liberato quando la funzione termina. Malloc invece alloca nello heap e la deallocazione è SOLO manuale.

un piccolo consiglio: se non hai il vincolo di rispettare l'ordine, fai inserimenti in TESTA e non in coda alla lista. E' molto più facile e veloce O(1).

Ciao
Top
Profilo Invia messaggio privato HomePage
kiara91
Mortale pio
Mortale pio


Registrato: 31/01/14 17:56
Messaggi: 20

MessaggioInviato: 12 Feb 2014 17:23    Oggetto: Rispondi citando

Benissimo:) Mi hai fatto capire finalmente cosa non andava..quanto alla ricerca fulltext, sinceramente non saprei..
Il mio file è fatto così:


Titolo1......................Argomento1
................................Argomento2
................................Argomento3
................................Argomento4
................................Argomento5
................................Argomento6
................................Argomento7
................................Argomento8
Titolo2.......................Argomentox
................................Argomentoy
................................Argomentoz
................................Argomentov
................................Argomentou
................................Argomentow
Titolo3.......................Argomentoi
................................Argomentoj
................................Argomentok
................................Argomentoh
................................Argomentop
................................Argomentoq
................................Argomentor
................................Argomentos

dove al posto dei puntini ci sono dei TAB. Una volta che ho memorizzato i miei dati nella mia 'lista di liste' (o conviene un array di liste?) non posso semplicemente (quando ricevo un input tramite scanf) fare un

Codice:
for(i=0;i<MAX_SIZE;I++){
  if(strcmp(Array[i]->Titolo,Stringa_letta_in_input)==0){
    Stampa_Lista_Argomenti;
    exit(1)}
 }

?

Ovviamente supponendo di aver memorizzato i dati in un array di liste Array[MAX_SIZE] e con opportuni aggiustamenti del codice.

Un ultima cosa: mi viene richiesto di fare in modo che digitando le prime 3 lettere che compongono il nome del Titolo o dell'Argomento il programma mi suggerisca tutte le corrispondenze idonee. Mi viene suggerito (ma non è obbligatorio) l'uso della struttura di dati Trie che da quello che ho letto dovrebbe aver a che fare con gli alberi. Posso evitare di usarla e utilizzare più semplicemente la funzione strncmp che confronta le liste in base ai primi n caratteri?

Grazie ancora e scusate se mi dilungo troppo!
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 10006
Residenza: Tokelau

MessaggioInviato: 13 Feb 2014 17:03    Oggetto: Rispondi citando

chiaro che se la tua chiave di ricerca è identica al valore cercato, fare una strcmp su qualunque valore è più che sufficiente...

per la ricerca di sotto-stringhe di 3 caratteri, puoi usare strncmp (nota la n in mezzo...) però se l'esercizio suggerisce gli alberi (tree) forse dovresti usare quelli...
Top
Profilo Invia messaggio privato HomePage
kiara91
Mortale pio
Mortale pio


Registrato: 31/01/14 17:56
Messaggi: 20

MessaggioInviato: 13 Feb 2014 17:21    Oggetto: Rispondi

Grazie ancora SverX..aspetto sempre con impazienza le tue risposte..si penso di usare questi alberi trie..non dovrebbe essere molto più complicato delle liste..ma se hai qualche suggerimento particolare su come implementarli sono tutta orecchie..

In particolare dovrebbero essere degli alberi k-ari (ovvero ogni nodo ha k figli eventualmente 'nulli' e dove k è il numero di lettere dell'alfabeto che voglio usare) che potrei implementare così

Codice:

struct EL {
    char valore;
    struct Nodo *figli[k];
};
typedef struct EL Nodo_trie;
typedef trie *Nodo_trie;
 


potrebbe andare?

Nel frattempo ho provveduto ad analizzare il mio file ed ora riesco a isolare titoli e argomenti e a copiarli ad esempio in array di stringhe del tipo argomenti[DIM] e titoli[DIM]..ovviamente ho fatto questo giusto per vedere se riuscivo a manipolare i dati che avevo nel file dato che non avevo mai fatto nulla del genere prima d'ora (e non so se questi array mi serviranno davvero in seguito) comunque una volta fatto questo posso incasellare le stringhe (titoli e argomenti) dove voglio..

Che ne dici?

Grazie della pazienza che hai nei confronti di una studentessa ignorante in materia:(
Top
Profilo Invia messaggio privato
Mostra prima i messaggi di:   
Nuovo argomento   Rispondi    Indice del forum -> Programmazione Tutti i fusi orari sono GMT + 1 ora
Vai a 1, 2, 3, 4  Successivo
Pagina 1 di 4

 
Vai a:  
Non puoi inserire nuovi argomenti
Non puoi rispondere a nessun argomento
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi