 | |
Il progetto dsy.it è l'unofficial support site dei corsi di laurea del Dipartimento di Scienze dell'Informazione e del Dipartimento di Informatica e Comunicazione della Statale di Milano. E' un servizio degli studenti per gli studenti, curato in modo no-profit da un gruppo di essi. I nostri servizi comprendono aree di discussione per ogni Corso di Laurea, un'area download per lo scambio file, una raccolta di link e un motore di ricerca, il supporto agli studenti lavoratori, il forum hosting per Professori e studenti, i blog, e molto altro...
In questa sezione è indicizzato in textonly il contenuto del nostro forum |
Progetto "FACCIALIBRO" Clicca QUI per vedere il messaggio nel forum |
middu |
siccome devo avere dei nomi utenti univoci devo ho creato una funzione che permette di verificare se il nome o nick di un utente è uguale lessograficamente ad uno di dei nick presenti in lista. E' giusto come ragionamento??? |
hyperion |
Originally posted by green.riot
ho letto http://www.algoteam.dsi.unimi.it/im...codici/hash.txt
ma copio dal testo:
quindi non ho la possibilià aggiungere 5001 profili, ma dovrò in ogni caso ricompilare i sorgenti per farlo .. -.-'' o sbaglio?
a questo punto meglio i grafi .. la soluzione delle liste mi sembra inefficiente
esatto.!se è cosi allora non puoi fare assunzioni sul numero di profili....ma anche nella creazion di un grafo devi specificare il numero di nodi per alocare l'array di puntatori!!un grafo dinamico non l'ho mai visto.. |
darkshadow |
 
