Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
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++
typedefstruct alunno
{
char nome[100];
char cognome[100];
int matricola;
char dataNascita[15];
char luogoNascita[50];
int presenze;
int assenze;
struct indirizzo {
char via[100];
int cap;
int civico;
} indirizzo;
} alunno;
//dichiaro un tipo di dato alunno ma sottoforma di array chiamato classe
struct alunno classe[10];
adesso ho creato una funzione ricorsiva e vi posto il codice
Codice sorgente - presumibilmente C++
int massimo_r(classe vettore[],int n)
{
int max;
if(n==0){return vettore[0];}
else
max=massimo_r(vettore[].assenze,n);
if(max>vettore[n].assenze){return max;}
else{return vettore[n].assenze;}
}
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 ?
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++
typedefstruct alunno
{
char nome[100];
char cognome[100];
int matricola;
char dataNascita[15];
char luogoNascita[50];
int presenze;
int assenze;
struct indirizzo {
char via[100];
int cap;
int civico;
} indirizzo;
} alunno;
//dichiaro un tipo di dato alunno ma sottoforma di array chiamato classe
struct alunno classe[10];
adesso ho creato una funzione ricorsiva e vi posto il codice
Codice sorgente - presumibilmente C++
int massimo_r(classe vettore[],int n)
{
int max;
if(n==0){return vettore[0];}
else
max=massimo_r(vettore[].assenze,n);
if(max>vettore[n].assenze){return max;}
else{return vettore[n].assenze;}
}
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
max=massimo_r(vettore, n);
se ancora si lamenta, aggiungi una forward declaration prima della funzione, cioè:
Codice sorgente - presumibilmente C/C++
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
Adesso resterebbe da capire come richiamare la funzione e con quali parametri allora posto codice :
Codice sorgente - presumibilmente C/C++
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++
int massimo_r(struct alunno* vettore[],int n)
{
int max;
if(n==0){return vettore[0];}
else
max=massimo_r(vettore[n],n);
if(max>vettore[n]){return max;}
else{return vettore[n];}
}
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.
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....
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....
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++
int max (int first, int second){
if(first > second)
return first;
else
return second;
}
int massimo_r (struct alunno* vettore, int n){//inizializza massimo_r(struct, int, int)
return massimo_r(alunno+1, n-1, vettore->assenze);//la prima volta il massimo è il primo elemento
}
int massimo_r (struct alunno* vettore, int n, int first){
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++
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include "function_e_struct.h"
// Prototipi delle funzioni precedentemente create
void inserisci_alunni();
void stampa();
void seleziona_alunno();
void presenza(int);
void assenza (int);
int massimo_r(struct alunno* vettore,int);
int main()
{
SetConsoleTitle("Gestione Alunni 1.0");
int scelta=0;
int inizio=0;
do
{
if(inizio==0)
{
printf("\n Andiamo a creare un elenco 10 studenti !\n");
system("PAUSE");
printf("\n\n");
inserisci_alunno();
inizio=1;
system("cls");
}
system("cls");
printf("\n");
printf(" ############################\n");
printf(" # Cosa vuoi fare ? #\n");
printf(" # Stampa alunni = 1 #\n");
printf(" # Appello = 2 #\n");
printf(" # Cerca alunno = 3 #\n");
printf(" # Per uscire premi 0 #\n");
printf(" ############################\n");
printf(" Scelta : ");
scanf("%d",&scelta);
switch(scelta)
{
case 1 : stampa();break;
case 2 : appello();break;
case 3 : seleziona_alunno();break;
case 4 : massimo_r(alunno* classe,MAX_STUDENTI);break;
case 0 :break;
default:printf("Attenzione scelta errata !");
}
}while(scelta != 0);
return0;
}
file function_e_struct.h
Codice sorgente - presumibilmente C++
#include <stdio.h>
#include <string.h>
#define MAX_STUDENTI 2
//Questa è la struct "alunno" in cui dichiarerò le variabili che compongono la struct
typedefstruct alunno
{
char nome[100];
char cognome[100];
int matricola;
char dataNascita[15];
char luogoNascita[50];
int presenze;
int assenze;
struct indirizzo {
char via[100];
int cap;
int civico;
} indirizzo;
} alunno;
//dichiaro un tipo di dato alunno ma sottoforma di array chiamato classe della dimensione di MAX_STUDENTI
struct alunno classe[MAX_STUDENTI];
//La funzione inserisci_alunno() ci sarà utile per inserire inizialmente i dati degli alunni che poi andremo a manipolare.
//L'inserimento verrà fatto per "MAX_STUDENTI" volte
void inserisci_alunno()
{
int i;
for(i=0;i<=MAX_STUDENTI;i++)
{
system("cls");
fflush(stdin);
printf("\n");
printf(" Alunno numero %d\n\n",i+1);
printf(" Nome : ");gets(classe[i].nome);fflush(stdin);
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