DOMANDA C++ void+ bubble sort

MPG

Utente Attivo
544
4
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:

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
E dove sta il problema?
Dagli il tipo CPP al tag code, che si legga meglio...
 

MPG

Utente Attivo
544
4
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-- )

??
Post unito automaticamente:

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:

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
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 []
 

MPG

Utente Attivo
544
4
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:

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
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...
 

Andretti60

Utente Èlite
6,440
5,091
Ohibò e perché mai non ha senso chiamare bil contatore di un ciclo? Scusa ma non ha senso alcuno :shock:
 

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
Ohibò e perché mai non ha senso chiamare bil contatore di un ciclo? Scusa ma non ha senso alcuno :shock:
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
 

Andretti60

Utente Èlite
6,440
5,091
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)
 

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
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...
 
  • Mi piace
Reazioni: Andretti60

Andretti60

Utente Èlite
6,440
5,091
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.
 
  • Mi piace
Reazioni: _Achille

MPG

Utente Attivo
544
4
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;
}
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili