Hola a todos.
Estoy como siempre estudiando y practicando en este caso con punteros y ya logre el programa restando 32 al ascii de la letra minúscula para pasarla a mayúscula, ahora lo que quiero hacer es lo mismo pero intercambiando el sexto bit, como ya se sabe si el sexto bit está encendido la letra es minúscula y si está apagado es mayúscula.-
La primer ayuda que les pido es: ¿cómo debo hacer para guardar el número binario en una variable del tipo int? (no imprimirla, línea 32).-
#include<stdio.h> 

void binario(int);

int main(){ 

	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){ 
	int aux; 
	
	if(num==0) 
      return; 

	aux=num%2; 
	num=num/2; 
	binario(num); 
	printf("%d",aux); 
}
Desde ya muchas gracias y feliz 2014.-
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.-
Vamos poco a poco.

He transformado un poco el código un poco para que me puedas entender mejor:

Código: Seleccionar todo

#include<stdio.h>
 
void binarioConvertir(int);
 
int main(){
 
    char cadena[6] = "daniel";    
    int ascii=0; 
    int i=0;
   
    while(i<6){
        ascii = cadena[i];
        printf("\n La letra %c en decimal %3d en binario ", cadena[i], ascii);
        binarioConvertir(ascii);        
        i++;
    }      
    printf("\n\n");    
    getch();
    return 0;
}
 
void binarioConvertir(int num){
    int aux;
    if (num!=0)
    {
        binarioConvertir(num/2);
        aux = num%2;
        printf("%d", aux);
    }
}
Estás usando recursividad para obtener el número en binario. ¿Sabes en qué consiste la recursividad? Si la respuesta es no, échale un ojo a este tema.

Si la respuesta es que sí:

Analicemos lo que hace el método para convertir a binario. Este método no coge el número entero y lo convierte a binario "de golpe" o "de una sola vez" digamoslo así. Concretemos:

Para la letra "d", por ejemplo, su correspondecia en decimal es 100. El programa luego entraría en el método para convertir a binario e imprimiría por pantalla el primer resultado para convertir a binario que es un "1". Vuelve a entrar en el método e imprime por pantalla el segundo resultado para convertir a binario que es un "1". Vuelve a entrar en el método e imrpime por pantalla el tercer resultado para convertir a binario que es un "0". Así recursivamente hasta que tenemos en la pantalla el "1100100" que el 100 en binario. Y luego pasa a la siguiente letra. Y así hasta que acaba.

Debes idear algo para guardar ese número final binario en un entero.

Espero que sea un inicio a tu solución, que lo estudies y práctiques. Consiguirás la solución.

Saludos.

P.D: Hay librerías en C que hacen la conversión entre letras mayúsculas y minúsculas automáticamente. Me refiero a que hay más métodos que el que estás usando para hacer esto, por si quieres investigar o te resulta útil.
Hola OK3NETu.
Debes idear algo para guardar ese número final binario en un entero.
Amigo, ese era el pedido de ayuda.-
P.D: Hay librerías en C que hacen la conversión entre letras mayúsculas y minúsculas automáticamente. Me refiero a que hay más métodos que el que estás usando para hacer esto, por si quieres investigar o te resulta til.
Si tengo conocimiento de eso, pero mi intención es aprender cosas a nivel de bits.-

Debo aclararte que hace un tiempo relativamente extenso que estoy en contactos con foros y nunca encontré alguien que enseñe como vos, ¿sos docente?.-

Estoy practicando, cuando tenga la solución para guardar el resultado binario en una variable int te voy a consultar para que me enseñes a cambiar el sexto binario para pasar de minúscula a mayuscula.-
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.-
De acuerdo Daniel, pero mi objetivo era representarte el cómo funciona el código que compartiste. De esta forma pretendo que intentes buscar la solución por tu cuenta, y si no, informar de tus avances y seguir ayudándote. No me gusta nada, responder con la solución y tema zanjado. No es el objetivo del foro por lo que tengo entendido. Aquí se puede aprender mucho ya que hay gente muy preparada.

No soy docente, pero sí que me dedico al mundo de la Ingeniería Informática(Se aprende muchísimo de programación), y me interesa mucho la seguridad informática.

Espero tus avances e información para seguir ayudándote. Ánimo y Un Saludo.

