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;
}