einstein Posted April 5, 2012 at 01:56 PM Report #447743 Posted April 5, 2012 at 01:56 PM Como posso criar um procedimento que receba como argumentos um numero e o numero máximo de caracteres para apresentar no ecra. E converta este numeor em binario apresentado-o com aquele numero de caracteres?
pmg Posted April 5, 2012 at 02:01 PM Report #447746 Posted April 5, 2012 at 02:01 PM Coisas a ter em conta: 1) se o número não couber nos caracteres especificados 2) numero negativo? 3) numero com virgula, por exemplo PI 4) o procedimento devolve alguma coisa? 5) a apresentacao é alinhada à esquerda, à direita ... com espaços, com zeros? What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
einstein Posted April 5, 2012 at 02:08 PM Author Report #447751 Posted April 5, 2012 at 02:08 PM Coisas a ter em conta: 1) se o número não couber nos caracteres especificados 2) numero negativo? 3) numero com virgula, por exemplo PI 4) o procedimento devolve alguma coisa? 5) a apresentacao é alinhada à esquerda, à direita ... com espaços, com zeros? Para simplificar o numero é inteiro,em relação ao numero caber ou nao isso tem de depender de o valor de digitos maximo introduzido pelo utilizador. O procedimento nao devolve nada apenas escreve no ecra o numero em binario com o numero de bits definido pelo utilizador. A apresentação pode ser alinha a esquerda.
pmg Posted April 5, 2012 at 02:18 PM Report #447763 Posted April 5, 2012 at 02:18 PM Imagina que já tens o procedimento feito e eu o chamava assim: imprimirbinarionoecra(-42, 5); // apresenta 42 negativo em 5 bits O que é que querias que aparecesse no ecra? Se afinal não pode ser negativo ... imagina isto imprimirbinarionoecra(42, 5); // apresenta 42 em 5 bits Podes aproveitar a minha sugestão acima e chamar ao teu procedimento o mesmo que eu chamei ao meu. What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
einstein Posted April 5, 2012 at 02:22 PM Author Report #447767 Posted April 5, 2012 at 02:22 PM Imagina que já tens o procedimento feito e eu o chamava assim: imprimirbinarionoecra(-42, 5); // apresenta 42 negativo em 5 bits O que é que querias que aparecesse no ecra? Se afinal não pode ser negativo ... imagina isto imprimirbinarionoecra(42, 5); // apresenta 42 em 5 bits Podes aproveitar a minha sugestão acima e chamar ao teu procedimento o mesmo que eu chamei ao meu. tem que aparecer no ecra os ultimos 5 bits menos significativos.
HappyHippyHippo Posted April 5, 2012 at 03:19 PM Report #447788 Posted April 5, 2012 at 03:19 PM algo deste género ?? void present_bits(int value, int n_bits) { int mask, iter; for(iter = 0, mask = 1; iter < sizeof(int) && iter < n_bits; iter++, mask << 1) printf("%d", (value & mask) != 0); printf("\n"); } PS : agora vi que estou a apresentar do menos significativo para o mais significativo .... deverás alterar a ordem de apresentação IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
einstein Posted April 20, 2012 at 08:15 PM Author Report #450286 Posted April 20, 2012 at 08:15 PM Ainda nao consegui perceber como se faz este programa o código que fiz foi o seguinte #include<stdio.h> #include<stdlib.h> void converte(unsigned int num, int n_bits) { int mascara=0; int and=0; int aux=0; mascara= 1 << (n_bits-1); while(n_bits>0){ and= num & mascara; if (and==0){ printf("0"); }else{ printf("1"); } aux=num<<1; n_bits--; } } int main() { int numero=0; int n_bits=0; printf("Introduza o numero a converter e o numero de bits que quer\n"); scanf("%d %d", &numero, &n_bits); converte(numero,n_bits); exit(0); } So que a função nao esta a converter os numeros correctamente
bsccara Posted April 20, 2012 at 08:29 PM Report #450289 Posted April 20, 2012 at 08:29 PM 1. Convém meteres um teste no início da função 'converte' para sair logo no caso de n_bits == 0. Já agora faz esse parâmetro 'unsigned'. 2. A variável 'aux', com o seu código associado, não serve para nada. 3. O código que inicializa a variável 'and' pode ser metido dentro do 'if' onde ela é testada, tornando essa variável também inútil. 4. Faz um 'right shift' (>>) da máscara no final do ciclo. Em vez de 'aux = num << 1;' faz 'mascara >>= 1;'.
einstein Posted April 20, 2012 at 08:54 PM Author Report #450295 Posted April 20, 2012 at 08:54 PM 1. Convém meteres um teste no início da função 'converte' para sair logo no caso de n_bits == 0. Já agora faz esse parâmetro 'unsigned'. 2. A variável 'aux', com o seu código associado, não serve para nada. 3. O código que inicializa a variável 'and' pode ser metido dentro do 'if' onde ela é testada, tornando essa variável também inútil. 4. Faz um 'right shift' (>>) da máscara no final do ciclo. Em vez de 'aux = num << 1;' faz 'mascara >>= 1;'. Muito obrigado. O programa já funciona 🙂 . . . Para poder ser com numeros com sinal como poderei fazer?
HappyHippyHippo Posted April 20, 2012 at 09:03 PM Report #450299 Posted April 20, 2012 at 09:03 PM depende do tipo de codificação do número negativo ... no entanto bastará apresentar um '1' ao início se for negativo ou '0' caso contrário IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
einstein Posted April 20, 2012 at 09:38 PM Author Report #450314 Posted April 20, 2012 at 09:38 PM depende do tipo de codificação do número negativo ... no entanto bastará apresentar um '1' ao início se for negativo ou '0' caso contrário -Quero apresentar em complemento para 2. Eu aqui quando introduzo numeros negativos ele apresenta-me em complemento para 2 pqe?
bsccara Posted April 20, 2012 at 10:07 PM Report #450327 Posted April 20, 2012 at 10:07 PM Se queres apresentar em complemento para 2 não precisas de fazer nada; os inteiros negativos já são representados internalmente assim. Muda só o parâmetro 'num' para 'int'.
einstein Posted April 20, 2012 at 10:08 PM Author Report #450328 Posted April 20, 2012 at 10:08 PM Se queres apresentar em complemento para 2 não precisas de fazer nada; os inteiros negativos já são representados internalmente assim. Muda só o parâmetro 'num' para 'int'. ok. Para converter para BCD como posso fazer? Separar os numeros em decimal e converter para binario? Se sim como posso separar os numeros em decimla?
bsccara Posted April 20, 2012 at 10:38 PM Report #450333 Posted April 20, 2012 at 10:38 PM O mais simples mas menos eficiente seria usar o 'sprintf' para converter o número para uma string e depois converter, caracter a caracter, para BCD. O mais eficiente, em processadores x86, seria usar instruções do FPU para fazer a conversão : FILD valor_inteiro FBSTP valor_BCD em que 'valor_inteiro' é uma posição de memória onde estaria guardado o valor a converter e 'valor_BCD' é outra posição que iria receber uma sequência BCD de 18 digitos, com sinal no bit mais significativo e 10 bytes no total. Mas isto já não tem nada a ver com C.
einstein Posted April 20, 2012 at 11:49 PM Author Report #450352 Posted April 20, 2012 at 11:49 PM O mais simples mas menos eficiente seria usar o 'sprintf' para converter o número para uma string e depois converter, caracter a caracter, para BCD. O mais eficiente, em processadores x86, seria usar instruções do FPU para fazer a conversão : FILD valor_inteiro FBSTP valor_BCD em que 'valor_inteiro' é uma posição de memória onde estaria guardado o valor a converter e 'valor_BCD' é outra posição que iria receber uma sequência BCD de 18 digitos, com sinal no bit mais significativo e 10 bytes no total. Mas isto já não tem nada a ver com C. O sprintf nao e para escrever numa string?
HappyHippyHippo Posted April 21, 2012 at 02:12 AM Report #450358 Posted April 21, 2012 at 02:12 AM outra solução seria : void printBinary(int number, int bits) { ... } void printPacketBCD(int number) { int digit; while(i != 0) { digit = i % 10; i /= 10; printBinary(digit, 4); } } http://en.wikipedia.org/wiki/Binary-coded_decimal IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
pmg Posted April 21, 2012 at 09:39 AM Report #450366 Posted April 21, 2012 at 09:39 AM O sprintf nao e para escrever numa string? Sim. Usas o sprintf para converter um valor numa string char texto[100]; int valor = 8042; sprintf(texto, "%d", valor); /* texto tem "8072" */ Depois convertes para BCD unsigned char bcd[100]; unsigned char *pb = bcd; char *pt = texto; while (*texto) { *pb = *pt - '0'; pb++; pt++; } What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
einstein Posted April 21, 2012 at 11:58 AM Author Report #450375 Posted April 21, 2012 at 11:58 AM outra solução seria : void printBinary(int number, int bits) { ... } void printPacketBCD(int number) { int digit; while(i != 0) { digit = i % 10; i /= 10; printBinary(digit, 4); } } http://en.wikipedia.org/wiki/Binary-coded_decimal Na tua funçao de "printPacketBCD" nao estas a usar o argumento number . O digit nao devia ser igual ao number/10? e o i? O que é que aquela expressão faz? Porque usas unsigned char? O que "char *pt=texto" , o que faz o *? Sim. Usas o sprintf para converter um valor numa string char texto[100]; int valor = 8042; sprintf(texto, "%d", valor); /* texto tem "8072" */ Depois convertes para BCD unsigned char bcd[100]; unsigned char *pb = bcd; char *pt = texto; while (*texto) { *pb = *pt - '0'; pb++; pt++; }
HappyHippyHippo Posted April 21, 2012 at 12:08 PM Report #450377 Posted April 21, 2012 at 12:08 PM Na tua funçao de "printPacketBCD" nao estas a usar o argumento number . O digit nao devia ser igual ao number/10? e o i? O que é que aquela expressão faz? sim .. troca number por i e fica bem IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
einstein Posted April 21, 2012 at 12:10 PM Author Report #450378 Posted April 21, 2012 at 12:10 PM sim .. troca number por i e fica bem o i é suposto fazer o que?
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now