Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Ricorsioni in un array struct
Forum - C/C++ - Ricorsioni in un array struct

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
__BlackworM__ (Member)
Pro


Messaggi: 110
Iscritto: 16/08/2008

Segnala al moderatore
Postato alle 22:00
Giovedì, 10/02/2011
Salve amici,
adesso mi spiego meglio io devo fare la ricerca del massimo con una ricorsione, la ricorsione deve essere applicata ad un array di un tipo da me definito con la struct e cioè :
Codice sorgente - presumibilmente C++

  1. typedef struct alunno
  2. {
  3. char nome[100];
  4. char cognome[100];
  5. int matricola;
  6. char dataNascita[15];
  7. char luogoNascita[50];
  8. int presenze;
  9. int assenze;
  10. struct indirizzo {
  11.                     char via[100];
  12.                     int cap;
  13.                     int civico;
  14.                  } indirizzo;
  15. } alunno;
  16. //dichiaro un tipo di dato alunno ma sottoforma di array chiamato classe
  17. struct alunno classe[10];



adesso ho creato una funzione ricorsiva e vi posto il codice
Codice sorgente - presumibilmente C++

  1. int massimo_r(classe vettore[],int n)
  2. {
  3. int max;
  4. if(n==0) { return vettore[0]; }
  5.  
  6. else
  7. max=massimo_r(vettore[].assenze,n);
  8. if(max>vettore[n].assenze) { return max; }
  9. else { return vettore[n].assenze; }
  10.  
  11. }



adesso mi da errore codeblock dicendo che si aspetta una parentesi tonda prima di int massimo_r ma credo che non stia bene l'IDE perchè tutto è corretto, mi aiutate a capire dove sbaglio ?

PM Quote
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Segnala al moderatore
Postato alle 22:42
Giovedì, 10/02/2011
Il mio consiglio? Riscrivi la funzione perchè è TOTALMENTE sbagliata dal punto di vista logico. Riparti da qui:

Codice sorgente - presumibilmente C/C++

  1. int massimo_r(struct alunno vettore[],int n)



Magari la potresti riscrivere prima senza ricorsione e poi te la modifichi.

Ultima modifica effettuata da Pitagora il 10/02/2011 alle 22:47
PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 23:05
Giovedì, 10/02/2011
Testo quotato

Postato originariamente da __BlackworM__:

Salve amici,
adesso mi spiego meglio io devo fare la ricerca del massimo con una ricorsione, la ricorsione deve essere applicata ad un array di un tipo da me definito con la struct e cioè :
Codice sorgente - presumibilmente C++

  1. typedef struct alunno
  2. {
  3. char nome[100];
  4. char cognome[100];
  5. int matricola;
  6. char dataNascita[15];
  7. char luogoNascita[50];
  8. int presenze;
  9. int assenze;
  10. struct indirizzo {
  11.                     char via[100];
  12.                     int cap;
  13.                     int civico;
  14.                  } indirizzo;
  15. } alunno;
  16. //dichiaro un tipo di dato alunno ma sottoforma di array chiamato classe
  17. struct alunno classe[10];



adesso ho creato una funzione ricorsiva e vi posto il codice
Codice sorgente - presumibilmente C++

  1. int massimo_r(classe vettore[],int n)
  2. {
  3. int max;
  4. if(n==0) { return vettore[0]; }
  5.  
  6. else
  7. max=massimo_r(vettore[].assenze,n);
  8. if(max>vettore[n].assenze) { return max; }
  9. else { return vettore[n].assenze; }
  10.  
  11. }



adesso mi da errore codeblock dicendo che si aspetta una parentesi tonda prima di int massimo_r ma credo che non stia bene l'IDE perchè tutto è corretto, mi aiutate a capire dove sbaglio ?



intanto mettici una bella "n" dentro quelle parentesi quadre, inoltre la funzione prende un array di struct, non un INT...
Codice sorgente - presumibilmente Plain Text

  1. max=massimo_r(vettore, n);



se ancora si lamenta, aggiungi una forward declaration prima della funzione, cioè:
Codice sorgente - presumibilmente C/C++

  1. int massimo_r(struct alunno* vettore,int n); // dichiaro ma non definisco... definisco sotto



Comunque mi sa che hai fatto un bel casino, rifalla da capo che fai prima XD

Ultima modifica effettuata da TheKaneB il 10/02/2011 alle 23:08
PM Quote
Avatar
__BlackworM__ (Member)
Pro


