Riordinamento di un array

di il
10 risposte

Riordinamento di un array

Sto scrivendo un convertitore da decimale a binario in C, questo è il codice:

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

int main()
{
		//Numero decimale
		int numDec;
		
		//Contatori
		int i, n;
		
		//Array che contiene i resti delle divisioni (numDec / 2)
		int resti[] = {};
		system("CLS");
		
		printf("\nCONVERTITORE BINARIO DECIMALE\n\n");
		
		printf("\nInserisci un numero decimale:   ");
		scanf("%d", &numDec);
		
		if (numDec < 0)
		{
			
			printf("\nIl numero da te inserito e' negativo, prenderemo il valore assoluto del numero decimale\ne lo convertiremo in binario.\n");
			numDec = -numDec;
			
		}
		
		/*
		if (numero e' con la virgola)
		{
		}
		Il problema non si pone perche' se inserisco un numero con la virgola in un int il complilatore lo arrotonda all'intero piu vicino
		
		*/
		
		//Conversione
		for( i = 0; i < 4000; i++)
		{
				//Quando si arriva all'ultima divisione ovvero (numDec / 2) = 0
				if (numDec == 0)
				{
					break;	
				}
				
				resti[i] = numDec % 2;
				numDec = numDec / 2;
			
		}
		
		//DEBUG: verificare se dopo il ciclo for il valore della variabile i e' cambiato
		printf("\n%d\n", i);
		printf("%d\n", numDec);
		
		//Stampa e riordinamento del numero binario
		
		system("PAUSE");
Mi sono bloccato perchè ad un certo punto ho bisogno di riordinare i resti contenuti nell'array in modo contrario rispetto al modo in cui li ho inseriti (se non avete ben chiaro andate qua: http://www.lezionidimatematica.net/Binario/lezioni/bin_lezione_03.htm ). Il problema è che l'array che ho creato ha una lunghezza indefinita, perchè effettivamente il numero di cicli che verranno conseguiti e il conseguente numero di resti cresce con il crescere di "numDec". Ho pensato che se conosco quante volte il ciclo for è stato eseguito, quindi il valore della variabile "i", allora posso scrivere il secondo for per stampare i resti al contrario. Tuttavia in un printf di debug, ho notato che stampando la variabile "i" dopo il for, ottengo "1". Perchè?

10 Risposte

  • Re: Riordinamento di un array

    E' sbagliatissimo in C non assegnare una dimensione al vettore. Puoi farlo solo con l'allocazione dinamica usando i puntatori (calcolando prima quanti posti ti servono e poi allocando memoria). Quindi se vuoi farlo così devi assegnare per forza una dimensione massima al vettore resti.

    Controlla bene che i ti da il valore corretto (o meglio errato perchè è uguale al numero di cicli più uno ma sottraendo questo valore ti trovi fino a dove hai riempito resti) quindi ti basta un ciclo for al contrario partendo da i e arrivando a 0 per mettere a video il numero binario corretto.

    Ti consiglio però di usare una variabile temporanea quando esegui il resto e la divisione al numero per non perdere il tuo valore originario.
    Inoltre puoi riscrivere il ciclo for che usi per calcolare il tuo valore binario in un altro modo usando il while o il do-while per evitare di usare il break che non è molto consigliato. In più se inserisci il valore 0 non ti calcola niente (vabbè questa è una piccolezza )

    Spero di essere stato abbastanza chiaro.
  • Re: Riordinamento di un array

    Controlla bene che i ti da il valore corretto (o meglio errato perchè è uguale al numero di cicli più uno ma sottraendo questo valore ti trovi fino a dove hai riempito resti) quindi ti basta un ciclo for al contrario partendo da i e arrivando a 0 per mettere a video il numero binario corretto.
    Quello che non riesco a spiegarmi è che nella funzione di Debug, dove stampo il valore di "i" dopo il ciclo for, ottengo 1. Com'è possibile?
  • Re: Riordinamento di un array

    Io se lancio il tuo programma e provo a convertire il numero la variabile i non è sempre uno ma dipende dal numero decimale...controlla bene.
  • Re: Riordinamento di un array

    Io continuo ad avere lo stesso problema. Indipendentemente dal numero decimale inserito la variabile "i" rimane uguale ad 1. Posto la foto del programma come allegato:

    programma.PNG
    programma.PNG

  • Re: Riordinamento di un array

    Il codice è sempre quello originale o lo hai modificato?
  • Re: Riordinamento di un array

    Il codice è quello originale.
  • Re: Riordinamento di un array

    E rutti i consigli che hai avuto? Fra l'altro il programma non può essere compilato se il vettore non ha dimensioni...
  • Re: Riordinamento di un array

    Cavolo, era proprio quello che faceva impazzire il programma. Non l'ho modificato perchè prima di farlo volevo capire bene il perchè di quella variabile "i" con un valore insolito. Per adesso ho dato all'array un valore massimo di 50 elementi, in seguito mi andrò a studiare bene l'allocazione dinamica della memoria e ricorrerò a quella. Grazie mille a tutti quelli che mi hanno aiutato!
  • Re: Riordinamento di un array

    Direi che per un valore a 32 bit bastano 32 elementi ...
  • Re: Riordinamento di un array

    Menomale che te l'ho scritto proprio all'inizio!
Devi accedere o registrarti per scrivere nel forum
10 risposte