|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2683
|
[C] Ho capito bene questo programma?
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
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 |
|
|
|
|
|
#2 | ||||
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Re: [C] Ho capito bene questo programma?
Quote:
Quote:
Quote:
Quote:
ciao |
||||
|
|
|
|
|
#3 |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2683
|
cioè fa ritornare TRUE se tipo a<b e FALSE se non è vero?
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:01.



















