Aiuto, programma per l'esame...

di il
22 risposte

Aiuto, programma per l'esame...

Salve a tutti, avrei bisogno di una mano per scrivere un programma in c, si tratta di una lista linkata che riceve in input delle parole stampa a video la parola più lunga e conta le vocali. Ho cominciato a farlo impostandolo in modo che ordini le parole in base alla lunghezza. però non stampa a video la lista per cui non so se le parole vengono ordinate correttamente... mi aiutate per favore a farlo funzionare bene... Grazie in anticipo =)
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <stdlib.h>

struct Nodo; // pre-dichiara il record 

typedef Nodo* L; //definisco il tipo di puntatore a Nodo.
typedef struct Nodo {
       char Parola[50]; //informazione
       L next; // puntatore all'elemento successivo
       }Nodo;
       
Nodo* Inserisci (char *word, L l){ // inserisci
       L q;
       q=(L)malloc(sizeof(Nodo)); //creo uno spazio in memoria di tipo L. 
       q->next=l;
       return(q);
       }
              
void Ordina (L l){
                   L q=l;
                   L succ=q->next;
                   while (q!=NULL && succ!=NULL){
                     while (succ!=NULL){    
                   char confronto[50];
                   if(strlen(succ->Parola)<strlen(confronto)){
                                                            succ=succ->next;}
                                                            else{
                   strcpy(confronto, q->Parola);
                   strcpy(q->Parola, confronto);
                   succ=succ->next;
                   }
                   }
                   succ=q->next;
                   q=q->next;
                   succ=succ->next;}
                  
                   }
void Stampa(L l){
         L q=l;
         printf("\n stampo la lista ordinata in modo crescente \n");
         while(q!=NULL){
                        printf("%s\n", q->Parola);
                        q=q->next;
                        }
                        }

 int main (){
 char word [50];
 int i;

 L l;
 l=NULL ;//inizializzazione puntatore Lista vuota
           do{ 
            printf("\n Dammi la parola: \n");
            scanf("%s", word);
            l=Inserisci(word, l);
            Ordina(l);
            printf("\n Desideri aggiungere un'altra parola? 1=no 0=si\n");
            scanf("%d", &i);
            } while(i==0);
            Stampa(l);
            
            printf("\n programma terminato \n");
            
 system("PAUSE");
 return 0 ;
}
         

