Codice

di il
9 risposte

Codice

Salve ragazzi.....mi trovo a lavorare in c...e devo far visualizzare la parola più lunga.......solo che nn riesco a farla comparire....mi potete dare una mano a capire il perchè???
vi allego parte del codice...

...
void ParolaLunga (char parola[],int lencurr){
lencurr==strlen(parola);
int lenmax=0;
if(lencurr>lenmax)
lenmax=lencurr;
}
void VisualizzaParolaPiuLunga (puntElenco L){
int p=0;
puntElenco q=L;
while(q!=NULL){
ParolaLunga(q->info,p);
q=q->next;
}
printf("La parola piu lunga della lista e' %d\n",p);
}
// funzione main
int main (){
puntElenco el_parole=NULL;
el_parole = NULL;
int scelta,a=1;
int vocali=0;
char word[MAX_DIM]={'\0'},lunga[MAX_DIM]={'\0'};

do{
//creazione MENU
printf("SCELTA OPERAZIONE \n");
printf("\nPREMI 1:-----------INSERISCI PAROLA---------------------\n");
printf("PREMI 2:-----------VISUALIZZA LISTA-----------------\n");
printf("PREMI 3:----------VISUALIZZA VOCALI IN LISTA-----------\n");
printf("PREMI 4:--------VISUALIZZA PAROLA PIU' LUNGA-------\n");
printf("PREMI 5:----------------USCITA-----------------\n");
printf("\nScelta: ");
scanf("%d",&scelta);

if(scelta==1){
printf("Digita la parola da inserire: ");
scanf("%s",word);
el_parole=InserisciElementoInLista(el_parole,word);
}
//definizione delle possibili scelte
if(scelta==2) VisualizzaLista(el_parole);

if(scelta==3){
ContaVocaliInLista(el_parole);
printf("Le vocali presenti in lista sono: %d ", vocali);

}
if(scelta==4){
VisualizzaParolaPiuLunga(el_parole);
printf("la parola più lunga è: %d ");

}
if(scelta==5) a=0;

if(scelta!= 1 && scelta!= 2 && scelta!= 3 && scelta!=4 && scelta!=5) printf("\nScelta non valida\n\n");

} while(a!=0);

return 0;
}

9 Risposte

  • Re: Codice

    ZEUSS ha scritto:


    int lenmax=0;
    if(lencurr>lenmax)
    lenmax=lencurr;
    Devi dichiarare lenmax con l'attributo static, altrimenti ad ogni chiamata di funzione si resetta a 0.
  • Re: Codice

    Grazie mille.....però scusa se ti trattengo...mi restituisce sempre zero anche se ho fatto la modifica che tu mi hai consigliato....
  • Re: Codice

    lencurr==strlen(parola);
    Non assegni a lencurr la lunghezza, eseguire soltanto una equivalenza logica..
  • Re: Codice

    Ti dispiacerebbe essere più chiaro???...sono andato nel pallone e non riesco a capire più di tanto....
  • Re: Codice

    Vedendo la funzione ParolaLunga e VisualizzaParolaPiuLunga noto che ci sono più errori, così è come dovrebbe essere:
    
    void ParolaLunga (char *parola, int *len)
    {
     int curr_len;
     
     curr_len = strlen (parola);
     if ( curr_len > *len )
          *len = curr_len;
    }
    
    void VisualizzaParolaPiuLunga (puntElenco L) 
    {
     int p = 0;
     
     puntElenco q;
     
     for ( q = L; q; q = q->next )
           ParolaLunga (q->info, &p);
     
     printf ("La parola piu lunga della lista e' %d\n", p);
    }
    
    La variabile p devi passarla per indirizzo all'altra funzione altrimenti non si può modificare il suo valore, perchè quando passi una variabile ad una funzione la funzione ne vede una "copia" che punta ad un indirizzo di memoria differente. Mentre passandola per indirizzo la funzione vede proprio l'indirizzo di memoria in cui è memorizzato il valore della variabile passata e la può modificare.
  • Re: Codice

    Grazie milleee ...non puoi immaginare quanto mi sei stato d'aiuto....però ho un ultimo problema...mi aiuteresti a disegnare il Record di attivazione sullo stack della funzione InserisciElementoInLista???
    grazie in anticipo!!!!
    ti allego il pezzo del codice.....(mi saresti di grandissimo aiuto):

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define MAX_DIM 20

    typedef struct Elenco{
    char info[MAX_DIM];
    struct Elenco *next;
    } Elenco;
    typedef Elenco * puntElenco;

    puntElenco inserisci(puntElenco L, char*word){
    puntElenco q;
    q=(puntElenco)malloc(sizeof(Elenco)); //crea un elenco allocandolo sulla memoria dinamica
    strcpy(q->info,word);
    q->next=L; //lega al resto della lista
    return(q); //ritorna al nuovo puntatore della lista
    }

    //definizione funzione di inserimento in lista
    puntElenco InserisciElementoInLista(puntElenco L,char*parola){
    puntElenco q=L, prec;
    int PosTrovata=0;
    if(q==NULL){ // lista vuota
    q=inserisci(L,parola);
    return(q);
    }

    //lista con una parola con inseriemnto in testa
    if(strcmp(q->info,parola)>=0){
    q=inserisci(L,parola);
    return q;
    }
    //lista con almeno una parola più inserimento dopo la prima parola
    while (q!=NULL && (PosTrovata==0))
    {
    if(strcmp(q->info,parola)<0)
    {
    prec=q;
    q=q->next;
    }
    else
    PosTrovata=1;
    }
    prec->next=inserisci(q,parola);
    return (L);
    }
  • Re: Codice

    Ho provato il codice, vedo che la lista la crea tranquillamente. Qual è il problema?
  • Re: Codice

    Disegnare il record di attivazione sullo stack della funzione InserisciElementoInLista..
  • Re: Codice

    A dirti la verità non conoscevo questi disegni sui record di attivazione , li ho guardati ora.. ( su )
    Se li ho capiti a grandi linee la tua funzione InserisciElementoInLista dovrebbe essere:
    
                                 InseriscielementoInLista
     ___________________________________________________________________
    |                                                                  |
    |------------------------------------------------------------------|
     |___||_______||____||______||___________|
      L    parola    q    prec    PosTrovata
    
    Poi a seconda dei controlli condizionali all'interno di questa funzione si creano altri record di attivazione in coda alla funzione nello stack della funzione inserisci (). Poi non so come si indichi ma *L e *q puntano ad aree di memoria presenti nell'heap e non nello stack del programma.

    Questa è come l'ho capita io, poi come ti ho detto non saprei
Devi accedere o registrarti per scrivere nel forum
9 risposte