Recordemos que C es un lenguaje de programación de tipado estático, es decir que comprueba la tipificación de variables en la compilación y no en la ejecución. Esta característica hace que en C existan formas particulares de declarar e inicializar variables.
Cuando nos referimos a tipos de variables en realidad nos estamos refiriendo a distintos tipos de valores que una variable puede tener. En este sentido, lo único que necesita conocer un compilador de C para crear una variable es el tipo al que pertenece y el nombre que se le quiere dar; el compilador se encarga de mantener la tabla de variables, y de asociar a cada nombre la dirección correspondiente. No hay problema si no inicializamos al momento de declarar una variable, siempre y cuando no la usemos hasta que no le hayamos dado un valor nosotros mismos.
Reglas para el Nombramiento de Variables
Todos los nombres de variables son sensibles a mayúsculas y minúsculas, lo cual indica que la variable num es distinta a la variable Num.
Las variables deben comenzar con una letra o un guión al piso (_), seguido de una combinación de letras, números y guiones al piso.
Los nombres de variables no pueden ser iguales a una palabra reservada del lenguaje C.
Lea también: IVA 21% Excel
Una variable puede tener cualquier nombre conformado por letras y/o números, que no incluya espacios, símbolos especiales, sea una palabra reservada del compilador (como el tipo de variable), ya lo tenga otra variable o función, o sea enteramente compuesta por números.
Definición de Tipos Personalizados: Fracciones
En C es posible utilizar typedef struct para crear tipos de datos personalizados. Se presenta un programa que suma, resta, multiplica y divide fracciones utilizando esta técnica.
Primero que nada se incluye la librería estándar y se define la estructura del tipo de dato llamado FRAC, el cual contiene dos variables de tipo short:
#include<stdio.h>typedef struct { short numerador; short denominador; }FRAC;El lenguaje C carece de operaciones propias de Entrada/Salida (E/S); esto se hizo para hacerlo independiente de las máquinas en que se utilizaría, y exige crear para cada máquina las funciones de entrada/salida necesarias. Esas funciones se declaran en un archivo de encabezado, stdio.h, y esta es la razón por la cual se incluye ese archivo en todos los programas que contengan operaciones de entrada/salida. El tipo short es para valores enteros.
Funciones para la Manipulación de Fracciones
Función setValue
Se define una función setvalue que va a regresar un dato tipo FRAC y va a recibir dos variables de tipo entero, a y b, que corresponden al numerador y al denominador. Esta función sirve para saber si la fracción con la que se quiere trabajar es correcta, porque si llegara a tener un 0 en el denominador no se puede realizar ninguna suma, resta, multiplicación o división con ella. Para esto, dentro de la función hay un if que ayuda a identificar el denominador y si no es 0, devuelve la variable tipo FRAC correctamente. Pero si es 0, manda un mensaje de error y regresa un valor que indica un estado incorrecto.
Lea también: Guía IVA reducido
FRAC setvalue(int a, int b){ FRAC ar; if(b!=0){ ar.denominador=b; ar.numerador=a; return(ar); } printf("Entonces el valor no existe"); ar.numerador=-1; ar.denominador=1; return(ar);}Función toPrint
Esta función, aunque es muy pequeña, es de gran utilidad para poder mostrar las fracciones en el formato numero1/numero2. Recibe una variable tipo FRAC llamada ar, de la cual obtiene el numerador (ar.numerador) y el denominador (ar.denominador) y los coloca en la forma ar.numerador/ar.denominador. La función no regresa nada porque lo único que hace es dar formato a la impresión.
void toprint (FRAC ar){ printf("%d/%d", ar.numerador, ar.denominador); return;}Función mult (Multiplicación)
Se define la función mult que va a recibir dos variables de tipo FRAC de entrada, a y b, y va a regresar otro tipo FRAC al que se le llamó ar. Para obtener la multiplicación de una fracción se tiene que multiplicar el numerador1 por el numerador2 y el denominador1 por el denominador2. En código, es igual. Se obtiene el valor de FRAC ar, es decir, el valor de ar.numerador y ar.denominador, multiplicando a.numerador*b.numerador para ar.numerador, y a.denominador*b.denominador para ar.denominador.
FRAC mult(FRAC a, FRAC b){ FRAC ar; ar.numerador=a.numerador*b.numerador; ar.denominador=a.denominador*b.denominador; return(ar);}Función div (División)
Para la división se multiplica el numerador1 por el denominador2 y el numerador2 por el denominador1. La forma de implementarlo en código es:
FRAC div(FRAC a, FRAC b){ FRAC ar; ar.numerador=a.numerador*b.denominador; ar.denominador=a.denominador*b.numerador; return(ar);}Función suma (Suma)
La fórmula para sumar fracciones es multiplicar el numerador1 por el denominador2 y sumarle la multiplicación del numerador2 por el denominador1, esto es el numerador resultante. El denominador se obtiene de multiplicar el denominador1 por el denominador2. Este es el código en C:
FRAC suma(FRAC a, FRAC b){ FRAC ar; ar.numerador=a.numerador*b.denominador+b.numerador*a.denominador; ar.denominador=a.denominador*b.denominador; return(ar);}Función rest (Resta)
Para la resta, la operación es similar a la suma, pero restando:
Lea también: ¿Cómo localizar tus XML del SAT?
FRAC rest(FRAC a, FRAC b){ FRAC ar; ar.numerador=a.numerador*b.denominador-b.numerador*a.denominador; ar.denominador=a.denominador*b.denominador; return(ar);}Función Principal (main) y Ejemplo de Uso
La función principal main se encarga de llamar a todas las funciones explicadas. Primero se definen tres variables tipo FRAC: las dos primeras son los datos de entrada para las operaciones, y la tercera es el resultado. En los primeros renglones del main, se puede ver la llamada a la función multiplicar que, en primer lugar, da valores a las dos fracciones con las que se trabajará. Después, evalúa con la función setvalue para asegurar que el denominador no sea 0. Enseguida, llama a la función de multiplicar para obtener el resultado. Lo que sigue es la forma de imprimirlo con la función toprint, la cual permite usar / para que se puedan ver las fracciones en la pantalla. Luego, se usa otro printf para mostrar el operador correspondiente (multiplicación, división, suma o resta).
int main(void){ FRAC nomvar1, nomvar2, nomvar3; nomvar1=setvalue(1,3); nomvar2=setvalue(1,2); nomvar3=mult(nomvar1, nomvar2); printf("\n\t"); toprint(nomvar1); printf(" * "); toprint(nomvar2); printf(" = "); toprint(nomvar3); FRAC n1, n2, n3; n1=setvalue(1,3); n2=setvalue(1,2); n3=div(n1, n2); printf("\n\t"); toprint(n1); printf(" / "); toprint(n2); printf(" = "); toprint(n3); FRAC m1, m2, m3; m1=setvalue(1,3); m2=setvalue(1,2); m3=suma(m1, m2); printf("\n\t"); toprint(m1); printf(" + "); toprint(m2); printf(" = "); toprint(m3); FRAC p1, p2, p3; p1=setvalue(1,3); p2=setvalue(1,2); p3=rest(p1, p2); printf("\n\t"); toprint(p1); printf(" - "); toprint(p2); printf(" = "); toprint(p3); printf("\n\n\n"); system("pause"); }Consideraciones y Buenas Prácticas
Cuando hacemos algo no esperado, como asignar un valor fuera de rango, asignar un valor que no concuerda con el tipo de la variable, sumar variables numéricas con alfanuméricas, o asignar decimales a un número entero, etc., puede que salte un error. Por ejemplo, una variable que se declare como tipo int pero a la que se asigna un contenido numérico real con dos decimales no da lugar a un error, pero sí a una pérdida de información derivada de que el número decimal se va a truncar a un entero.
Como programadores, hemos de buscar programas “100% predecibles”, en los que no se pueda producir que "sea difícil prever lo que va a suceder". Por tanto, intentaremos que la declaración y asignación de contenidos a variables se ajuste a las normas previstas.
