[C con Clase] Varias dudas

Steven Davidson steven en conclase.net
Vie Feb 2 23:01:02 CET 2007


Hola Alejandro y Santiago,

El pasado 2007-02-01 14:24:10, Alejandro escribió:

A> Hola, tengo un par de dudas que os quería plantear para que me ayudéis a resolverlas:

Muy bien. Veamos las dudas.

A> He conseguido una tabla sobre el código ASCII (en inglés por desgracia) pero sólo aparecen los signos que corresponden a los números del 1 al 255 y sin embargo el carácter 'ñ' es el número - 92. ¿Alguien me podría decir dónde encontrar algo más completo?

Primeramente, ASCII estándar es de 7 bits. Por lo tanto, los códigos van de 0 á 127 (ambos incluidos). Por razones obvias, esta cantidad de caracteres se considera bastante limitada, por lo que otros grupos y compañías crearon extensiones. Las típicas extensiones fueron a 8 bits. Esto dobla la cantidad de caracteres y por tanto tenemos códigos de 0 á 255, cabiendo en 1 byte. Más tarde, IBM extendió nuevamente el conjunto de caracteres ASCII para representar combinaciones de las teclas especiales como las flechas, las seis teclas de "insert", "supr" (o "del"), "home", etc., [CTRL], [ALT], y las teclas de función como F1, F2, F3, ..., F12. Sin embargo, esto no es estándar, aunque sí es popular.

Me temo que entramos en otro problema, que es el uso de varios conjuntos o tablas de caracteres. En un sistema gráfico, como es por ejemplo MS-Windows, nos encontramos con que tenemos a disposición varios diferentes tipos de fuentes. cada fuente tiene su propia tabla de equivalencias. Esto es, tenemos los mismos códigos ASCII, pero su equivalencia a los caracteres - símbolos gráficos - puede diferir poco o mucho. Por ejemplo, la fuente "Wingdings" simbólica o gráficamente no tiene mucho que ver con la fuente "Helvetica". En otras plataformas, usan ciertos conjuntos de caracteres, pero esto depende de la configuración del sistema.

Lo único que podemos asegurar es el conjunto de caracteres del ASCII estándar; es decir, los primeros 7 bits: de 0 á 127.

Si quieres algo que vaya más allá de 256 posibles caracteres, entonces tienes que abandonar ASCII y pasarte a Unicode. Para casi todos los usos, Unicode te servirá. Sin embargo, ANSI C/C++ no usa Unicode, sino ASCII. Por lo tanto, tendrás que usar funciones no estándares y posiblemente especializadas para tu plataforma que manipulen la parte gráfica para usar Unicode.

A> En el capítulo "Normas para la notación" habláis de la notación decimal, octal o hexadecimal. Decís que son más útiles que la hexadecimal y la octal que la decimal. El problema es que no tengo ni idea de pasar de una a otra y me resulta muy difícil. Si realmente es importante saber esas notaciones, ¿me podría ayudar alguien diciéndome cómo pasar de una a otra?

Sugiero consultar el artículo escrito por Salvador Pozo acerca de la teoría de los sistemas numéricos. Puedes ir directamente a: http://articulos.conclase.net/numeracion/numeracion.html

A> En el cuarto problema de arrays habláis de incrementar un número, pero¿cómo lo he de incrementar? Yo he conseguido hasta ahora identificar si en la cadena hay números y cómo sacarlos (hay que restar 48 ya que en ASCII el 48 es igual a 0). Ahora quiero saber cómo incrementar, por ejemplo, la cadena '45'.¿ Debe salir '000000045'?

Sugiero usar caracteres y no los códigos ASCII. O sea, al escribir el código fuente, usa '0' y no 48. Esto es porque no todo el mundo tiene memorizado la tabla ASCII.

En cuanto al ejercicio, lo que se pretende hacer es que manipules los caracteres para emular el incremento por uno del "número" representado. Por ejemplo,

"1234" + 1 = "1235"

Esto sería el comportamiento de la función 'Incrementa()'. La implementación involucrará manipular los caracteres de la cadena para que aparente ser incrementado. Como estos caracteres y por tanto sus códigos ASCII para representar dígitos son contiguos y ordenados de menor a mayor, podemos sumar uno a un carácter-dígito y posiblemente obtengamos su carácter-dígito correlativo. Por ejemplo,

char car = '8';
car++;

cout << car;

Aparecerá en pantalla:
9

Ahora bien, el primer problema que vemos con esto es al sumar 1 al carácter '9'. El resultado será: '9' + 1 = ':' (código 58). Por lo tanto, tendrás que hacer algo al respecto.

Básicamente, la implementación de esta función se basa en lo que aprendimos en el colegio:

  12399
+     1
-------
      0  y nos llevamos 1

     1
  12399
+     1
-------
     00  y nos llevamos 1

    1
  12399
+     1
-------
    400  (ya no nos llevamos 1, podríamos decir que nos llevamos 0)

  12399
+     1
-------
  12400

Tendrás que hacer algo similar con 'Incrementa()'.

A> En una función de tipo 'bool', si tu dices que devuelva true el resultado es '1' y false devuelve '0'. ¿Por qué?

Esto no es del todo cierto. Lo único que podemos asegurar es que 'false' se puede convertir a 0 (cero) y viceversa. Sin embargo, 'true' puede ser cualquier otro valor, que no sea cero. El valor numérico de 'true' puede ser 1, -1, o incluso 4294967295. Todo depende del compilador y quizás hasta cierto punto del sistema operativo.

Nuevamente, lo único que podemos asegurar es la siguiente equivalencia:

false   0
true    distinto de 0

La razón tiene que ver con el motivo de mantener compatibilidad entre C y C++. Bajo C, no existe el tipo booleano, pero sí existen las expresiones booleanas. El criterio para determinar si tales expresiones son verdaderas o falsas es el mismo que la equivalencia anterior; o sea, bajo C, se mantiene que,

0             => falsedad
distinto de 0 => verdad


Espero haber aclarado las dudas.

Steven


Más información sobre la lista de distribución Cconclase