Messaggi: 110
Iscritto: 16/08/2008

Segnala al moderatore
Postato alle 2:38
Venerdì, 11/02/2011
Adesso resterebbe da capire come richiamare la funzione e con quali parametri allora posto codice :
Codice sorgente - presumibilmente C/C++

  1. int massimo_r(alunno classe[MAX_STUDENTI].assenze,MAX_STUDENTI);


in pratica ho una struct di tipo array con MAX_STUDENTI che indica il numero di studenti e la sua dimensione è di MAX_STUDENTI ma mi d- questo errore
main.c|49|error: expected ';', ',' or ')' before '.' token|
la riga in questione è quella che ho postato sopra.

La funzione riscritta è questa
Codice sorgente - presumibilmente C++

  1. int massimo_r(struct alunno* vettore[],int n)
  2. {
  3. int max;
  4.  
  5. if(n==0) { return vettore[0]; }
  6.  
  7. else
  8. max=massimo_r(vettore[n],n);
  9. if(max>vettore[n]) { return max; }
  10. else { return vettore[n]; }
  11.  
  12. }



P.S. Grazie mille ragazzi in questo periodo sto praticamente inondando il forum di domande, ma sto facendo un progetto per l'università di programmazione e col C non ho molta dimistichezza anche se programmo abbastanza in PHP.

PM Quote
Avatar
__BlackworM__ (Member)
Pro


Messaggi: 110
Iscritto: 16/08/2008

Segnala al moderatore
Postato alle 2:44
Venerdì, 11/02/2011
Mi sà che sto facendo un macello, perchè quasi quasi mi sembra che non sia ricorsiva la funzione ed io DEVO farla ricorsiva, avevo anche creato la funzione non ricorsiva e tutto funzionava ma poi l'ho riscritto in modo ricorsivo ed adesso guardando bene mi sà che non lo sia....8-|

PM Quote
Avatar
Xaratroom (Ex-Member)
Expert


Messaggi: 526
Iscritto: 03/04/2008

Segnala al moderatore
Postato alle 9:10
Venerdì, 11/02/2011
Testo quotato

Postato originariamente da __BlackworM__:

Mi sà che sto facendo un macello, perchè quasi quasi mi sembra che non sia ricorsiva la funzione ed io DEVO farla ricorsiva, avevo anche creato la funzione non ricorsiva e tutto funzionava ma poi l'ho riscritto in modo ricorsivo ed adesso guardando bene mi sà che non lo sia....8-|


Spesso rendere ricorsivo qualcosa che funziona alla grande da iterativo diventa un casino (vale anche il viceversa).

Alla tua funzione devi aggiungere il massimo come parametro. La prima volta assumi come massimo il primo elemento.
Io ti consiglierei di partire da qualcosa di più simile a questo (il codice è solo abbozzato e, dal momento che sono sveglio da 10 minuti, potrebbe contenere errori):
Codice sorgente - presumibilmente C++

  1. int max (int first, int second) {
  2.         if (first > second)
  3.                 return first;
  4.         else
  5.                 return second;
  6. }
  7.  
  8. int massimo_r (struct alunno* vettore, int n) { //inizializza massimo_r(struct, int, int)
  9.         return massimo_r(alunno+1, n-1, vettore->assenze); //la prima volta il massimo è il primo elemento
  10. }
  11.  
  12. int massimo_r (struct alunno* vettore, int n, int first) {
  13.         if (n == 0)
  14.                 return first;
  15.         else
  16.                 return massimo_r (vattore+1, n-1, max(vettore->assenze, first));
  17. }


PM Quote
Avatar
__BlackworM__ (Member)
Pro


Messaggi: 110
Iscritto: 16/08/2008

Segnala al moderatore
Postato alle 16:51
Venerdì, 11/02/2011
Ragazzi sono esausto ormai, questa piccolezza mi sta facendo perdere una barca di tempo, adesso posto i codici completissimi che ancora danno errore per favore ditemi dove sbaglio sto impazzendo: (anche se so che non è importante vi dico comunque che uso codeblocks mille casi fosse problema di editor)

