Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Postato originariamente da Joker22: Però con quello che mi hai scritto , il problema mi sembra più chiaro .
Quello che ti ho scritto è, di fatto, l'esempio di una cosa che dovresti tenere sempre a mente: per scrivere un programma, occorre anzitutto sapere COSA il programma dovrà fare e COME (in senso meramente algoritmico, indipendentemente dallo specifico linguaggio di programmazione che userai) dovrà farlo.
Detto questo, sfrutta quello schemino che ti ho fatto per sistemare il programma, applicando magari i consigli che io e Nessuno ti abbiamo a più riprese fornito E, possibilmente, non farlo in un futuro troppo lontano: va bene la pigrizia, ma noi qui i consigli mica te li diamo tanto per scrivere
Testo quotato
Postato originariamente da Joker22: non riesco a scrivere la funzione ricorsiva ...
Chi sa perchè, me lo aspettavo
C'è un motivo per cui ti ho posto la domanda indiretta (alla quale, a proposito, mi piacerebbe avere una risposta se non ti dispiace):
Testo quotato
Postato originariamente da Template:
sarei curioso di sapere cosa trattate a lezione e come lo trattate
Ed è il seguente: la ricorsione, è estremamente più facile da apprendere se correttamente illustrata ed attentamente studiata. Bene, io ho la sensazione che almeno una di queste due componenti sia, nel tuo caso, venuta a mancare... nell'attesa di avere la tua risposta e capire quale, comunque, mi unisco alla preghiera di Nessuno: METTI 'STA CACCHIO DI CHIAMATA ALLA FUNZIONE RICORSIVA NEL PUNTO OPPORTUNO DEL MAIN, che senza quella non vai da nessuna parte in ogni caso.
Ultima modifica effettuata da Template il 12/02/2016 alle 19:44
Postato originariamente da Template: mi unisco alla preghiera di Nessuno: METTI 'STA CACCHIO DI CHIAMATA ALLA FUNZIONE RICORSIVA NEL PUNTO OPPORTUNO DEL MAIN, che senza quella non vai da nessuna parte in ogni caso.
Attento a non essere estremamente sgarbato ...
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
Raga chiedo umilmente scusa ad entrambi .
A Nessuno per come l'ho trattato , ad entrambi perchè vi sto facendo perdere un sacco di tempo e , penso , vi sto facendo anche incazzare
sti ultimi giorni si stati complicati ...
Comunque adesso sto ultimando veramente il progetto .. ho inserito la chiamata a funzione , e ho risolto il problema dell'inserimento dei numeri >11 .. in più il codice è più ordinato .
printf("CI DISPIACE, MA LA MACCHINA ACCETTA SOLO MONETE DA 0.10, 0.20, 0.50, 1.00.");
}
}
return0;
}
Questo è il Main .
La Function la metto in un file a parte , che ancora devo ultimare .
Penso che in questo non ci siano più problemi ... forse è ancora un po troppo disordinato ?
Comunque adesso che mi sono applicato seriamente , ho capito una cosa...
non è tanto la difficoltà nel creare la funzione ricorsiva ... il mio reale problema è che non ho capito cosa deve fare questa funzione ricorsiva ... e non ho capito nemmeno il comando "Resoconto" che deve fare ...
Penso che senza capire queste due cose , sarà sempre difficile ultimare questo progetto .
Miei cari , se riuscite a farmi ultimare sto progetto ... quando vi trovate a passare per Napoli , vi porto a mangiare una grande pizza
Ultima modifica effettuata da Joker22 il 13/02/2016 alle 12:19
Il codice non è ancora perfetto, ma già è molto meglio
Intanto, hai dimenticato di mettere le istruzioni per registrare la transazione nel caso in cui non ci sia resto da dare... avresti dovustro scrivere così:
Codice sorgente - presumibilmente C/C++
if (monete_inserite == array_bibite[bibita_scelta]. prezzo)
{
printf("STAI PER AVERE LA BIBITA SCELTA.\nGRAZIE.\n");
Altrimenti, il tuo programma registrerà solo le transazioni nell'ambito delle quali ha dovuto rilasciare il resto.
Inoltre, ti ribadisco un dettaglio importante: stai scrivendo codice C, quindi LE VARIABILI VANNO DICHIARATE TUTTE AD INIZIO FUNZIONE. Variabili dichiarate in mezzo alla funzione (ce n'è una pure nel pezzo di codice qui sopra) non sono ammissibili in C (e tra l'altro rendono disordinato il codice).
Ora, andiamo alla funzione ricorsiva:
Testo quotato
La Function la metto in un file a parte , che ancora devo ultimare .
Per il momento, lascia stare la suddivisione del programma su più files, che ti fa solo perdere tempo: devi scrivere DUE funzioni, non venti, quindi puoi tranquillamente metterle nello stesso file.
Per quanto riguarda i principi alla base della progettazione della funzione, ci sono alcuni aspetti "base" da considerare (che il vostro professore dovrebbe avervi fatto almeno intendere... tra parentesi, ma dove studi?):
Definire cosa fa la funzione: una funzione ricorsiva può fare sostanzialmente due cose, nell'ambito della costruzione incrementale di una soluzione: selezionare un dato (aggiungendolo alla soluzione) o definire il ruolo di un dato. Mi spiego meglio: la tua funzione può, ad esempio, fare una di queste due cose:
- Scorrere l'array delle vendite fino a trovarne una valida, dunque aggiornare il contatore ed infine effettuare la chiamata ricorsiva
- Assegnata una posizione, definire se il dato in quella posizione è valido (e se lo è, aggiornare il contatore) e dopo effettuare la chiamata ricorsiva
Definire dove sono i suoi dati: la funzione ricorsiva avrà bisogno di alcuni dati comuni a tutte le istanze: il vettore delle vendite, il contatore... bene, occorre definire il campo di visibilità di questi dati:
- Puoi porli come dati globali, in modo che siano visibili a tutte le istanze della funzione
- Puoi inserirli dentro la funzione main(), come dati locali, e passarli alla funzione ricorsiva insieme ai parametri
In generale, si preferisce la seconda via (anche se nessuno vieta di usare la prima).
Vagliati questi punti fondamentali, sei di fatto pronto per costruire la tua funzione.
Ora, mi pare chiaro che il vostro professore non vi abbia mai mostrato una funzione ricorsiva sviluppata decentemente (altrimenti, non saremmo qui a discutere di queste cose), quindi ti propongo io una soluzione... è una cosa che non mi piace affatto, perchè c'è il rischio che tu la prenda per buona senza capirci nulla, ma se proprio non hai mai visto una funzione ricorsiva mi sa che non ci sono molte alternative...
Allora, poniamo di voler scrivere una funzione che implementi la "seconda scelta" per entrambi gli aspetti precedentemente visti. Ecco cosa faremo:
- Definiremo il prototype della funzione come (lo scrivo in maniera "discorsiva": i tipi di dato poi ce li metti tu):
if(elenco_vendite[posizione].data == data && elenco_vendite[posizione].bibita == bibita)
(*contatore)++;
trova_vendite(data, bibita, elenco_vendite, numero_vendite, *contatore, posizione + 1);
return;
}
Ok, ora analizziamo 'sta funzione:
- Il primo if è la condizione di terminazione: analizzato tutto il vettore, non abbiamo più elementi da considerare e quindi possiamo tornare indietro.
- Il secondo if è il lavoro "vero e proprio" della funzione: assegnata la posizione, verifica se il dato è valido, e se lo è aggiorna il contatore.
- Le righe successive sono di fatto la chiamata ricorsiva e il return.
Bene, ma come lavora?
Cerco di fartelo capire con uno schema:
PASSO1 (posizione = 0): funzione richiamata dal main, analizza il dato in posizione 0 e poi effettua la chiamata ricorsiva incrementando nel frattempo la posizione -> PASSO 2 (posizione = 1): analizza il dato in posizione 1 e poi effettua la chiamata ricorsiva incrementando nel frattempo la posizione -> PASSO 3 (posizione = 2): analizza il dato in posizione 2 e poi effettua la chiamata ricorsiva incrementando nel frattempo la posizione ->...->PASSO NUMERO_VENDITE + 1 (posizione = numero_vendite): essendo vera la condizione del primo if, la funzione si chiude subito, tornando a quella che l'aveva chiamata -> PASSO NUMERO_VENDITE + 2 (posizione = numero_vendite - 1): dopo la chiamata ricorsiva (che è stata completata), c'è solo l'istruzione di return, dunque ritorna alla sua chiamante->PASSO NUMERO_VENDITE + 3 (posizione = numero_vedite - 2): idem come sopra->...->ULTIMO PASSO: siamo tornati alla prima istanza della funzione ricorsiva, e anche qui rimane da eseguire solo l'istruzione di return, e dunque torniamo nel main().
Tutto chiaro?
Lo so che non è molto intuitivo, se non ci si è abituati... ma meglio di così non posso proprio fare
Tra parentesi, ritengo che possa esserti utile l'acquisto del testo "Ricorsione e problem solving" di Cabodi-Camurati-Pasini-Patti-Vendraminetto. Si tratta di un libriccino (meno di 200 pagine al costo di circa 16-17€) molto interessante, che spiega benissimo i concetti base della ricorsione ed è ricco di esempi molto utili.
Ultima modifica effettuata da Template il 13/02/2016 alle 10:33
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
Quindi adesso devo solo inserire le variabili che ho usato io ..
poi dovrebbe funzionare giusto ?
Per vedere se il Resoconto funziona , devo simulare delle vendite di un prodotto , poi scelgo il codice 11 , inserisco la data di oggi , e dovrebbe dirmi quante ne sono state vendute ... è corretto ?
Lo so, sono cose banali... dopo che qualcuno ti mostra la soluzione
Testo quotato
Postato originariamente da Joker22: Quindi adesso devo solo inserire le variabili che ho usato io ..
poi dovrebbe funzionare giusto ?
La risposta è si, ma non è questo il punto... ciò che conta è che tu capisca i punti essenziali di quello che ti ho spiegato.
Scrivendoti la soluzione (cosa che - guarda gli altri topics in questa sezione se non ci credi - io cerco di fare il meno possibile), ti ho dato fiducia: ora non deludermi e studia bene ciò che devi
Testo quotato
Postato originariamente da Joker22: Per vedere se il Resoconto funziona , devo simulare delle vendite di un prodotto , poi scelgo il codice 11 , inserisco la data di oggi , e dovrebbe dirmi quante ne sono state vendute ... è corretto ?
Il programma è tuo, quindi se non lo sai tu...
Così come hai scritto dovrebbe (OVVIAMENTE) funzionare.
Ah, quasi dimenticavo: ovviamente, mi aspetto di vedere quanto prima tutto il codice FUNZIONANTE E SCRITTO BENE (quindi, privo di tutti quegli errori che ti abbiamo segnalato in oltre sei pagine di topic)
Ultima modifica effettuata da Template il 13/02/2016 alle 16:52