Webcampista.com

mucho más que un foro

Programar en C

Navegante, he visto que ya habéis llegado a las tablas/vectores ¿que tal?
 
Con la cabeza como un bombo, pero lo he sacado.... Gracias a cambiar de programa.....

En un principio, usabamos el dev c, pero era muy complicado segun el profe usar el debuger, así que ahora usamos el borland, y gracias al debuger he pidido seguir mejor el programa y ver donde la cagaba.... Eso y que un compañero, que por las mañanas esta en la uni, me enseño el for....

Ahora a ver que nos pone.....
 
Mejor que sumar y restar 20h yo prefiero hacer OR con 20h para pasar a mayusculas y AND con DFh para pasar a minusculas.
 
Bueno, lo haremos como en C...

Para pasar a minusculas hariamos:
Salida == entrada && 0xDF

y para pasar a mayusculas:
Salida == entrada || 0x20

En realidad hay otra forma mas sencilla, creo que es utilizando la libreria <string.h> creo que hay una funcion toupper y otra tolower, en ese caso sera tan sencillo como:
Salida==toupper(entrada) para pasar a mayusculas y

Salida==tolower(entrada) para pasar a minusculas.
 
Bueno, lo haremos como en C...

Para pasar a minusculas hariamos:
Salida == entrada && 0xDF

y para pasar a mayusculas:
Salida == entrada || 0x20

En realidad hay otra forma mas sencilla, creo que es utilizando la libreria <string.h> creo que hay una funcion toupper y otra tolower, en ese caso sera tan sencillo como:
Salida==toupper(entrada) para pasar a mayusculas y

Salida==tolower(entrada) para pasar a minusculas.

Las líneas en rojo están mal. Se debería de haber utilizado el operador de asignación = en vez de ==, que es el operador lógico de igualdad.
Además, el operador && realiza la operación lógica AND entre los dos operados devolviendo como resultado verdadero o falso. La operación lógica AND bit a bit entre los bits de los operandos se realiza con el operador &, que es lo que se pretende en este caso.
Lo mismo se puede decir del operador || que es la operación lógica AND y del operador | que es la operación lógica OR bit a bit entre los bits de los operandos.

Las líneas quedarían:

Salida = entrada & 0xDF;

Salida = entrada | 0x20;

Como comentario, aunque sumar y restar 20h es correcto y obtienes lo mismo, hacerlo de esa manera te obliga a hacer antes una comparación para saber si el carácter es mayúscula o minúscula y decidir si debes sumar, restar o no hacer nada. Por lo tanto es una solución peor (más ineficiente) que la operación lógica.
 
Las líneas en rojo están mal. Se debería de haber utilizado el operador de asignación = en vez de ==, que es el operador lógico de igualdad.
Además, el operador && realiza la operación lógica AND entre los dos operados devolviendo como resultado verdadero o falso. La operación lógica AND bit a bit entre los bits de los operandos se realiza con el operador &, que es lo que se pretende en este caso.
Lo mismo se puede decir del operador || que es la operación lógica AND y del operador | que es la operación lógica OR bit a bit entre los bits de los operandos.

Las líneas quedarían:

Salida = entrada & 0xDF;

Salida = entrada | 0x20;

Como comentario, aunque sumar y restar 20h es correcto y obtienes lo mismo, hacerlo de esa manera te obliga a hacer antes una comparación para saber si el carácter es mayúscula o minúscula y decidir si debes sumar, restar o no hacer nada. Por lo tanto es una solución peor (más ineficiente) que la operación lógica.

Pues tienes razon. La verdad es que hace años que no programo en C y se pierde la costumbre. Ya ni me acordaba si la linea se debia terminar con el ;. La comprobacion se debe hacer para saber si es una letra o es otro caracter.

A ver si esto es mas correcto:

Pasar a mayusculas:
salida = entrada < 'a' || entrada > 'z' ? entrada : entrada | 0x20;

Pasar a minusculas:
salida = entrada < 'A' || entrada > 'Z' ? entrada : entrada & 0xDF;

En ambos casos el resultado quedaría igual si el caracter no es una letra entre la a y la z.

Mi memoria no me alcanza para acordarme si se escribe 'A' o se escribe "a", pues muchos años programando en pascal hacen olvidar detalles de la sintaxis del C. En pascal los literales se señalan con ' o con " segun los casos.
 
Un comentario sobre el programa de convertir a mayúsculas.
Nunca se deben poner en los programas "números mágicos" sin más al estilo del 32. Es una mala práctica de programación.

