V I S U A L I Z Z A D I S C U S S I O N E |
easley |
Inserito il - 17/12/2014 : 16:48:41 Salve avrei alcuni problemi con l'output del vettore partizionato,in pratica non avviene. Si accettano anche consigli su miglioramenti o eventuali errori commessi. Di seguito ho postato il codice in c. Grazie in anticipo
#include<stdio.h> #include<stdlib.h>
using namespace std;
int main(){ printf("Pratizionamento array \n\n"); int n,num,temp; printf("quanti numeri vuoi inserire? "); scanf("%d",&n); int a[n]; printf("inserisci valori array \n"); for(int i=0;i<n;i++){ printf("valore %d :",i+1); scanf("%d",&a[i]); }
printf("Inserisci numero per creare partizione "); scanf("%d",num); int i=0,j=n; do { while(a[i]<=num) i=i++; while(a[j]>num) j=j--; if(i<=j){ temp=a[i]; a[i]=a[j]; a[j]=temp; i=i++; j=j--;} }while(i<=j); for(int k=0;k<n;k++){ printf(" %d ",a[k]); } system("pause"); }
|
7 U L T I M E R I S P O S T E (in alto le più recenti) |
easley |
Inserito il - 20/12/2014 : 10:25:32 perfetto,grazie mille per la tua gentilezza! |
genius |
Inserito il - 19/12/2014 : 15:17:51 Nel tuo programma i due cicli di scorrimento di i e j potevano incrociarsi ed inoltre se non si incrociavano, il programma andava in loop (o in crash) per l'assenza di verifiche sui limiti dell'array.
Comunque, essendo 'found' una variabile booleana, accetta qualsiasi valore booleano, sia che direttamente si tratti di un true o di un false, sia che si utilizzi una funzione o un'espressione che ritorni un valore booleano. In questo caso l'espressione "a[j] <= num" resistuisce true se a[j] è minore o uguale a num, false altrimenti.
diciamo che scrivere
found = a[j] <= num; equivale a scrivere
if(a[j] <= num)
found = true;
else
found = false;
|
easley |
Inserito il - 19/12/2014 : 10:54:15 grazie mille per il tuo tempo ed il tuo aiuto! Ho capito tutto del tuo programma,solo che ancora non capisco cosa c'era di sbagliato nel mio xD
solo una cosa,nella parte di codice : bool found = false; for(int j = n - 1; j > i && !found; j--) { found = a[j] <= num; }
if(found==true ) ...
solo "found = a[j] <= num;" non mi è tanto chiaro |
genius |
Inserito il - 18/12/2014 : 16:08:35 Citazione: Messaggio inserito da easley
In pratica: dato un array di elementi inserito da tastiera(a[n]), viene chiesto un valore (sia interno che esterno all'array) "num",secondo il quale viene effettuata una partizione,non necessariamente ordinata in modo crescente o decrescente,dove a sinistra vengono specificati i valori minori e a destra quelli maggiori,o anche,avevo pensato successivamente,in due output diversi(tipo: "numeri maggiori:..numeri minori:..")
Ho rivisto e corretto il tuo codice. In fase di visualizzazione uso il numero pivot (num) per suddividere visivamente le due parti dell'array.
Chiedi pure se qualcosa non ti è chiara.
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int main(){
printf("Pratizionamento array \n\n");
int n,num,temp;
printf("quanti numeri vuoi inserire? ");
scanf("%d",&n);
int a[n];
printf("inserisci valori array \n");
for(int i=0;i<n;i++){
printf("valore %d :",i+1);
scanf("%d",&a[i]);
}
printf("Inserisci numero per creare partizione ");
scanf("%d",&num);
unsigned int i = 0;
unsigned int j = n - 1;
for(; i < j; i++) {
if (a[i] > num) {
bool found = false;
for(; !found && j > i; j--) {
found = a[j] <= num;
}
if(found) {
temp = a[i];
a[i] = a[j + 1];
a[j + 1] = temp;
}
}
}
unsigned int k = 0;
for(; a[k] <= num && k < n; k++){
printf("%d ",a[k]);
}
printf("<%d> ", num);
for(; k < n; k++){
printf("%d ",a[k]);
}
printf("\n");
}
|
easley |
Inserito il - 17/12/2014 : 20:58:02 In pratica: dato un array di elementi inserito da tastiera(a[n]), viene chiesto un valore (sia interno che esterno all'array) "num",secondo il quale viene effettuata una partizione,non necessariamente ordinata in modo crescente o decrescente,dove a sinistra vengono specificati i valori minori e a destra quelli maggiori,o anche,avevo pensato successivamente,in due output diversi(tipo: "numeri maggiori:..numeri minori:..") |
easley |
Inserito il - 17/12/2014 : 20:53:37 Sisi,esatto. Mi scuso per non aver chiarito bene il funzionamento |
genius |
Inserito il - 17/12/2014 : 17:49:11 Ciao, posso chiederti cosa intendi per partizionamento?
update: ho provato a compilare ed eseguire il codice. Come consiglio ti direi di rivedere per bene i "bound check" sull'array (i potrebbe superare la dimensione dell'array sia nel ciclo interno ("while(a[i]<=num)") sia in quello esterno ("while(i<=j") così come j può assumere valori negativi. Inoltre j è inizializzato a un valore di indice "out of bound".
per il resto intuisco che il partizionamento per te è basato su un pivot, per cui tutti gli elementi iniziali del vettore sono minori o uguali ad esso, e tutti quelli finali sono maggiori. corretto? |
|
|