PDA

Visualizza la versione completa : [C] Calcolo occorrenze in array di code


AgentSpam
23-12-2008, 04:51
Salve a tutti!
Innanzitutto mi sembra doveroso porvi le mie congratulazioni per il sito strutturato ottimamente e per le fantastiche guide: se mi sono affacciato al mondo della programmazione è anche per merito vostro!

Partendo dal presupposto che sono alle prime armi (non siate troppo severi con me anche se per voi questi argomenti risulteranno banalissimi!) il mio problema è il seguente:

vorrei calcolare le occorrenze all'interno di un array di code contenente interi. A dire il vero non ho ben presente come possa essere strutturato graficamente, di preciso, questo esercizio. Ho provato a fare un abbozzo e credo che il risultato sia questo:

http://img360.imageshack.us/img360/9837/bohzk0.png

In vista di ciò, ho preferito raggirare l'ostacolo tentando, in un primo momento, di calcolare le occorrenze di un intero all'interno di una semplice coda. In questo caso ho ottenuto il seguente codice:

testa = coda.primo;
trovato = 0;

while(temp != NULL)
{
if(temp->valore == n) //dove 'n' è il numero del quale cercare le occorrenze, scelto dall'utente
{
trovato++;
}
temp = temp->next;
}

if(trovato)
printf("bla bla bla");
else
printf("bla bla bla");

Da ciò ho provato a cercare una soluzione al problema iniziale ma sono molto confuso e non so come muovermi. Ho provato a stilare questi 2 frammenti di codice:

1)
int CercaOccorrenze(int num)
{
testa = coda->primo;
trovato = 0;

for(i=0; i<num; i++)
{
temp = testa;
while(temp != NULL)
{
if(temp->valore == num)
trovato++;
temp = temp->next;
}
return trovato;
}

2)
struct Cella
{
int valore;
struct Cella *next;
};

struct Coda
{
struct Cella *inizio;
struct Cella *fine;
};

typedef struct Cella *riferimento[MAX]; //dove 'MAX' è dichiarato in '#define'

int CercaOccorrenze2(struct Cella *cursore[MAX], num)
{
trovato = 0;

for(i=0; i<MAX; i++)
{
riferimento[i] *temp = NULL;

while(cursore[i] != NULL)
{
if(cursore[i]->valore == num)
trovato++;
temp = cursore[i];
cursore[i] = cursore[i]->next;
temp->next = NULL
}
}
return trovato;
}

Non credo affatto che vada bene. Avete idea di come risolvere? Se non vi dispiace potreste anche illustrarmi la figura grafica di un array di code? Mi aiutano parecchio i disegni!


L'ora si è fatta tarda: le palpebre e la mente incominciano ad abbandomarmi pian piano!
Vi ringrazio per l'attenzione e per l'eventuale risposta,
A.S.

MrX87
23-12-2008, 14:50
Innanzi tutto un consiglio, quando posti del codice mettilo tra gli appositi tag che ci sono nel forum...

esempio post codice

per il resto, bhè onestamente non ho capito molto il tuo problema...penso che in poche parole devi calcolare le occorrenze di un numero dato in input dall'utente in un array di code giusto?? per quanto riguarda l'array di code, è corretta la figura che hai rappresentato tu...anche se quella sembra una generica lista, la coda è una struttura FIFO (First In First Out ) quindi dovresti inserire sempre in testa e cacciare gli elementi dalla coda...ma comunque questo non è un problema per il tuo esercizio a quanto mi pare!

AgentSpam
23-12-2008, 20:05
Chiedo scusa, il sonno mi stava devastando e non ho pensato di inserire il codice tra gli appositi tag!

Sì, il mio obiettivo è calcolare le occorrenze di un dato inserito in input dall'utente in un array di code. Il primo codice che ho inserito serve per calcolare le occorrenza in una coda semplice, senza alcun array. Una volta fatto ciò, ho cercato di modificare esso per raggiungere il mio obiettivo e si sono prodotti i due codici che ho riportato sotto al primo, nel post precedente. Ancora non ho compilato nulla, sono solo bozze, ma credo che siano errate entrambe e chiedevo gentilmente una vostra supervisione. Leggendo le altre discussioni, trovare le occorrenze all'interno di un array di code, per voi, è un gioco da ragazzi! :D

MrX87
24-12-2008, 11:35
Innanzi tutto non ho capito a cosa serve quella struttura dati che hai fatto tu nel post precedente:


struct Coda
{
struct Cella *inizio;
struct Cella *fine;
};
perchè da come la vedo io, serve solo la struttura dati della lista ( coda ) ovvero:


struct Cella
{
int valore;
struct Cella *next;
};
che sembra corretta;

poi prova a scrivere il tuo codice e provare a avviarlo...perchè così, si fa poco e niente...cioè c'è qualcosa di giusto come anche la ricerca delle occorrenze, ovvero:


int CercaOccorrenze(int num)
{
testa = coda->primo;
trovato = 0;

for(i=0; i<num; i++)
{
temp = testa;
while(temp != NULL)
{
if(temp->valore == num)
trovato++;
temp = temp->next;
}
return trovato;
}
anche se questa funzine verrà sicuramente passata dal main dove tu avrai anche il tuo vettore di puntatori alla struct Cella(in questo caso "coda"), e quindi dovrai passare anche quello alla funzione, quindi ci sarà un parametro in più;
c'è qualche altro errore, perchè hai dimenticato totalmente di definire le variabili che usi, e poi il campo "primo" non esite in nessuna struttura!
poi devi gestire anche il vettore, nel senso renderlo statico, quindi fai una #define e il vettore lo dichiari statico, sempre del tipo struct Cella, oppure fai un puntatore alla struct Cella e poi fai inserire da tastiera la dimensione e lo allochi con la malloc...

ti posto io mio main che ho provato a fare...solo per darti un esempio...


#include <stdio.h>
#include <time.h>

typedef struct Cella {
int valore;
struct Cella *next;
}nodo;

int occorrenze ( nodo** vat, int val, int dim );
nodo** read ( int dim );
nodo* inserzione_lista ( nodo* top, int val, int dim );
nodo** allocazione ( int dim );
nodo* newE ( void );

int main ()
{
nodo **vet;
int dim, val;
int i, j;

printf ("Inserire grandezza vettore di liste: ");
scanf ("%d", &dim);

vet = read ( dim );

printf ("Inserire valore del quale calcolare le occorrenze: ");
scanf ("%d", &val);

printf ("Il valore val si trova nel vettore di liste %d volte\n", occorrenze (vet, val, dim));

system ("pause");
return (1);
} come vedi ho usato un vettore dinamico che alloco (di dim ) in seguito nella funzione read...

AgentSpam
24-12-2008, 13:37
Ti ringrazio per la dettagliata risposta, MrX87! Ora provvedo a risponderti:

Originariamente inviato da MrX87
c'è qualche altro errore, perchè hai dimenticato totalmente di definire le variabili che usi, e poi il campo "primo" non esite in nessuna struttura!
poi devi gestire anche il vettore, nel senso renderlo statico, quindi fai una #define e il vettore lo dichiari statico, sempre del tipo struct Cella, oppure fai un puntatore alla struct Cella e poi fai inserire da tastiera la dimensione e lo allochi con la malloc...
Ho preferito evitare di copiare anche il main perché, teoricamente, su di esso non dovrei aver commesso errori, anche se è leggermente diverso dalla tua versione. Il mio vero problema è che non capisco il ragionamento della ricerca... :nonlodire

Questo è il mio attuale programma al completo:

#include <stdio.h>
#include <stdlib.h>

#define MAX 4

struct Cella
{
int valore;
struct Cella *next;
};

struct Coda
{
struct Cella *primo;
struct Cella *ultimo;
};

typedef struct Cella nodo;
int CercaOccorrenze(nodo *cursore, int num);

int main()
{
int n, i, occ;
nodo *testa[MAX];

printf("Inserire il numero del quale si stanno ricercando le occorrenze: ");
scanf("%d", &n);

for(i=0; i<MAX; i++)
{
occ = CercaOccorrenze(testa[MAX], n);
}

printf("Il numero %d possiede %d occorrenze.", n, occ);

system("pause");
return 0;
}

int CercaOccorrenze(nodo *cursore, int num)
{
nodo *temp = NULL;
int trovato = 0;

while(cursore =! NULL)
{
if(cursore->valore == num)
{
trovato++;
}
temp = cursore;
cursore = cursore->next;
temp->next = NULL;
}

return trovato;
}
Così composto pensi che possa andare bene? :bhò:

Altro quesito al quale non riesco a rispondermi:

Originariamente inviato da MrX87
Innanzi tutto non ho capito a cosa serve quella struttura dati che hai fatto tu nel post precedente:

struct Coda
{
struct Cella *inizio;
struct Cella *fine;
};
perchè da come la vedo io, serve solo la struttura dati della lista ( coda )
Mi sono posto la medesima domanda durante la stesura del codice ma non ho trovato alcuna risposta. Ricordo, però, che negli esempi di codice che mi davano alle superiori, questa struttura era onnipresente ma non ne comprendo l'utilizzo, dato che nelle code il procedimento di lettura è il medesimo delle liste! Penso che possa tornare utile solo in caso si debba inserire un elemento, giusto? :master:

MrX87
24-12-2008, 15:26
ecco già ci siamo quasi apparte qualche piccolo errore, ovvero:


int main()
{
int n, i, occ=0;
nodo *testa[MAX];

for(i=0; i<MAX; i++) testa[i]=NULL;

printf("Inserire il numero del quale si stanno ricercando le occorrenze: ");
scanf("%d", &n);

for(i=0; i<MAX; i++)
{
if ( testa[i] != NULL ) occ += CercaOccorrenze(testa[i], n);
}

printf("Il numero %d possiede %d occorrenze.\n", n, occ);

system("pause");
return 0;
}il for che ho inserito serve per mettere inizialmente a NULL tutti i puntatori...altrimenti se vai a cercare e la lista è vuota ti va in crash, e poi quando vai a fare la ricerca, fai un test prima su testa[i] per vedere se il puntatore non è NULL, e poi passi alla funzione testa[i], non testa[MAX]!
Inoltre devi mettere "+=" ovvero:


occ = CercaOccorrenze(testa[i], n) + occ;
perchè deve sommare le occorrenze in occ, altrimenti va a contre le occorrenze in ogni singola lista! non so se mi sono spiegato!

Infine la funzione ricerca io la farei come l'hai fatta tu ma sl cn una piccola modifica:


int CercaOccorrenze(nodo *cursore, int num)
{
nodo *temp;
int trovato = 0;

temp = cursore;

while(temp != NULL)
{
if(temp->valore == num)
{
trovato++;
}
temp = temp->next;
}

return trovato;
}

AgentSpam
26-12-2008, 18:58
Scusa il ritardo, con le feste di mezzo non sono più riuscito a connettermi!


Originariamente inviato da MrX87
il for che ho inserito serve per mettere inizialmente a NULL tutti i puntatori...altrimenti se vai a cercare e la lista è vuota ti va in crash, e poi quando vai a fare la ricerca, fai un test prima su testa[i] per vedere se il puntatore non è NULL, e poi passi alla funzione testa[i], non testa[MAX]!
Inoltre devi mettere "+=" ovvero:


occ = CercaOccorrenze(testa[i], n) + occ;
perchè deve sommare le occorrenze in occ, altrimenti va a contre le occorrenze in ogni singola lista! non so se mi sono spiegato!
Certo che ti sei spiegato anzi, i tuoi consigli sono stati fino ad ora chiarissimi! Effettivamente mi era sfuggito questo ragionamento!


Originariamente inviato da MrX87
Infine la funzione ricerca io la farei come l'hai fatta tu ma sl cn una piccola modifica:


int CercaOccorrenze(nodo *cursore, int num)
{
nodo *temp;
int trovato = 0;

temp = cursore;

while(temp != NULL)
{
if(temp->valore == num)
{
trovato++;
}
temp = temp->next;
}

return trovato;
}
Mi sono aiutato con uno schemino grafico ed ho compreso la tua semplificazione ma a questo punto mi sorge una domanda: a cosa serve *temp? Non potrei fare la stessa identica cosa utilizzando solamente *cursore?

Intanto ti ringrazio per il tempo ed il supporto dedicatomi, senza il tuo aiuto mi sarei perso all'interno del codice! :biifu:

MrX87
27-12-2008, 19:17
Mi sono aiutato con uno schemino grafico ed ho compreso la tua semplificazione ma a questo punto mi sorge una domanda: a cosa serve *temp? Non potrei fare la stessa identica cosa utilizzando solamente *cursore?

Bhè in effetti in questo caso non serve ad un granchè...in genere però si cerca di preservare la testa della lista, ma in questo caso, poichè si tratta di una funzione che lavora in locale quindi si può anche modificare direttamente il puntatore "cursore"!

AgentSpam
28-12-2008, 16:17
Perfetto, ottimo così! :unz:

MrX ti ringrazio infinitamente per l'aiuto e per il supporto che mi hai saputo dare, senza il tuo aiuto non avrei mai completato il programma, grazie infinite, veramente! http://www.carloneworld.it/images/4_Humor/emoticons/innamorato.gif

Loading