MAIN:
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4. #include "function_e_struct.h"
  5.  
  6. // Prototipi delle funzioni precedentemente create
  7. void inserisci_alunni();
  8. void stampa();
  9. void seleziona_alunno();
  10. void presenza(int);
  11. void assenza (int);
  12. int massimo_r(struct alunno* vettore,int);
  13.  
  14. int main()
  15. {
  16.     SetConsoleTitle("Gestione Alunni 1.0");
  17.     int scelta=0;
  18.     int inizio=0;
  19.  
  20.     do
  21.     {
  22.         if(inizio==0)
  23.         {
  24.         printf("\n Andiamo a creare un elenco 10 studenti !\n");
  25.         system("PAUSE");
  26.         printf("\n\n");
  27.         inserisci_alunno();
  28.         inizio=1;
  29.         system("cls");
  30.         }
  31.         system("cls");
  32.         printf("\n");
  33.         printf("  ############################\n");
  34.         printf("  # Cosa vuoi fare ?         #\n");
  35.         printf("  # Stampa alunni = 1        #\n");
  36.         printf("  # Appello = 2              #\n");
  37.         printf("  # Cerca alunno = 3         #\n");
  38.         printf("  # Per uscire premi 0       #\n");
  39.         printf("  ############################\n");
  40.         printf("  Scelta : ");
  41.         scanf("%d",&scelta);
  42.  
  43.         switch(scelta)
  44.         {
  45.         case 1 : stampa(); break;
  46.         case 2 : appello(); break;
  47.         case 3 : seleziona_alunno(); break;
  48.         case 4 : massimo_r(alunno* classe,MAX_STUDENTI); break;
  49.         case 0 : break;
  50.         default: printf("Attenzione scelta errata !");
  51.         }
  52.  
  53.     } while(scelta != 0);
  54.  
  55. return 0;
  56. }



