D4rkAng3l
14-02-2005, 18:58
Scusate sre ultimamente sono particolarmente attivo a fare domande sul forum ma il 23 ho l'esame e evo riuscire a capirci qualcosa di più per quella data :eek: :cry:
Si tratta di un programma che implementa l'algoritmo bubblesort mediante i puntatori a funzioni, il codice è questo:
/* Programma di ordinamento polivalente che utilizza dei puntatori a funzioni */
#include <stdio.h>
#define SIZE 10
void bubble(int *, const int, int (*)(int, int));
int ascending(const int, const int);
int descending(const int, const int);
int main(){
int a[SIZE] = {2,6,4,8,10,12,89,68,45,37};
int counter, order;
printf("Inserire 1 per ordinare in modo ascendente il vettore\n");
printf("Inserire 2 per ordinare in modo discendente il vettore\n");
scanf("%d", &order);
printf("\nDati nell'ordine originale:\n");
for(counter=0; counter<=SIZE-1; counter++) // Visualizza il vettore nell'ordine originale
printf("%4d", a[counter]);
if(order == 1){
bubble(a, SIZE, ascending);
printf("\nDati nell'ordine ascendente:\n");
}
else{
bubble(a, SIZE, descending);
printf("\nDati nell'ordine decrescente:\n");
}
for(counter=0; counter<=SIZE-1; counter++)
printf("%4d", a[counter]); // Visualizza il vettore precedentemente ordinato
printf("\n");
return 0;
}
void bubble(int *work, const int size, int (*compare)(int, int)){
int pass, count;
void swap(int *, int*); // Prototipo di void visibile solo in bubble, gli passo i puntatori ai due elementi da scambiare
for(pass=1; pass<=size-1; pass++)
for(count=0; count<=size-2; count++)
if((*compare)(work[count], work[count+1]))
swap(&work[count], &work[count+1]);
}
void swap(int *element1Ptr, int *element2Ptr){
int temp;
temp = *element1Ptr;
*element1Ptr = *element2Ptr;
*element2Ptr = temp;
}
int ascending(const int a, const int b){
return b<a;
}
int descending(const int a, const int b){
return b>a;
}
Le cose che non ho ciarissime sono le seguenti(mi sà un bel po')
1) La funzione bubble riceve come argomenti il vettore, la sua dimensione e un puntatore a una funzione (gli viene passata o ascending o descending) che a sua volta accettacome parametri 2 argomenti interi e restituisce un intero...giusto?
2) A seconda della scelta viene invocata bubble passandogli o ascening o descending...
int (*compare)(int, int) è il puntatore a una delle due funzioni?
3)Il prototipo di swap viene dichiarato nella funzione buble per rendere visibile swap solo al suo interno e non fuori di buble?
4)PUNTO CRUSCIALE !!! Ecco questa è la cosa che mi è meno chiara di tutti :
if((*compare)(work[count], work[count+1]))
swap(&work[count], &work[count+1]);
Che fa questa parte di codice?
Io credo, ma non ne sono affatto sicuro, che chiami una delle due funzioni ascending o descending(in base alla scelta fatta prima) e gli passi 2 elementi contigui del vettore.....e se è vero che b<a (oppure nel caso dui descending b>a) passa i due scalari alla funzione swap e scambia i valori...giusto?
non mi è per niente chiaro il return in ascending e descending...help meeee
Grazie mille
Si tratta di un programma che implementa l'algoritmo bubblesort mediante i puntatori a funzioni, il codice è questo:
/* Programma di ordinamento polivalente che utilizza dei puntatori a funzioni */
#include <stdio.h>
#define SIZE 10
void bubble(int *, const int, int (*)(int, int));
int ascending(const int, const int);
int descending(const int, const int);
int main(){
int a[SIZE] = {2,6,4,8,10,12,89,68,45,37};
int counter, order;
printf("Inserire 1 per ordinare in modo ascendente il vettore\n");
printf("Inserire 2 per ordinare in modo discendente il vettore\n");
scanf("%d", &order);
printf("\nDati nell'ordine originale:\n");
for(counter=0; counter<=SIZE-1; counter++) // Visualizza il vettore nell'ordine originale
printf("%4d", a[counter]);
if(order == 1){
bubble(a, SIZE, ascending);
printf("\nDati nell'ordine ascendente:\n");
}
else{
bubble(a, SIZE, descending);
printf("\nDati nell'ordine decrescente:\n");
}
for(counter=0; counter<=SIZE-1; counter++)
printf("%4d", a[counter]); // Visualizza il vettore precedentemente ordinato
printf("\n");
return 0;
}
void bubble(int *work, const int size, int (*compare)(int, int)){
int pass, count;
void swap(int *, int*); // Prototipo di void visibile solo in bubble, gli passo i puntatori ai due elementi da scambiare
for(pass=1; pass<=size-1; pass++)
for(count=0; count<=size-2; count++)
if((*compare)(work[count], work[count+1]))
swap(&work[count], &work[count+1]);
}
void swap(int *element1Ptr, int *element2Ptr){
int temp;
temp = *element1Ptr;
*element1Ptr = *element2Ptr;
*element2Ptr = temp;
}
int ascending(const int a, const int b){
return b<a;
}
int descending(const int a, const int b){
return b>a;
}
Le cose che non ho ciarissime sono le seguenti(mi sà un bel po')
1) La funzione bubble riceve come argomenti il vettore, la sua dimensione e un puntatore a una funzione (gli viene passata o ascending o descending) che a sua volta accettacome parametri 2 argomenti interi e restituisce un intero...giusto?
2) A seconda della scelta viene invocata bubble passandogli o ascening o descending...
int (*compare)(int, int) è il puntatore a una delle due funzioni?
3)Il prototipo di swap viene dichiarato nella funzione buble per rendere visibile swap solo al suo interno e non fuori di buble?
4)PUNTO CRUSCIALE !!! Ecco questa è la cosa che mi è meno chiara di tutti :
if((*compare)(work[count], work[count+1]))
swap(&work[count], &work[count+1]);
Che fa questa parte di codice?
Io credo, ma non ne sono affatto sicuro, che chiami una delle due funzioni ascending o descending(in base alla scelta fatta prima) e gli passi 2 elementi contigui del vettore.....e se è vero che b<a (oppure nel caso dui descending b>a) passa i due scalari alla funzione swap e scambia i valori...giusto?
non mi è per niente chiaro il return in ascending e descending...help meeee
Grazie mille