Oppure

Loading
07/02/13 20:17
grasszilla
buona sera a tutti ragazzi.
frequento il terzo anno di un istituto tecnico e ho quest'anno iniziato a studiare questo linguaggio.
il professore di informatica ha assegnato un problema sulla conversione di un numero decimale in un altra base di numerazione.
io sono riuscito a svolgere un algoritmo ma presenta ancora qualche problema.
#include <iostream>
#include <stdio.h>
#include <conio.h>
int main()
{
	int n, a, risul=0, p=1, resto, base;
	do
	{
		printf("inserisci un numero in base 10 intero positivo :");
		scanf("%d", &n);
	}while (n<=0 || n%1!=0);
	do
	{
		printf("inserisci una base di numerazione compresa tra 2 e 16 :");
		scanf("%d", &base);
	}while (n<=0 || n%1!=0);
	a=n;
	do
	{	
		resto=a%base;
		a=(int) a/base;
		risul=(risul+(resto*p));
		p=p*10;
	}while (a>(base-1));
	if (a!=0) risul=(risul+(a*p));
	printf("\nil valore convertito in base %d equivale a %d ", base,risul);
	getch();
	return 0;
}

il primo è che non converte in base due numeri superiori a 1023 (giustamente perchè l'ho dichiarato come intero... ma per ora non mi importa, l'importante è che funzioni l'algoritmo).
il secondo è che non so come mostrare le cifre della base 16 superiori a 9 come lettere.
voi che modifiche apportereste al codice?
grazie in anticipo per l'aiuto
Ultima modifica effettuata da grasszilla 07/02/13 20:27
aaa
07/02/13 20:41
Poggi Marco
Ciao!

Una soluzione possibile, è quella di salvare il risultato su una stringa.
Ultima modifica effettuata da Poggi Marco 07/02/13 22:55
aaa
09/02/13 10:25
tuttodiMC
Già se dichiari come intero il numero convertito non potrai mai mettere a,b,c,d,e,f. Ma il prof ha proprio chiesto la base esadecimale? E poi come faresti con le altre basi?
Ultima modifica effettuata da tuttodiMC 09/02/13 10:29
aaa
10/02/13 12:57
grasszilla
il prof ha chiesto di convertire un numero decimale nelle basi di numerazione che abbiamo studiato fino ad ora (da 2 a 16) utilizzando la tecnica delle divisioni successive).
per ora per quanto riguarda la gestione dei caratteri abbiamo studiato solo char, e abbiamo introdotto i vettori, ma solo a livello teorico.
aaa
11/02/13 15:04
tuttodiMC
Allora io l'ho creato perciò:

funzione nome(n)
dichiara vettore
mentre n > 0 fai
resto = n % 16
se n < 10 allora
inserisci in vettore resto
se invece (elseif) n == 10 allora
inserisci in vettore "A"
se invece n == 11 allora
inserisci in vettore "B"
...
...
...
...
fine se
n = arrotondamento-per-difetto-di(n / 16)
fine while 
per i = numero-massimo-elementi-tabella, 1 , -1 (step) fai
scrivi(t[i])
fine per
fine funzione


Questo è un pseudocodifica. Il prossimo l'ho fatto in Lua:

function dec2hex(n)
    local t = {}
    while n > 0 do
        resto = n % 16
		if resto < 10 then
			table.insert(t, resto)
		elseif resto == 10 then
		    table.insert(t, "A")
		elseif resto == 11 then
		    table.insert(t, "B")
		elseif resto == 12 then
		    table.insert(t, "C")
		elseif resto == 13 then
		    table.insert(t, "D")
		elseif resto == 14 then
		    table.insert(t, "E")
		elseif resto == 15 then
		    table.insert(t, "F")
		end
		n = math.floor(n / 16)
	end
	for i = #t, 1, -1 do
	    io.write(t[i])
	end
end
io.write("Scrivi il numero da convertire:")
numero = io.stdin:read'*number'
dec2hex(numero)


Spero di averti aiutato. Usa questo genere di algorimo per tutte le basi sopra la 10. A me funziona alla perfezione.

aaa
11/02/13 17:43
Poggi Marco
Il c non è un linguaggio orientato agli oggetti, di conseguenza bisogna ragionare a basso livello.

Una soluzione potrebbe essere:
#include <stdio.h>
#include <string.h>

int main(void)
{
  printf("Trasformatore di basi\n\n");
  int n=0,base=0,pos,i;
  char numero[30]="";
  const char alfanumeri[]="0123456789ABCDEF"; // definisco una stringa costante
                                                                       // che rappresenta le cifre
  printf("Numero ");
  scanf("%d", &n);
  while (getchar() != '\n') ;
  printf("Base ");
  scanf("%d", &base);
  while (getchar() != '\n') ;
  i=0;
  pos=0;
  while (n>0)
  {
	 pos=n % base;
	 numero[i++]=alfanumeri[pos];
	 n=(int) (n/base);
  }
  numero[i]='Il c non è un linguaggio orientato agli oggetti, di conseguenza bisogna ragionare a basso livello.


Una soluzione potrebbe essere:
#include <stdio.h>
#include <string.h>

int main(void)
{
  printf("Trasformatore di basi\n\n");
  int n=0,base=0,pos,i;
  char numero[30]="";
  const char alfanumeri[]="0123456789ABCDEF"; // definisco una stringa costante
                                                                       // che rappresenta le cifre
  printf("Numero ");
  scanf("%d", &n);
  while (getchar() != '\n') ;
  printf("Base ");
  scanf("%d", &base);
  while (getchar() != '\n') ;
  i=0;
  pos=0;
  while (n>0)
  {
	 pos=n % base;
	 numero[i++]=alfanumeri[pos];
	 n=(int) (n/base);
  }
  numero[i]='{parsed_message}'; // agguingo il carattere terminatore
  printf("--------------------------\nNumero: ");
  i=strlen(numero); // calcolo la lunghezza della stringa
  while (i>0)
  {
	  printf("%c", numero[--i]); // stampo la stringa in ordine inverso
  }
  printf("\n\nFine... ");
  while (getchar() != '\n') ;
  return 0;
}
'; // agguingo il carattere terminatore printf("--------------------------\nNumero: "); i=strlen(numero); // calcolo la lunghezza della stringa while (i>0) { printf("%c", numero[--i]); // stampo la stringa in ordine inverso } printf("\n\nFine... "); while (getchar() != '\n') ; return 0; }
aaa
12/02/13 20:27
tuttodiMC
Ahia ma perché non fate il C++ allora?
aaa
12/02/13 20:57
Poggi Marco
Postato originariamente da tuttodiMC:

Ahia ma perché non fate il C++ allora?
:-?
Non capisco la domanda. Per assurdo, perché non utilizzare la finzione itoa ?
aaa