file function_e_struct.h
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. #define MAX_STUDENTI 2
  5.  
  6. //Questa è la struct "alunno" in cui dichiarerò le variabili che compongono la struct
  7. typedef struct alunno
  8. {
  9. char nome[100];
  10. char cognome[100];
  11. int matricola;
  12. char dataNascita[15];
  13. char luogoNascita[50];
  14. int presenze;
  15. int assenze;
  16. struct indirizzo {
  17.                     char via[100];
  18.                     int cap;
  19.                     int civico;
  20.                  } indirizzo;
  21. } alunno;
  22. //dichiaro un tipo di dato alunno ma sottoforma di array chiamato classe della dimensione di MAX_STUDENTI
  23. struct alunno classe[MAX_STUDENTI];
  24.  
  25. //La funzione inserisci_alunno() ci sarà utile per inserire inizialmente i dati degli alunni che poi andremo a manipolare.
  26. //L'inserimento verrà fatto per "MAX_STUDENTI" volte
  27. void inserisci_alunno()
  28. {
  29. int i;
  30. for(i=0;i<=MAX_STUDENTI;i++)
  31.     {
  32.      system("cls");
  33.      fflush(stdin);
  34.      printf("\n");
  35.      printf(" Alunno numero %d\n\n",i+1);
  36.  
  37.      printf(" Nome : ");                                                         gets(classe[i].nome);                          fflush(stdin);
  38.      printf(" Cognome : ");                                                      gets(classe[i].cognome);                       fflush(stdin);
  39.      printf(" Matricola (Inserisci solo numeri) : ");                            scanf("%d",&classe[i].matricola);              fflush(stdin);
  40.      printf(" Data di Nascita : ");                                              gets(classe[i].dataNascita);                   fflush(stdin);
  41.      printf(" Luogo di Nascita : ");                                             gets(classe[i].luogoNascita);                  fflush(stdin);
  42.      printf(" Via/Corso/Piazza (Inserisci solo l'indirizzo senza civico) : ");   gets(classe[i].indirizzo.via);                 fflush(stdin);
  43.      printf(" Numero civico (Inserisci solo numeri) : ");                        scanf("%d",&classe[i].indirizzo.civico);       fflush(stdin);
  44.      printf(" CAP (Inserisci solo numeri) : ");                                  scanf("%d",&classe[i].indirizzo.cap);          fflush(stdin);
  45.     }
  46. }
  47.  
  48. //La funzione stampa() stamperà a video tutto l'elenco completo degli alunni del corso
  49. void stampa()
  50. {
  51. system("cls");
  52. int i;
  53. printf("  ##########################################################\n");
  54. for(i=0;i<=MAX_STUDENTI;i++)
  55.     {
  56.         printf("  # Alunno numero %d\n",i+1);
  57.         printf("  # Nome : %s\n",classe[i].nome);
  58.         printf("  # Cognome : %s\n",classe[i].cognome);
  59.         printf("  # Matricola : %d\n",classe[i].matricola);
  60.         printf("  # Data di Nascita : %s\n",classe[i].dataNascita);
  61.         printf("  # Luogo di Nascita : %s\n",classe[i].luogoNascita);
  62.         printf("  # Indirizzo : %s,%d - CAP : %d\n",classe[i].indirizzo.via,classe[i].indirizzo.civico,classe[i].indirizzo.cap);
  63.         printf("  # Presenze : %d\n",classe[i].presenze);
  64.         printf("  # Assenze : %d\n",classe[i].assenze);
  65.         printf("  ##########################################################\n");
  66.     }
  67. system("PAUSE");
  68. }
  69.  
  70.  
  71. void presenza(int studente) { classe[studente].presenze+=1; }
  72.  
  73. //La funzione assenze ci permetterà di inserire le assenze degli alunni
  74. void assenza (int studente) { classe[studente].assenze+=1; }
  75.  
  76. void appello()
  77. {
  78. int count;
  79. int i;
  80.  
  81. printf(" Se l'alunno è assente=1, se presente=0\n");
  82.  
  83. for(i=0;i<=MAX_STUDENTI;i++)
  84.     {
  85.         printf(" %s %s : ",classe[i].cognome,classe[i].nome);
  86.         fflush(stdin);
  87.         scanf("%d",&count);
  88.  
  89.         switch(count)
  90.         {
  91.         case 0: presenza(i); break;
  92.         case 1: assenza(i); break;
  93.         }
  94.  
  95.     }
  96. }
  97.  
  98.  
  99. void seleziona_alunno()
  100. {
  101. system("cls");
  102. int i;
  103. char nome[100];
  104. char cognome[100];
  105. fflush(stdin);
  106. printf("Inserisci il nome dell'alunno che cerchi : ");
  107. gets(nome);
  108. fflush(stdin);
  109. printf("Inserisci il cognome dell'alunno che cerchi : ");
  110. gets(cognome);
  111. fflush(stdin);
  112.  
  113. for(i=0;i<=MAX_STUDENTI;i++)
  114.     {
  115.        if( !strcmp(classe[i].nome,nome) && !strcmp(classe[i].cognome,cognome) )
  116.         {
  117.         printf("  # Nome : %s\n",classe[i].nome);
  118.         printf("  # Cognome : %s\n",classe[i].cognome);
  119.         printf("  # Matricola : %d\n",classe[i].matricola);
  120.         printf("  # Data di Nascita : %s\n",classe[i].dataNascita);
  121.         printf("  # Luogo di Nascita : %s\n",classe[i].luogoNascita);
  122.         printf("  # Indirizzo : %s,%d - CAP : %d\n",classe[i].indirizzo.via,classe[i].indirizzo.civico,classe[i].indirizzo.cap);
  123.         printf("  # Presenze : %d\n",classe[i].presenze);
  124.         printf("  # Assenze : %d\n",classe[i].assenze);
  125.         system("PAUSE");
  126.         break;
  127.         }
  128.     }
  129. }
  130.  
  131.  
  132. int massimo_r(struct alunno* vettore, int n)
  133. {
  134.     if (n == 0)
  135.        return vettore[0].assenze;
  136.     else
  137.        return massimo_r(vettore->assenze, n-1);
  138. }


:hail::hail::hail:

PM Quote
Avatar
Xaratroom (Ex-Member)
Expert


Messaggi: 526
Iscritto: 03/04/2008

Segnala al moderatore
Postato alle 0:07
Sabato, 12/02/2011
Codice sorgente - presumibilmente C++

  1. int massimo_r(struct alunno* vettore, int n)
  2. {
  3.     if (n <= 0)
  4.         return -1;
  5.     if (n == 1)
  6.        return vettore[0].assenze;
  7.     else
  8.        return max(vettore->assenze, massimo_r(vettore+1, n-1));
  9. }


PM Quote
Avatar
__BlackworM__ (Member)
Pro


Messaggi: 110
Iscritto: 16/08/2008

Segnala al moderatore
Postato alle 0:36
Sabato, 12/02/2011
Ma poi per andarla a richiamare ho fatto cosi e mi da errore
Codice sorgente - presumibilmente Plain Text

  1. massimo_r(classe[MAX_STUDENTI].assenze,MAX_STUDENTI);


dove MAX_STUDENTI è il numero di studenti contenuti nell array di tipo alunno e quindi classe e assenze dovrebbe essere il valore dell'array da confrontare...
ma ci siamo quasi

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo