Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    68

    [C] Ordinare dei numeri in ordine crescente

    Salve, sono nuovo di questo forum.

    Ho iniziato a fare programmazione da un mese e mezzo all'università, e ora mi trovo davanti a un esercizio che sicuramente fra qualche mese riterrò una ca**ata, ma che in questo momento mi sta dando parecchi grattacapi.

    Si tratta di ordinare in ordine crescente 10 numeri memorizzati in un array. Io ho scritto il codice così, qualcuno può aiutarmi a capire dov'è l'errore?

    #include <stdio.h>
    #include <stdlib.h>

    #define MAX 10

    int main()
    {
    int n[MAX];
    int i, temp;

    for(i = 1; i <= MAX; i++)
    {
    printf("Inserisci il valore %d: ",i);
    scanf("%d", &n[i]);
    }

    if(n[i]>n[i+1])
    {
    temp = n[i];
    n[i] = n[i+1];
    n[i+1] = temp;
    }

    printf("\n\nL'ordine crescente dei numeri e\':\n");

    for (i = 0; i < MAX; i++)
    {
    printf("%d",n[i]);
    }

    system("pause");

    return 0;
    }
    Grazie mille per eventuali risposte

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Benvenuto ... per ottenere il massimo dal forum, quando proponi i problemi, non dire

    "dov'e' l'errore"

    ma indica, con precisione

    1) se hai un errore di compilazione (e se e' cosi', quale e in quale riga)

    2) se hai un errore di runtime (vedi punto 1)

    3) se e' il comportamento del programma che non e' quello che ti aspetti (allora indica quali dati inserisci, cosa ottieni in output e cosa invece dovresti avere ...)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    68
    Sì, hai ragione, perdonami.

    Allora, la compilazione va tutto ok. Quando testo il programma, io inserisco i 10 numeri (a 2 o 3 cifre, casualmente). Quando mi deve stampare i numeri in ordine crescente, mi compare un unico numero (del tipo: -174323439223, sono numeri digitati a caso per farvi capire cosa mi compare).

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ok ... cominciamo con l'input dei dati ...

    Questa riga

    for(i = 1; i <= MAX; i++)

    non mi sembra corretta ... sai perche'?

    (confrontala con la for successiva ...)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    prova a studiarti questo semplice codice
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAX 10
    
    int main()
    {
    
    	int n[] = {3, 5, 7, 8, 1, 2, 6, 4, 9, 0};
    	int i, j, temp;
    
    	for ( i = 0; i < MAX; ++i )
    		for ( j = i; j < MAX; j++ ) {
    			if ( n[j] < n[i] ) {
    				/* swap data */
    				temp = n[i]; 
    				n[i] = n[j]; 
    				n[j] = temp;
    			} 
    		}
    	
    	printf("\n\nL'ordine crescente dei numeri e':\n");
    
    	for (i = 0; i < MAX; i++) {
    		printf("%d\n", n[i]);
    	} 
    
    
    return 0;
    }
    ciao
    sergio

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    68
    Originariamente inviato da oregon
    Ok ... cominciamo con l'input dei dati ...

    Questa riga

    for(i = 1; i <= MAX; i++)

    non mi sembra corretta ... sai perche'?

    (confrontala con la for successiva ...)
    Capito: l'altra riga ha inizializzazione e limite diverso. Comunque pensavo di inizializzarla a 1, perchè altrimenti compare "Inserisci il valore 0", che non ha molto senso. Ho provato comunque a rendere i 2 for identici, ma non è cambiato niente. Il problema pensavo fosse nell'istruzione if.

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da Andres7X
    Capito: l'altra riga ha inizializzazione e limite diverso.
    Esatto

    Comunque pensavo di inizializzarla a 1, perchè altrimenti compare "Inserisci il valore 0", che non ha molto senso.
    L'output a video lo puoi modificare con

    printf("Inserisci il valore %d: ", i+1);

    ma l'indice nel vettore che usi in

    scanf("%d", &n[i]);

    deve essere compreso tra 0 e MAX-1, altrimenti hai un errore di accesso alla memoria oppure "sporchi" lo stack. E questo e' grave.

    Ho provato comunque a rendere i 2 for identici
    E' quello che devi fare, cambiando la printf come ti ho detto ...

    ma non è cambiato niente.
    Infatti ti ho scritto "cominciamo" con l'input dei dati ... esistono altri problemi ... non risolvi solamente con quella for ...

    In realta' quella if e' una "parte" della soluzione (per confrontare due elementi del vettore) ma manca un ciclo che esegua la if per tutti gli elementi del vettore ... Quindi

    codice:
    for(i = 0; i <= MAX-1; i++)
      if(n[i]>n[i+1])
      { 
        temp = n[i]; 
        n[i] = n[i+1]; 
        n[i+1] = temp;
      }
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    68
    Ora ho risolto in parte il problema. I numeri me li stampa, solo che anzichè essere ordinati in maniera crescente, sono ordinati nell'ordine in cui l'utente li inserisce :/

    Ho fatto tutto come mi hai detto tu, almeno penso... Ti reincollo il codice se vuoi darci un'occhiata.

    PS. Dimenticavo: grazie per l'aiuto che mi stai dando, e perdonami se ti faccio perdere tempo a causa della mia ignoranza >_>

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAX 10
    
    int main()
    {
        int n[MAX];
        int i, temp;
    
        for(i = 0; i < MAX; i++)
        {
           printf("Inserisci il valore %d: ",i+1);
           scanf("%d", &n[i]);
        }
        
        for(i = 0; i < MAX; i++)
           if(n[i] > n[i+1])
           { 
              temp = n[i]; 
              n[i] = n[i+1]; 
              n[i+1] = temp;
           }
        
        for(i = 0; i < MAX; i++)
        {
         printf("\n%d\n",n[i]);
        }    
    
        system("pause");
        
        return 0;
    }

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Certo ... il ciclo centrale deve essere ripetuto finche' il vettore non e' ordinato ...

    codice:
    int srt=1;
    while(srt)
    {
      srt=0;
      for(i = 0; i < MAX-1; i++)
        if(n[i] > n[i+1])
        { 
          temp = n[i]; 
          n[i] = n[i+1]; 
          n[i+1] = temp;
          srt=1;
        }
    }
    Fai attenzione al for ... e' <MAX-1 non <MAX
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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.