P.D: Va una pista de cómo lo haría yo, por supuesto que habrá más formas. Ir guardando en un vector los bits de binario que te va devolviendo la función de convertir a binario.
bueno respondiendo tu duda de "¿cómo debo hacer para guardar el número binario en una variable del tipo int?"
este trozo de codigo te puede servir si lo que haces es para fines educativos no lo recomiendo ya que te hace flojo pero siempre hay que saber estos trucos feos}
int binario(int num){

    int ifinal;
    char buffer[255];
    itoa(num,buffer,2);//de integer a Cadena de Caracter en su version binaria
    ifinal=atoi(buffer);//de CC a integer
    return ifinal;//retorna el integer
}
recuerda agregar la libreria <stdlib>
checalo si te sirve que bueno saludos
Skype:crack8111
Hola crack81.
Luego me detengo en tú código, dado que a sugerencia de unos cuantos guarde el resultado binario en una cadena de caracteres.-
Profe, estoy siguiendo tus consejos y realmente así se aprende realmente, si bien para un erudito en c el programa se debe ver sencillo créeme que me costó bastante llegar hasta aquí.-
Bueno el caso es que ahora necesito que me digas como seguir, ¿como paso el nuevo binario a la “d” para que se transforme en “D”?.-
#include<stdio.h>
#include <stdlib.h>
 
void binarioConvertir(int, char[]);
 
int main(void){
 
	char cadena[6] = "daniel", cad_binaria[8] = "";
	int ascii=0, i=0, binarioMayuscula=0;
   
    while(i<6){
        ascii = cadena[i];
		binarioConvertir(ascii,cad_binaria);       
		printf("\n La letra %c en decimal %3d en binario %s", cadena[i], ascii, cad_binaria);
		cad_binaria[1] = '0';
        printf(" mayuscula --> %s", cad_binaria);
		binarioMayuscula = atoi(cad_binaria);
		i++;
    }     
    printf("\n\n");   

    return 0;
}
 
void binarioConvertir(int num, char cad[]){
	int i=0, izq=0, der=0, aux=0;
	while(num>0){  
		if(num%2 == 0)  
			cad[i] = '0';  
		else  
			cad[i] = '1';  
        num = num/2;  
		i++;
	}  
	der=6;
	while(izq<3){
		aux		 = cad[izq];
		cad[izq] = cad[der];;
		cad[der] = aux;
		der--;
		izq++;
	}
	cad[7] = '\0';
}
Saludos y feliz 2014.
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.-
¿Por qué no lo guardas en un array de enteros, si estás utlizando ceros y unos? Así te será más fácil tratar los datos.(También se puede realizar con tu propuesta de cadena de caracteres)

Luego el problema tiene dos enfoques. Puedes realizar el cambio de bit para pasar a mayúscula según obtienes el número binario. O bien puedes guardar todos los números binarios, y posteriormente realizar el cambio de bit a cada uno de los números binarios.

A ver si mañana estoy más despejado y te explico más, he tenido una nochevieja muy larga... jaja

Saludos!
Te dejo la primera parte de uno de los enfoques que te propuse anteriormente. Es el enfoque de guardar todos los numeros binarios, y posteriormente realizar el cambio de bit a cada uno de ellos:

Está hecha solo la parte de guardar todos los números binarios en una matriz bidimensional. A ver si consigues por tí mismo cambiar el bit que necesitas de cada uno de ellos para convertir esas letras a mayúscula. Te dejo una buena y creo que bien planetada base:

Código: Seleccionar todo

#include<stdio.h>
 
void binarioConvertir(int);
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 ascii=0;
    int i = 0; 
    int a = 0;
    int b = 0;
    
    printf("Numeros binarios obtenidos mediante recursividad bit a bit:\n");
    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(Obtenidos desde memoria): \n\n");
    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");
    }    
    getch();
    return 0;
}
 
void binarioConvertir(int num){
    int aux;
    if (num!=0)
    {
        binarioConvertir(num/2);
        aux = num%2;
        printf("%d", aux);
        bitsBinario[posicionNumero][posicionBit] = aux;
        posicionBit++;   
    }
}
Y te digo lo de siempre, paciencia, y si tienes alguna duda por muy tonta que pienses que sea plantealá. No te quedes con cosas que no entiendes.

Espero que te haya servido. Y por suspuesto que hay mil soluciones diferentes o mil maneras distintas de solucionar un mismo problema.

Saludos y espero tu respuesta!
Hola Profe.
¿Decime si es esto lo que me pedias?.-
#include<stdio.h>
 
void binarioConvertir(int);

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 ascii=0, i = 0, a = 0, b = 0;
   
    printf("\n\n Numeros binarios obtenidos mediante recursividad bit a bit:\n");
    while(i<6){
        ascii = cadena[i];
        printf("\n La letra %c en decimal %3d en binario ", cadena[i], ascii);
        binarioConvertir(ascii);       
        i++;
    }     
    printf("\n\n");
    printf(" Matriz Bidimensional de los numeros binarios(Obtenidos desde memoria): \n\n");
    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");
    }   

    for(a=0; a<6; a++){
		bitsBinario[a][1] = 0;
	}
    printf("\n");
	for(a=0;a<6;a++)
    {
        printf(" Numero binario que corresponde a la letra %c: ", cadena[a]-32);
		for(b=0;b<7;b++)
        {           
           printf("%d", bitsBinario[a][b]);
        }
        printf("\n");
    }   
		

	return 0;
}
 
