RISOLTO Procedura ordina array

Stato
Discussione chiusa ad ulteriori risposte.

Vito-

Nuovo Utente
120
9
Ciao, sapreste dirmi perche quando stampo mi stampa tanti zeri quanti sono i numeri che inserisco?
Penso che il problema sia nell'ultimo for


C:
#include <stdio.h>
#define LungMax 10

void ordinaTabella(int array[LungMax])
{
    int i,j;
    for(i=0;i<LungMax-1;i++)
    {
        for(j=0;j<LungMax-i-1;j++)
        {
            if(array[j]>array[j+1])
            {
                int tmp=array[j];
                array[j]=array[j+1];
                array[j+1]=tmp;
            }
        }
    }
}

int main()
{
    int array[LungMax], num,i=0;

    printf("Inserisci massimo 10 numeri interi diversi da zero:\n");
    scanf("%d", &num);

    while(num!=0 && i<LungMax)
    {
        array[i]=num;
        i++;
        scanf("%d", &num);
    }

    ordinaTabella(array);

    for(int g=0;g<LungMax;g++)
    {
        printf("%d", array[g]);
    }

    return(0);
}
 
Ultima modifica:

Vito-

Nuovo Utente
120
9
Piu che penso sono certo che sia li, ma non so cosa mettere al posto di LungMax per farlo funzionare anche quando metto meno di 10 numeri
 

DispatchCode

Moderatore
Staff Forum
1,492
1,153
CPU
Intel 1200 I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10Gb DDR6
Audio
Integrata 7.1 HD audio
Monitor
AOC C27g2u 165Hz
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
Dovresti dichiarare dopo l'array e quindi avere int array[num]; (prende il nome di VLA, Variable Length Array questo tipo di allocazione).

Comunque il bubble sort puoi anche farlo partire con il ciclo interno uguale a j=i+i. Ovviamente anche qui dovrai usare "num" come limite e non la lunghezza massima.
 

Vito-

Nuovo Utente
120
9
Dovresti dichiarare dopo l'array e quindi avere int array[num]; (prende il nome di VLA, Variable Length Array questo tipo di allocazione).

Comunque il bubble sort puoi anche farlo partire con il ciclo interno uguale a j=i+i. Ovviamente anche qui dovrai usare "num" come limite e non la lunghezza massima.
in che senso dichiararlo dopo?
 

DispatchCode

Moderatore
Staff Forum
1,492
1,153
CPU
Intel 1200 I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10Gb DDR6
Audio
Integrata 7.1 HD audio
Monitor
AOC C27g2u 165Hz
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
Questo:

