|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Dec 2006
Messaggi: 198
|
[C++] Array puntatori x ordinamento
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++): Codice:
#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");
}
Cosa ho perso? é.è Ultima modifica di Mesh89 : 02-12-2006 alle 15:49. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Feb 2004
Messaggi: 1454
|
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. Ultima modifica di Furla : 02-12-2006 alle 22:45. |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Dec 2006
Messaggi: 198
|
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... |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Feb 2004
Messaggi: 1454
|
esatto
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quando si fa un esercizio del genere conviene aggiungere un livello di astrazione:
Codice:
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;
}
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:45.



















