Forum by laureateci.it
[ Home | REGOLE FORUM | Tutti i blog | Profilo | Registrati | CHAT | Discussioni Attive | Discussioni Recenti | Segnalibro | Msg privati | Sondaggi Attivi | Utenti | Download Informatica | Download ICD | Download TPS | Download Magistrale | Download Specialistica | Giochi | Cerca nel web | cerca | faq | RSS ]
Nome Utente:
Password:
Salva Password
Password Dimenticata?

 Tutti i Forum
 INFORMATICA - Primo Anno
 Programmazione
 Aiuto esercizio progr (partizionamento array)
 Nuova Discussione  Rispondi
 Versione Stampabile Bookmark this Topic Aggiungi Segnalibro
I seguenti utenti stanno leggendo questo Forum Qui c'è:
Autore Discussione Precedente Discussione Discussione Successiva  

easley
Nuovo Utente



Inserito il - 17/12/2014 : 16:48:41  Mostra Profilo  Visita l'Homepage di easley Invia a easley un Messaggio Privato  Rispondi Quotando
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

Genio


Regione: Puglia
Prov.: Bari
Città: Molfetta - Caput Mundi


Inserito il - 17/12/2014 : 17:49:11  Mostra Profilo  Visita l'Homepage di genius  Clicca per vedere l'indirizzo MSN di genius  Invia a genius un messaggio Yahoo! Invia a genius un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina

easley
Nuovo Utente



Inserito il - 17/12/2014 : 20:53:37  Mostra Profilo  Visita l'Homepage di easley Invia a easley un Messaggio Privato  Rispondi Quotando
Sisi,esatto. Mi scuso per non aver chiarito bene il funzionamento
Torna all'inizio della Pagina

easley
Nuovo Utente



Inserito il - 17/12/2014 : 20:58:02  Mostra Profilo  Visita l'Homepage di easley Invia a easley un Messaggio Privato  Rispondi Quotando
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:..")
Torna all'inizio della Pagina

genius
dott. ing. cav. ...FN

Genio


Regione: Puglia
Prov.: Bari
Città: Molfetta - Caput Mundi


Inserito il - 18/12/2014 : 16:08:35  Mostra Profilo  Visita l'Homepage di genius  Clicca per vedere l'indirizzo MSN di genius  Invia a genius un messaggio Yahoo! Invia a genius un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina

easley
Nuovo Utente



Inserito il - 19/12/2014 : 10:54:15  Mostra Profilo  Visita l'Homepage di easley Invia a easley un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina

genius
dott. ing. cav. ...FN

Genio


Regione: Puglia
Prov.: Bari
Città: Molfetta - Caput Mundi


Inserito il - 19/12/2014 : 15:17:51  Mostra Profilo  Visita l'Homepage di genius  Clicca per vedere l'indirizzo MSN di genius  Invia a genius un messaggio Yahoo! Invia a genius un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina

easley
Nuovo Utente



Inserito il - 20/12/2014 : 10:25:32  Mostra Profilo  Visita l'Homepage di easley Invia a easley un Messaggio Privato  Rispondi Quotando
perfetto,grazie mille per la tua gentilezza!
Torna all'inizio della Pagina
  Discussione Precedente Discussione Discussione Successiva  
 Nuova Discussione  Rispondi
 Versione Stampabile Bookmark this Topic Aggiungi Segnalibro
Vai a:
Forum by laureateci.it © 2002 - 2012 Laureateci Communications Torna all'inizio della Pagina
Il DB ha risposto in 0,25 secondi.

TargatoNA.it | SuperDeejay.Net | Antidoto.org | Brutto.it | Equiweb.it | Snitz Forum 2000