C:
int main()
{
    int num, i=0;

    printf("Inserisci massimo 10 numeri interi diversi da zero:\n");
    scanf("%d", &num);
    int array[num];
    .........
 

DispatchCode

Moderatore
Staff Forum
1,492
1,153
CPU
Intel 1200 I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10Gb DDR6
Audio
Integrata 7.1 HD audio
Monitor
AOC C27g2u 165Hz
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
Scusami, ora ho più tempo per articolare meglio.

Hai due strade.
La prima è leggere la dimensione massima dell'array, e dichiararlo come ti ho mostrato sopra. Così avrà come dimensione il nr di elementi che dovrà contenere.

La seconda è tenere tu un contatore: usi una variabile che vai a incrementare a ogni inserimento. Questo valore dovrai passarlo poi alle altre funzioni e lo utilizzerai come "lunghezza dell'array".
Chiaramente mentre inserisci i valori dovrai verificare che il tuo contatore sia inferiore al LungMax.
 

Vito-

Nuovo Utente
120
9
Scusami, ora ho più tempo per articolare meglio.

Hai due strade.
La prima è leggere la dimensione massima dell'array, e dichiararlo come ti ho mostrato sopra. Così avrà come dimensione il nr di elementi che dovrà contenere.

La seconda è tenere tu un contatore: usi una variabile che vai a incrementare a ogni inserimento. Questo valore dovrai passarlo poi alle altre funzioni e lo utilizzerai come "lunghezza dell'array".
Chiaramente mentre inserisci i valori dovrai verificare che il tuo contatore sia inferiore al LungMax.
L'ho sistemato cosi e funziona. é corretto?


C:
#include <stdio.h>
#define LungMax 10

void ordinaTabella(int array[LungMax], int n)
{
    int i,j;
    for(i=0;i<n-1;i++)
    {
        for(j=0;j<n-i-1;j++)
        {
            if(array[j]>array[j+1])
            {
                int tmp=array[j];
                array[j]=array[j+1];
                array[j+1]=tmp;
            }
        }
    }
}

int main()
{
    int array[LungMax], num,i=0, n=0;
    char nomeFile[15];
    FILE *fp;

    printf("Inserisci massimo 10 numeri interi diversi da zero:\n");
    scanf("%d", &num);

    while(num!=0 && i<LungMax)
    {
        array[i]=num;
        i++;
        n++;
        scanf("%d", &num);
    }

    ordinaTabella(array,n);

    for(int g=0;g<n;g++)
    {
        printf("%d\t", array[g]);
    }

    return(0);
}
 

DispatchCode

Moderatore
Staff Forum
1,492
1,153
CPU
Intel 1200 I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10Gb DDR6
Audio
Integrata 7.1 HD audio
Monitor
AOC C27g2u 165Hz
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
Si, a occhio mi sembra corretto.
Potresti "migliorare" il bubble sort, ma va bene anche così.
 

DispatchCode

Moderatore
Staff Forum
1,492
1,153
CPU
Intel 1200 I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10Gb DDR6
Audio
Integrata 7.1 HD audio
Monitor
AOC C27g2u 165Hz
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
È la prima volta che lo uso e l'ho preso su internet, ancora devo capire bene come funziona.
Per il resto ti ringrazio!

Inviato da Redmi 5 Plus tramite App ufficiale di Tom\'s Hardware Italia Forum

Non abituarti male visto che stai imparando (hai tempo in seguito per farlo...).
Con il bubble sort hai un indice su un elemento e un altro indice sul successivo. Ogni volta controlli se il precedente è maggiore del successivo, se lo è, li scambi.

Comunque guardando meglio il tuo codice, non ti serve nemmeno la variabile n, puoi utilizzare direttamente i.
 
  • Mi piace
Reazioni: Vito-

Vito-

Nuovo Utente
120
9
Non abituarti male visto che stai imparando (hai tempo in seguito per farlo...).
Con il bubble sort hai un indice su un elemento e un altro indice sul successivo. Ogni volta controlli se il precedente è maggiore del successivo, se lo è, li scambi.

Comunque guardando meglio il tuo codice, non ti serve nemmeno la variabile n, puoi utilizzare direttamente i.
Ma puoi spiegarmi come funzionano i due cicli for nel bubble sort perche non riesco a capirlo
 

DispatchCode

Moderatore
Staff Forum
1,492
1,153
CPU
Intel 1200 I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10Gb DDR6
Audio
Integrata 7.1 HD audio
Monitor
AOC C27g2u 165Hz
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
Ma puoi spiegarmi come funzionano i due cicli for nel bubble sort perche non riesco a capirlo

Il concetto del BubbleSort è questo.
Tieni un indice i sul primo elemento. Il secondo for inizia da j inizializzata alla posizione successiva, i+1.
Il funzionamento è semplice: ogni iterazione del ciclo esterno ordina un valore (in posizione i+1). Servono due cicli perchè ogni elemento deve essere confrontato con tutti gli altri dell'insieme.

Ecco perchè non serve che il ciclo interno inizi sempre da 0: quando sarai all'indice i, i valori da 0 a i-1 saranno ordinati (in quanto inferiori), quindi ha senso confrontare il valore all'indice i con tutti i valori in posizioni maggiori di i, poichè ancora non sono stati ordinati.
 
  • Mi piace
Reazioni: Vito-

Andretti60

Utente Èlite
5,626
4,239
Quello non e' un Bubble Sort, infatti dubito perfino che funzioni. Dove hai trovato quel codice (poiché piedi come funzioni deduco non lo hai scritto tu)
 

DispatchCode

Moderatore
Staff Forum
1,492
1,153
CPU
Intel 1200 I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10Gb DDR6
Audio
Integrata 7.1 HD audio
Monitor
AOC C27g2u 165Hz
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
Quello non e' un Bubble Sort, infatti dubito perfino che funzioni. Dove hai trovato quel codice (poiché piedi come funzioni deduco non lo hai scritto tu)

Di averlo copiato l'ha detto qualche post sopra, infatti gli consigliavo di scriversele le cose, specie visto che sta imparando.

Comunque perché non è bubble sort? Non è scritto proprio bene, ma a me sembra comunque bubble sort.
 
  • Mi piace
Reazioni: Andretti60
Stato
Discussione chiusa ad ulteriori risposte.

Entra

oppure Accedi utilizzando

Discussioni Simili