Si quieres "marcar paquete" con el profesor, un algoritmo más eficiente para intercambiar mayúsculas y minúsculas es darse cuenta que el código ASCII de una letra mayúscula (la 'A' por ejemplo es 0100 0001 ó 41h) y el de una minúscula (la 'a', por ejemplo es 0110 0001 ó 61h) difiere siempre en un único bit y es el de posición 5. Por lo tanto, si a cualquier letra le pones ese bit a 1, la tendrás en minúscula, si se lo pones a 0, la tendrás en mayúscula y si cambias el valor de ese bit, la cambias entre mayúscula <-> minúscula.
Esos cambios son triviales si haces la operación or, and o xor con la máscara 20h.


Desde la total y completa ignorancia en esto del C, poner 20h no seria otro "número mágico" pero en hexadecimal en vez de decimal?????
 
:D se nota el venir del ensamblador, lo de las and y las or,





PD: en C también se pueden usar...


Pues tal y como se me estan dando las cosas, tengo que decir que estoy con dedalo "viva el ensamblador".

Ejercicio de la tabla de edades, tiempo efectivo más de 12h

Calculadora, suma, resta, multiplicación, con pic y ensamblador, no tarde ni tres horas.

Teniendo en cuenta que el programa en C son 20 lineas de codigo y el ensamblador fueron 170 lineas, juzgar que se me da mejor....
 
Pues tal y como se me estan dando las cosas, tengo que decir que estoy con dedalo "viva el ensamblador".

Ejercicio de la tabla de edades, tiempo efectivo más de 12h

Calculadora, suma, resta, multiplicación, con pic y ensamblador, no tarde ni tres horas.

Teniendo en cuenta que el programa en C son 20 lineas de codigo y el ensamblador fueron 170 lineas, juzgar que se me da mejor....

Si pero, hay que comparar las mismas cosas, ¿cuanto cuesta realizar el programa de estas tablas en ensamblador? :D



Por cierto, para pasar de minúsculas a mayúsculas, no hace falta decidir nada, le aplicas la AND y como la pones a cero a piñon, es como si restaras 32 si es minúscula o no hicieras nada si es mayúscula.


20h es en hexadecimal, lo mismo que 32 en decimal o 32d

Pero al hacer la AND y la OR no sumas o restas, solo pones a uno o a cero un bit, mira la traza:

0100 0001 en binario ó 41h ó 65d (es la 'A' en ASCII)
0110 0001 en binario ó 61h ó 97d (es la 'a' en ASCII)

Fijate que se diferencia solo en un bit ¿que conseguimos si hacemos esto?
0110 0001 en binario ó 61h ó 97d (es la 'a' en ASCII)
AND
1101 1111 en binario ó DFh (no hace falta lo otro)
=
0101 0001 en binario ó 41h ó 65d, vamos la 'A' en ASCII, sin sumas ni restas.

A esto se refiere owockadoy. que ya ha puesto como se pondría en C.

nouc= c & 0xDF;
 
Desde la total y completa ignorancia en esto del C, poner 20h no seria otro "número mágico" pero en hexadecimal en vez de decimal?????

Bien visto :), pero erróneo.
Cuando te comenté lo del "número mágico" fue porque tú quitaste de tu programa un #define para hacer aparecer un número mágico en mitad del código. Cuando yo puse el 20h lo hice en la explicación de un algoritmo: tienes que hacer una operación lógica con ese valor. Otra cosa es cómo codifiques luego el programa.

Como regla general los "números mágicos" no deben aparecer en medio del código porque sí. Se pueden admitir sólo si aparecen una única vez en una función concreta y con un comentario al lado explicando qué es eso.
La práctica correcta es colocar en la cabecera del programa un #define por cada una de las constantes que utilices (con un comentario apropiado, por supuesto) y luego usar esa constante definida a lo largo del programa. De esa manera, si por cualquier razón la constante tiene que cambiarse, sólo se hace una vez en la cabecera y sus efectos se propagan a lo largo del código.
 
Por cierto, para pasar de minúsculas a mayúsculas, no hace falta decidir nada, le aplicas la AND y como la pones a cero a piñon, es como si restaras 32 si es minúscula o no hicieras nada si es mayúscula.


20h es en hexadecimal, lo mismo que 32 en decimal o 32d

Pero al hacer la AND y la OR no sumas o restas, solo pones a uno o a cero un bit, mira la traza:

0100 0001 en binario ó 41h ó 65d (es la 'A' en ASCII)
0110 0001 en binario ó 61h ó 97d (es la 'a' en ASCII)

Fijate que se diferencia solo en un bit ¿que conseguimos si hacemos esto?
0110 0001 en binario ó 61h ó 97d (es la 'a' en ASCII)
AND
1101 1111 en binario ó DFh (no hace falta lo otro)
=
0101 0001 en binario ó 41h ó 65d, vamos la 'A' en ASCII, sin sumas ni restas.

