[C] funzione di ordinamento con puntatori

di il
22 risposte

[C] funzione di ordinamento con puntatori

Allora avendo appena introdotti i puntatori ho dovuto realizzare una funzione che dato un'array ne ordinasse il contenuto utilizzando i puntatori. Questo è il codice non so dove sia sbagliato...
void swap(int *a, int *b)
{
        int t;
        t = *a;
        *a = *b;
        *b = t;
}

void ordina(int *d, int n, char mode)
{
        int flag,i;
        
        if(mode=='+')
        {
                do
                {
                           flag=0;
                           for(i=0;i<n-1;i++)
                           {
                                     if(d[i] > d[i+1])
                                     {
                                                swap(&d[i], &d[i+1]);
                                                flag=1;
                                     }
                           }
                }
                while(flag==1);
                printf("Array ordinato in ordine crescente\n");
        }
        else if(mode=='-')
        {
                do
                {
                           flag=0;
                           for(i=0;i<n;i++)
                           {
                                     if(d[i] < d[i+1])
                                     {
                                                swap(&d[i], &d[i+1]);
                                                flag=1;
                                     }
                           }
                }
                while(flag==1);
                printf("Array ordinato in ordine decrescente\n");
        }
}

22 Risposte

  • Re: [C] funzione di ordinamento con puntatori

    Ma hai errori? Problemi di compilazione? Cosa succede?

    Il main qual è?
  • Re: [C] funzione di ordinamento con puntatori

    Allora il main sempre per mezzo di altre funzioni fa operazioni su array di dati. Il problema con questa funzione è che dopo averla eseguita l'array è sempre nello stesso ordine. La chiamata è questa
    
    
    //ordinamento secondo mode
        
        char mode;
        fflush(stdin);
        printf("Premi + per ordinare in modo crescente o - per l'ordine decrescente.\n");
        getch(mode);
        order(numeri, 20, mode);
        //stampa dell'array ordinato
        stampa(numeri, 20);
  • Re: [C] funzione di ordinamento con puntatori

    A parte il nome (order invece di ordina) mi sembra che funzioni regolarmente.

    Se non hai altro da aggiungere o codice da mostrare, quello che ho provato funziona ...
  • Re: [C] funzione di ordinamento con puntatori

    Mah non so cosa dire ... dev-c++ si sta rivelando sempre più buggato
  • Re: [C] funzione di ordinamento con puntatori

    Ma sei sicuro che ti funziona?
  • Re: [C] funzione di ordinamento con puntatori

    Sì ma ripeto ... la funzione che hai mostrato è

    ordina

    ma tu chiami la

    order

    Io ho modificato la chiamata per usare la ordina ma tu potresti usarne una sbagliata ...
  • Re: [C] funzione di ordinamento con puntatori

    No no non sono ancora cosi scemo
  • Re: [C] funzione di ordinamento con puntatori

    Allora ci hai voluto mettere alla prova ...

    Comunque, a parte order/ordina, mi sembra che funzioni ... fammi un esempio di dati in input e dati in output che ottieni e che ritieni sbagliati.
  • Re: [C] funzione di ordinamento con puntatori

    Dev c++ è una ciofeca buggata e vecchia non piu aggiornata!
    Se proprio si vuole rimanere in ambito opensource con compilatore MingW si può usare Code::Blocks buon ide molto semplice per i novizi...
  • Re: [C] funzione di ordinamento con puntatori

    #include <stdio.h>
    #include <stdlib.h>
    
    //prototipo generaione numeri random
    
    void rnd_fill(int *numeri, int n, int n_min, int n_max);
    
    //prototipo stampa
    
    void stampa(int v[], int n);
    
    //prototipo max
    
    int max(int v[], int n);
    
    //prototipo min
    
    int min(int v[], int n);
    
    //prototipo find
    
    int find(int v[], int num, int n);
    
    //prototipo swap
    
    void swap(int *a, int *b);
    
    //prototipo ordinamento
    
    void ordina(int *d, int n, char mode);
    
    int main(int argc, char *argv[])
    {
        int numeri[20];
        int i,n,pos,n_min,n_max;
        printf("Genero numeri casuali da ");
        scanf("%d",&n_min);
        printf("a ");
        scanf("%d",&n_max);
        
        //genero numeri casuali
        
        rnd_fill(numeri, 20, n_min, n_max);
        
        stampa(numeri, 20);
        printf("\n");
        system("PAUSE");
        
        //calcolo del valore MAX. e MIN.
        
        printf("Il valore massimo trovato vale: %d. Il valore minimo vale: %d.\n",max(numeri, 20),min(numeri, 20));
        printf("\n");
        system("PAUSE");
        
        //ricerca valore inserito da utente
        int val;
        printf("Inserisci valore da cercare: \n");
        scanf("%d",&val);
        
        pos = find(numeri, val, 20);
        //stampa a video della posizione del valore se è presente
        if(pos==-1)
        {
                   printf("Numero non presente!\n");
        }
        else 
        {
                   printf("Valore presente alla posizione [%d].\n",pos);
        }
        printf("\n");
        
        //ordinamento valori
        char mode;
        printf("Premi '+' per ordinare in modo crescente o '-' per decrescente.\n");
        fflush(stdin);
        getch(mode);
        ordina(numeri, 20, mode);
        
        //stampa dell'array ordinato
        stampa(numeri, 20);
      
      system("PAUSE");	
      return 0;
    }
    
    void stampa(int v[], int n)
    {
            int i;
            for(i=0;i<n;i++)
            {
                            printf("%d ",v[i]);
                            sleep(500);
            }
    }
    
    int max(int v[], int n)
    {
            int i, max = 0;
            for(i=0;i<n;i++)
            {
                            if(v[i] > max)
                            {
                                    max = v[i];
                            }
            }
            return max;
    }
            
    int min(int v[], int n)
    {
            int i, min = n;
            for(i=0;i<n;i++)
            {
                            if(v[i] < min)
                            {
                                    min = v[i];
                            }
            }
            return min;
    }
    
    int find(int v[], int num, int n)
    {
            int i, found = -1;
            for(i=0;i<n;i++)
            {
                            if(v[i] == num)
                            {
                                    found = i+1;
                                    break;
                            }
            }
            return found;
    }
    
    void rnd_fill(int *numeri, int n, int n_min, int n_max)
    {
            srand(time(NULL));
            int i,num;
            
            for(i=0;i<n;i++)
            {
                      do
                      {
                                 num = rand();
                                 if((num>n_min)&&(num<=n_max))
                                 {
                                               break;
                                 }        
                      }
                      while(1);
                      numeri[i] = num;
            }   
    }   
    
    void swap(int *a, int *b)
    {
            int t;
            t = *a;
            *a = *b;
            *b = t;
    }
    
    void ordina(int *d, int n, char mode)
    {
            int flag,i;
            
            if(mode=='+')
            {
                    do
                    {
                               flag=0;
                               for(i=0;i<n-1;i++)
                               {
                                         if(d[i] > d[i+1])
                                         {
                                                    swap(&d[i], &d[i+1]);
                                                    flag=1;
                                         }
                               }
                    }
                    while(flag==1);
                    printf("Array ordinato in ordine crescente\n");
            }
            else if(mode=='-')
            {
                    do
                    {
                               flag=0;
                               for(i=0;i<n;i++)
                               {
                                         if(d[i] < d[i+1])
                                         {
                                                    swap(&d[i], &d[i+1]);
                                                    flag=1;
                                         }
                               }
                    }
                    while(flag==1);
                    printf("Array ordinato in ordine decrescente\n");
            }
    }
            
    
    
  • Re: [C] funzione di ordinamento con puntatori

    ^
    | Codice con relativa console V

    forum.png
    forum.png

  • Re: [C] funzione di ordinamento con puntatori

    Ma dove l'hai compilato ? Su linux ? Ci sono degli errori in compilazione ...

    la funzione getch, la time e la sleep ...

    In ogni caso, io ottengo

    Genero numeri casuali da 0
    a 90
    45 59 42 87 47 51 65 26 58 86 22 63 14 10 52 30 74 5 63 47
    Premere un tasto per continuare . . .
    Il valore massimo trovato vale: 87. Il valore minimo vale: 5.

    Premere un tasto per continuare . . .
    Inserisci valore da cercare:
    22
    Valore presente alla posizione [11].

    Premi '+' per ordinare in modo crescente o '-' per decrescente.
    Array ordinato in ordine crescente
    5 10 14 22 26 30 42 45 47 47 51 52 58 59 63 63 65 74 86 87 Premere un tasto per
    continuare . . .
  • Re: [C] funzione di ordinamento con puntatori

    Il codice l'ho copiato dal progetto e non da errori di compilazione... e a te funziona quindi non so cosa dire ...
  • Re: [C] funzione di ordinamento con puntatori

    Ma con cosa compili? E su quale sistema operativo?
Devi accedere o registrarti per scrivere nel forum
22 risposte