DOMANDA C++ void+ bubble sort

Pubblicità

MPG

Utente Attivo
Messaggi
556
Reazioni
4
Punteggio
55
Ciao a tutti ho questa consegna per casa:

/*
//codifica del Bubblesort
void bubblesort(int A[], int dim);

/*
1. popola l'array A con valori casuali tra 1 e k
2. stampa l'array
3. ordina la seconda metà (richiamare la funzione sopra)
4. stampa l'array
*/
//void funzione(int A[], int dim, int k);

/*
Codificare funzioni di supporto “a piacimento”/secondo utilità
*/


//int main()
//{

//}


Ho provato cosi' seguendo delle tracce qui:
https://it.wikibooks.org/wiki/Implementazioni_di_algoritmi/Bubble_sort
Pero' faccio fatica, mi potete aiutare senz "bastonarmi"??:muro:

C++:
*/

#include <cstdlib>
#include <ctime>
#include <cmath>
#include <iostream>
using namespace std;

void PopolaArray(int A[],int dim,int k)
{
    for(int i=0;i<dim;i++)
A[i]=rand()%k+1;
}
void PaintArray(int A[],int dim,int k)
{
for(int i=0;i<dim;i++)
cout<<A[i]<<endl;
}

void bubblesort(int A[], int dim)
{
/* dim è il numero degli elementi del vettore da ordinare */

int b=0;
   for (int i = dim - 1; i > 0; i-- )
     {
         for (int j=0; j<i; j++)
         {
           if (A[j]>A[j+1]) /* sostituire ">" con "<" per avere un ordinamento decrescente */
           {
             int b = A[j];
             A[j] = A[j+1];
             A[j+1] = b;
           }
         }
     }
}


int main()
{
  srand(time(NULL));

  int dimensione;
  cout<<"inserisci dimensione"<<endl;
  cin>>dimensione;
  int L[dimensione];
  int Key;
  cout<<"inserisci K"<<endl;
  cin>>Key;
  cout<<endl;
  PopolaArray(L,dimensione,Key);
  PaintArray(L,dimensione,Key);
  bubblesort(L,dimensione);
    return 0;
}
 
Ultima modifica:
Va beh ma nn capisco quello che mi dici ........ per te immagino sia tutto semplice pero' mettiti nei panni di chi ha difficoltà.... io proprio nn ci arrivo come ordinare la seconda metà....
Dovrei usare qualcosa tipo questa parte che ho trovato qui?
https://www.geeksforgeeks.org/sort-first-half-in-ascending-and-second-half-in-descending-order/

C++:
for (int j = n - 1; j >= n / 2; j--)

        cout << arr[j] << " ";

IN pratica dove ho scritto in alto nel code

for (int i = dim - 1; i > 0; i-- )

dovrei scrivere

for (int i = dim - 1; i >=n/2 0; i-- )

??
--- i due messaggi sono stati uniti ---
Provato anche cosi' ma non va'...

