Hola Upala.-
Hice los cambios y me da los mismos resultados.-
#include <stdio.h>
#include <math.h>
  
void binario(int);
  
int main(void){
  
    char cadena[6] = "daniel";
    int ascii=0, i=0;
      
    while(i<6){
    ascii = cadena[i];
    printf("\n La letra %c en decimal %3d en binario ", cadena[i], ascii);
    binario(ascii);
    i++;
    }
      
    printf("\n\n");
      
    return 0;
}
  
void binario(int num){
    long int temp=0;
    int i;
    for(i=0; num>0; i++){
        temp+=(num%2) * pow(10, i);
        num/=2;
    }
    printf(" %ld", temp);
}
No habrá que modificar el interior del for, o la formula es correcta.-
Saludos.
Daniel
Imagen
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Si, man, tenes toda la razon del mundo, no es problema de desbordamiento del rango de entero, el tema es otra cosa... es como que en los numeros pares le falta sumar un 1... dificil debuggear sin el compilador, pero el "for" está bien hecho.
Probado en Borland C++, y en VC++.

Voy a seguir pensando por qué en gcc no funca
¿Por qué ahora quieres usar la librería math.h para pasar a binario y has dejado el trabajo que adelantaste?

Saludos!
Por favor, antes de utilizar una función de una librería. Parad a mirar que tipo de dato devuelve esa función.

La función pow devuelve un tipo de dato de tipo real double.

Código: Seleccionar todo

#include <stdio.h>
#include <math.h>
   
void binario(int);
   
int main(void){
   
    char cadena[6] = "daniel";
    int ascii=0, i=0;
       
    while(i<6){
    ascii = cadena[i];
    printf("\n La letra %c en decimal %3d en binario ", cadena[i], ascii);
    binario(ascii);
    i++;
    }
       
    printf("\n\n");
       getch();
    return 0;
}
   
void binario(int num){
    double temp=0;
    int contador = 0;
    for(contador=0; num>0; contador++){
        temp+=(num%2) * pow(10, contador);
        num/=2;
    }
    printf("%.0f", temp);
}
Si lo quieres de esta forma aquí tienes. ¿Pero por qué el querer hacerlo de esta manera? También es una manera válida pero utilizas la librería math.h en vez de recursividad a través de método.

P.D: También quedó claro que no es problema de compilador ni nada por estilo. C es un lenguaje de programación diferente a C++. Este último está más desarrollado y por lo tanto no te daba, upala, ningún problema al compilar el fichero como .cpp y ejecutar el programa. Mirad bien la extensión de vuestros ficheros porque los compiladores os pueden dar guerra. Cuidado con esto.

P.D2: Daniel si pides ayuda en otros foros, puedes dar el enlace de este para que vean por donde estamos enfocando la solución. Ya que si no cada uno pensará una forma distinta de hacerlo y el más perjudicado en el aprendizaje vas a ser tu mismo porque te podemos hacer un lío tremendo entre todos. Ahora no sé por donde quieres seguir enfocando el problema. Si de esta manera con la función pow, o como lo habíamos hecho hasta antes de que te dieran este otro enforque.

Saludos.
Hola.
Bien, ahora si funciona a la perfección.-

Saludos.
Daniel
Imagen
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Hola.
En estos momentos:
[Enlace externo eliminado para invitados]
[Enlace externo eliminado para invitados]
[Enlace externo eliminado para invitados]
[Enlace externo eliminado para invitados]

Cuando termine el programa lo pongo aquí...(si lo termino).-

Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Bueno aquí te dejo una posible solución a través del primer enfoque que teníamos para conseguir el número binario. La recursividad.

Hay que aclarar que esto es una solución A MEDIDA de tu problema. Digo esto, porque está hecho para pasar exclusivamente de minúscula a mayúscula y no al revés. También únicamente se ha tenido en cuenta la dimensión de la cadena que propusiste("daniel").

Por lo tanto también se ha tenido en cuenta la dimensión de los números binarios resultantes que serían de 7 bits. Si algo de esto cambia, el tamaño de la matriz bidimensional que he diseñado no valdría, ya que son [NumeroDeCaracteresDeLaCadena][NumeroDeBitsDelBinario]. Y seguro que me dejo alguna cosa más.

De todos modos espero que el código sea de ayuda, y se pueda extrapolar o generalizar a otros problemas. Esta comentado, pero si hay alguna duda o problema digánmelo.

Por supuesto el código es muy mejorable, y quizás no sea la solución idónea.
Sé de C, pero no me considero un experto.

Saludos!

Código: Seleccionar todo

#include<stdio.h>
 
void binarioConvertir(int);
int decimalConvertir(int);
unsigned concatenate(unsigned, unsigned);
int bitsBinario[6][7] = {{5, 5, 5, 5, 5, 5, 5},
                         {5, 5, 5, 5, 5, 5, 5},
                         {5, 5, 5, 5, 5, 5, 5},
                         {5, 5, 5, 5, 5, 5, 5},
                         {5, 5, 5, 5, 5, 5, 5},
                         {5, 5, 5, 5, 5, 5, 5}};
int posicionBit = 0;
int posicionNumero = 0;