A esto se refiere owockadoy. que ya ha puesto como se pondría en C.

nouc= c & 0xDF;

Ya, ¿Y con los simbolos que hay por encima y por debajo de a:z y A:Z?

Por ejemplo, los numeros en una cadena se convertirian en caracteres de control,mira la tabla ASCII, desde el 0 al 9, si les quitas el 5º bit te quedan los caracteres de control:

0 -> DLE
1 -> DC1
2 -> DC2
3 -> DC3
4 -> DC4
5 -> NAK
6 -> SYN
7 -> ETB
8 -> CAN
9 -> EM

El control es para que la conversion se aplique exclusivamente a los caracteres a los que esta dirigida la operacion.
 
Como regla general los "números mágicos" no deben aparecer en medio del código porque sí. Se pueden admitir sólo si aparecen una única vez en una función concreta y con un comentario al lado explicando qué es eso.
La práctica correcta es colocar en la cabecera del programa un #define por cada una de las constantes que utilices (con un comentario apropiado, por supuesto) y luego usar esa constante definida a lo largo del programa. De esa manera, si por cualquier razón la constante tiene que cambiarse, sólo se hace una vez en la cabecera y sus efectos se propagan a lo largo del código.

Ciertamente, cuando ahora reviso alguno de los programas de cuando empezaba a programar me vuelvo loco buscando esos numeros magicos distribuidos por el codigo.
 
Ya, ¿Y con los simbolos que hay por encima y por debajo de a:z y A:Z?

Por ejemplo, los numeros en una cadena se convertirian en caracteres de control,mira la tabla ASCII, desde el 0 al 9, si les quitas el 5º bit te quedan los caracteres de control:

0 -> DLE
1 -> DC1
2 -> DC2
3 -> DC3
4 -> DC4
5 -> NAK
6 -> SYN
7 -> ETB
8 -> CAN
9 -> EM

El control es para que la conversion se aplique exclusivamente a los caracteres a los que esta dirigida la operacion.

El control de si es una letra lo tienes que hacer igualmente, para evitar eso, lo que se trata de evitar con la AND es la suma o no, dependiendo de si es minúscula o no dicha letra. eso si, no puedes poner eso de "Ya es mayúscula"
 
Si pero, hay que comparar las mismas cosas, ¿cuanto cuesta realizar el programa de estas tablas en ensamblador? :D

Quieres decir que tardaria más de 12h????????

no lo creo.....:)
 
"Tu saber no que dices, mi joven aprendiz"
Fdo: Yoddah


Por eso me ha dejado mi compi que esta en la uni un librito mu guapo "introducción a la programación en C" de marco A. peña y Jose M. Cela de ediciones UPC que es la monda, por lo menos entiendo lo que me explica.....
 
Por eso me ha dejado mi compi que esta en la uni un librito mu guapo "introducción a la programación en C" de marco A. peña y Jose M. Cela de ediciones UPC que es la monda, por lo menos entiendo lo que me explica.....

Uy, ese me suena (claro que el nombre tampoco es gran cosa :D ) ¿es rojo?
 
Quieres decir que tardaria más de 12h????????

no lo creo.....:)

¿con tablas? ¿en ensamblador? depende de lo que sean las tablas, pero a poco que quieras ordenarlas, buscar, saber donde acaba el nombre... no es lo mismo una tabla de valores numéricos que una alfanumérica.

Ten en cuenta que el ensamblador "ya lo dominas" y el C todavía no. Cuando lo domines verás.
De todas maneras, recuerda el C te lo puedes llevar a cualquier parte, cosa que el ensamblador no, aunque te cueste creerlo, el programa de las mayúsculas lo puedes pasar casi sin modificar a un PIC, y funcionará, dependiendo del compilador, el printf y el scanf se referirá al puerto serie, pero funcionará.
 
Ten en cuenta que el ensamblador "ya lo dominas" y el C todavía no. Cuando lo domines verás.
De todas maneras, recuerda el C te lo puedes llevar a cualquier parte, cosa que el ensamblador no, aunque te cueste creerlo, el programa de las mayúsculas lo puedes pasar casi sin modificar a un PIC, y funcionará, dependiendo del compilador, el printf y el scanf se referirá al puerto serie, pero funcionará.

No, si creeros os creo, y soy consciente de que cuando sepa C las posibilidades seran infinitas, pero como viste, mi primer contacto con C fue un poquito duro, y sin vaselina, espero que gracias a vuestra ayuda y al libro que me han dejado, se me pase el nudo que tengo y deje de atragantarseme el C.
 
Arriba
© 2004-2024 Webcampista.com