Discussione chiusa
Visualizzazione dei risultati da 1 a 4 su 4

[C] ordinamento array numerico

  1. #1
    ellosma non è in linea Novello
    
    #include <stdio.h>
    #include <stdlib.h>
    
    
    
    void bubbleSort(int *v, int size){
      
       int i;
       int tmp;
       while(size>0)
       {
          for(i=0;i<size-1;i++)
          {
             if(v[i]>v[i+1])
             {
                tmp=v[i];
                v[i]=v[i+1];
                v[i+1]=tmp;
             }    
          }
          size--;
       }     
       printf("Dopo: ");
       for(i=0;i<size;i++)
       {
          printf("%d ",v[i]);
       }
       printf("\n");
       return 0;
    }
    
    
    
    
    int main()  {
          int *v=NULL ; 
          int i, val; 
          int zero=0;
          int size = 0; 
    
    do  {
                printf ( "Inserire un nuovo elemento nell'array :");
    
    
    scanf ("%d", &val);
                v = (int*) realloc( v, (++size)*(sizeof(int)) );
                v[size-1] = val; 
          } while (val != -1); 
    
    
    printf( "Elementi nell'array:"); 
    
          for ( i=0; i < size; i++ )
                printf ("%d ", v[i]);
    
    bubbleSort( v , size );
    
    free(v);
    return 0; }
    

    In questo codice ho cercato di fare una funzione che mi permettesse di stampare da input una stringa dinamica e Che , successivamente la ordinasse. Il problema e' che mi viene chiesta e stampata a video la stringa numerica ma poi , al momento di. Stamparla convertita, non mi viene nulla.. Qualcuno potrebbe aiutarmi ? Grazie

  2. #2
    Stamparla "convertita" ? Ma convertita in cosa ? Veramente stai ordinando, non convertendo ...
    ℹ️ Leggi di più su AntonioG ...

  3. #3
    Il motivo è decisamente ovvio. Al termine del primo loop nella funzione bubbleSort, il valore della variabile size è sicuramente zero. Questo fa scattare immediatamente la condizione di terminazione del successivo for(), che viene così eseguito zero volte.


    PS: spero che tu abbia un motivo veramente valido (= imposizione didattica da parte di un docente) per usare in quel modo barbaro la realloc(). Non c'è ragionevole motivazione di engineering o di usability che possa giustificare una tale realizzazione del loop di immissione dati. L'utente deve specificare a priori quanti dati immetterà, non può e non deve essere lasciato libero affidarsi ad un capriccio o istinto estemporaneo di terminare arbitrariamente l'immissione digitando un valore convenzionale (-1, nel caso specifico).
    Un tale approccio non semplifica in alcun modo il controllo formale, e a conti fatti non risulta maggiormente robusto di una for() su un valore preimmesso riguardo a eventuali overflow. La realloc() è una funzione potenzialmente molto inefficiente, da usare solo in caso di estrema necessità, a ragion veduta e mai entro un loop.

    Un esempio assolutamente classico per l'allocazione dinamica e contestuale immissione dati di un array è il seguente (che indica anche la Via Regia per descrivere array allocati dinamicamente tramite una apposita struct):
    
    #define LOWER_LIMIT 0
    #define UPPER_LIMIT  65535
    
    typedef struct {
        int* Data;
        int  dsize;
    } VLA_t;
    
    typedef enum {FALSE, TRUE} Boole_t;
    
    int *AllocArray(VLA_t *Array)
    {
        int dim, i;
        Boole_t done = FALSE;
    
        while (!done)
        {
            printf("  Inserisci la dimensione: ");
            scanf("%d", &dim);
            if ((dim < LOWER_LIMIT) || (dim > UPPER_LIMIT))
            {
                printf("\n## ERRORE: valore non ammesso."
                        " Deve essere compreso tra %d e %d\n\n",
                        LOWER_LIMIT, UPPER_LIMIT);
            }
            else
            {
                done = TRUE;
            }
        }
    
        Array->dsize = dim;
    
        printf("  Dovrai ora inserire %d numeri:\n", dim);
        Array->Data = (int *)malloc(dim * sizeof(int));
        if (NULL == Array->Data)
        {
            return (NULL);
        }
    
        for (i = 0 ; i < dim ; ++i)
        {
            int num;
            printf("  Array[%d] = ", i);
            scanf("%d", &num);
            Array->Data[ i ] = num;
        }
    
        return(Array->Data);
    }
    
    Ultima modifica di M.A.W. 1968; 13-02-2013 23:02  Motivo: Aggiunto codice esemplificativo
    ℹ️ Leggi di più su M.A.W. 1968 ...

  4. #4
    Beh, visto che ne discuti anche oggi in

    [C] conteggio dello zero in un array dinamico &bull; Forum Ubuntu-it

    e che hai avuto 3 richiami per crossposting, si vede che non hai bisogno di noi.

    Chiudo questo thread e provvedo per un tuo ban temporaneo.
    ℹ️ Leggi di più su AntonioG ...

Discussione chiusa

Potrebbero interessarti anche ...

  1. ordinamento numerico sbagliato
    Da Valter015 nel forum Microsoft Excel
    Risposte: 5
    Ultimo Post: 11-08-2020, 09:08
  2. [VBA] Modulo per ordinamento Array
    Da dragone bianco nel forum Progetti e idee
    Risposte: 1
    Ultimo Post: 08-09-2013, 15:45
  3. ordinamento array
    Da giagianca nel forum Microsoft Excel
    Risposte: 6
    Ultimo Post: 04-06-2013, 16:18
  4. Ordinamento array di strutture
    Da terry86 nel forum C/C++
    Risposte: 14
    Ultimo Post: 24-02-2010, 14:21
  5. ordinamento array
    Da papy2 nel forum Visual Basic 6
    Risposte: 7
    Ultimo Post: 10-11-2008, 10:27