int main(){
 
    char cadena[6] = "daniel";
    int binarioMayusculas[6];
    int decimalesMayusculas[6];       
    int ascii = 0;
    int i = 0; 
    int a = 0;
    int b = 0;
    
    printf("Numeros binarios obtenidos mediante recursividad bit a bit:\n");
    
    //Obtenemos el número binario mediante recursividad, e imprimiéndolo por pantalla bit a bit
    while(i<6){
        ascii = cadena[i];
        printf("\nLa letra %c en decimal %3d en binario ", cadena[i], ascii);
        binarioConvertir(ascii);        
        i++;
    }  
        
    printf("\n\n");
    
    printf("Matriz Bidimensional de los numeros binarios: \n\n");
    
    //Imprimo por pantalla la matriz bidimensional obtenida
    for(a=0;a<6;a++)
    {
        printf("Numero binario que corresponde a la letra %c: ", cadena[a]);
        for(b=0;b<7;b++)
        {           
           printf("%d", bitsBinario[a][b]);
        }
        printf("\n");
    }
    
    printf("\n\n");
    
    //Cambio el Sexto Bit, 
    //para que el numero binario resultante sea el equivalente a la letra mayúscula
    for(a=0; a<6; a++){
        bitsBinario[a][1] = 0;                       
    }

    //Concatenando los Enteros de la Matriz, para tener cada numero binario
    //en una posición de array diferente
  
    for(a=0;a<6;a++){
        binarioMayusculas[a] = bitsBinario[a][0];
        for(b=1;b<7;b++){        
            binarioMayusculas[a] = concatenate(binarioMayusculas[a], bitsBinario[a][b]);
        }
    } 
    
    //Imprimo por pantalla el array resultante
     
    printf("Array de los numeros binarios con bit cambiado: \n\n");
     
    for(a=0;a<6;a++){
       //Aquí aún hay que utilizar el cadena[a]-32 para obtener la mayúscula :(
       printf("Numero binario que corresponde a la letra %c: %d", cadena[a]-32, binarioMayusculas[a]);
       printf("\n");
    }
    printf("\n\n");
    
    //Convierto los binarios de cada posicion del array, a número decimal.
    //De esta manera ya tendremos el numero decimal correspondiente a la letra
    //mayúscula de la tabla ascii
    for(a=0;a<6;a++){
         decimalesMayusculas[a] = decimalConvertir(binarioMayusculas[a]);
    }
       
    //Imprimo por pantalla el array de decimales correspondientes con su letra mayúscula
    printf("Array de los numeros decimales correspondientes a las Mayusculas: \n");
    printf("(Caracter ASCII obtenido ya a partir del numero decimal) \n\n");
     
    for(a=0;a<6;a++){
       //Aquí ya hemos realizado la conversión pura, como se puede comprobar
       //obtenemos la letra %c, a partir del numero binario convertido previamente en decimal.
       //Ese numero se encuentra en el array decimalesMayusculas[]. Primero impreso como caracter,
       // y luego como entero. De esta manera verificamos la correspondencia entre BINARIO-DECIMAL-CARÁCTER(Letra) 
       printf("Numero decimal que corresponde a la letra %c: %d", decimalesMayusculas[a], decimalesMayusculas[a]);
       printf("\n");
    }
    
    getch();
    return 0;
}
 
void binarioConvertir(int num){
    int aux;
    if (num!=0)
    {
        binarioConvertir(num/2);
        aux = num%2;
        printf("%d", aux);
        //Guardo cada bit obtenido en una matriz bidimensional[NumeroGeneral][Bit]
        bitsBinario[posicionNumero][posicionBit] = aux; 
        posicionBit++;   
    }
}

int decimalConvertir(int binario){
     int c = 1;
     int d = 0;
     int p = 0;
          
     while(binario>0){
         p=0;
         p=c*(binario%10);
         d+=p;
         c*=2;
         binario/=10;
     }
     return d;
}

unsigned concatenate(unsigned x, unsigned y) {
    unsigned pow = 10;
    while(y >= pow)
        pow *= 10;
    return x * pow + y;        
}

Veo que al final te has complicado mucho para hacerlo, si lo que querías es "apagar" el 3 MSB del caracter para sacar la mayúscula, con una simple máscara te hubiese servido, mira:

01100001 a
01000001 A

01100010 b
01000010 B

Luego si cogemos la máscara 11011111, se ve que (a) 01100001 & 11011111 = 01000001 (A)

Hay muchas formas de hacer esto a "nivel de bits", para aprender te puedes complicar lo que quieras, pero con tu algoritmo estás superando las cotas O(1) (en temporal y en espacial) del problema, si te interesa el tema enviame un mp lo comentamos :).

Un saludo :)
Hola overxfl0w13
¿Esto es lo que proponías?

Imagen


Es similar al código de Upala.-

La explicación del porque esta línea frase &=0xDF; transforma la letra minúscula
En mayúscula, utilizando el operador AND(&)


El binario de la letra a es…: 01100001
El binario de 0xDF es……….: 11011111
..........................................: 01000001 binario de la A mayúscula.-

El binario de la letra p es…: 01110000
El binario de 0xDF es……….: 11011111
..........................................: 01010000 binario de la P mayúscula.-

Espero tu comentario.-

Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Pino1952 escribió:Hola overxfl0w13
¿Esto es lo que proponías?

Imagen


Es similar al código de Upala.-

La explicación del porque esta línea frase &=0xDF; transforma la letra minúscula
En mayúscula, utilizando el operador AND(&)


El binario de la letra a es…: 01100001
El binario de 0xDF es……….: 11011111
..........................................: 01000001 binario de la A mayúscula.-

El binario de la letra p es…: 01110000
El binario de 0xDF es……….: 11011111
..........................................: 01010000 binario de la P mayúscula.-

Espero tu comentario.-

Saludos.
Daniel

Exactamente, eso mismo es lo que te comentaba, no ví ese código por el post por eso te comenté :).
Responder

Volver a “C/C++”