Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    c selection sort controllo ordine crescente non funzionante

    Ciao!!

    la funzione che mi controlla se la serie di numeri da ordinare sia ordinata
    prima del tempo non funziona bene.
    codice:
    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!!!

  2. #2
    Manca l'indentazione ed è un po' difficile da interpretare, ma ho notato un paio di cose.

    1) nel main:

    codice:
    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:

    codice:
    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ì:

    codice:
    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';
    
    }
    Salute a voi, da Laikius!

    --> Faber est suae quisque fortunae <--

  3. #3
    grazie... seguirò i tuoi suggerimenti!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.