Newsgroup: it.comp.lang.c
Titolo: Exchange-sort

Buonasera....
Ho trovato notevoli difficoltà nell' estendere questo programma....
Si tratta dell' ordinamento particolare così definito....
Ma nulla, non va!!!!
Vorrei sapere perchè?????
Qualcuno mi spiega bene come si fa ????
Ecco:
#include <stdio.h>
#define array_size 100 
/*void swap_int(int *a, int *b);*/
void exchange( dimAr, Ar);
main ()
{   
 
    int A[array_size]; 
    int dim; 
    int i,j,t; 
 
    printf("\n \n"); 
    printf("                       **** BENVENUTO!****\n");    
    printf (" Inserisci il numero di elementi dell' array da ordinare =
");
    scanf("%d", &dim); 
    printf("\n \n");     
    for(i=0;i<dim;i++) 
    { 
        printf("Inserire l'elemento di posto %d: ", (i+1)); 
        scanf("%d", &A[i]); 
    } 
    printf("Fine Introduzione dati\n \n");     
 
    printf("Il Vettore inserito è: "); 
    for(i=0; i<dim; i++)      
        printf("[%d]", A[i]);     
 
    printf("Fine Visualizzazione dati\n \n");      
    dimAr =&dim ;
    Ar= &A[0];    
    exchange( Ar,dimAr);
 
    printf("Inizio Visulaizzazione Output");   
    printf("Il vettore ordinato risulta essere: "); 
    for(i=0;i<dim;i++) 
    { 
         printf("[%d]", A[i]); 
    }            
    printf("Fine Visulaizzazione Output");
}
/*Funzione per lo scambio del valore di due interi*/
/*void swap_int(int *a, int *b)
{
    int c; /*variabile di comodo*/
    /* c = *a; /* c <- valore puntato da a */
    /* *a = *b; /* il valore puntato da a <- il valore puntato da b*/
    /* *b = c; /* il valore puntato da b <- c
}
*/
void exchange (int Ar,int dimAr) 
{
int i, j;
for (i=dim-1; i<1; i--)
    {
            printf("ok3"); 
            for (j=1; j<i; j++)
            {
                    if (A[j] > A[j+1])
                    {
                                printf("scambio"); 
 
                                t = A[j];
                                A[j]=A[j+1];
                                A[j+1]=t;
                    }
                    /*swap_int(&A[j], &A[j+1]);*/
            }             
     }
}
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Anno Domini Tue, 17 Feb 2004 20:33:00 +0000 (UTC), Fabrizio, nobilissimus
apud internautas, scripsit:
[cut]
Penso di aver trovato una ventina di errori, fra i quali almeno 6 o 7 di
entità spaventosa, comunque eccoti il codice (che mi è parso funzionante) e
prova a confrontarlo con quello che hai postato! :)
2 cosine che potrebbero servirti da promemoria:
in c gli array vanno da 0 a n-1, quindi nel ciclo di ordinamento devi 					
ricordardi di partire da indice 0 e non 1;
se dichiari una variabile in main, non aspettarti di poterla richiamare
come se niente fosse dalla procedura di ordinamento, da una procedura si
possono solo richiamare variabili locali della procedura/funzione stessa,
variabili globali (dichiarate prima del main), parametri della proc/funz.;
se vuoi passare un array ad una funzione devi fare in modo che la funzione
richieda un puntatore e non un intero, poi chiamala funzione(mioarray);
utilizzando una funzione non devi per forza richiamarla utilizzando le
variabili con o stesso nome:
tu hai dichiarato dopo opportune correzioni
	void exchange (Ar,dimAr);
il che non esiste proprio, semmai
	void exchange (int ,int);
possibile(salvo errori miei, comunque novizio) solo nella dichiarazione
iniziale; ma probabilmente intendevi
	void exchange (int Ar,int dimAr);
che però risulta dover essere
	void exchange (int *Ar,int dimAr);
perchè Ar è un array!
detto ciò tu provavi a chiamare la funzione così
	exchange (Ar,dimAr);
Nessunoti obbliga a udare gli stessi nomi della dichiarazione... puoi
benissimo anche chiamarla così
	exchange(vettore_del_nonno, costante_di_geppetto);