22 Risposte

  • Re: Aiuto, programma per l'esame...

    Non c'è un loop per forza che mette una sola parola.
  • Re: Aiuto, programma per l'esame...

    Rivedendolo me ne so accorta che testa che ho xD ora ho un problema con la stampa a video... T.T kmq grazie
  • Re: Aiuto, programma per l'esame...

    Ciao tittadomi,
    il problema con la stampa che hai dovrebbe dipendere dalla funzione 'inserisci' che non copia la stringa (questo lo sistemi in un attimo). Poi troverai che pure l' algoritmo di ordinamenti non funziona (quello mi sembra proprio sbagliato come principio).
  • Re: Aiuto, programma per l'esame...

    Ah... eh mica puoi aiutarmi a sistemarlo?? io di informatica ci capisco poco e niente...
  • Re: Aiuto, programma per l'esame...

    Volentieri, inizia a sistemare gli altri problemi poi posta nuovamente il tutto e ne riparliamo.
  • Re: Aiuto, programma per l'esame...

    Il problema della stampa l'ho risolto quello dell'ordinamento non ancora, il programma ordina tutte le parole tranne la prima che inserisco che finisce sempre alla fine... come devo fare???per favore >_<
  • Re: Aiuto, programma per l'esame...

    Ok, quando metti a punto un programma lo esegui molte volte ed è scomodo dover inserire sempre i dati da tastiera, per cui potresti modificare (provvisoriamente) il main in questo modo:
    
    int main ()
    {
    	char word [50];
    	L l = NULL ;
    
    	//printf("\n Dammi la parola: \n");
    	//scanf("%s", word);
    	//l=Inserisci(word, l);
    
    	l=Inserisci("aaa", l);
    	l=Inserisci("bb", l);
    	l=Inserisci("ccccc", l);
    	l=Inserisci("ee", l);
    	l=Inserisci("d", l);
    
    	Ordina(l);
    	Stampa(l);
    
    	system("PAUSE");
    	return 0 ;
    }
    
    Poi posta nuovamente tutto il codice (altrimenti faccio fatica a seguiri) e parliamo dell' ordinamento.
  • Re: Aiuto, programma per l'esame...

    Ecco qui ho fatto come hai detto tu... l'ho fatto partire e le parole non le ordina uffy... xD kmq poi cosa devo fare?
    #include <stdio.h>
    #include <iostream>
    #include <string.h>
    #include <stdlib.h>
    
    struct Nodo; // pre-dichiara il record 
    
    typedef Nodo* L; //definisco il tipo di puntatore a Nodo.
    typedef struct Nodo {
           char Parola[50]; //informazione
           L next; // puntatore all'elemento successivo
           }Nodo;
           
    Nodo* Inserisci (char *word, L l){ // inserisci
           L q;
           q=(L)malloc(sizeof(Nodo)); //creo uno spazio in memoria di tipo L. 
           q->next=l;
           strcpy(q->Parola,word);
           return(q);
           }
                  
    void Ordina (L l){
                       L q=l;
                       L succ=q->next;
                       while (q!=NULL && succ!=NULL){
                             while(succ!=NULL){
                             char confronto[50];
                       
                       if(strlen(succ->Parola)<strlen(confronto)){
                                                                succ=succ->next;}
                                                                else{
                       strcpy(confronto, q->Parola);
                       strcpy(q->Parola, confronto);
                       succ=succ->next;
                       }
                       }
                       succ=q->next;
                       q=q->next;
                       succ=succ->next;}
                       }
                       
    void Stampa(L l){
             L q=l;
             printf("\n stampo la lista ordinata in modo crescente \n");
             while(q!=NULL){
                            printf("%s\n", q->Parola);
                            q=q->next;
                            }
                            }
    
    
                     
      int main ()
    {
       char word [50];
       L l = NULL ;
    
      
       l=Inserisci("aaa", l);
       l=Inserisci("bb", l);
       l=Inserisci("ccccc", l);
       l=Inserisci("ee", l);
       l=Inserisci("d", l);
    
       Ordina(l);
       Stampa(l);
    
       system("PAUSE");
       return 0 ;
    }
  • Re: Aiuto, programma per l'esame...

    Ma che algoritmo di sort hai usato?
  • Re: Aiuto, programma per l'esame...

    Volevo usare il selecsort...
  • Re: Aiuto, programma per l'esame...

    Se ti propongo una soluzione col bubble sort ti va bene ugualmente? nel senso che poi dovrai spiegarla al prof.
  • Re: Aiuto, programma per l'esame...

    Sisi va benissimo
  • Re: Aiuto, programma per l'esame...

    Tanto gli algoritmi di sort mica te li devi inventare tu, li studi e poi li copi da qualche esempio.
    
    void Ordina(Nodo* primo)
    {
       // ripete finchè ci sono scambi, se non vi è stato nessuno scambio allora la lista è ordinata
    	int flag = 1;
    	while (flag == 1) 
    	{  
    		Nodo* p = primo;
    		flag = 0;
    		while (p->next != NULL)
    		{
    			if(strlen(p->Parola) > strlen(p->next->Parola))
    			{
    				// scambia gli elementi
    				char confronto[50];
    				strcpy(confronto, p->next->Parola);
    				strcpy(p->next->Parola, p->Parola);
    				strcpy(p->Parola, confronto);
    				
    				flag = 1; // segnala che c' è stato uno scambio
    			}
    			p = p->next;
    		}
    	}
    }
    
  • Re: Aiuto, programma per l'esame...

    La lista non viene ordinata a causa della definizione della funzione di ordinamento:
    
    void Ordina(L l); //E' come se scrivessi 'void Ordina(struct Nodo *l);
    
    In C le variabili alle funzoni vengono passate solo per 'valore' (non abbiamo come il C++ situazioni come 'void Ordina(L &l)' ). infatti quando si passa ad una generica funzione un puntatore, viene 'istanziato' ex novo un puntatore temporaneo con il 'valore' di quello passato alla funzione stessa. Per cui, nel caso il valore del puntatore (e non il valore del dato puntato, occhio eh) viene modificato nella funzione, lo stesso non accade al puntatore usato come parametro di input, dato che in pratica sono due variabili distinte e separate. un esempio:
    
    void Next(int* p){
        p++; //incrementiamo il valore del puntatore, non del dato puntato
        printf("\nil valore di p è %p ed il suo indirizzo in memoria è %p",p,&p);
    }
    
    int main(){
        int array[10]; //array di 10 elementi;
        int *pArray = array //pArray punterà al primo elemento , identico a pArray = &array[0];
        printf("\npArray, valore prima di Next(): %p",pArray); //stampiamo il valore di pArray, ovvero l'indirizzo in memoria del prio elemento;
        //facciamo caso che sia 0x2c2c2c2c
        Next(pArray);
        printf("\npArray, valore dopo la Next(): %p . pArray è allocato in memoria nella posizione %p",pArray,&pArray); //pArray è rimasto invariato dopo la Next, perchè la funzione ha operato sulla variabile 'locale' p;
        //quindi pArray vale sempre 0x2c2c2c2c
        return 0;
    }
    
    In base al codice di cui sopra, noterai che i due indirizzi in memoria di p e di pArray sono diversi.
    Se vui modificare il valore 'del puntatore' con una funzione hai due possibilità:
    .la prima è che fai ritornare dalla funzione il valore'modificato' del puntatore: ad esempio:
    
    int* Next(int *p){return (p+1)};
    
    int main(){
        int *p=0x2c2c2c00;
        p=Next(p); //assegno a p il valore calcolato da Next(), dopo tale chiamata varrà 0x2c2c2c04
        return 0;
    }
    
    .la seconda possibilità è quella di passare alla funzione l'indirizzo del puntatore, cioè un 'puntatore a puntatore', un esempio:
    
        void Next(int **p){
            *p++; //ora aumento il 'valore' del dato puntato da p, cioè il valore del puntatore passato come parametro;
    }
    
    int main(){
        int *p=0x2c2c2c00;
        Next(&p); //passo alla funzione l'indirizzo i memoria del puntatore;
        cout<<p; //stamperà a video 0x2c2c2c04
        return 0;
    }
    
    per cui, in base al tuo codice , modifica Ordina() in:
    
    L Ordina(L l);
    //oppure
    void Ordina(L *l);
    
    nella prima versione:
    
        L Ordina(L l){
        L p=l; //variabile temporanea per ordinare;
        /*
          effettua le operazioni necessarie per l'ordinamento
        */
        return p; //ritorni la lista ordinata
        }
    
    nella seconda versione:
    
    void Ordina(L *l){
        L p= *l ; //usi una variabile temporanea per l'ordinamento
        /*
        effettua le operazioni necessarie per l'ordinamento
        */
        *l=p; //assegni la nuova lista al dato puntato da l;
    }
    
    Prova a fare una delle due modifiche e facci sapere se funziona o no .
Devi accedere o registrarti per scrivere nel forum
22 risposte