void binarioConvertir(int num){
    int aux;
    if (num!=0)
    {
        binarioConvertir(num/2);
        aux = num%2;
        printf("%d", aux);
        bitsBinario[posicionNumero][posicionBit] = aux;
        posicionBit++;   
    }
}
Ahora unas consultas, el porqué del Matriz declarada como pública y porque inicializada con todos cincos.-
A otra cosita que realmente me come la cabeza.-
printf(" Matriz Bidimensional de los numeros binarios Obtenidos desde memoria \n\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.-
La matriz declarada como publica para no tener que pasarla como parámetro al método de convertir a binario. Y todo a cincos, simplemente para poder comprobar que se han rellenado todos los espacios que representan a los bits. (Como no queda ningun 5 al final, pues es que el proceso ha sido correcto).

Ese printf de "Matriz Bidimensional de los numeros binarios Obtenidos desde memoria". Es para diferenciar cuando imprimo por pantalla los binarios, bit a bit. (Primera parte del programa mediante recursividad) O Cuando accedo a la matriz y imprimo por pantalla los numeros guardados en ella.

Y a la pregunta: ¿Decime si es esto lo que me pedias?.-

Lo tienes que responder tú. ¿ Es lo que estabas buscando que hiciera el código que has puesto ?

Saludos.
Hola Profe.
No, no es lo que estaba buscando, en realidad ya mi código hacia lo que este sólo que los bits con el sexto cambiado no estaba en un array.-
Bueno ahora espero que me des una pista en pseudocódigo o teórica para mostrar daniel en mayúscula.-

Un gran abrazo y muchas gracias por plantear las respuestas de éste modo, aprendo mucho.-
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.-
#include<stdio.h>
#include<string.h>

int main(void){
    char cadena[6] = "daniel";

    for (int i=0;i<strlen(cadena);i++)
	cadena[i]^=32;

    printf("\n\n %s",cadena);

    return 0;
}
Upala escribió:
#include<stdio.h>
#include<string.h>

int main(void){
    char cadena[6] = "daniel";

    for (int i=0;i<strlen(cadena);i++)
	cadena[i]^=32;

    printf("\n\n %s",cadena);

    return 0;
}
Gracias por el aporte upala, pero Daniel lo que está buscando es trabajar con números binarios para realizar el cambio. Puso en un post que conocía estas funciones pero no era lo que estaba buscando.
Pino1952 escribió:Hola Profe.
No, no es lo que estaba buscando, en realidad ya mi código hacia lo que este sólo que los bits con el sexto cambiado no estaba en un array.-
Bueno ahora espero que me des una pista en pseudocódigo o teórica para mostrar daniel en mayúscula.-

Un gran abrazo y muchas gracias por plantear las respuestas de éste modo, aprendo mucho.-
Daniel
No me llames Profe, por favor jaja. Aquí estamos todos para aprender

Yo lo creo que quieres hacer, es que apartir de los números binarios, con el bit cambiado(Esta parte del código la has hecho como yo lo haría).

Código: Seleccionar todo

for(a=0; a<6; a++){
        bitsBinario[a][1] = 0;
    }
Ahora a partir de estos numeros binarios, conseguir las letras mayúsculas. Esto se realiza programando el proceso inverso de pasar de letra a decimal y de decimal a binario(Que es lo que está hecho). Lo que tienes que hacer es pasar de binario a decimal y de decimal a la letra. ¿Entiendes?

No te he querido poner nada de código todavía, para que sugiriéndote la idea a ver si eres capaz de realizarlo ya que en este punto te he visto un poco perdido en cuanto a planteamiento, y no en cuanto a programación.

Ánimo Daniel, vas muy bien. Espero que esta respuesta te sirva. Cualquier duda o avance házmelo saber.

Saludos!
Hola Upala.
Muchas gracias por el aporte, bueno ya te aclaró Ok3NETu lo que deseo aprender, ahora me atrevo a pedirte un favor, podrías correr el programa que dejo a continuación y decirme si, ¿te da resultados correctos ó los mismos que muestran la imagen?
#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){
	int temp=0, i;
	for(i=0; num>0; i++){
		temp+=(num%2) * pow(10, i);
		num/=2;
	}
	printf(" %d", temp);
}
Imagen


Saludos y desde ya muchas gracias.-
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.-
Pino1952 escribió:¿te da resultados correctos ó los mismos que muestran la imagen?
Depende...

Si lo corro con BC++ tira cualquier cosa, porque te vas del rango del int
Si lo corro con VC++ funca bien, con una pequeña modificacion de casteo

Por lo cual, si vas a seguir usando gcc, puedes probar en modificar el tipo de dato "temp"
Simplemente cambiandolo a long int
(No olvides de cambiar el printf del resultado, modificando la mascara por %ld)

Salud
Responder

Volver a “C/C++”