se i parametri sono visibili laddove invocata la funzione...
<CODE>
#include <stdio.h>
#define array_size 100 
/*void swap_int(int *a, int *b);*/
void exchange (int *Ar,int dimAr);
main ()
{   
 
    int A[array_size]; 
    int dim; 
    int i; 
 
    printf("\n \n"); 
    printf("                       **** BENVENUTO!****\n");    
    printf (" Inserisci il numero di elementi dell' array da ordinare =");
    scanf("%d", &dim); 
    printf("\n \n");     
    for(i=0;i<dim;i++) 
    { 
        printf("Inserire l'elemento di posto %d: ", (i+1)); 
        scanf("%d", &A[i]); 
    } 
    printf("Fine Introduzione dati\n \n");     
 
    printf("Il Vettore inserito è: "); 
    for(i=0; i<dim; i++)      
        printf("[%d]", A[i]);     
 
    printf("Fine Visualizzazione dati\n \n");      
    //dimAr =&dim ;
    //Ar= &A[0];    
    exchange( A,dim);
 
    printf("Inizio Visulaizzazione Output");   
    printf("Il vettore ordinato risulta essere: "); 
    for(i=0;i<dim;i++) 
    { 
         printf("[%d]", A[i]); 
    }            
    printf("Fine Visulaizzazione Output");
	return 0;
}
/*Funzione per lo scambio del valore di due interi*/
/*void swap_int(int *a, int *b)
{
    int c; /*variabile di comodo*/
    /* c = *a; /* c <- valore puntato da a */
    /* *a = *b; /* il valore puntato da a <- il valore puntato da b*/
    /* *b = c; /* il valore puntato da b <- c
}
*/
void exchange (int *Ar,int dimAr) 
{
int i, j, t;
for (i=dimAr-1; i>0; i--)
    {
            printf("ok3"); 
            for (j=0; j<i; j++)
            {
                    if (Ar[j] > Ar[j+1])
                    {
                                printf("scambio"); 
 
                                t = Ar[j];
                                Ar[j]=Ar[j+1];
                                Ar[j+1]=t;
                    }
                    /*swap_int(&A[j], &A[j+1]);*/
            }             
     }
}
</CODE>
-- 
Poochie ©
Teoricamente la teoria è uguale alla pratica, ma in pratica non lo è...

 iniziale;
Cosa intendi per dichiarazione iniziale?
Ti riferivi al prototipo di funzione ?
Marcello

Anno Domini Wed, 18 Feb 2004 09:45:24 GMT, Marcello, nobilissimus apud
internautas, scripsit:

Yep in parole povere all'inizio dove introduci al programma tutte le
procedure/funzioni che lui potrà trovare più in là nel programma.


 procedure/funzioni che lui potrà trovare più in là nel programma.
Ho capito...
Ti riferivei al prototipo di funzione.
In questo caso, hai ragione quando affermi che una siffatta riga di codice:
void exchange (int ,int);
è quella relativa ad un prototipo di funzione e null'altro.
I prototipi sono una delle più importanti caratteristiche dell'ANSI C 
(per la cronaca, rubacchiata al C++).
Nulla vieta di inserire i nomi delle variabili nel prototipo, ma il 
compilatore li ignorerà. E'solo una questione di leggibilità.
Un'altra caratteristica molto importante dei prototipi, in C, è la 
coercizione degli argomenti (conversioni di tipi di dato).
L'importante è che nelle conversioni non vi sia perdita di informazione 
(vedi regole di promozione).
I prototipi evitano il verificarsi di errori subdoli dovuti alla mancata 
convalida delle chiamate di funzione da parte del compilatore.
In generale, quindi, benchè il loro utilizzo possa essere evitato, credo 
sia consigliabile fornire al compilatore i prototipi di funzione.
Marcello


<cut>
Perche' rubacchiata al C++ ?
Io ricordo che i prototipi erano necessari, se utilizzavi una funzione prima
di definirla o era su un'altro modulo, sin dai tempi dell'Aztec C su
AppleII, quando il C++ mi sembra non esistesse neanche.
O forse ho sbagliato a capire?
Ciao
Giuseppe

Giuseppeł wrote:

Non hai sbagliato a capire.
Nel senso che e' molto piu' facile che abbia sbagliato io a dire... :)
Per quel che ne so (molto poco ad essere sinceri), il comitato dell'ANSI 
C, prese in prestito il prototipo di funzione dagli sviluppatori del C++.
Le versioni precedenti del C non eseguivano il controllo della convalida 
delle chiamate di funzione.
Questo, naturalmente, AFAIK.
Marcello