Aiuto per semplice programma

di il
61 risposte

61 Risposte - Pagina 4

  • Re: Aiuto per semplice programma

    Ciao a tutti, come al solito chiedo consiglio, ho tentato di ricreare un programma che utilizzi lo sconveniente bubble sort.
    La descrizione del programma era fatta a parole, io ho provato a riscriverlo in linguaggio c, però qualcosa non va.
    L'avevo scritto in un certo modo e veniva compilato correttamente però dava un ordinamento errarto, ora ho provato a riscriverlo ma alla compilazione mi da errore alla riga 39, e poi sono sicuro che qualcos'altro di sbagliato ci sia (sesto senso ).
    Posto il codice
    
    #include <stdio.h>
    
    
    int Dati[5];
    
    
    void acquisisciNumeri(){
    short i;
       
      for(i=0; i<5; i++){
      printf("scrivi un numero:");
      scanf("%u", &Dati[i]);
      }
    }
    
    void bubbleSort(){
    
    
    int   Livello,
          Minimo;
          
    short i,
          k;
    
    k=0;
    Livello=Dati[k];
      do{  
      i=4;
       while(i>Livello) {
       if(Dati[i]<Dati[i-1]){
       Minimo=Dati[i];
       Dati[i]=Dati[i-1];
       Dati[i-1]=Minimo;
       }
       i=i-1;
       }
       k=k+1;
     }
     }
     
    
    void stampaRisultato(){
    short i;
      for (i=0; i<5; i++){
      printf("%u", Dati[i]);
      }
    }
    
    void main(){
    acquisisciNumeri();
    bubbleSort();
    stampaRisultato();
    system("PAUSE");
    }
    
    Scusate se non risponderò subito o attuerò immediatamente i vostri consigli, ma sarò fuori città fino alla prossima settimana, quindi non avrò molte possibilità di connettermi al web, in ogni caso appena possibile lo farò! Grazie in anticipo
  • Re: Aiuto per semplice programma

    Ok ho accesso a una presa di corrente 24 ore su 24, posso usare il pc
    Nessun consiglio riguardo il bubble sort? Non riesco a capire dove sbaglio...Ah la descrizione del funzionamento allegata all'esercizio non spiegava parola per parola come si scrive l'algoritmo bubble sort, descriveva solo il suo funzionamento in linguaggio comune.
    Per me non è facile tradurlo in codice...
  • Re: Aiuto per semplice programma

    Ok dato che nessuno mi spiega (probabilmente avrò fatto errori talmente grossi che non sono nemmeno commentabili) lo implementerò come spiegato su wikipedia. Peccato però perchè mi sarebbe piaciuto capire dove stavo sbagliando...
  • Re: Aiuto per semplice programma

    Ciao, ho letto ora i tuoi messaggi! Per quanto riguarda l'implementazione del bubble sort ho dato una rapida occhiata ma penso che tu abbia sbagliato proprio ad impostarla! ad esempio confronti "i" (che imposti manualmente a 4) con "livello" (che rappresenta sempre il primo elemento dell'array visto che non lo modifichi mai). Probabilmente non hai ben chiaro cosa fare a causa della spiegazione sommaria che l'esercizio ti fornisce.

    Il funzionamento del bubble sort è in realtà semplice: come suggerisce il nome, i numeri vengono rappresentati come bolle: più il numero è grande e più grande è la bolla; così come le bolle più grandi tendono a salire in maniera più veloce di quelle più piccole (non so se in realtà questo sia vero, ma prendilo come se fosse vero ) allo stesso modo con questo algoritmo i numeri più grandi vengono ordinati per primi.
    Per implementare questo algoritmo devi confrontare ogni numero con il suo successivo: se il primo è maggiore del secondo allora li inverti. Una volta che hai confrontato tutti i numeri allora sicuramente l'ultimo elemento dell'array è ordinato e ricominci con i confronti. Ripeti questa cosa fino a quando non effettui più scambi (cosa che implica che gli elementi sono ordinati).
    Spero che ti sia un po' più chiaro ora, ma se hai dubbi chiedi pure
  • Re: Aiuto per semplice programma

    Per maggiore chiarezza faccio un esempio!
    Supponi di avere l'array [4,3,2,1].

    L'algoritmo dice di fare questo:
    • Confronto il primo elemento col secondo: dato che 4 > 3 allora li inverto, ottenendo [3,4,2,1]
    • Confronto il secondo elemento col terzo: dato che 4 > 2 li inverto, ottenendo [3,2,4,1]
    • confronto 4 con 1: 4 > 1 per cui li inverto ottenendo [3,2,1,4]
    • sono arrivato alla fine dell'array [fine prima iterazione].
    • [inizio seconda iterazione]Ricomincio con i confronti dal primo elemento: 3>2 per cui inverto e ottengo [2,3,1,4]
    • 3>1 per cui li inverto. ottengo [2,1,3,4]
    • a questo punto NON confronto 3 con 4 poiché 4 è l'ultimo elemento e quindi esso è sicuramente ordinato visto che siamo alla 2° iterazione. [fine 2° iterazione]
    • [inizio 3° iterazione] Ricomincio: confronto 2 con 1: 2>1 per cui inverto e ottengo [1,2,3,4]
    • a questo punto NON confronto 2 con 3 perché siamo alla 3° iterazione quindi il penultimo elemento è sicuramente ordinato [fine 3° iterazione]
    • [inizio 4° iterazione] Confronto 1 con 2: dato che 1<2 NON scambio nulla. Continuo
    • a questo punto NON confronto 2 con 3 perché siamo alla 4° iterazione e il terzultimo elemento è ordinato.
    • Dato che nell'ultima iterazione non ho scambiato nulla capisco che l'array è ordinato, per cui termino l'esecuzione
  • Re: Aiuto per semplice programma

    Ciao Della, grazie della spiegazione!
    Confrontavo i con livello perchè per ordinare i numeri partivo dall'ultimo (ovvero Dati [5]), quindi il mio scopo era portare il numero più basso in prima posizione (stavo facendo un ordinamento crescente dal più basso al più alto) e così via.
    Quindi pensavo di porre livello=Dati[k] con k impostato a zero riferendomi così al primo elemento, e finchè i fosse stato maggiore di livello il programma avrebbe proseguito con il confronto.
    Dato che ogni volta il numero in fondo sarebbe stato al suo posto giusto, ovvero il più basso, avrei aumentato livello di uno, quindi Dati[k] = Dati[k+1].
    In ogni caso capisco di aver fatto confusione! Ora provo a correggere.
  • Re: Aiuto per semplice programma

    Capito! Beh alla fine il funzionamento sarebbe l'opposto di quanto ti ho detto ma sarebbe altrettanto valido. Per fare pratica puoi implementare entrambe le soluzioni. Magari prima fai quella suggerita da wikipedia e poi provi a tradurre in codice il tuo algoritmo
  • Re: Aiuto per semplice programma

    Sì provo a fare così!
  • Re: Aiuto per semplice programma

    Ho tentato 2 implementazioni di bubblesort, la prima, funzionante, è la seguente:
    
    #include <stdio.h>
    
    
    int Dati[5];
    
    
    void acquisisciNumeri(){
    short i;
       
      for(i=0; i<5; i++){
      printf("scrivi un numero:");
      scanf("%u", &Dati[i]);
      }
    }
    
    void BubbleSort()
     {
       int passo,i,app, size;
       
       size=5;
     
       for(passo=1;passo<size;passo++)
       {
          for(i=0;i<size-passo;i++)
          {
             if(Dati[i]>Dati[i+1])
             {              
                app=Dati[i];
                Dati[i]=Dati[i+1];
                Dati[i+1]=app;
    			}
          }
       }
    }
     
     void stampaRisultato(){
    short i;
      for (i=0; i<5; i++){
      printf("%u", Dati[i]);
      }
    }
    
    void main(){
    acquisisciNumeri();
    BubbleSort();
    stampaRisultato();
    system("PAUSE");
    }
    
    L'altra l'ho copiata da wikipedia, funziona parzialmente, ovvero ordina tutti i numeri tranne uno(il più alto) al posto del quale mette uno zero all'inizio dell'ordinamento. Inoltre in questo codice ci sono alcune cose che non mi sono chiare, intanto lo posto:
    
    #include <stdio.h>
    
    
    int Dati[5];
    
    
    void acquisisciNumeri(){
    short i;
       
      for(i=0; i<5; i++){
      printf("scrivi un numero:");
      scanf("%u", &Dati[i]);
      }
    }
    
    void BubbleSort()
     {
       int i, tmp, ultimo;
       int alto=5; 
     
       while (alto >= 0)
         { 
             ultimo = -1;
             for (i=0; i<alto; i++)
             {
               if (Dati[i]>Dati[i+1]) 
               { 
                 tmp = Dati[i]; 
                 Dati[i] = Dati[i+1]; 
                 Dati[i+1] = tmp;
                 ultimo = i;
               } 
             }
         alto = ultimo;
         }
     }
     
     void stampaRisultato(){
    short i;
      for (i=0; i<5; i++){
      printf("%u", Dati[i]);
      }
    }
    
    void main(){
    acquisisciNumeri();
    BubbleSort();
    stampaRisultato();
    system("PAUSE");
    }
    
    Non capisco l'uso delle variabili "alto" e "ultimo".
  • Re: Aiuto per semplice programma

    Beh alto e ultimo sono strettamente collegati. In particolare ultimo tiene traccia dell'indice dell'ultimo numero che ha subito swap, mentre alto indica qual è l'indice limite da controllare. In pratica tutti gli elementi con indice maggiore di alto saranno già ordinati.

    Nell'esercizio alla fine di ogni iterazione si pone alto = ultimo poiché tutti gli elementi che non subiscono swap sono già ordinati, per cui si tiene traccia di quale sia l'ultimo swap per ottimizzare l'algoritmo.

    Prova a mettere alto = 4 all'inizio e forse dovrebbe andare!
  • Re: Aiuto per semplice programma

    Ok, grazie mille!
  • Re: Aiuto per semplice programma

    Solita domandina da inesperto, ho svolto un esercizio che chiede: scrivere un programma che comunichi la lunghezza di una frase acquisita mediante la funzione gets.
    Il codice che ho scritto è questo:
    
    #include <stdio.h>
    
    void main(){
    short i;
    char Frase[i];
    
    gets(Frase);
    
    for(i=0; Frase[i]!=\0; i++);
    printf("L'array Frase ha %u elementi",i);
    }
    
    
    Però mi dice: stray \ in program, eppure il carattere terminatore è quello..
  • Re: Aiuto per semplice programma

    Essendo quel carattere un char va scritto fra apici: '\0'
  • Re: Aiuto per semplice programma

    Comunque ho notato ora che questo pezzo non è corretto:
    
    short i;
    char Frase[i];
    
    Infatti dal momento che non inizializzi la variabile "i" essa conterrà un valore casuale. Di conseguenza tu crei un array di char di cui non conosci la lunghezza (che potrebbe essere anche negativa). Per cui ti consiglio di inizializzare tale variabile ad un valore per te consono (es: 50) o perlomeno di creare l'array con una dimensione nota a priori in questo modo:
    short i;
    char Frase[50];
    Inoltre nella printf dovresti mettere %h invece che %u, il quale è usato per gli unsigned int!
  • Re: Aiuto per semplice programma

    Uffa che errori del cavolo! Devo stare più attento...comunque riguardo gli apici ci avrei messo ore a trovare quell'errore. Riguardo la lunghezza dell'array la metterò ad un valore consono, l'ultimo errore è stato proprio grossolano invece
Devi accedere o registrarti per scrivere nel forum
61 risposte