PDA

View Full Version : [C++] Array puntatori x ordinamento


Mesh89
02-12-2006, 14:34
Salve a tutti, sono uno studente d programmazione alla prese con i puntatori

Mi è stato kiesto di ordinare un vettore di interi senza toccarne il contenuto, ma usando un array di supporto con puntatori agli elementi del vettore Interi, e scambiandone gli indirizzi.
Ecco il codice (Dev-C++):

#include <iostream>
#include <stdlib.h>
#include <time.h>

using namespace std;

int main() {
srand(time(0));
int Interi[10];
int *PInteri[10];
int *backup;
for (int i=0;i<10;i++) {Interi[i]=rand()%100;PInteri[i]=&Interi[i];cout<<*PInteri[i]<<" ";}
cout<<"\n\nVettore ordinato:\n";
for (int i=0;i<9;i++)
for (int j=0;j<10-(i+1);j++) {
if (Interi[j]>Interi[j+1]) {
backup=PInteri[j];
PInteri[j]=PInteri[j+1];
PInteri[j+1]=backup;
}
}
for (int i=0;i<10;i++) cout<<*PInteri[i]<<" ";
cout<<"\n\nVecchio vettore:\n";
for (int i=0;i<10;i++) cout<<Interi[i]<<" ";
cout<<"\n\n";
system("PAUSE");
}

L'array viene ordinato in modo sbagliato. Eppure Bubblesort è corretto, xkè se nellos cambio invece d scambiare i puntatori scambio direttamente i puntati, funziona correttamente

Cosa ho perso? é.è

Furla
02-12-2006, 21:30
devi usare i puntatori nella condizione di scambio.
al posto di

if (Interi[j]>Interi[j+1])

usa

if (*PInteri[j]>*PInteri[j+1])


non è facile spiegarti bene il motivo, provo a farti un esempio su un array di 3 elementi:

array di interi: 4 2 3
array di puntatori: p4 p2 p3

(ovviamente p4 punta all'elemento di indice zero, di valore 4, p2 punta all'elemento di indice 1 di valore 2 e p3 punta all'elemento di indice 2 di valore 3)

4 è minore di 2, scambi i puntatori ed hai:

array di interi: 4 2 3
array di puntatori: p2 p4 p3

se fai il confronto tra gli elementi dell'array di interi, 2 è minore di 3 e l'algoritmo si ferma senza scambiare p4 con p3.

se invece lo fai usando i puntatori, il confronto avviene fra *p4 e *p3, ovvero tra l'elemento puntato da p4 (di valore 4) e quello puntato da p3 (cioè quello di valore 3), e visto che il primo è maggiore del secondo viene effettuato lo scambio di puntatori:

array di interi: 4 2 3
array di puntatori: p2 p3 p4


non so se è chiaro, se hai capito il bubble sort dovrebbe essere semplice.

Mesh89
03-12-2006, 20:14
Ah, è vero, grazie mille!

Se ho capito bene, l'errore è ke, non cambiando fisicamente le posizioni degli elementi sull'array, finirei confrontando sempre gli stessi elementi, praticamente un array sempre uguale, mentre invece dovrei sempre vedere l'array tramite gli "occhi" dell'array di puntatori...

Furla
04-12-2006, 12:10
esatto ;)

cionci
04-12-2006, 17:07
Quando si fa un esercizio del genere conviene aggiungere un livello di astrazione:

int getValue(int *v[], int i)
{
return *v[i];
}

void swap(int *v[], int i, int j)
{
int *temp = v[i];
v[i] = v[j];
v[j] = temp;
}

Ed ecco che l'esercizio diventa di nuovo perfettamente leggibile...