Gurzi Posted May 22, 2006 at 07:18 PM Report Share #28948 Posted May 22, 2006 at 07:18 PM Bem estava aqui a tentar fazer uma conversão de binário para decimal, fiz este código mas não dá, alguem que possa ver a lógica? onde errei ? #include <stdio.h> #include <stdlib.h> #include <string.h> int elevado(int x, int y) { int g=0; while (g >=y-1) { x*=x; y++; } return x; } int main(){ int a = 0; char text[10]; int k=0; int total=0; printf("introduza um numero\n"); scanf("%d",&a); sprintf(text, "%d", a); int i=strlen(text); while (i != 0) { total += text[i]*(elevado(2,k)); k++; i--; } printf("%d\n", total); system("PAUSE"); } Link to comment Share on other sites More sharing options...
saramgsilva Posted May 22, 2006 at 07:25 PM Report Share #28950 Posted May 22, 2006 at 07:25 PM é só para lembrar que já debateu sobre o assunto nesta secção!! gurzi procura o código...ok que é para resolver o erro do teu programa...mas estou alerta para não termos 2 topicos sobre o mesmo na mesma secção!!! www.saramgsilva.com As minhas apps no WP7 Marketplace Youtube : Galinho - Windows Phone 7.5 Link to comment Share on other sites More sharing options...
mogers Posted May 22, 2006 at 08:10 PM Report Share #28968 Posted May 22, 2006 at 08:10 PM #include <stdio.h> #include <stdlib.h> #include <string.h> //int elevado(int x, int y) int elevado(int y) { /*int i,g=1; // axo k era melhor usar o shift logico como tem abaixo, for (i=0;i<y;i++) // de qualquer forma esta' aqui uma possivel solucao g*=x; return g;*/ if (y==0) return 1; else return 2 << (y-1); // "<<" e' o shift logico 'a esquerda o que significa multiplicar por 2. // como neste caso 'x' e' sempre 2, nao penso que ha necessidade // de o colocar como parametro. } // deslocar 2, (y-1) vezes para a esquerda equivale a fazer 2^y int main(){ int a = 0; char text[10]; int k=0; int total=0; printf("introduza um numero\n"); scanf("%d",&a); sprintf(text, "%d", a); int i=strlen(text)-1; // o ultimo digito do numero está em strlen(text) - 1 ... while (i >=0) // importante nao esquecer que a contagem começa em 0. { total += (text[i]-'0') * (elevado(k)); // text[i] tem o valor ascii do '0' ou '1'... k++; //o que nao e' igual a 0 e 1... para obter os numeros i--; // subtraimos o valor ascii do '0'... '1' = '0' +1 } printf("%d\n", total); system("PAUSE"); return 0; } cumprimentos ? "What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação. Link to comment Share on other sites More sharing options...
Gurzi Posted May 22, 2006 at 08:31 PM Author Report Share #28980 Posted May 22, 2006 at 08:31 PM mogers muito obrigado, parece que não andei muito longe da formula correcta, acontece que é a primeira vez que estou a ouvir falar do << " li o que disseste mas não entendi bem , podias explicar melhor por favor ? if (y==0) return 1; else return 2 << (y-1); // "<<" e' o shift logico 'a esquerda o que significa multiplicar por 2. // como neste caso 'x' e' sempre 2, nao penso que ha necessidade // de o colocar como parametro. } // deslocar 2, (y-1) vezes para a esquerda equivale a fazer 2^y também não entendi isto : total += (text-'0') * (elevado(k)); // text tem o valor ascii do '0' ou '1'... k++; //o que nao e' igual a 0 e 1... para obter os numeros i--; // subtraimos o valor ascii do '0'... '1' = '0' +1 quer dizer, já percebi, agora não percebo é o porque de -'0' e não -'1' ou outro número qualquer Link to comment Share on other sites More sharing options...
vbmaster Posted May 22, 2006 at 08:53 PM Report Share #28989 Posted May 22, 2006 at 08:53 PM Cheguei a fazer código para isso para um problema que tinha saído também nas olimpíadas da física, não precisei de mais de 15 linhas de código... Link to comment Share on other sites More sharing options...
mogers Posted May 22, 2006 at 09:12 PM Report Share #29000 Posted May 22, 2006 at 09:12 PM mogers muito obrigado, parece que não andei muito longe da formula correcta, acontece que é a primeira vez que estou a ouvir falar do << " li o que disseste mas não entendi bem , podias explicar melhor por favor ? Isto tem a ver com binario mesmo. Em binario para multiplicar por 2, basta acrescentar um zero à direita do número, ou seja: 1: 0001 2: 0010 4: 0100 8: 1000 etc Isto é chamado um shift logico 'a esquerda. Logico porque não preserva o sinal (em binario, o bit mais significativo [akele mais a esquerda] e' o bit de sinal 0 -> positivo, 1 -> negativo), no caso do 8: se considerassemos o sinal estavamos perante um numero negativo. O shift consiste em deslocar os bits para a esquerda e acrescentar um zero. Só funciona assim neste caso, devido a estarmos a multiplicar por 2. Sintaxe: numero << numero_de_vezes_a_deslocar; Exemplo: 3 << 4; é a mesma coisa que fazer 3 * 2 * 2 * 2 * 2 Existe o oposto, o shift à direita com o operador ">>" ... de modo analogo, em vez de multiplicar, divide por 2. Sintaxe: numero >> numero_de_vezes_a_deslocar; Exemplo: medio = ( numA + numB) >> 1; --> mesmo que ( numA + numB) / 2 Nao sei se deu para perceber que e' mais eficiente, visto que na pratica nao e' feita qualquer multiplicacao. E' apenas "ligar os fios" como o meu prof diz. Deslocar os bits e acrecentar um bit a zero. Se nao consegui explicar bem, avisa ? também não entendi isto : total += (text[ i ]-'0') * (elevado(k)); // text[ i ] tem o valor ascii do '0' ou '1'... k++; //o que nao e' igual a 0 e 1... para obter os numeros i--; // subtraimos o valor ascii do '0'... '1' = '0' +1 quer dizer, já percebi, agora não percebo é o porque de -'0' e não -'1' ou outro número qualquer Já experimentaste fazer o seguinte? printf("%d %d\n" , 'A' , 'B' ); printf("%d %d\n" , '0' , '1' ); Isto vai imprimir o codigo ASCII dos caracteres. Como podes verificar, o código ASCII do 'B' é o codigo imediatamente a seguir ao do 'A', da mesma forma o '1' esta a seguir ao '0'. Tanto as letras do alfabecto como os digitos de 0 a 9 estao seguidos. Ao fazeres total += text[ i ] * (elevado(k)) estas a multiplicar o codigo ASCII do caracter text[ i ] pelo valor retornado pela funcao "elevado". Como o codigo ASCII do '0' nao corresponde a zero (e' igual a 48 por curiosidade), como estas a ver nao estas a fazer a multiplicacao de que pretendes. Para se perceber melhor imprimi os codigos ASCII dos digitos: '0' = 48 '1' = 49 '2' = 50 '3' = 51 etc Com a instrucao (text[ i ]-'0') vais subtrair ao codigo ASCII do text[ i ] o codigo do '0' que e' 48. Neste caso o caracter text[ i ] so' pode ser '0' ou '1'. Sendo assim: '0' - '0' = 0 e '1' - '0' = 1 com esta subtraccao ja' tens os valores decimais do 0 e do 1 correctos. Espero ter sido claro... critiquem o post 😄 Offtopic: Há alguma opcao de modo a nao interpretar o "[ i]" (sem o espaco) como italico? Alem de nao me reconhecer caracters acentuados e "c" com cedilha... desculpem mas tou sem tempo para procurar isso.. "What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação. Link to comment Share on other sites More sharing options...
Gurzi Posted May 22, 2006 at 09:37 PM Author Report Share #29012 Posted May 22, 2006 at 09:37 PM mogers, adorei o post, tens uma grande paciência , fico grato por isso, percebi muito bem a parte do ASCII e esse pensamento é muito á frente , nunca me ia passar isso pela cabeça lol.. em relação aos bits ele multiplica e divide sempre por 2 ?? vou ler mais informação na net, porque confesso que de binários, pouco sei, por issso estou verde nisto 😄 Link to comment Share on other sites More sharing options...
mogers Posted May 23, 2006 at 10:36 AM Report Share #29057 Posted May 23, 2006 at 10:36 AM Sempre às ordens (quando há tempo) 😄 mogers, adorei o post, tens uma grande paciência , fico grato por isso, percebi muito bem a parte do ASCII e esse pensamento é muito á frente , nunca me ia passar isso pela cabeça lol.. em relação aos bits ele multiplica e divide sempre por 2 ?? Os computadores funcionam em binario, por isso é sempre por 2. Eu também nunca tinha pensado naquilo do ASCII até ver um código dum rapaz em que usava isso. Offtopic (espero que nao se importem): Quando lemos um texto, caracter a caracter, para verificar se o caracter actual era uma letra do alfabecto, eu criava uma string com o alfabecto e ia procurar o caracter no alfabecto. Contudo basta: char c = getchar(); while (c!=EOF) { if ( ( c >= 'A' ) && ( c <= 'Z' )) // este codigo passa as letras maiusculas para minusculas c = c - 'A' + 'a'; if ( ( c >= 'a' ) && ( c <= 'z' )) // c pertence ao alfabecto { // o que quisermos } c = getchar(); } muito mais simples... não sei se já tinham pensado nisto. cumps ? "What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação. Link to comment Share on other sites More sharing options...
Gurzi Posted May 23, 2006 at 01:51 PM Author Report Share #29091 Posted May 23, 2006 at 01:51 PM vou cagar agora nisso do shift à esquerda porque sinceramntenão estou a perceer muito bem , whatever,fica a tua boa ajuda Link to comment Share on other sites More sharing options...
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