Raga qui state andando in paranoia totale inutilmente!
@ green.riot
se proprio vuoi usare le tabelle hash metti come HASHSIZE MAX_INT cosi vai sul sicuro tanto + profili di quelli non puoi inserire visto che è il limite degli interi.
Forse ti starai chiedendo "ma non è spreco di spazio definire la hash table con MAX_INT" in realtà non sprechi molto spazio perchè se non contiene nessun elemento la tua tabella ha solo dei puntatori!! quindi direi che lo spreco è minimo.
@ hyperion
prima di tutto non so dove avete visto che per creare un grafo bisogna indicare il numero di vertici che conterrà. mah!!
qui ci sono un sacco di progetti (tra i quali i miei) che fanno uso di grafi a volontà :D , e ti assicuro che non è necessario sapere il numero di nodi del grafo.
@ per tutti
Tabelle hash o grafi?
dipende di come vi trovate meglio.
inoltre con le tabelle hash avete il limite imposto dal tipo di dati intero mentre con i grafi non avete nessun limite ( tranne che quello della memoria RAM :D )
ciao e buon progetto a tutti!!
DS. |
xSharKMaNx |
Grazie dark per il contributo ;) |
johnnyd |
dark avanzi una birra |
nas |
leggendo i vostri post mi sono venuti 2 dubbi:
1 - ma i comandi bisogna leggerli da tastiera o file ????
2 - come avete pensato di fare l'algoritmo per suggerire nuovi amici a un utente ??? |
green.riot |
grazie dark per i suggerimenti, ritorno sui miei passi vai di grafo con liste |
Benny |
scusate, ma io sono da giorni che impazzisco per l'input, sto input di lunghezza arbitraria, mi sta facendo schizzare le vene fuori dalla testa..da tutte le prove che ho potuto fare, non posso ottenere piu di tanto, al max 4 o 5 parole dipende dall'archiettura della cpu e anche la loro lunghezza non e mica infinita..ora che ho raggiunto lo scopo, proseguiro, che di test ce ne sono e il tempo non e eterno ragazzi/e tutto questo mi ricorda statistica, e ne devo buttare di sangue come disse qualcuno.. |
middu |
io avrei intenzione di crearmi una lista per i profili e per i gruppi un grafo, dove ogni gruppo punterà alla lista di tutti i profili che sono iscritti a quel gruppo |
nas |
Originally posted by nas
leggendo i vostri post mi sono venuti 2 dubbi:
1 - ma i comandi bisogna leggerli da tastiera o file ????
2 - come avete pensato di fare l'algoritmo per suggerire nuovi amici a un utente ???
nessuno che mi risponde ??? |
hyperion |
Originally posted by nas
nessuno che mi risponde ???
1)da tastiera..anche perchè è specificato stdinput nel testo del progetto
2)dipende che strutture dati usi... |
nas |
Originally posted by hyperion
1)da tastiera..anche perchè è specificato stdinput nel testo del progetto
2)dipende che strutture dati usi...
grazie!
uso un grafo fatto con un albero RB e liste di adiacenza |
elex1984 |
Ciao raga,
come siete messi con il progetto??? Io direi male :-( |
green.riot |
allora benvenuto sei dei nostri :-) |
Gehur |
pure io vi faccio compagnia..ho il progetto che mi sfonda la memoria cavolo, ed è solo prima funzione di inserimento..siamo spacciati.. |
BeppeGoal |
Quesito tecnico... ma se uno tenta il progetto del 18, e (grattatina) non andasse bene, può fare quello dell'8 marzo anche se il progetto non differisce di molto? (beh insomma...)
Secondo voi?
Grazie e buon lavoro a tutti! |
Gehur |
anche io ci ho pensato, credo di si comunque |
middu |
Io ho in mente di rappresentare un gruppo con un grafo. Ogni nodo del grafo conterrà la descrizione del gruppo e un puntatore ad una lista ordinata che conterrà tutti i profili iscritti in quel gruppo. L'idea vi piace ??? Per il momento è questa la mia idea del gruppo. Per contenere tutti i profili, invece ho pensato di utilizzare una lista ordinata. é Buona l'idea??? |
iuz-lab |
io ho scelto questa soluzione (vedi allegato)..
scusate se non si capisce un c***o ma non sono un grande scrittore.. |
Gehur |
si ma poi riesci ad implementare il tutto?? io ho problemi con l'inserimento del profilo nella tabella hash, ho anche capito il problema ma non riesco a risolverlo, e dire che è una cavolata(e il tempo stringe!) |
nas |
Originally posted by iuz-lab
io ho scelto questa soluzione (vedi allegato)..
scusate se non si capisce un c***o ma non sono un grande scrittore..
la struttura dati l'ho simile alla tua!
uso un albero RB per i nodi e liste di adiacenza per il grafo.
come hai pensato di gestire la funzionalità di "consigliare nuovi amici" ??? |
green.riot |
mm, io ho fatto un grafo con liste di adiacenza orientato quando una persona aggiunge un'altra finisce nel vettore degli amici. se anche l'altra persona ha il puntatore della persona che ha fatto la richiesta di amicizia allora sono amici, in caso contrario la richiesta resta sempre pendente.
ora dubbio, volevo fare un inserimento ordinato utilizzando la ricerca binaria modificata che mi restituisca il puntatore in cui fare l'inserimento. solo che sono sempre costretto a fare la scansione di tutta la lista per trovare il nickname da cercare :shock:
esempio:
___1______2____3_____4_____5____
| andrea | azul | beta | darwin | growl |
---------------------------------------------
@cerca darwin
G->V / 2 # divido in due il numero dei vertici
nella ricerca binaria dovrei fare il numero dei vertici diviso due e poi accedere al nickname e fare un confronto .. solo che per come funsiona il grafo con il puntatore next .. non è possibile .. o forse ignoro qualcosa di banale?
l'unica soluzione è creare una struttura dati parallela per la ricerca? un vettore? una matrice?
crecasi guru c oppure sherpa algoritmi |
green.riot |
ops come non detto si può -.-'' scusate |
iuz-lab |
come hai pensato di gestire la funzionalità di "consigliare nuovi amici" ???
non mi ricordo bene a cosa ho pensato.. comunque è una cosa del genere..
supponendo di voler consigliare amici al profilo P..
creo una lista di possibili amici di P popolando una lista con tutti gli amici degli amici di P (nessun nodo duplicato e nessun amico di P dovra' finire in questa lista)..
e poi la scorro e per ogni nodo vado alla ricerca di almeno 3 amici che sono presenti nella lista degli amici di P..
se ci sono 3 amici lo consiglio, altrimenti no.. |
Benny |
Ciao a tutti, qualcuno di voi mi saprebbe dire come diavolo si resetta una stringa(puntatore char) in questo malefico linguaggio?
le sto provando tutte il problema mio è che uso scanf e strcat che concatena due puntatori stringa, ma all'iterazione successiva il puntatore è quasi pieno e non fa un tubo o fa cazzate..
aggiungere un \0 non fa nulla, anzi da errore
non è bello come java quindi non si può fare stringa=""
funzioni standard non ci sono
fare free e riallocare non fa una mazza
insomma o mi metto io a grattare i dischi magnetici per pulire la stringa o non si da una mossa sta maledetta stringa...
io ancora devo fare un casino di roba e mi sento come prince of persia solo che ho una clessidra piu piccola anche se devo consegnare il 9 marzo |
Gehur |
il tuo problema è leggere una la stringa di input??
per esempio nick n nick2
comunque se ti può essere utile e se ho capito il problema:
char* stringa = calloc(30,sizeof(char));
ti crea una stringa di 30 caratteri, se non bastano basta fare realloc
string = (char*)realloc(string, (i+1)*sizeof(char));
sui vari progetti vecchi c'è la funzione readstring che fa questo |
Benny |
no gehur il problema e leggere system ? nick1 nick2 gruppo
dove gruppo puo avere degli spazi bianchi, e in generale in tutti i comandi dove ci sta o gruppo o status che implicano spazi bianchi..
provero a vedere questa readstring..
comunque nel realloc, si estende la stringa corrente, io devo renderla di nuovo vuota
ovvero dopo un comando il puntatore e sporco del vecchio comando, se io ne immettessi un altro, lo metterebbe in coda fino al totale riempimento o a delle schifezze...
i passi sono:
comando carattere qualcosa gruppo(o status)
le stringhe sono piene
devo renderle vuote(gruppo=vuoto)
grazie
controllero quella funzione |
darkshadow |
 
magari farlo puntare a NULL?? |
Benny |
gia fatto, quando alla prossima iterazione ci riscrivo sopra, riscriverei su un puntatore a null, quindi errore ecc... |
darkshadow |
 
cmq non capisco a cosa ti serve azzerare la stringa. quando ti serve basta ke la fai punatre a la nuova stringa. |
iuz-lab |
per leggere una riga del tipo nick n st dove nick non ha spazi mentre st si potete fare in questo modo..
code:
line = gets();
nickname = strtok(line, " ");
command = strtok(NULL, " ");
status = strtok(NULL, "");
quando prendo status il secondo parametro è lasciato intenzionalmente vuoto..
per capire meglio, il mio codice fa' una cosa del genere..
code:
[cut]
#define BLK " \t"
[cut]
cmd->w0 = cmd->w1 = cmd->w2 = NULL;
cmd->w0 = s_strtok(line, BLK);
if (cmd->w0 == NULL) {
// uscita con errore
}
cmd->w1 = s_strtok(NULL, BLK);
if (cmd->w1 == NULL) {
// uscita con errore
}
if (strlen(cmd->w1) != 1) {
// uscita con errore
}
switch (cmd->w1[0]) {
[cut]
case 'n':
free(cmd->w1);
cmd->w2 = s_strtok(NULL, "");
cmd->w1 = s_trim(cmd->w2, BLK);
if (cmd->w1 != NULL) {
cmd->action = USR_CH_STATUS;
return cmd;
}
[cut]
dove s_strtok è l'equivalente di strtok riscritto da me per non aver problemi di overflow e s_trim è una funzione sempre riscritta da me per non aver problemi di overflow e che rimuove tutti i caratteri del secondo parametro dalla testa e dalla coda del primo parametro..
in pratica io ho creato una funzione parse() che prende in input una linea e ritorna una struttura "command" che contiene un int action (che indica quale tipo di azione deve essere svolta) e tre stringhe (che contengono, a seconda dell'operazione richiesta, tutte le stringhe necessarie.. per esempio: se l'azione è "n" allora conterranno nome nick e status)..
se volete posto il codice completo della mia funzione parse.. ma credo che la elimineranno dal forum (visto che dovrebbe essere proibito aiutarsi con pezzi di codice) (anche se è possibile utilizzare codice trovato in rete e nei progetti precedenti.. mah?!?! ha senso?!?!) |
iuz-lab |
giusto per chiarire le idee a chi ne ha bisogno..
per gestire input di lunghezza arbitraria si usano le funzioni malloc, realloc, free, getchar..
esempio per la memoria (lettura di 9 caratteri):
code:
int i;
char *str;
str = malloc((size_t) 10); // allocazione dello spazio per 9 caratteri (piu' 1 per il '\0')
for (i = 0; i < 9; i++) { // leggo 9 caratteri
str[i] = getchar();
}
str[9] = '\0'; // metto il carattere di fine stringa (non servirebbe ma è sempre bene)
// codice che elabora la mia stringa
free(str); // libero la memoria allocata all'inizio
visto che readstring è gia' disponibile online non credo che postare la mia funzione possa essere considerato contro i termini del progetto..
mia funzione equivalente di readstring:
code:
static int __eofflag = 0;
char *s_gets ()
{
char *line;
int i, s = 16;
char c;
if (__eofflag) {
return NULL;
}
line = malloc(sizeof(char) * s);
for (i = 0; 1; i++) {
if (i + 1 >= s) {
s *= 2;
line = realloc(line, s);
}
c = getchar();
switch (c) {
case '\n':
line[i] = '\0';
return line;
case EOF:
__eofflag = 1;
if (i == 0) return NULL;
line[i] = '\0';
return line;
default:
line[i] = c; break;
}
}
questa funzione legge una intera stringa da stdin e ritorna un puntatore a questa.. non ha problemi di overflow e fa soltanto log_2(n) riallocazioni (dove n è la lunghezza della stringa).. l'unico svantaggio è che se n è di poco superiore ad una potenza di 2 si spreca "un'po'" di spazio (ma è trascurabile visto per cosa dovrebbe essere usata)..
sarebbe migliorabile ulteriormente ma diventerebbe illeggibile.. |
Joy88 |
Ciao!
ragazzi qui il progetto va male.......!!!
Ora sono alle prese con il nick c...... mah.... ho seri dubbi.....
Domanda:
Mi sono fatta una virtual machine x linux dato che uso windows solo che mi mancano le librerie.. anche quelle standard x il gcc!!
quindi non funziona niente.. quindi chiedo a voi guru di linux: sapete dove posso scaricarle e dove le devo mettere??? |
darkshadow |
 
ma perchè ti 6 fatto la VM?? guarda che c'è gcc anche per winzokz!! |
Joy88 |
Ho scritto con il Dev C++ ma dalle lezioni di lab ho scoperto che alcune cose sono incompatibili con il gcc.. ad esempio la getch(); che equivale alla system ("PAUSE")..
quindi ho dedotto che non stavo scrivendo in ANSI C...
In ogni caso.. su windowz cosa devo fare?? i comandi son gli stessi???? |
darkshadow |
 
sul sito di aguzzoli c'è gcc per win. decomprimi la cartella e poi da riga di comando vai nella cartella e digiti gocs che ti setta le variabili d'ambiente e poi il resto è uguale a gcc in linux. |
Joy88 |
Ti ringrazio Darkshadows!!!
Adesso ci provo..!!
Ti citerò nei ringraziamenti del progetto!!!
:cool:
ihihih!!! |
Benny |
iuz-lab ci ho capito poco di tutto quello che hai detto, anche perchè io prima usavo l'originale gets e il prof me lo aveva vietato, cosi sono passato alla scanf, e tutto andava bene ma siccome devo prendere un input con spazi bianchi e quindi ho usato strcat per aggiungerli, mi fa un casino non indifferente..in pratica credo che con la scanf il puntatore venga sovrascritto normalmente, ma nel caso io usi la strcat, sovrascriva solo l'ultimo puntatore, e presto si riempira del tutto lasciando il vecchio contenuto quasi intatto...continuo a provare a ripulire il puntatore, ma perdo tempo per sta cosa..
ti ringrazio per l'interesse, pero non posso copiare il tuo codice o il prof mi fa il culo quando lo vede |
iuz-lab |
allora vedo di essere piu' chiaro..
l'obiettivo è dividere una stringa in modo particolare.. nello specifico (per nick n st):
<spazi bianchi> <nick> <spazi bianchi> <char 'n'> <spazi bianchi> <st>
per farlo il c ti mette a disposizione diverse funzioni utili.. gets e strtok sono quelle che ci interessano..
char *gets(char *s);
Reads next line from stdin into s. Replaces terminating newline with '\0'. Returns s, or NULL on end-of-file or error.
e qui ci troviamo di fronte al problema dell'overflow che puoi risolvere usando readstring (ammesso che io abbia capito quello che dovrebbe fare readstring.. magari mi sto' sbagliando) o la funzione che ho postato o una funzione equivalente..
char* strtok(char* s, const char* ct);
A sequence of calls to strtok returns tokens from s delimited by a character in ct. Non-NULL s indicates the first call in a sequence. ct may differ on each call. Returns NULL when no such token found.
questa funzione è una manna per leggere stringhe del tipo nick n st..
in pratica la prima volta che la chiamiamo gli passiamo come primo parametro il nome della stringa da esaminare e nelle successive chiamate gli passiamo NULL, mentre come secondo parametro gli indichiamo un set di caratteri che funzionano da delimitatori..
per esempio:
code:
char *string = "123 456 789";
char *part;
part = strtok(string, " ");
do {
printf("-- %s --\n", part);
} while (part = strtok(NULL, " ") != NULL);
stamperà:
code:
-- 123 --
-- 456 --
-- 789 --
questo pero' non è il comportamento che volevamo.. per noi dopo il secondo token "tutto fa brodo"..
ma strtok ci mette in condizione di cambiare i caratteri delimitatori del token ad ogni chiamata..
quindi possiamo scrivere un codice del tipo:
code:
char *string = "bob n i hate facebook";
char *nickname, *action, *status;
nickname = strtok(string, " ");
action = strtok(NULL, " ");
status = strtok(string, ""); // NOTA CHE NON HO DATO ALCUN CARATTERE DELIMITATORE
printf("--%s--", nickname);
printf("--%s--", action);
printf("--%s--]", status);
visto che nell'ultima chiamata a strtok non ho messo delimitatori strtok mi ritornerà il resto della stringa (che è il comportamento desiderato)..
quindi l'ouput sarà:
code:
--bob--
--n--
-- i hate facebook--
ora, come puoi vedere, siamo vicinissimi alla soluzione.. dico vicinissimi perchè cambiare il set di delimitatori nella terza strtok ci ha fatto prendere come stringa di status " i hate facebook" (nota lo spazio iniziale) invece di "i hate facebook"..
per risolvere puoi usare la funzione strspn..
size_t strspn(const char* cs, const char* ct);
Return length of prefix of cs consisting entirely of characters in ct.
questa funzione non te la spiego.. perchè iniziano a sanguinarmi gli occhi :-D ma la puoi sfruttare per scriverti una funzione ltrim in C..
ricapitolando:
code:
char *line;
char *nick, *status, *action, *string1;
while(line = gets() != NULL) { // qui usa una funzione sicura ma equivalente a gets
string1 = strtok(line, " "); // questo è il primo token (non so come chiamarlo finche
//non conosco l'azione da intraprendere..
//e questo lo posso capire solo esaminando il secondo token nello switch)
action = strtok(NULL, " ");
switch(action[0]) {
// ...
case 'n':
nick = string1; // adesso che so che la funzione è 'n' ho capito che il
// primo token rappresentava il nickname
status = strtok(NULL, ""); // qui ci finirà "status" con eventuali spazi iniziali
// elimino gli spazi iniziali (e magari anche finali) da status
// faccio le mie sporche operazioni con nick e status
break;
// ...
}
}
spero di essere stato sufficientemente chiaro (dubito)..
ciao,
iuz |
iuz-lab |
Originally posted by Benny io prima usavo l'originale gets e il prof me lo aveva vietato, cosi sono passato alla scanf [/B]
sia gets che scanf soffrono degli stessi problemi.. vanno evitate entrambe :-P
se le usi non sei in grado di rispettare il vincolo del progetto che dice "non devono esistere limiti alla lunghezza massima di una stringa" o qualcosa del genere (il succo comunque era quello)..
scriviti una funzione gets sicura e sei a posto..
ne trovi mille implementazioni gia' pronte in rete (probabilmente anche nei progetti passati) oltre quella che ho gia' lasciato nel post di ieri (era ieri?!?).. |
xSharKMaNx |
Grande iuz-lab ... è esattamente ciò che ho fatto ;)
ma la fgets si potrà utilizzare ?
ieri sera leggendo tutti i i punti del progetto ho notato:
Per semplicità si suppone che l’input sia sempre conforme alle specifiche delle Tabelle 1,2,3 e 4, per cui
non è necessario controllare la correttezza dell’input. Per leggere l’input si usino le funzioni standard
ANSI C getchar() e/o scanf().
|
Joy88 |
Ragazzi io sto implementando tutto tramite liste..
Ma avete pensato a come fare per i gradi di separazione?? :?
Non so proprio dove sbatter la testa.. |
Gehur |
be io conto tutti gli amici che ho, e ci levo 1..
quindi se ho 3 mici nella lista amici, il grado di separazione sarà 2, se ho solo 1 amico, sarà infinito..
il fatto è che non sono sicuro di aver capito la specifica :D
ma qualcuno è riuscito a finirlo il progetto?? |
Joy88 |
No aspetta x il grado di separazione io l'ho inteso così:
A amico di B amico di C amico di D
tra A e B il grado è 1
tra A e C il grado è 2
tra A e D il grado è 3
se avessi:
A amico di B amico di C amico di D e E amico di F
tra A e E il grado è infinito
tra A e F il grado è infinito
:shock:
..Ho capito male io??? :? |
Gehur |
quindi tu dici se non sono amici grado infinito,altrimenti se sono amici conta quante persone ci sono tra loro 2
e bo..io non ho capito molto bene il testo, dovrei rileggerlo ma adesso sono in sbatta per far funzionare il tutto correttamente, al max il grado di separazione lo ricalcolo, non mi sembra il problema più grosso.. |
Joy88 |
Originally posted by Joy88
No aspetta x il grado di separazione io l'ho inteso così:
A amico di B amico di C amico di D
tra A e B il grado è 1
tra A e C il grado è 2
tra A e D il grado è 3
se avessi:
A amico di B amico di C amico di D e E amico di F
tra A e E il grado è infinito
tra A e F il grado è infinito
:shock:
..Ho capito male io??? :?
Ma guarda che nel mio esempio A è amico di B ma NON di C e D..
Per quello mi sembra difficile.. tutti gli amici di A hanno grado 1 gli amici degli amici di A (che non sono miei amici) hanno grado 2, gli amici degli amici degli amici di A (non miei amici) hanno grado 3 ecc..
Ho paura di una funzione ricorsiva infinita!!!!
:twisted: |
Gehur |
io alla prima lettura l'avevo interpretata così:
system ! nick nick2
nick e nick 2 devono essere amici, se sono amici conta quante persone ci sono nella lista amici di nick, se è presente solo nick2 fai grado infinito..
ripeto dovrei rileggerla visto che ho dubbi su come l'ho compresa |
iuz-lab |
Originally posted by xSharKMaNx
ma la fgets si potrà utilizzare ?
beh, se usata bene, fgets è sicura.. mentre scanf no..
visto che il docente aveva proibito l'uso di fgets (non è che la abbia proprio proibita.. ma tant'è) io ho (come vedi dai post precedenti) scritto una funzione safe_gets che lavora con stringhe di lunghezza arbitraria e funziona grazie alla funzione getchar (che, al contrario di fgets, il docente dice di usare)
comunque non credo sia un problema.. meglio una fgets di una scanf.. |
nas |
ragazza ma è sufficiente che il progetto compilato con
gcc -o faccialibro faccialibro.c
non dia nessun errorre o warning o bisogna compilarlo con le opzioni -ansi e -pedantic e quindi
gcc -o -ansi -pedantic faccialibro faccialibro.c
??????? |
nas |
Originally posted by nas
ragazza ma è sufficiente che il progetto compilato con
gcc -o faccialibro faccialibro.c
non dia nessun errorre o warning o bisogna compilarlo con le opzioni -ansi e -pedantic e quindi
gcc -o -ansi -pedantic faccialibro faccialibro.c
???????
uhm... volevo dire ragazzi! |
Gehur |
se non hai warning con -ansi sicuramente vuol dire che è tutto perfetto, comunque -o dovrebbe bastare |
Joy88 |
Niente news sul fronte system ! o system ? ???
Io proprio non mi capacito... |
Bloom |
non sono altro che il percorso minimo tra 2 nick per system !
per system ? è il percorso minimo tra due nik ,madevi contrllare che tutti i profili che visiti appartengono all stesso gruppo |
Joy88 |
Io ho fatto tutto tramite liste.. quindi dubito che possa risolverlo con il percorso minimo.. |
Bloom |
io ho fatto con un albero rb e lista di adiacenza Ho utilizzato un BFS.
Hai fatto tutto a liste o hai anche un grafo /albero? |
hyperion |
Originally posted by Bloom
io ho fatto con un albero rb e lista di adiacenza Ho utilizzato un BFS.
Hai fatto tutto a liste o hai anche un grafo /albero?
ma guardate che potete benissimo implementare un grafo e le visite di un grafo usando solo alberi e liste...non è che c'è bisogno d'altro... |
Joy88 |
Bloom: solo liste ho usato.. hai qualche suggerimento x me???
:D
Hyperion non ho capito bene... |
hyperion |
Originally posted by Joy88
Bloom: solo liste ho usato.. hai qualche suggerimento x me???
:D
Hyperion non ho capito bene...
pensa a che cosa in realtà è un grafo.... |
Joy88 |
Sì ma aspetta un attimo..
io ho già fatto tutto.. mi mancano solo queste funzioni..
tutto con le liste.. non stravolgo il lavoro di 2 settimane.. |
Bloom |
un grafo......sono dei nodi i vicini dei nodi non sono altro che liste :-)
Io ho un altro problema:non riescoa togliere lo spazio all'inizio di una stringa..sapete com si fa? |
hyperion |
Originally posted by Joy88
Sì ma aspetta un attimo..
io ho già fatto tutto.. mi mancano solo queste funzioni..
tutto con le liste.. non stravolgo il lavoro di 2 settimane..
tutto con le liste?cioè? |
Joy88 |
Tutto fatto utilizzando solo liste!
Liste di profili, di amicizie ecc..
@Bloom.. ho un trucchetto: usa la sequenza di escape \b ti ritorna indietro in un carattere.. in pratica sovrascrivi lo spazio.. |
Bloom |
Originally posted by Joy88
Tutto fatto utilizzando solo liste!
Liste di profili, di amicizie ecc..
@Bloom.. ho un trucchetto: usa la sequenza di escape \b ti ritorna indietro in un carattere.. in pratica sovrascrivi lo spazio..
Cioè ?
Come deve essere utilizzato?
Il profilo è un nodo della lista?E ogni nodo ha una ilista per la gestione delle amicizie? |
Joy88 |
ho una lista profili nel quale il profilo sì è un nodo ma ogni nodo non ha la sua lista amicizie quella è a parte..
se in una print metti \b ti mangia il carattere precedente..
quindi se il tuo è un problema di stampa, come lo era x me, ho risolto mangiandomi lo spazio!!! |
Bloom |
Non è un problema di stampa, il problema è che la ricerca del gruppo non funziona perche c'è uno spazio.
Devo togiere lo spazio prima di inserire il nome del gruppo nell'albero.
Mi sa che è un po difficile gestire il calvcolo del percorso minimo solo con le liste.
Prova a farti una coda e vedi se riesci a gestirle cosi |
Joy88 |
Ok, se usi il getchar fai un getchar a vuoto che poi sovrascrivi..
tanto x farti un esempio:
nome[0]= getchar();
for (i=0; i < sizeof (...); i++)
nome [i] = getchar();
poi adattalo tu..!!
spero di esserti stata di aiuto!! |
Bloom |
Ti ringrazio!,ma non sempre memorizza in modo corretto..
Che stress ste stringhe |
Joy88 |
sì è un po' un casino..
ma d'altronde stiamo usando un linguaggio 1972.. Allora il tipo string non era contemplato!!!
:D |
Bloom |
appunto ci dovremmo evolvere....... |
Joy88 |
Poi voglio vedere quando andremo a lavorare e ci faranno usare, per dire il visual basic, cosa gli racconteremo!!!! Sarà utile sapere che in c non c'è il tipo string??? Mah..
ancora un po' e l'anno prossimo ci troviamo a scrivere il pascal.. |
Bloom |
comunque....sono costretta ad avere diverse funzioni di lettura a seconda del caso....che noia...... |
Joy88 |
Sì certo.. e anche di scrittura!!! |
Gehur |
Originally posted by Bloom
non sono altro che il percorso minimo tra 2 nick per system !
per system ? è il percorso minimo tra due nik ,madevi contrllare che tutti i profili che visiti appartengono all stesso gruppo
bene, posso dire di essere fregato..non avevo mica capito che bisognava cercare il persorso minimo tra 2 nick..infatti mi sembravano funzioni un po inutili :D
in pratica è il percoso minimo tra i loro amici?? cioè anche se nick e nick2 non si conoscono possono avere un grado di separazione minimo se hanno amici in comune?
insomma non solo mi mancano ancora da fare un sacco di funzioni, devo rivedere il tutto per calcolarmi sto cammino minimo..sarà davvero dura |
iuz-lab |
sto' uscendo quindi faccio in anticipo gli auguri..
buon timestamp 1234567890 a tutti :-D |
Benny |
rispondo a bloom per lo spazio bianco, usando strtok come esposto anche da altri puoi tokenizzare con un certo separatore, se torni un po indietro noterai varie spiegazioni che comunque sul libro o su internet trovi subito.
Ora invece rispondo a iuz-lab, purtroppo io non ci capisci un cacchio di che problemi hanno ste maledette funzioni di input, ma scovando un indizio su iprogrammatori e facendo una piccola ricerca
al link:http://forum.html.it/forum/showthread/t-1103656.html
troverete la soluzione definitiva yattaaaa:
praticamente io adesso uso soltanto scanf, come richiesto esplicitamente dal prof, ma per poter buttare dentro tutta una pappardella di roba con spazi usando la
scanf("%[^\n]s",str);
piglia tutto fino al carattere di ritorno a capo.
E adesso, se ce la faccio con tutti sti colloqui di lavoro, e con casini di vario genere spero di riuscire a farcela per il tempo che rimane
shinra tensei iiiiaaaaaaaa |
hyperion |
Originally posted by Joy88
sì è un po' un casino..
ma d'altronde stiamo usando un linguaggio 1972.. Allora il tipo string non era contemplato!!!
:D
mi chiedo che cosa fanno a fare java il primo anno..... |
Gehur |
be io non ci sto più con la testa..per mercoledi non riesco a finirlo..dovrò fare la versione ancora più complicata :D
non capisco che problemi ho con la cancellazione(da stamattina che la sto guardando!), e devo ancora fare il consiglia amici e il grado di separazione, in pratica mi manca tutto..cazzo passano in fretta 3 settimane
la cosa che mi da fastidio comunque è il fatto che il prossimo esame sarà tra quasi 4 mesi!! assieme a matematica e altri, tanto per rendere le cose semplici :D |
iuz-lab |
Originally posted by Benny
Ora invece rispondo a iuz-lab, purtroppo io non ci capisci un cacchio di che problemi hanno ste maledette funzioni di input, ma scovando un indizio su iprogrammatori e facendo una ...
il problema è l'overflow..
se non allochi abbastanza spazio per i dati in arrivo scanf "trabocchera'" i dati oltre il limite..
code:
char *str = malloc(sizeof(char) * 10);
scanf("%s", str);
malloc ti riserva lo spazio per dieci byte.. quindi hai:
|_|_|_|_|_|_|_|_|_|_|
se inserisci una stringa di 5 caratteri ("ciao!") succede questo:
|c|i|a|o|!|\0|_|_|_|_|
e questo va bene..
ma se inserisci una stringa di 11 caratteri ("ciao bella!") succede questo:
|c|i|a|o|!| |b|e|l|l||a|!|\0|
come puoi vedere scanf scrive ben oltre il limite della memoria disponibile assegnataci da malloc..
questo genera un overflow che da comportamenti non definiti..
una soluzione sarebbe allocare una quantita' di memoria ragionevolmente ampia (1000 caratteri) per rendere il programma ragionevolmente sicuro..
un'altra soluzione sarebbe quella di leggere al massimo x caratteri e fare fscanf su di essi (ma imponendo comunque un limite di grandezza delle stringhe di input prefissato)
un'altra soluzione (quella che piu' va d'accordo con i requisiti del progetto) è quella di scrivere una funzione scanf o una funzione gets che non risentono del problema dell'overflow..
dico che "va piu' d'accordo con il progetto" per via dei requisiti di tipo: "stringa di lunghezza arbitraria" |
hyperion |
Originally posted by iuz-lab
il problema è l'overflow..
se non allochi abbastanza spazio per i dati in arrivo scanf "trabocchera'" i dati oltre il limite..
code:
char *str = malloc(sizeof(char) * 10);
scanf("%s", str);
malloc ti riserva lo spazio per dieci byte.. quindi hai:
|_|_|_|_|_|_|_|_|_|_|
se inserisci una stringa di 5 caratteri ("ciao!") succede questo:
|c|i|a|o|!|\0|_|_|_|_|
e questo va bene..
ma se inserisci una stringa di 11 caratteri ("ciao bella!") succede questo:
|c|i|a|o|!| |b|e|l|l||a|!|\0|
come puoi vedere scanf scrive ben oltre il limite della memoria disponibile assegnataci da malloc..
questo genera un overflow che da comportamenti non definiti..
una soluzione sarebbe allocare una quantita' di memoria ragionevolmente ampia (1000 caratteri) per rendere il programma ragionevolmente sicuro..
un'altra soluzione sarebbe quella di leggere al massimo x caratteri e fare fscanf su di essi (ma imponendo comunque un limite di grandezza delle stringhe di input prefissato)
un'altra soluzione (quella che piu' va d'accordo con i requisiti del progetto) è quella di scrivere una funzione scanf o una funzione gets che non risentono del problema dell'overflow..
dico che "va piu' d'accordo con il progetto" per via dei requisiti di tipo: "stringa di lunghezza arbitraria"
ma per ottenere tipo il comando al centro in una stringa nick M nick come posso procedere?divido in token?esiste una funzione simile?i mie i ricordi arrivano da java |
Bloom |
Ma voi riuscite a far stampare le virgole nella stampa dei profili in modo corretto?
Io non ci riesco!!!! |
hyperion |
Originally posted by Bloom
Ma voi riuscite a far stampare le virgole nella stampa dei profili in modo corretto?
Io non ci riesco!!!!
...quali virgole?? |
Bloom |
Nella stampa.....Ah nooo
Ma che cosa ho guardato?Ero convinta che ci fossero...mi sa che me le sono sognate.
Le operazioni con ? vi escono giuste? |
hyperion |
Originally posted by Bloom
Nella stampa.....Ah nooo
Ma che cosa ho guardato?Ero convinta che ci fossero...mi sa che me le sono sognate.
Le operazioni con ? vi escono giuste?
ti ho mandato un pm...cmq avrai guardato più su quando diceva : siano nick1,nick2,nick3 i profili ecc ecc....nell'output da stampare però nn ci sono.. |
Bloom |
Nella prima versione di faccialibro avevo visto le virgole ,ma magari mi sono sbagliata |
Joy88 |
Ma ragazzi.. voi compilate con gcc -ansi progetto.c??
Perchè a me in tal caso da almeno (non scherzo) 100 warning....
:( |
Bloom |
su linux:
gcc -ansi nomeprogetto.c -o nomeprogetto
per windows:
gcc -ansi -o progetto progetto.c |
Joy88 |
Merda!
..e adesso come faccio????
..se li lascio sarà grave??? |
poi_1969 |
State attenti alle indicazioni di iuz-lab, a volte esce fuori tema. |
hyperion |
Originally posted by Joy88
Merda!
..e adesso come faccio????
..se li lascio sarà grave???
che warning hai? |
Joy88 |
Se proprio vuoi vederli... :D
progetto.c:1538: error: `trovato' previously defined here
progetto.c:1562: warning: data definition has no type or storage class
progetto.c:1563: error: parse error before '}' token
progetto.c:1564: error: redefinition of `g'
progetto.c:1542: error: `g' previously defined here
progetto.c:1564: error: invalid type argument of `->'
progetto.c:1564: warning: data definition has no type or storage class
progetto.c:1565: error: parse error before '}' token
progetto.c:1566: error: redefinition of `g'
progetto.c:1564: error: `g' previously defined here
progetto.c:1566: error: initializer element is not constant
progetto.c:1566: warning: data definition has no type or storage class
progetto.c:1567: error: parse error before '}' token
progetto.c:1570: error: redefinition of `a3'
progetto.c:1513: error: `a3' previously defined here
progetto.c:1570: error: invalid type argument of `->'
progetto.c:1570: warning: data definition has no type or storage class
progetto.c:1571: error: parse error before '}' token
progetto.c:1572: error: redefinition of `a3'
progetto.c:1570: error: `a3' previously defined here
progetto.c:1572: error: initializer element is not constant
progetto.c:1572: warning: data definition has no type or storage class
progetto.c:1573: error: parse error before '}' token
progetto.c:1575: error: redefinition of `a2'
progetto.c:1260: error: `a2' previously defined here
progetto.c:1575: error: invalid type argument of `->'
progetto.c:1575: warning: data definition has no type or storage class
progetto.c:1576: error: parse error before '}' token
progetto.c:1577: error: redefinition of `a2'
progetto.c:1575: error: `a2' previously defined here
progetto.c:1577: error: initializer element is not constant
progetto.c:1577: warning: data definition has no type or storage class
progetto.c:1578: error: parse error before '}' token
progetto.c:1604: error: redefinition of `trovato'
progetto.c:1562: error: `trovato' previously defined here
progetto.c:1604: warning: data definition has no type or storage class
progetto.c:1605: error: parse error before '}' token
progetto.c:1606: error: redefinition of `g'
progetto.c:1566: error: `g' previously defined here
progetto.c:1606: error: invalid type argument of `->'
progetto.c:1606: warning: data definition has no type or storage class
progetto.c:1607: error: parse error before '}' token
progetto.c:1608: error: redefinition of `g'
progetto.c:1606: error: `g' previously defined here
progetto.c:1608: error: initializer element is not constant
progetto.c:1608: warning: data definition has no type or storage class
progetto.c:1609: error: parse error before '}' token
progetto.c:1628: error: redefinition of `trovato'
progetto.c:1604: error: `trovato' previously defined here
progetto.c:1628: warning: data definition has no type or storage class
progetto.c:1629: error: parse error before '}' token
progetto.c:1630: error: redefinition of `g'
progetto.c:1608: error: `g' previously defined here
progetto.c:1630: error: invalid type argument of `->'
progetto.c:1630: warning: data definition has no type or storage class
progetto.c:1631: error: parse error before '}' token
progetto.c:1632: error: redefinition of `g'
progetto.c:1630: error: `g' previously defined here
progetto.c:1632: error: initializer element is not constant
progetto.c:1632: warning: data definition has no type or storage class
progetto.c:1633: error: parse error before '}' token
progetto.c:1636: error: redefinition of `a3'
progetto.c:1572: error: `a3' previously defined here
progetto.c:1636: error: invalid type argument of `->'
progetto.c:1636: warning: data definition has no type or storage class
progetto.c:1637: error: parse error before '}' token
progetto.c:1638: error: redefinition of `a3'
progetto.c:1636: error: `a3' previously defined here
progetto.c:1638: error: initializer element is not constant
progetto.c:1638: warning: data definition has no type or storage class
progetto.c:1640: error: parse error before "if"
progetto.c:1669: error: redefinition of `trovato'
progetto.c:1628: error: `trovato' previously defined here
progetto.c:1669: warning: data definition has no type or storage class
progetto.c:1670: error: parse error before '}' token
progetto.c:1671: error: redefinition of `g'
progetto.c:1632: error: `g' previously defined here
progetto.c:1671: error: invalid type argument of `->'
progetto.c:1671: warning: data definition has no type or storage class
progetto.c:1672: error: parse error before '}' token
progetto.c:1673: error: redefinition of `g'
progetto.c:1671: error: `g' previously defined here
progetto.c:1673: error: initializer element is not constant
progetto.c:1673: warning: data definition has no type or storage class
progetto.c:1674: error: parse error before '}' token
progetto.c:1693: error: redefinition of `trovato'
progetto.c:1669: error: `trovato' previously defined here
progetto.c:1693: warning: data definition has no type or storage class
progetto.c:1694: error: parse error before '}' token
progetto.c:1695: error: redefinition of `g'
progetto.c:1673: error: `g' previously defined here
progetto.c:1695: error: invalid type argument of `->'
progetto.c:1695: warning: data definition has no type or storage class
progetto.c:1696: error: parse error before '}' token
progetto.c:1697: error: redefinition of `g'
progetto.c:1695: error: `g' previously defined here
progetto.c:1697: error: initializer element is not constant
progetto.c:1697: warning: data definition has no type or storage class
progetto.c:1698: error: parse error before '}' token
progetto.c:1701: error: redefinition of `a3'
progetto.c:1638: error: `a3' previously defined here
progetto.c:1701: error: invalid type argument of `->'
progetto.c:1701: warning: data definition has no type or storage class
progetto.c:1702: error: parse error before '}' token
progetto.c:1703: error: redefinition of `a3'
progetto.c:1701: error: `a3' previously defined here
progetto.c:1703: error: initializer element is not constant
progetto.c:1703: warning: data definition has no type or storage class
progetto.c:1704: error: parse error before '}' token
progetto.c:1728: error: redefinition of `trovato'
progetto.c:1693: error: `trovato' previously defined here
progetto.c:1728: warning: data definition has no type or storage class
progetto.c:1729: error: parse error before '}' token
progetto.c:1730: error: redefinition of `g'
progetto.c:1697: error: `g' previously defined here
progetto.c:1730: error: invalid type argument of `->'
progetto.c:1730: warning: data definition has no type or storage class
progetto.c:1731: error: parse error before '}' token
progetto.c:1732: error: redefinition of `g'
progetto.c:1730: error: `g' previously defined here
progetto.c:1732: error: initializer element is not constant
progetto.c:1732: warning: data definition has no type or storage class
progetto.c:1733: error: parse error before '}' token
progetto.c:1752: error: redefinition of `trovato'
progetto.c:1728: error: `trovato' previously defined here
progetto.c:1752: warning: data definition has no type or storage class
progetto.c:1753: error: parse error before '}' token
progetto.c:1754: error: redefinition of `g'
progetto.c:1732: error: `g' previously defined here
progetto.c:1754: error: invalid type argument of `->'
progetto.c:1754: warning: data definition has no type or storage class
progetto.c:1755: error: parse error before '}' token
progetto.c:1756: error: redefinition of `g'
progetto.c:1754: error: `g' previously defined here
progetto.c:1756: error: initializer element is not constant
progetto.c:1756: warning: data definition has no type or storage class
progetto.c:1757: error: parse error before '}' token
progetto.c:1760: error: redefinition of `a3'
progetto.c:1703: error: `a3' previously defined here
progetto.c:1760: error: invalid type argument of `->'
progetto.c:1760: warning: data definition has no type or storage class
progetto.c:1761: error: parse error before '}' token
progetto.c:1762: error: redefinition of `a3'
progetto.c:1760: error: `a3' previously defined here
progetto.c:1762: error: initializer element is not constant
progetto.c:1762: warning: data definition has no type or storage class
progetto.c:1763: error: parse error before '}' token
progetto.c:1765: error: redefinition of `a2'
progetto.c:1577: error: `a2' previously defined here
progetto.c:1765: error: invalid type argument of `->'
progetto.c:1765: warning: data definition has no type or storage class
progetto.c:1766: error: parse error before '}' token
progetto.c:1767: error: redefinition of `a2'
progetto.c:1765: error: `a2' previously defined here
progetto.c:1767: error: initializer element is not constant
progetto.c:1767: warning: data definition has no type or storage class
progetto.c:1768: error: parse error before '}' token
progetto.c:1771: error: redefinition of `a'
progetto.c:1370: error: `a' previously defined here
progetto.c:1771: error: invalid type argument of `->'
progetto.c:1771: warning: data definition has no type or storage class
progetto.c:1772: error: parse error before '}' token
progetto.c:1773: error: redefinition of `a'
progetto.c:1771: error: `a' previously defined here
progetto.c:1773: error: initializer element is not constant
progetto.c:1773: warning: data definition has no type or storage class
progetto.c:1774: error: parse error before '/' token
progetto.c:1774: error: stray '\350' in program
progetto.c:1796: error: parse error before '/' token
progetto.c:1798: error: conflicting types for `c'
progetto.c:968: error: previous declaration of `c'
progetto.c:1798: error: conflicting types for `p'
progetto.c:1312: error: previous declaration of `p'
progetto.c:1800: error: parse error before "for"
progetto.c:1803: error: `i' undeclared here (not in a function)
progetto.c:1803: error: conflicting types for `group'
progetto.c:1798: error: previous declaration of `group'
progetto.c:1803: warning: data definition has no type or storage class
progetto.c:1804: error: `i' undeclared here (not in a function)
progetto.c:1804: error: conflicting types for `p'
progetto.c:1798: error: previous declaration of `p'
progetto.c:1804: warning: data definition has no type or storage class
progetto.c:1805: error: parse error before '}' token
progetto.c:1827: warning: parameter names (without types) in function declaratio
n
progetto.c:1827: error: conflicting types for `grado_amico'
progetto.c:978: error: previous declaration of `grado_amico' |
Joy88 |
..e attenzione.. non sono mica tutti.. :( |
hyperion |
Originally posted by Joy88
..e attenzione.. non sono mica tutti.. :(
ma come fa a compilartelo normalmente??!
cmq alcuni errori :
progetto.c:1570: error: invalid type argument of `->'
qui gli stai dando in pasto un qualcosa che non è un puntatore ad una struttura infatti come argomento -> vuole un puntatore
esempio
struct prova {
int campo;
}
typedef struct prova chiave;
chiave *k;
k->campo;
cosi è giusto perchè k è un puntatore alla struttura..altrimenti dovrebbe darti quell'errore... |
hyperion |
progetto.c:1563: error: parse error before '}' token
guarda che magari hai dimenticato qualche " ; " o errore di sintassi stupido prima di "} " |
hyperion |
Ci sono tante ridefinizioni a quanto si vede....stai attento a non ridefinire tipi,funzioni già definiti in precedenza altrimenti va tutto in conflitto....C non è come Java che potevi avere più funzioni con lo stesso nome e argomenti diversi,non esiste overloading! |
Joy88 |
Ragazzi con il dev c mi funziona senza warning nè niente..
se non metto -ansi funziona con pochissimi warning (che pensavo di lasciare) anche da riga di comando..
quindi direi che non mancano nè parentesi, nè punti e virgola..
..hyperion alla 1570 c'è: a3 = a3->next_a;
dove a3 è struct lista_amicizie *a3=a; e next_a è struct lista_amicizie *next_a=a;
Non so...
se dichiaro delle variabili locali con lo stesso nome in diverse funzioni non dovrebbe dare overloading no?! |
hyperion |
Originally posted by Joy88
Ragazzi con il dev c mi funziona senza warning nè niente..
se non metto -ansi funziona con pochissimi warning (che pensavo di lasciare) anche da riga di comando..
quindi direi che non mancano nè parentesi, nè punti e virgola..
..hyperion alla 1570 c'è: a3 = a3->next_a;
dove a3 è struct lista_amicizie *a3=a; e next_a è struct lista_amicizie *next_a=a;
Non so...
se dichiaro delle variabili locali con lo stesso nome in diverse funzioni non dovrebbe dare overloading no?!
no se sono variabili locali delle funzioni no!però li appaiono ridefinizioni e precedenti definizioni....ora non so cosa siano quelle variabili a cui si riferisce..! |
Joy88 |
Come ridefinizioni da errori stupidi tipo:
//dichiaro nella funzione la variabile locale
1538 :int trovato =0;
...
...
...
1561: if (...)
1562: trovato=1;
Gli errori dicono:
progetto.c:1538: error: `trovato' previously defined here
progetto.c:1562: warning: data definition has no type or storage class |
hyperion |
Originally posted by Joy88
Come ridefinizioni da errori stupidi tipo:
//dichiaro nella funzione la variabile locale
1538 :int trovato =0;
...
...
...
1561: if (...)
1562: trovato=1;
Gli errori dicono:
progetto.c:1538: error: `trovato' previously defined here
progetto.c:1562: warning: data definition has no type or storage class
come l'hai compilato usando -ansi con dev C?
hai aggiunto -ansi alle opzioni di compilazione? |
Joy88 |
No, non l'avevo aggiunto..!
Xò non capisco x' prima funzionava e adesso no.. |
hyperion |
Originally posted by Joy88
No, non l'avevo aggiunto..!
Xò non capisco x' prima funzionava e adesso no..
strano..prima te lo eseguiva senza problemi? |
|
|
|
|