PDA

Visualizza la versione completa : [C] Selection Sort e controllo ordine crescente non funzionante


matteo martis
25-02-2011, 11:30
Ciao!!

la funzione che mi controlla se la serie di numeri da ordinare sia ordinata
prima del tempo non funziona bene.


include <stdio.h>
#define size 5 /* questo è il main del programma in cui si chiamano le tre funzioni per prendere in input, ordinare un array e farci una ricerca */

void input(int [], int);
void selectsort(int [], int);
void printarray(int[], int);
char orderer(int[], int);
main() {
int numeri[size]; i
input(numeri,size);
selectsort(numeri,size);
system("PAUSE");
} /*fine main*/
/* inizio funzione input*/
void input(int vet[], int dim) {
int i;
for(i=0; i<dim; i++)
{
printf("\n\n inserisci l'elemento numerico numero %d \n\n", i+1);
scanf("%d", &vet[i]);
}
printarray(vet,dim);
} /* fine della funzione di input */
/* inizio della funzione di selectionsort */
void selectsort(int vet[], int dim)
{
int i, j, p, min;
char flag ='d';
/* inizio doppio ciclo di for alla base del selection sort */
for(i=0; i<(dim-1) && flag == 'd'; i++) {
/* preset min */
min = vet[i];
for(j=i;j<dim; j++) {
/* ricerca del consueto minimo */
if(min > vet[j]) {
min = vet[j];
p=j;
} else {
if(min==vet[j]) {
p=j; }
} /* fine ricerca minimo*/ }
/* scambio di posizioni nel caso il min non sia già memorizzato nella posizione giusta inizio */ if(p!=i) {
vet[p] = vet[i];
vet[i] = min; }
/* scambio di posizioni fine*/
flag = orderer(vet, dim);
} /* fine doppio ciclo */
/* stampa dell'array selection ordinato*/
printarray(vet,dim);
}
/* stampa un array inizio*/
void printarray(int vet[], int dim) {
int i;
printf("\n\n");
for(i=0; i<dim; i++) {
printf("%d\t", vet[i]);
} printf("\n\n");
} /* stampa un array fine*/
/* inizio funzione per il controllo dell'ordine degli elementi */
char orderer(int vet[], int dim) {
int i, j;
char ret='d';
printf(" controllo se per caso l'ordine e' arrivato prima del tempo");
for(i=0 ; i<dim; i++) {
j= i+1;
if(vet[i]>vet[j]) {
ret = 'o';
} } return ret; } /* fine funzione per il controllo dell'ordine degli elementi */
Grazie!!!

Laikius91
25-02-2011, 12:48
Manca l'indentazione ed è un po' difficile da interpretare, ma ho notato un paio di cose.

1) nel main:



int numeri[size]; i


non so se sia un errore di battitura, ma ovviamente tra numeri[size] e i occorre una virgola e il punto e virgola va alla fine del tutto...

2) la funzione orderer:



char orderer(int vet[], int dim) {
int i, j;
char ret='d';
printf(" controllo se per caso l'ordine e' arrivato prima del tempo");
for(i=0 ; i<dim; i++) {
j= i+1;
if(vet[i]>vet[j]) {
ret = 'o';
} } return ret; } /* fine funzione per il controllo dell'ordine degli elementi */


Ipotizziamo che l'array sia 2-1-3-4: al primo ciclo si ha che 2 è > di 1 e pertanto ret viene impostato a 'o'... Nei cicli seguenti, anche se la condizione non è più rispettata, a ret rimane il valore 'o' che sarà in ogni caso ritornato.
Potresti risolvere così:



char orderer (int vet[], int dim)
{

int i = 0, j, ok = 1;

while (ok && i < dim)
{
ok = 0;
j = i + 1;
if (vet[i] > vet[j])
ok = 1;
i++;
}

if (ok)
return 'o';
else
return 'd';

}

matteo martis
25-02-2011, 13:30
grazie... seguirò i tuoi suggerimenti!!!

Loading