Autor
|
Tema: De minúscula a mayúscula a nivel de bits en lenguaje C. (Leído 17,148 veces)
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
Sí.
|
|
|
En línea
|
|
|
|
DanielPy
Desconectado
Mensajes: 145
|
Ok, lo voy a analizar más profundamente, lo necesito.-
Saludos. Daniel
|
|
|
En línea
|
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.-
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
Creo que esta es la salida que buscas:No me gusta ni pizca el código que te paso, pero no quería modificarte el tuyo de forma sustancial: #include<stdio.h> #include <stdlib.h> #include <math.h> void binarioConvertir(int, char[]); int main(void){ char cadena[] = "daniel", cad_binaria[8] = ""; int ascii=0, i=0, binarioMayuscula=0; while(i<6){ ascii = cadena[i]; binarioConvertir(ascii,cad_binaria); convertir_a_decimal(cad_binaria); printf("\n%c en decimal %3d en binario %s", cadena[i], ascii, cad_binaria); if (cad_binaria[1] = '1') cad_binaria[1] = '0'; printf(" -->mayuscula-->%c-->",convertir_a_decimal(cad_binaria) ); printf(" %s-->%d",cad_binaria,convertir_a_decimal(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'; } int convertir_a_decimal (char cad[]){ int decimal=0,i; for (i=6;i>=0;i--){ if (cad[6-i]!='0'){ decimal+=pow (2,i*((cad[6-i])-48)); } } return decimal; }
Todo es jugar con el valor del caracter en la posición 1.
Te he añadido la conversión a decimal usando las potencias de 2. Lo he hecho con "pow" por ganseria xD. ¡¡¡¡ Saluditos! ..... !!!!
|
|
« Última modificación: 3 Enero 2014, 21:58 pm por leosansan »
|
En línea
|
|
|
|
DanielPy
Desconectado
Mensajes: 145
|
Hola leosansan. No me gusta ni pizca el código que te paso, pero no quería modificarte el tuyo de forma sustancial: Te pido por favor que la próxima vez, si tenes que utilizar este tipo de aclaraciones prefiero que no me contestes o que me pidas que no efectúe nuevo post.- Yo soy un autodidacta y dependo muchísimo de los foros, con tu aclaración me estás dando a entender que mi código está mal, perfecto lo acepto y acepto me falta mucho por aprender, no sería mejor que pusieras un programa como el que hiciste pero a tu manera y de esa forma me dieras la posibilidad de aprender la forma correcta de hacerlo.- Muchas gracias por tu tiempo.-
|
|
|
En línea
|
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.-
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
Bueno el caso es que ahora necesito que me digan cómo seguir, ¿como paso el nuevo binario a la “d” para que se transforme en “D”? Si la intención es realizar las operaciones a nivel de bits entonces para pasar de: A) Mayúsculas a minúsculas, debes activar el sexto bit mediante el operador "|" y una mascara (el valor 32). B) Minúsculas a mayúsculas, debes desactivar el sexto bit mediante el operador "&" y una mascara (el valor opuesto al anterior, 223). Un programa de ejemplo: #include <stdio.h> #include <stdlib.h> int main(void) { char ch[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; int i; puts("Mayusculas a minusculas:"); for (i = 0; i < 26; i++){ ch[i] |= 32; } puts("Minusculas a mayusculas:"); for (i = 0; i < 26; i++){ ch[i] &= 223; } return EXIT_SUCCESS; }
---- Por ultimo tal vez tu programa no tenga el comportamiento esperado debido a esta declaración: char cadena[6] = "daniel";
Con ella se crea un array de seis elementos inicializados con los caracteres indicados pero falta el indicador de fin de cadena (el '\0'), para que este se agregue de forma automática debes eliminar el numero de elementos del array o bien indicar el numero correcto (siete). Un saludo
|
|
|
En línea
|
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
Ten en cuenta Daniel, que el hecho de que te guste un código o no a veces es un poco subjetivo. Lo que le guste a Leo no tiene porque ser siempre lo que te guste a tí o a mí. Por ejemplo en las declaraciones de función: void binarioConvertir(int num, char cad[]){ //... }
Yo soy más partidario de poner las llaves así porque se ve mejor cuando empieza y cuando acaba: void binarioConvertir(int num, char cad[]) { //... }
Pero eso es cuestión de gustos. Bueno y ya hablando del código, esta función: int convertir_a_decimal (char cad[]){ int decimal=0,i; for (i=6;i>=0;i--){ if (cad[6-i]!='0'){ decimal+=pow (2,i*((cad[6-i])-48)); } } return decimal; }
Esa función no es muy portable, puesto que para que funcione la cadena debe medir exactamente 6 caracteres. Existe una función de la librería estándar que te calcula el tamaño de una cadena: #include <string.h> //... strlen(cadena);
Podemos ayudarnos de ella para reescribir la función: int convertir_a_decimal (char cad[]){ int decimal=0,i; int tam_cadena = strlen(cad); for (i = tam_cadena-1;i>=0;i--) { if (cad[tam_cadena-i]!='0') { decimal+=pow (2,i*((cad[tam_cadena-i])-48)); } } return decimal; }
De esa forma esta función te valdrá para cualquier tamaño de cadena, por lo que la podrás reutilizar siempre que quieras. Y aunque no la pienses reutilizar, es una buena costumbre hacer las funciones lo más generales posibles, de lo contrario te podrías encontrar con errores extraños si modificas el código. Y siguiendo otra vez con la función, ese pow no es necesario. Podemos definir la potencia aprovechando las iteraciones del for, lo que haremos es cambiar el sentido del for y añadir una variable más: int convertir_a_decimal (char cad[]) { int decimal=0,i; int tam_cadena = strlen(cad); int multiplicador = 1; for (i = 0; i < tam_cadena; i++) { if (cad[tam_cadena-i]!='0') { decimal += multiplicador * (cad[tam_cadena-i])-48); multiplicador *= 2; } } return decimal; }
Y por último, quitaría ese 48 por un '0': int convertir_a_decimal (char cad[]) { int decimal=0,i; int tam_cadena = strlen(cad); int multiplicador = 1; for (i = 0; i < tam_cadena; i++) { if (cad[tam_cadena-i] != '0') { decimal += multiplicador * (cad[tam_cadena-i]) - '0'); multiplicador *= 2; } } return decimal; }
|
|
« Última modificación: 3 Enero 2014, 20:17 pm por amchacon »
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
Otra forma es multiplicar el acumulado por la base y agregar el dígito: int convertir_a_decimal(char cad[]) { int rv = 0; int i; for (i = 0; cad[i] != '\0'; i++) rv = rv * 2 + cad[i] - '0'; return rv; }
Una opción mejor es la función strtol, parte de la biblioteca estándar de C y con soporte para las bases 2 a 36. Un saludo
|
|
|
En línea
|
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
|
|
|
DanielPy
Desconectado
Mensajes: 145
|
Hola a todos. Muchas pero muchas gracias a todos, vaya que predisposición para ayudar, por favor sigan así, no se puede pedir más, realmente con todas estas respuesta se podría hacer un tutorial.- Leosansan, con mis 61 años debo reconocer que siempre fui muy visceral extremadamente franco y en este caso te pido disculpas si fui muy duro pero es lo que sentí en el momento, y para que veas que me hago cargo de mis errores voy a dejar de postear el elhacker.net, de esta manera trato de no perjudicarte, es preferible que te quedes vos que podes ayudar a muchos y no yo que he dejado un triste antecedente.-
Saludo a todos los genios que ayudan y a todos los que vienen a buscar soluciones que seguramente la encontraran.- Hasta siempre. Roberto Daniel Virgili.-
|
|
|
En línea
|
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.-
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
Hola leosansan.Te pido por favor que la próxima vez, si tenes que utilizar este tipo de aclaraciones prefiero que no me contestes o que me pidas que no efectúe nuevo post.- Yo soy un autodidacta y dependo muchísimo de los foros, con tu aclaración me estás dando a entender que mi código está mal, perfecto lo acepto y acepto me falta mucho por aprender, no sería mejor que pusieras un programa como el que hiciste pero a tu manera y de esa forma me dieras la posibilidad de aprender la forma correcta de hacerlo.
Estamos en el mismo barco, yo también soy autodidacta.
Respecto a lo segundo soy de la opinión de cuando alguien postea un código y tiene algún error procedo a la corrección pertinente respetando en lo posible su código, no a poner un código que a mí se me ocurra, ya que puede que el nivel no sea el mismo y no le sirva, y no es porque mi nivel sea alto, todo lo contrario................................................................... Leosansan, con mis 61 años debo reconocer que siempre fui muy visceral extremadamente franco y en este caso te pido disculpas si fui muy duro pero es lo que sentí en el momento, y para que veas que me hago cargo de mis errores voy a dejar de postear el elhacker.net, de esta manera trato de no perjudicarte, es preferible que te quedes vos que podes ayudar a muchos y no yo que he dejado un triste antecedente.- ..........................................
Casi te pillo, yo tengo 59 años y como tu, además de autodidacta, soy muy crítico conmigo mismo, así que si te he ofendido en algo te pido humildemente disculpas. Pero sinceramente no sé que he podido decir que te haya ofendido .
No entiendo por qué quieres dejar de postear en este foro. Creo que se te ha ayudado de forma presta e intensa: ivancea96, rir3760, amchacon y yo mismo.
No entiendo por qué dices que lo haces por no perjudicarme, todo lo contrario, me has ayudado a refrescar cositas sobre números en binario y máscaras de bits.
Y para que veas que te respeto y admiro, como en mi caso, al meterte en este mundillo con tu edad y por ti solo, te dejo una nueva solución, esta vez partiendo de cero, usando las funciones que el C pone a nuestra disposición. Por no usar, no he usado ni strlen como sugirió amchacon:
Introduzca una frase en minusculas:
rir amchacon leosansan
r en decimal 114 en binario 1110010 -->mayuscula-->R--> 1010010-->82 i en decimal 105 en binario 1101001 -->mayuscula-->I--> 1001001-->73 r en decimal 114 en binario 1110010 -->mayuscula-->R--> 1010010-->82 en decimal 32 en binario 100000 -->mayuscula--> --> 100000-->32
a en decimal 97 en binario 1100001 -->mayuscula-->A--> 1000001-->65 m en decimal 109 en binario 1101101 -->mayuscula-->M--> 1001101-->77 c en decimal 99 en binario 1100011 -->mayuscula-->C--> 1000011-->67 h en decimal 104 en binario 1101000 -->mayuscula-->H--> 1001000-->72 a en decimal 97 en binario 1100001 -->mayuscula-->A--> 1000001-->65 c en decimal 99 en binario 1100011 -->mayuscula-->C--> 1000011-->67 o en decimal 111 en binario 1101111 -->mayuscula-->O--> 1001111-->79 n en decimal 110 en binario 1101110 -->mayuscula-->N--> 1001110-->78 en decimal 32 en binario 100000 -->mayuscula--> --> 100000-->32
l en decimal 108 en binario 1101100 -->mayuscula-->L--> 1001100-->76 e en decimal 101 en binario 1100101 -->mayuscula-->E--> 1000101-->69 o en decimal 111 en binario 1101111 -->mayuscula-->O--> 1001111-->79 s en decimal 115 en binario 1110011 -->mayuscula-->S--> 1010011-->83 a en decimal 97 en binario 1100001 -->mayuscula-->A--> 1000001-->65 n en decimal 110 en binario 1101110 -->mayuscula-->N--> 1001110-->78 s en decimal 115 en binario 1110011 -->mayuscula-->S--> 1010011-->83 a en decimal 97 en binario 1100001 -->mayuscula-->A--> 1000001-->65 n en decimal 110 en binario 1101110 -->mayuscula-->N--> 1001110-->78
#include<stdio.h> #include <stdlib.h> int main(void){ char cadena[100],binario[8] = ""; int i=0; puts("Introduzca una frase en minusculas:\n"); scanf ("%100[^\n]", cadena); for (i=0;cadena[i] ;i++){ printf("\n %c en decimal %3d en binario %s", cadena[i],(int)(cadena[i]), itoa((int) (cadena[i]),binario,2 )); if (binario[1] = '1' ) binario[1] = '0'; if (!isalpha(cadena[i])) cadena[i]+=32; printf(" -->mayuscula-->%c-->",(int)(cadena[i])-32 ); printf(" %s-->%d",binario,((int)(cadena[i])-32)); } puts("\n\n"); return 0; }
¡¡¡¡ Saluditos! ..... !!!!
|
|
« Última modificación: 6 Enero 2014, 19:52 pm por leosansan »
|
En línea
|
|
|
|
DanielPy
Desconectado
Mensajes: 145
|
Hola a todos. Si bien este es un foro de programación para que se me entienda mejor tengo que introducir un poco de teoría sobre lo que realmente vine a aprender en esta reencarnación (como en las anteriores) que es a evolucionar, tengo que observar mis errores y haciéndome cargo voy solucionando cosas paso a paso y este es uno de ellos, estoy muy consciente que viendo lo que está pasando humanamente voy a perder mucho sin la ayuda de todos Uds. pero priorizo lo espiritual, luego Dios (como siempre) me presentará a otros hermanos para que me enseñen (si el karma no está aprendido tal vez sean Uds. mismo, el padre me lo hará saber).-
Amigos, un gran abrazo a la distancia y que tengan un muy buen día.-
“Yo solo digo lo que vos necesitas escuchar” Roberto Daniel Virgili.-
|
|
|
En línea
|
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.-
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
convertir txt a mayuscula minuscula mayuscuala...
Programación Visual Basic
|
4D1cTo
|
4
|
6,011
|
18 Junio 2006, 15:10 pm
por Hadess_inf
|
|
|
Convertir cadena minuscula en mayuscula
Programación C/C++
|
delirio
|
3
|
13,801
|
28 Noviembre 2010, 04:36 am
por delirio
|
|
|
[Python] - Ejercicio de Mayúscula y Minúscula
Scripting
|
ChicoMaravilla
|
2
|
12,817
|
3 Diciembre 2010, 02:17 am
por ChicoMaravilla
|
|
|
convertir minúscula a mayúscula
« 1 2 »
Programación C/C++
|
m@o_614
|
10
|
48,288
|
24 Abril 2017, 12:31 pm
por NikNitro!
|
|
|
De minúscula a mayúscula a nivel de bits (lenguaje C.)
Programación C/C++
|
NOB2014
|
4
|
3,903
|
21 Marzo 2014, 02:44 am
por rir3760
|
|