C++:
int b;
   for (int b = dim - 1; b > 0; b-- )
     {
         for (int i=0; i<b; i++)
         {
           if (A[i]>A[i+1]) /* sostituire ">" con "<" per avere un ordinamento decrescente */
           {
             int tmp = A[i];
             A[i] = A[i+1];
             A[i+1] = tmp;
 
Ultima modifica:
Devi codificare il BubbleSort come è. Quando devi passare l’array da ordinare devi passare la seconda metà e quindi un puntatore.

Pseudocodice:
BubbleSort(indirizzo del primo elemento della seconda metà, dimensione / 2). Un po di aritmetica e il primo elemento della seconda metà è proprio L[...]...

Perciò è pure meglio richiedere un puntatore int * che un array int []
 
Dunque i puntatori non li ho fatti ancora, ho provato cosi' puo' andare bene o vedi cose errate?
Sembrerebbe tutto oko mi sfugge altro?

C++:
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <iostream>
using namespace std;

void PopolaArray(int A[],int dim,int k)
{
    for(int i=0;i<dim;i++)
A[i]=rand()%k+1;
}
void PaintArray(int A[],int dim,int k)
{
for(int i=0;i<dim;i++)
cout<<A[i]<<endl;
}

void bubblesort(int A[], int dim)
{
/* dim è il numero degli elementi del vettore da ordinare */
   int b;
   for (int b = dim - 1; b > dim/2; b-- )
     {
         for (int i=dim/2; i<b; i++)
         {
           if (A[i]>A[i+1]) /* sostituire ">" con "<" per avere un ordinamento decrescente */
           {
             int tmp = A[i];
             A[i] = A[i+1];
             A[i+1] = tmp;

           }
         }
     }
}


int main()
{
  srand(time(NULL));

  int dimensione;
  cout<<"inserisci dimensione"<<endl;
  cin>>dimensione;
  int L[dimensione];
  int Key;
  cout<<"inserisci K"<<endl;
  cin>>Key;
  cout<<endl;
  PopolaArray(L,dimensione,Key);
  PaintArray(L,dimensione,Key);
  cout<<endl;
  bubblesort(L,dimensione);
  PaintArray(L,dimensione,Key);




    return 0;
}
 
Ultima modifica:
Dunque i puntatori non li ho fatti ancora, ho provato cosi' puo' andare bene o vedi cose errate?
Sembrerebbe tutto oko mi sfugge altro?

C++:
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <iostream>
using namespace std;

void PopolaArray(int A[],int dim,int k)
{
    for(int i=0;i<dim;i++)
A[i]=rand()%k+1;
}
void PaintArray(int A[],int dim,int k)
{
for(int i=0;i<dim;i++)
cout<<A[i]<<endl;
}

void bubblesort(int A[], int dim)
{
/* dim è il numero degli elementi del vettore da ordinare */
   int b;
   for (int b = dim - 1; b > dim/2; b-- )
     {
         for (int i=dim/2; i<b; i++)
         {
           if (A[i]>A[i+1]) /* sostituire ">" con "<" per avere un ordinamento decrescente */
           {
             int tmp = A[i];
             A[i] = A[i+1];
             A[i+1] = tmp;

           }
         }
     }
}


int main()
{
  srand(time(NULL));

  int dimensione;
  cout<<"inserisci dimensione"<<endl;
  cin>>dimensione;
  int L[dimensione];
  int Key;
  cout<<"inserisci K"<<endl;
  cin>>Key;
  cout<<endl;
  PopolaArray(L,dimensione,Key);
  PaintArray(L,dimensione,Key);
  cout<<endl;
  bubblesort(L,dimensione);
  PaintArray(L,dimensione,Key);




    return 0;
}
Va tutto bene tranne
1. PrintArray non utilizza l’argomento k , levalo.
2. Doppia dichiarazione di b in bubblesort() oltre ad aver nessun senso chiamare un contatore b. Chiamali i e j.
3. Codifica il BubbleSort normalmente. Deve ordinare gli elementi dall’inizio dell’array alla dimensione data.

Dopo devi passare l’indirizzo del valore dell’array a metà e dimensione mezzi alla funzione.
C++:
int array[100];
bubblesort(&array[50], 100 / 2);
& è l’operatore che ti dà l’indirizzo. Poi bubblesort() deve accettare un int * invece di un int [] o casti ad int [] quel &array[...].

Se non puoi usare in nessun modo puntatori e l’operatore & devi, o lasciare la funzione come è ora (ma non so se possa essere corretta con la richiesta) o creare un subvettore che va dalla metà alla fine e ordinare quello...
 
Mai visto un contatore b.
Per carità uno può chiamarlo pippo, come uno può scrivere and invece di && ma è roba che ti aspetti normalmente di trovare? Non credo
certamente, io per esempio usi quasi sempre k come contatore, e' troppo facile confondere una i con una l o un 1.
Anche adesso dove i cicli con contatori si usano ben poco (al loro posto si usano gli iteratori tipo i "foreach") uso sempre nomi espressivi per le variabili invece che un semplice o (per "oggetto"), cosa che odio.
Per il AND e OR invece che && e ||, sinceramente non ho preferenze, sono uno standard quindi non vedo perche' non debbano essere usate. Sarebbe come dire di usare il ciclo while() invece che for() ... ognuno ha le sue preferenze.
Ma dire specialmente a novellini di "non usarle" mi pare eccessivo, hanno altri problemi per la testa (come scrivere un bubble sort)
 
certamente, io per esempio usi quasi sempre k come contatore, e' troppo facile confondere una i con una l o un 1.
Anche adesso dove i cicli con contatori si usano ben poco (al loro posto si usano gli iteratori tipo i "foreach") uso sempre nomi espressivi per le variabili invece che un semplice o (per "oggetto"), cosa che odio.
Per il AND e OR invece che && e ||, sinceramente non ho preferenze, sono uno standard quindi non vedo perche' non debbano essere usate. Sarebbe come dire di usare il ciclo while() invece che for() ... ognuno ha le sue preferenze.
Ma dire specialmente a novellini di "non usarle" mi pare eccessivo, hanno altri problemi per la testa (come scrivere un bubble sort)
Già, ma ho più pensiero al fatto che possa inizare a mischiare codice scritto da qualcun’altro (che molto spesso utilizza i e j) con altri contatori da lui definiti e alla fine fa più confusione.

Comunque il problema qui sta nel fatto di capire quello che a scuola si è fatto e cosa voglia la consegna...
 
La confusione di usare contatori come i e j si crea specialmente in questo caso in cui ci sono DUE cicli innestati fra loro, e fare confusione con i e j e' estremamente facile. Cosa e' uno e cosa e' l'altro? E' facilissimo sbagliarsi e usarne uno invece dell'altro, con risultati disastrosi. E questo e' un codice piccolo e corto, immagina un ciclo che non sta in una pagina dello schermo, ti trovi davanti un i e un j... che diamine sono? Proprio davanti a me ho un codice scritto da un mio ex collega, roba vecchia di venti anni. Tre cicli innestati, usando due funzioni, codice lungo alcune centinaia di righe. Nel bel mezzo mi trovo questa istruzione: i=i+1... e che cavolo... e non e' nemmeno un ciclo for! Se non avesse aggiunto un commento sarei ancora qui a smadonnare.
 
Ecco qui tenendo conto che i puntatori non li ho ancora fatti dovrebbe andar bene spero..

C++:
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <iostream>
using namespace std;

void PopolaArray(int A[],int dim,int k)
{
    for(int i=0;i<dim;i++)
A[i]=rand()%k+1;
}
void PaintArray(int A[],int dim)
{
for(int i=0;i<dim;i++)
cout<<A[i]<<endl;
}

void bubblesort(int A[], int dim)
{
/* dim è il numero degli elementi del vettore da ordinare */
      for (int j = dim - 1; j > dim/2; j-- )
     {
         for (int i=dim/2; i<j; i++)
         {
           if (A[i]>A[i+1]) /* sostituire ">" con "<" per avere un ordinamento decrescente */
           {
             int tmp = A[i];
             A[i] = A[i+1];
             A[i+1] = tmp;

           }
         }
     }
}


int main()
{
  srand(time(NULL));

  int dimensione;
  cout<<"inserisci dimensione"<<endl;
  cin>>dimensione;
  int L[dimensione];
  int Key;
  cout<<"inserisci K"<<endl;
  cin>>Key;
  cout<<endl;
  PopolaArray(L,dimensione,Key);
  PaintArray(L,dimensione);
  cout<<endl;
  bubblesort(L,dimensione);
  PaintArray(L,dimensione);




    return 0;
}
 
Pubblicità
Pubblicità
Indietro
Top