Autore |
Discussione |
|
easley
Nuovo Utente
|
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"); }
|
Modificato da - easley in Data 17/12/2014 16:49:11
|
|
genius
dott. ing. cav. ...FN
Regione: Puglia
Prov.: Bari
Città: Molfetta - Caput Mundi
|
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? |
"...e se non hai morale e se non hai passione se nessun dubbio ti assale perché la sola ragione che ti interessa avere è una ragione sociale soprattutto se hai qualche dannata guerra da fare non farla nel mio nome non farla nel mio nome che non hai mai domandato la mia autorizzazione se ti difenderai non farlo nel mio nome che non hai mai domandato la mia opinione..."
Un blog farlocco |
|
|
easley
Nuovo Utente
|
Inserito il - 17/12/2014 : 20:53:37
|
Sisi,esatto. Mi scuso per non aver chiarito bene il funzionamento |
|
|
easley
Nuovo Utente
|
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:..") |
|
|
genius
dott. ing. cav. ...FN
Regione: Puglia
Prov.: Bari
Città: Molfetta - Caput Mundi
|
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");
}
|
"...e se non hai morale e se non hai passione se nessun dubbio ti assale perché la sola ragione che ti interessa avere è una ragione sociale soprattutto se hai qualche dannata guerra da fare non farla nel mio nome non farla nel mio nome che non hai mai domandato la mia autorizzazione se ti difenderai non farlo nel mio nome che non hai mai domandato la mia opinione..."
Un blog farlocco |
|
|
easley
Nuovo Utente
|
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 |
Modificato da - easley in data 19/12/2014 11:00:11 |
|
|
genius
dott. ing. cav. ...FN
Regione: Puglia
Prov.: Bari
Città: Molfetta - Caput Mundi
|
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;
|
"...e se non hai morale e se non hai passione se nessun dubbio ti assale perché la sola ragione che ti interessa avere è una ragione sociale soprattutto se hai qualche dannata guerra da fare non farla nel mio nome non farla nel mio nome che non hai mai domandato la mia autorizzazione se ti difenderai non farlo nel mio nome che non hai mai domandato la mia opinione..."
Un blog farlocco |
|
|
easley
Nuovo Utente
|
Inserito il - 20/12/2014 : 10:25:32
|
perfetto,grazie mille per la tua gentilezza! |
|
|
|
Discussione |
|
|
|