viernes, 15 de junio de 2012

Introducción al Lenguaje C


Presentación de la unidad
En la Unidad anterior te presentamos un conjunto de instrucciones que una ardilla (ficticia) podría realizar y te mostramos cómo, a través de éstas, la ardilla podía resolver varios problemas siempre y cuando se definiera un algoritmo.
Ahora veamos qué relación hay entre el mundo de la ardilla y las computadoras: la ardilla representa la computadora, que sólo puede ejecutar un conjunto de instrucciones definidas; al igual que la ardilla, la computadora por sí misma es incapaz de resolver ningún problema, para hacerlo necesita un programa que pueda seguir (ejecutar) para obtener el resultado deseado, así como la ardilla necesitaba un algoritmo que le indicara cómo realizar una tarea específica.
Para comenzar a resolver problemas simples por medio de la computadora, en esta Unidad aprenderemos la forma en que se crean los programas en el lenguaje de programación C, desarrollado por Dennis M. Ritche en el año de 1972 en los laboratorios Bell de AT&T y que posteriormente fue estandarizado por un comité del ANSI (por sus siglas en inglés American National Standard Institute) dando lugar al ANSI C, a través del cual se garantiza que cualquier programa creado bajo este estándar pueda ser ejecutado en cualquier computadora (Kernighan & Ritchie, 1991).
Los elementos básicos del lenguaje de programación C que estudiaremos en la Unidad son:
  • Tipos de datos, variables y constantes
  •  Expresiones aritméticas
  • Funciones matemáticas
  • Funciones de entrada y salida.
Propósito de la unidad
  • Distinguirás la estructura de un programa en lenguaje C.
  • Declararás las variables y constantes que se utilizan en un algoritmo en lenguaje C.
  • Codificarás expresiones matemáticas en lenguaje C.
  • Utilizarás funciones de la biblioteca estándar de C para codificar instrucciones de entrada y salida y funciones matemáticas.
  • Utilizarás un entorno de trabajo de C para escribir, compilar y ejecutar programas escritos en C.
Competencia(s) específica(s) 
Utiliza el lenguaje de programación C para resolver problemas a través de la implementación de algoritmos secuenciales.

3.1. Componentes de un programa
En general, “un programa es una secuencia de instrucciones mediante las cuales se ejecutan diferentes acciones de acuerdo con los datos que se estén procesando” (López, 2005).
En la Unidad 1 se explicó que un programa puede ser ejecutado por una computadora solamente si está escrito en lenguaje de máquina, pero escribir los programas en ese lenguaje puede resultar una labor altamente complicada, es por eso que existen los lenguajes de programación, que son fáciles de entender para los seres humanos y a través de ellos se pueden escribir programas más legibles conocidos como programas fuente –en C los programas fuente tienen extensión .c –, que son traducidos a lenguaje de máquina mediante compiladores o traductores.
En el caso de C, se trata de un lenguaje compilado, por lo que se genera un programa ejecutable con extensión .exe, que puede ser ejecutado cada vez que se desee sin necesidad de volver a compilar el programa fuente, a menos que se realice algún cambio.
De acuerdo con su creador un programa fuente en C, cualquiera que sea su tamaño, consta de funciones y variables.
Una función contiene un conjunto de instrucciones, también llamadas preposiciones o enunciados, que especifican las operaciones que la computadora debe realizar; en tanto, las variables son los espacios de memoria donde se almacenan los valores utilizados en dichas operaciones (Kernighan & Ritchie, 1991, p. 6).
A continuación se explican las partes que componen un programa.
Tipos de operadores 
Para explicar los componentes de un programa, analizaremos la estructura del programa “hola_mundo.c”, que es el primer programa que por tradición se realiza cuando se aprende a programar en un nuevo lenguaje de programación. A partir de este ejemplo se revisará la estructura de un programa y los elementos que lo integran. A continuación se muestra la estructura general: 

Programa hola_mundo.c

#include <stdio.h>             /*Directivas de preprocesador*/
main( )                              /* Definición de función Principal */
{
printf(“Hola mundo… \n”);
}
El programa hola_mundo.c solo tiene una función: main; generalmente se puede dar cualquier nombre a las funciones que se definan en un programa, sin embargo, main es una función especial que siempre debe aparecer en algún lugar del programa, ya que es el punto desde el cual se inicia la ejecución (equivale a la instrucción de inicio de un algoritmo). Los paréntesis “( )” que aparecen después de  la palabra main indican que se trata de una función;  las instrucciones que forman parte de ésta, llamadas cuerpo de la función, van encerradas entre llaves “{ }”, señalando el inicio y fin de la misma, respectivamente.
Las instrucciones que comienzan con “/*” y terminan con “*/”, se llaman comentarios e  indican que todo lo que está escrito entre esos símbolos no son instrucciones que la computadora debe ejecutar sino información de interés para el programador; por ejemplo la primera línea de código:
/*Directivas de preprocesador*/
Otro tipo de instrucciones especiales son las directivas del preprocesador, que son instrucciones que se realizan antes de la compilación del programa,  un ejemplo es:
#include<stdio.h>
Se distinguen porque inician con el carácter gato “#”, en este caso esta instrucción le indica al compilador que debe incluir la información que está definida en el archivo de biblioteca stdio.h, en el cual se encuentran todas las funciones de salida y entrada, como printf.

Los compiladores de lenguaje C ofrecen distintas directivas, sin embargo las que utilizaremos son:
#define,  que sirve para definir de constantes y/o macros
#include, que se utiliza para incluir otros archivos
 
En el cuerpo de la función main, del programa 3.1, sólo aparece una instrucción que es la invocación a la función printf con el argumento “Hola mundo… \n”
printf(“Hola mundo… \n”);

Invocamos o llamamos una función cuando requerimos que se ejecute con un conjunto de datos específicos, a los cuales llamamos argumentos. Una función se invoca o llama al nombrarla, es decir, escribiendo su nombre seguido de la lista de argumentos, separados por comas y encerrados entre paréntesis. En otras palabras,  los argumentos son los valores que una función necesita para realizar la tarea que tiene encomendada, por ejemplo, la función printf tiene como fin imprimir la cadena de caracteres que recibe como parámetro, en este caso particular imprimirá la frase “Hola mundo…” seguida de un salto de línea, que es lo que representa la secuencia de caracteres “\n”.

Actividad 1. Introducción al lenguaje C - Presentación 
Como sabes, la intención de esta asignatura es que aprendas a diseñar programas en C que te sean de utilidad para resolver problemas por medio de la computadora. Para lograrlo, es necesario que perseveres y practiques constantemente hasta habituarte en el manejo de los elementos de C; con ese propósito, durante toda esta Unidad y las que siguen, te presentaremos varios ejercicios que deberás realizar como complemento de las demás Actividades y Evidencias de Aprendizaje, los ejercicios propuestos para esta Unidad son:
Ejercicio A: Hola mundo.
Deberás escribir, compilar y ejecutar el programa hola_mundo.c y compartir tu experiencia en el foro destinado para la actividad.
Ejercicio B: Estructura general de un programa.
Consiste realizar lo mismo que en el anterior pero aplicado a un programa más complejo en el que identificarás la estructura general de un programa en C.
Ejercicio C: Bibliotecas y funciones.
Cuando estudies el tema de Bibliotecas y funciones codificarás y ejecutarás un pequeño programa que implemente esos elementos. 

Actividad 1. Introducción al lenguaje C - Ejercicio A 
hola_mundo
El primer ejercicio consiste en la elaboración del programa hola_mundo.c. Realiza lo siguiente:
1. Busca, descarga e instala el compilador DevC++, el cual es el software libre que utilizaremos durante todo lo que resta del curso para compilar los programas que se realicen.
Para conocer cómo funciona el compilador, busca información al respecto.
2. Escribe, compila (con DevC++) y ejecuta el programa “hola_mundo.c”.
En caso de que el compilador envíe errores, te sugerimos verificar que hayas copiado correctamente el programa.
3. Ahora reflexiona: 
¿Te quedó claro todo? si
¿Comprendiste perfectamente todo lo que hiciste y por qué? Si, por que ya tengo
¿Tienes alguna duda relacionada con alguno de los componentes del programa? No
4. Ingresa a la base de datos y comparte tu reflexión con tus compañeros(as), si es el caso, expón las dudas o preguntas que te surjan para que entre todos podamos darles respuesta. No es necesario que subas tus archivos a menos que así lo requieras para presentar tu comentario.

3.1.1. Instrucciones
Una instrucción o enunciado en lenguaje C se puede definir como una expresión que tiene alguna consecuencia, generalmente ésta se ve reflejada en el cambio del valor que está almacenado en las variables. De acuerdo con su estructura sintáctica se pueden clasificar en dos tipos: simples y compuestas.

Instrucciones en C 
Instrucciones simples y compuestas.
Las instrucciones simples se distinguen porque terminan con punto y coma
La sintaxis es:
<instrucción>;

Como ejemplo de instrucciones simples tenemos la declaración de variables, la llamada de funciones y la asignación.
int x;
x = 2*y;
printf(“Hola”);

En cambio las instrucciones compuestas son un conjunto de instrucciones que se escriben entre llaves {}
La sintaxis es:
{
<instrucción>;
<instrucción>;
<instrucción>;
}

Un ejemplo de este tipo de instrucciones es el cuerpo de la función
main, del programa 3.1:
/*Directivas de preprocesador*/
#include <stdio.h>
/* Definición de función Principal */
main
{
}

3.1.2. Comentarios
Los comentarios son textos que sirven como información al programador y no son procesados por el compilador, es decir, no son instrucciones que debe realizar la computadora y por lo tanto, no son traducidos a lenguaje de máquina. Para que un texto sea considerado como comentario debe estar entre los símbolos /* (marca el comienzo) y */ (marca el final del comentario).
Pueden ir en cualquier parte del programa
Un(a) buen(a) programador(a) debe comentar sus programas para que otras personas puedan entender la lógica de éstos; incluso, los comentarios pueden ser de utilidad al (a la) programador(a) cuando en un tiempo futuro requiera realizar cambios.
Es recomendable incluir al inicio de éstos:
  • Nombre del programa
  • Nombre del programador
  • Breve descripción de la tarea que realiza
  • Fechas de creación y de la última modificación
Todo lo anterior encerrado entre comentarios.
Por ejemplo, al inicio del programa hola_mundo.c sería conveniente incluir el comentario que se muestra en la imagen del lado derecho.
Los comentarios también se pueden incluir al lado de una instrucción para describir de qué se trata, por ejemplo:
printf(“Hola mundo”); /* Imprime el mensaje “Hola mundo” en la pantalla*/

3.1.3. Palabras reservadas
Las palabras reservadas de cualquier lenguaje de programación, se llaman así porque tienen un significado especial para el compilador, el lenguaje C tiene 32 palabras reservadas (27 fueron definidas en la versión original y cinco añadidas por el comité del ANSI: enum, const, signed, void y volatile), todas ellas escritas con minúsculas
En la siguiente tabla se muestran todas las palabras claves o reservadas de lenguaje C. Es importante que las tengas en cuenta a la hora de realizar tus programas.
3.1.4. Estructura general de un programa
Ahora que ya se han descrito los diferentes elementos que integran un programa de lenguaje C, podemos describir su estructura general.
Si observas el programa hola_mundo.c , verás que la primera instrucción en el programa es la directiva al preprocesador, seguida de la función main y las instrucciones que la integran. Esta estructura corresponde a los programas más simples, pero es similar a la de cualquier programa en C. La forma general de un programa en este lenguaje es la que se muestra en el siguiente cuadro:
3.1.4. Estructura general de un programa
Como se ha mencionado, se pueden incluir comentarios en cualquier parte del código. Para dejar más claro esto, a continuación se presenta un programa que calcula el área de una circunferencia dada la medida de su radio.

Comentarios
Directivas del procesador
Declaraciones globales
Función principal
{
Declaración de variables
}
Por el momento, basta con que observes la estructura del programa, sobre todo en la parte de los comentarios; el significado de cada una de las líneas del código se irá definiendo en las siguientes secciones.
Para cerrar esta sección en la siguiente figura se muestra la ejecución del programa con la entrada radio=3.
Actividad 1. Introducción al lenguaje C – Ejercicio B 
Estructura general y ejecución de un programa
Realiza lo siguiente:
Escribe el programa areaCircunferencia.c
Compílalo con DevC++  y ejecútalo dando diferentes valores para el radio.
Ingresa a la base de datos para comentar tu experiencia, tus dudas, o para responder a los comentarios de tus compañeros.
Para ingresar a la base de datos: En la ruta (parte superior izquierda del aula) da clic en Fundamentos. Se enlistarán las actividades de la Unidad 3 y ahí da clic en la Actividad 1. Introducción al lenguaje C.
3.2. Tipos de datos
En la Unidad 1 se mencionó que todos los datos que son procesados por una computadora se almacenan en la memoria principal y, no importa de qué tipo sean, se representan por medio de unos y ceros; sin embargo, no todos se pueden representar con el mismo número de bits, esto sí depende del tipo de dato que se trate. Por ejemplo, los caracteres como: a, @, Z, entre otros, se representan utilizando 8 bits, en cambio para representar un número decimal se utilizan, al menos, 32 bits; por lo que, cuando se crea un espacio de memoria, es necesario indicar qué tipo de dato se desea almacenar ahí, para que se reserve la cantidad de celdas de memoria que se necesitan y las operaciones que se pueden realizar con ellos.
En general, los tipos de datos que existen, independientemente del lenguaje de programación utilizado, se pueden clasificar de la siguiente forma:
Por el momento, sólo nos enfocaremos en los tipos de datos simples definidos en el estándar de C, en la Unidad 5 se estudiarán los datos estructurados.

En la siguiente tabla se muestran los tipos de datos simples en:
Es posible aumentar o disminuir la capacidad de representación de los números utilizando los modificadores long, short y unsigned. De esta manera las combinaciones que se ajustan al estándar ANSI, junto con sus rangos mínimos, son las que se muestran aquí.
Una vez que conocemos los tipos de datos que se pueden representar en lenguaje C, es conveniente saber cómo se reservan espacios de memoria donde son almacenados, esto es justo lo que se explica en el siguiente Tema.

3.3. Variables y constantes
Tanto las variables como las constantes en lenguaje C se utilizan para almacenar valores, la diferencia que existe entre ellas es que en una el valor almacenado puede cambiarse en cualquier instante del programa y en la otra no. En seguida lo explicamos. A lo largo de este tema descubrirás cómo puedes construir variables y constantes en lenguaje C. Avanza al primer subtema para continuar.
3.3.1. Identificadores
En lenguaje C hay una serie de restricciones en cuanto a los nombres o identificadores, ya sea de variables, constantes o funciones. Éstas son:
  •  Los identificadores se integran por letras y dígitos pero es necesario que el nombre siempre comience con una letra, por ejemplo: enteroA, arco3, S184.
  •  No pueden contener caracteres especiales, por ejemplo, acentos (á, í), la letra eñe (Ñ), gato (#), guión (-), etc. El caracter de subrayado “_” es el único caracter especial que puede utilizarse, generalmente se usa para darle una mejor legibilidad al nombre de una variable, por ejemplo: entero_A, area_Circulo, i_elemento.
  • No pueden contener espacios en blanco.
  • No pueden ser palabras reservadas.
  • Se distingue entre letras mayúsculas y minúsculas, esto significa que los siguientes identificadores son distintos: area, Area, AREA.
Aunque no es una regla, se recomienda que los identificadores sean significativos, es decir, que el nombre indique qué dato se está almacenando ahí.
Ejemplo 3.1:
1) Se requiere una variable para almacenar el radio de un círculo.
Las opciones sugeridas son: radio, radioCirculo, radio_circulo.
2) Se requiere un identificador para una variable que almacene el promedio de ventas anuales de una tienda departamental.
Opciones sugeridas: promedioVentas, prom_Ventas, promAnual.
3) Para almacenar el número telefónico de una persona.
Como opciones sugeridas tenemos: tel, telefono, nTel.
Ahora que ya conoces las reglas para escribir los nombres de las variables y las características básicas que pueden tener, estás listo(a) para descubrir cómo se crean las variables en lenguaje C. A esta acción se le denomina declaración de variables.
3.3.2. Declaración e inicialización de variables
La declaración de una variable es una instrucción que proporciona información de la variable al compilador, para que éste reserve en memoria el espacio adecuado y la referencia (identificador) para tener acceso a ella. Las declaraciones en general tienen la siguiente sintaxis:
<tipo> <identificador>;
Donde <tipo> se refiere a un tipo básico de C y el <identificador> se refiere al nombre con el cual se identificará el espacio de memoria reservado, puede ser cualquier nombre siempre y cuando se respeten las reglas vistas previamente. Veamos los siguientes ejemplos:
int edad;                     /* declara una variable de tipo entero con el identificador edad*/
float area;                 /* declara una variable de tipo float a la cual identificará por area*/
También es posible declarar una lista de variables de un mismo tipo separando los nombres con comas “,”:
<tipo> <identificador1>, … , <identificadorN>;
Podemos ver un ejemplo de este tipo de declaración en el programa que calcula el área de una circunferencia (programa 3.2), cuando declaramos las variables locales a la función main:
float radio, area;               /* declara dos variables (radio y area) de tipo float*/
Siempre es posible asignarles un valor inicial a las variables cuando las declaramos, a esta operación se conoce como inicialización. La sintaxis es:
<tipo> <identificador>=<valor>;
Del mismo modo, podemos inicializar varias variables:
<tipo><identificador1> = <valor1>, … , <identificadorN> = <valorN>;
Para ilustrar esto, se presentan los siguientes ejemplos de variables inicializadas:
int edad = 18;
float radio = 3.0, area = 0.0;
En la figura se muestra una representación gráfica de estas declaraciones e inicializaciones que puede ayudar a darte una idea general de lo que sucede en la memoria: Las columnas de Dirección representan la dirección física de los registros en la memoria RAM, si ha sido asignada una variable se escribe su identificador junto a la dirección, en Contenido se muestra el dato que está almacenado para esa variable. El estado de una variable hace referencia al valor del dato que hay almacenado en un momento determinado.
De lo anterior tenemos que: a la variable edad le corresponde la dirección de memoria 02 y su estado es 18; a la variable radio le corresponde la dirección 51 y su estado es 3.0; y por último, a la variable area le corresponde la dirección 54 y el estado es 0.0.
3.3.3. Tipos de constantes
Como ya se mencionó antes, las constantes son expresiones con un significado invariable, pueden clasificarse en dos tipos: literales y simbólicas.
Las constantes literales son valores de un determinado tipo, escritos directamente en un programa y pueden ser de los siguientes tipos:
a) Constantes numéricas
Son números representados en sistema decimal, algunas veces se estila escribir una letra que indique el tamaño o tipo de la constante numérica:
Enteros: Por ejemplo 123, 2006, -38…
Enteros Largos: Se consideran números enteros que superan un entero (int) generalmente valores mayores a 32,000; se le agrega los sufijos l o L por ejemplo: 123456789L.
Enteros sin Signo: Aquí se define que el valor de la constante se va a considerar como un número positivo o mayor a cero, en estos casos se agrega el sufijo U o u así por ejemplo podemos escribir: 123456789LU.
Flotantes: Los valores numéricos que impliquen precisión decimal se pueden escribir de dos formas, la primera sería: 14324.983 ó 3.1416. También se puede expresar en representación exponencial (e-n), por ejemplo: 1.1434E2 o 1.1432e-5. También se ocupan los sufijos f o F y l o L para especificar los tipos double.
Como puedes observar, las constantes reales con representación exponencial, tienen como valor una parte entera o real en forma decimal, seguida por la letra E o seguida de una constante entera, que se interpreta como exponente de la base 10.
b) Constantes carácter
Se representa internamente por el lenguaje C como un número entero corto (short int). Una constante carácter siempre debe ir entre apóstrofes, por ejemplo: ‘x’, ‘A’.
También existen constantes carácter que aparentan ser compuestas pero sólo son representaciones de caracteres de formato o caracteres especiales y en C se les conoce como secuencias de escape.
\n’ Salto de línea
‘\t’ Tabulador
‘\b’ Espacio hacia atrás
‘\f’ Salto de página
‘\”’ Comillas
‘\\’ Barra invertida

c) Constantes cadena
Son una secuencia de caracteres entre comillas, incluyendo secuencias de escape, por ejemplo: “hola”, “hola mundo \n”. Las constantes simbólicas representan datos permanentes que nunca cambian.
Las constantes de este tipo son representadas por un nombre (simbólico) en el código del programa. Del mismo modo en que ocurre con las constantes literales éstas no pueden cambiar su valor, sin embargo para utilizar el valor constante se utiliza el nombre simbólico que le ha sido otorgado.
Este tipo de constantes mantienen dos ventajas muy claras sobre las constantes literales, una es que la escritura del código es más clara y otra que facilita la edición de los valores contenidos en el código del programa. En el siguiente subtema ahondaremos en esto.
3.3.4. Declaración de constantes  
En C existen dos formas de declarar una constante simbólica. La primera es utilizando la directiva de preprocesador #define, la cual asocia un identificador a un valor constante, sin reservar espacio en memoria, por lo que no podemos decir estrictamente que se declara, sólo se define. La sintaxis general es la siguiente:
#define <identificador> <valor_constante>
Por ejemplo:
#define PI 3.1416
Con esta instrucción, cada vez que en el programa se escriba el identificador PI, éste será sustituido por el compilador con el valor de 3.1416 (no se almacena el valor 3.1416 en ningún espacio de memoria sólo se hace una sustitución textual en el momento de compilación).
La segunda forma de declarar una constante simbólica es reservando espacio de memoria que tenga la restricción de sólo lectura, para impedir que el valor sea cambiado, en este caso sí la declaramos. La sintaxis general es similar a la forma de declarar una variable sólo que se antepone al tipo la palabra reservada const y es obligatorio asignar un valor:
Const <tipo> <identificador> = <valor_constante>;
Por ejemplo:
const float PI 3.1416;
La directiva #define debe escribirse al principio del programa antes del main, en cambio, la declaración de una constante mediante const puede ser escrita dentro o fuera de las funciones al igual que las declaraciones de variables.
Se recomienda escribir el nombre de una constante con letras mayúsculas para diferenciarlas de las variables, pero las reglas son exactamente las mismas que para los identificadores de las variables.
Evidencia de Aprendizaje: Programa en C. Análisis del problema  
Ha llegado la hora de retomar el desarrollo del programa en C que estás realizando como parte de la Evidencia de Aprendizaje, hasta el momento ya debes contar con tu problema perfectamente delimitado.
Lo que corresponde para esta unidad es implementar la fase dos del proceso, que consiste en hacer el análisis del problema para que en la siguiente unidad se pueda comenzar el diseño del algoritmo en pseudocódigo o diagrama de flujo.
Realiza lo siguiente:
1.-En un archivo de Word, analiza cuidadosamente el problema planteado, para ello considera:
·         Los datos que se necesitarán como entrada y salida del programa, es decir, qué necesitará ingresar el usuario, y qué se espera que devuelva el programa como resultado final.
·         La metodología que seguirás para resolver el problema, es decir, qué elementos de programación necesitará el programa para resolver el problema. Por ahora no necesitas delimitarlo muy a detalle, ya que conforme avances en el estudio de las unidades siguientes, aprenderás nuevos elementos que se pueden incorporar al programa. Lo importante en este punto es que plantees una estructura general que podría servir para el algoritmo.
2.-En el mismo documento, realiza un esbozo del algoritmo en lenguaje natural (no necesitas hacerlo en diagrama de flujo ni pseudocódigo) para presentar la estructura general que tendrá tentativamente tu programa.
3.-Guarda tu trabajo con el nombre FPR_U3_EA_XXYZ.doc y envíalo mediante el Portafolio de evidencias; espera a que tu Facilitador(a) devuelva los comentarios a tu trabajo, atiende lo que se te indique y haz los ajustes necesarios para mejorar tu Evidencia.
Nota: El plazo límite para enviar la segunda versión de la Evidencia de Aprendizaje es hasta que acabe la Unidad (consulta al (a la) Facilitador (a) para mayor información).
Para conocer los lineamientos de evaluación de esta evidencia, descarga el siguiente documento. EscalaEvidenciaU3_FPR.doc
Para enviar tu evidencia: En la ruta (parte superior izquierda del aula) da clic en Fundamentos. Se enlistarán las actividades de la Unidad 3 y da clic en la Evidencia de Aprendizaje: Programa en C. Análisis del problema
3.4. Expresiones matemáticas  
Las expresiones matemáticas representan una de las partes importantes de la programación en C, ya que a través de ellas se pueden resolver problemas de distintas clases. Éstas pueden ser un número, una variable, una constante o la combinación de operadores y todas las anteriores. Toda expresión al ser evaluada produce un valor.
Se dividen en dos tipos de acuerdo al tipo de datos que devuelven cuando son evaluadas:
  • Expresiones aritméticas cuando el resultado de la evaluación es un número.
  • Expresiones booleanas cuando el resultado de la evaluación es un valor booleano (verdadero o falso). En este punto es importante destacar que el modo en que el lenguaje C maneja los valores booleanos es por medio de valores enteros: cero equivale a falso y cualquier entero distinto de cero representa verdadero.
Las expresiones matemáticas permiten modelar situaciones reales; por ejemplo, mediante las expresiones aritméticas podemos modelar la forma de calcular el área de cualquier figura, también podemos representar la forma de calcular las raíces de un polinomio de segundo grado, o calcular el monto de una venta, etc. En cambio las expresiones booleanas son la base para construir programas que pueden tomar decisiones.
Observa los siguientes ejemplos:
Ejemplo 3.2
a) La hipotenusa es igual a la raíz cuadrada de la suma de los cuadrados de catetos.
Codificación en C:           c =sqrt(a*a + b*b);
b) ¿x es un número par?
Sabemos que un número es par si es divisible entre 2, en otras palabras, si el residuo de la división entre dos es cero, lo cual se puede expresar con el operador de módulo, que devuelve el residuo de una división.
Codificación en C:           x % 2 == 0
En el próximo subtema se presentan los operadores básicos del lenguaje C, tanto aritméticos como booleanos.
3.4.1. Tipos de operadores  
Los operadores son palabras o símbolos que permiten realizar operaciones con los datos de un programa, para cada tipo de datos hay una serie de operadores definidos.
Entre todos los operadores se distingue el operador de asignación “=”, que se puede leer como “guarda un valor en la variable indicada”, el valor puede ser una constante literal o el resultado de una expresión. Cabe señalar que este operador en pseudocódigo o diagrama de flujo lo hemos representado con una flecha apuntado hacia la izquierda ←.
Veamos algunos ejemplos:
radio =3.0;                             /* modifica el estado de la variable radio con el valor 3.0*/
area=PI*radio*radio;            /* modifica el estado de la variable por el resultado de evaluar la expresión PI * radio * radio */
Mencionamos ya que existen dos tipos de operadores básicos que se pueden utilizar en el lenguaje C, a continuación los explicamos:
Los operadores aritméticos definidos en C son: “+” (suma), “-” (resta), “*” (multiplicación),“/” (división) y “%”(módulo). Este último representa el residuo de dividir dos números enteros, por ejemplo si realizamos la división de 6 entre 15 (15/6), el cociente es 2 y el residuo es 3, al aplicar el operador módulo a estos valores tenemos:
15 % 6 → 3
21 % 4 → 1
En C también existen los operadores de incremento “++” y decremento “--“, éstos tienen el efecto de aumentar o disminuir en una unidad el valor de una variable, supongamos que estamos trabajando con la variable x:
x++;/* equivale a hacer: x = x + 1;*/
x--; /* equivale a hacer: x = x – 1;*/
Por ejemplo, si el valor de x es 5 el resultado de aplicar ++ y -- es:
x++; →  6
x--;     4
Los operadores que permiten construir expresiones booleanas son:
Operadores relacionales que manipulan expresiones aritméticas y son:
“>” (mayor que), “<” (menor que), “>=” (mayor o igual), “<=” (menor o igual), “==” (igual), “!=” (distinto)
Operadores booleanos también llamados lógicos, manipulan únicamente expresiones booleanas y son:
“!” (negación), “||” (disyunción) y “&&” (conjunción).
Observa que el operador de igualdad se escribe con dos símbolos de igualdad seguidos (==). El error más común es escribir una comparación con un sólo símbolo de igualdad, recuerda que (=) es el operador de asignación y su significado es totalmente distinto. En cuanto a los operadores booleanos, su significado es el siguiente:
Negación“!”, es un operador unario que cambia el valor de verdad de la expresión a la cual se le aplica. Por ejemplo, si el valor de verdad de expresión es verdadero entonces devuelve falso, y viceversa. Por ejemplo, si x=2, y=3, z=5
!(z > x ) → !(5 > 2 )→!(1)→ 0 (falso)
!(x > y ) → !(2 > 3 )→ !(0)→ 1 (falso)
En pseudocódigo o diagrama de flujo se representa con la palabra en inglés NOT
Conjunción“&&”, es un operador binario que se evalúa como verdadero sólo cuando las dos expresiones involucradas son verdaderas, en caso contrario devuelve falso. Por ejemplo, si evaluamos las siguientes expresiones en el estado las variables x=2, y=3, z=5
(x>y) && (z>y)→(2 > 3) && (5 > 3)  → 0&&1  → 0 (falso)
!(x > y) && (z>y)   →!(2 > 3) && (5 > 3)   → !(0) &&1   → 1&&1     1 (verdadero)
En pseudocódigo y diagrama de flujo se representa con la palabra en inglés AND
Disyunción“||”, es un operador binario que devuelve únicamente falso si los dos operadores son falsos, en caso contrario devuelve verdadero. Nuevamente, tomemos el mismo estado de las variables x=2, y=3, z=5
(x>y) | | (z>y)  →(2>3) | | (5>3)  → 0 | | 1    1 (verdadero)
(x>y) | | (y>z)  →(2>3) | | (3>5)  → 0 | | 0  → 0 (falso)
En pseudocódigo y diagrama de flujo se representa con la palabra en inglés OR
Además de los operadores mencionados, en C existen otros que se pueden utilizar, sin embargo, su estudio supera los objetivos de este curso por lo que no los revisaremos. Si deseas saber más al respecto puedes consultar el texto de Joyanes & Zohanero(2005).
3.4.2. Evaluación de expresiones  
La evaluación de las expresiones depende de tres cosas, principalmente el estado de las variables que aparecen en la expresión, el significado de los operadores y su precedencia. Esta última se refiere a la prioridad de los operadores, es decir, el orden en el que se evalúan, eliminando con esto la ambigüedad de las expresiones, por ejemplo, si tenemos la expresión:
2 + 3 * 5
Podríamos evaluarla de dos diferentes formas: la primera es hacer primero la suma 2+3 (=5) y después multiplicar el resultado por 5. De tal manera obtendríamos como resultado final 25.
Otra manera sería realizar primero la multiplicación 3*5 (=15) y sumar el resultado a 2, obteniendo 17 como resultado final. Pero sabemos que en matemáticas primero se realiza la multiplicación y después la suma, en otras palabras, tiene mayor prioridad la multiplicación que la suma. Por lo tanto, el resultado correcto de la expresión 2 + 3 * 5 es 17.
En la siguiente tabla se muestra la precedencia de operadores de lenguaje C que se han presentado.
Los operadores que se encuentran en el mismo nivel de precedencia se ejecutan de izquierda a derecha según aparecen en la expresión. Da clic aquí para observar un par de ejemplos.
Ejemplo 3.3: Dada la siguiente expresión matemática para convertir grados centígrados (C) a su equivalente Fahrenheit (F),
Su codificación en C es:
F= (9.0/5.0)*C +32;
Se escribe 9.0 y 5.0 para que la división devuelva un número flotante, de lo contrario la división será entera. En este caso las variables F y C, deben ser declaradas como float.
Evaluando paso a paso la expresión en el estado de la variable C = 30 tenemos:
Observa que el único operador que cambia el estado de una variable es el de asignación "=".
Ejemplo 3.4: Ahora evaluemos la expresión:
(x % 2 == 0)
Considerando que el estado de la variable x=24
En este caso la evaluación de la expresión no afecta el estado de la variable, esto es porque no contiene ningún operador de asignación, sin embargo podemos decir que el resultado de su evaluación es verdadero
Autoevaluación de la Unidad 3  
Realiza la siguiente actividad que te servirá para autoevaluar tu conocimiento, esto con el fin de que puedas verificar qué tanto has aprendido los temas vistos hasta ahora pues necesitarás tener un buen manejo de los mismos para comprender los temas siguientes y para realizar tus próximas actividades.
Ingresa al cuestionario Autoevaluación de la Unidad 3 y contesta cada una de las preguntas que se te plantean. Considera volver a repasar algunos temas si tus respuestas correctas son menos que las incorrectas.
Para ingresar al cuestionario: En la ruta (parte superior izquierda del aula) da clic en Fundamentos. Se enlistarán las actividades de la Unidad, da clic en Autoevaluación de la Unidad 3.
3.5. Bibliotecas y funciones  
El lenguaje C en realidad es un lenguaje reducido, en comparación con otros lenguajes de programación, por ejemplo, no tiene instrucciones de estrada y salida, tampoco cuenta con operadores o funciones para calcular la raíz cuadrada de un número o su potencia, entre otras.
Sin embargo, para compensar esto, el lenguaje C ofrece un vasto conjunto de bibliotecas de funciones que para fines prácticos se pueden considerar como parte de C. Además se pueden definir nuevas bibliotecas.
No obstante, para fines de este curso las bibliotecas de uso frecuente del lenguaje son más que suficientes, por lo que no se estudiarán más que esas en esta ocasión.
Las funciones que más se utilizan están agrupadas en bibliotecas estándar, declaradas como archivos de cabecera, de tal manera que para utilizarlas se debe escribir la directiva #include seguida del nombre del archivo encerrado entre “<>”.
Las bibliotecas estándar que usaremos en este curso son:
stdio.h
en esta biblioteca se encuentran definidas las funciones estándar de entrada y salida –que representan la tercera parte de la biblioteca–, por ejemplo, declara la función printf que sirve para imprimir datos en pantalla y scanf que se utiliza para leer datos ingresados mediante el teclado.
stdlib.h
incluye funciones para conversión numérica, asignación de memoria y tareas similares, llamadas funciones de utilería. En esta biblioteca se declara la función system mediante la cual se envían mensajes al sistema operativo para que ejecute una tarea.
math.h
declara funciones matemáticas, como la función sqrt que calcula la raíz cuadrada de un número.
ctype.h
declara funciones para prueba de clasificación de caracteres, por ejemplo, si es un dígito o un carácter.
Observa que todas las bibliotecas estándar tienen extensión “.h ”.
3.5.1. Funciones matemáticas
Por el momento, conozcamos las funciones declaradas en la biblioteca math.h; si aprendes a utilizar éstas, también podrás utilizar otras funciones del resto de las librerías.
Observa la siguiente tabla:
Con esta información es posible codificar algoritmos que requieran este tipo de operaciones. Por ejemplo, la fórmula para calcular el área de una circunferencia, que aparece en el programa 3.2.
area=PI * radio * radio;
Se puede codificar de la siguiente manera:
area=PI * pow(radio,2);
3.5.2. Funciones de entrada y salida  
En los programas que hemos visto aparece la función de salida estándar printf , que se encarga de imprimir un mensaje en la pantalla. La sintaxis general es:
printf(<cadena_de_control>, <lista_de_identificadores>);
Donde <cadena_de_control> representa el mensaje de texto que se desea desplegar en el monitor y siempre tiene que ir en comillas, opcionalmente puede incluir secuencias de escape o especificadores de control; <lista_de_identificadores> es una lista con los identificadores de las variables o las expresiones que serán desplegadas, separadas por comas.
Los especificadores de conversión se utilizan para imprimir valores dentro de la cadena de control especificados por una variable, una constante o una expresión. En la siguiente tabla se muestran los que más se usan.
Da clic aquí para ver un ejemplo de uso.
Ejemplo 3.5.
Suponiendo que el estado de las variables es:
radio=3 y area=28.27,
printf (“El area del circulo con radio %d es %f \n”,radio,area);
La salida de la instrucción anterior sería:
El area del circulo con radio 3 es 28.27
 Observa que se imprime el texto tal cual pero en vez de imprimir el especificador de conversión  %d se imprime el valor de la primera variable que es radio y en el lugar  del especificador %f se imprime el valor del siguiente argumento que es la variable area.
Ahora, si tenemos la instrucción:
printf(“El perimetro es %.2f \n”, PI*2*radio);
La salida sería:
El perimetro es 18.85
En este caso en el lugar del convertidor %.2f se imprime el resultado de evaluar la expresión PI*2*radio que es el segundo argumento, el número .2 que aparece en el convertidor indica que sólo deben imprimirse dos decimales.
En lenguaje C la lectura de datos por medio del teclado se realiza con la función scanf, en la cual se deben de especificar de ante mano los tipos de datos que se desean recibir, además de los identificadores de las variables donde se desean almacenar.
La sintaxis de esta función es:
scanf(<cadena_de_control>,<lista_de_direcciones_de_variables>);
Donde <cadena_de_control> es una cadena con los códigos que controlarán la forma como se recibirán los datos desde teclado y la <lista_de_direcciones_de_variables> es una lista con las localidades de memoria de las variables donde se almacenarán los datos que el usuario del programa introduzca a través del teclado.
Dos observaciones importantes: en la especificación de la cadena de control se utilizan los mismos especificadores de conversión que para la función printf encerrados entre comillas y en la lista de direcciones los identificadores de las variables, anteponiéndoles a cada uno un símbolo de amperson “&”, en el mismo orden que los especificadores de tipos que les corresponden. Da clic aquí para observar un ejemplo.
Ejemplo 3.6.
Suponiendo que se desea leer la base y la altura de un rectángulo y guardarlas en las variables de tipo int llamadas  base y altura, de tal manera que el usuario ingrese los valores separados por una coma, digamos “5,2” entonces la instrucción sería:

scanf(“%d,%d”, &base, &altura);

Nota: Es frecuente que las personas olviden escribir el & antes del identificador de una variable, al utilizar la función scanf, cuestión que no es supervisada por el compilador y genera un error en el momento que se ejecuta el programa.

Actividad 2. Funciones de entrada y salida  
Realiza un programa en C que resuelva el problema que te proporcionará tu Facilitador(a).  Utiliza funciones de entrada y salida.
1.    Analiza el problema y propón una solución en pseudocódigo o diagrama de flujo, guárdalo con el nombre FPR_U3_A2_XXYZ, la extensión del archivo puede ser cualquiera de las siguientes, dependiendo del programa que hayas decidido utilizar: .doc, .ppt, .pdf, .jpg, .bmp, .gif, .vsd.
2.    Realiza una prueba de escritorio y posteriormente, si ésta ha sido satisfactoria, escribe el programa en lenguaje C.
3.    Compílalo y ejecútalo para verificar que funciona correctamente.
4.    En caso de que el compilador envíe errores, verifica dónde está el error y corrigelo
5.    Guárdalo con el nombre FPR_U3_A2_XXYZ.c
Agrega los siguientes archivos a una carpeta comprimida llamada FPR_U3_A2_XXYZ.zip:
  • Algoritmo en pseudocódigo o diagrama de flujo
  • Programa fuente (.c)
  • Archivo ejecutable (.exe)
6.-Envía la carpeta comprimida a tu facilitador(a) mediante la Sección de tareas.
Para enviar tu documento: En la ruta (parte superior izquierda del aula) da clic en Fundamentos. Se enlistarán las actividades de la Unidad 3 y da clic en la Actividad 2. Funciones de entrada y salida.

3.6. Codificación de algoritmos  
Para concluir esta Unidad, desarrollemos un programa en C que incluya la implementación de lo que hemos estudiado hasta el momento. Veamos cómo se realiza la codificación de los algoritmos con un poco más de detalle. Para lo cual realizaremos un programa que resuelva el problema que a continuación se presenta.
Se requiere un programa que se encargue de la venta de boletos en un cine. El sistema debe calcular el monto que se debe pagar por una cantidad determinada de boletos tomando en cuenta que el costo de cada boleto es de 45 pesos. También se encargará de cobrar, es decir, dado el pago, debe calcular el cambio indicando el tipo y número de billetes o monedas que devolverá de cada denominación.
Para evitarse problemas de cambio, los ejecutivos de CineESAD han decidido no aceptar monedas de denominación menor a 1 peso y tampoco billetes de denominación mayor a 500 pesos. También se debe suponer que siempre hay suficientes billetes y monedas de cualquier denominación para devolver el cambio.
Los datos de entrada son el número de boletos (nboletos) y el monto del pago (pago), la salida del programa es el monto que se debe pagar por los boletos(total)y el monto del cambio (cambio), indicando el tipo y número de cada uno de los billetes o monedas que se devolverán.
Notemos que el precio de los boletos siempre es el mismo, así que se puede declarar como una constante, llamémosla PRECIO. Así que para calcular el monto que el cliente debe pagar tenemos la siguiente fórmula:
total = nboletos * PRECIO
Y el monto del cambio se calcula con la siguiente fórmula:
cambio = pago – total
Para calcular cuántos billetes o monedas se tienen que devolver, se utilizarán los operadores de módulo y división. Por ejemplo, si el cambio es 360 se puede calcular el número de billetes de 100 dividiendo 360 entre 100, lo cual resulta ser 3 que corresponde al número de billetes, el resto del cambio es igual a 360 módulo 100, en este caso es 60.
Por último, los billetes sólo pueden ser de $500, $200, $100, $50 y $20 y las monedas sólo son de $10, $5, $2 y $1. Por el momento supondremos que el usuario siempre ingresa datos correctos.
En la siguiente tabla se muestra el algoritmo que resuelve el problema.
Constantes:
PRECIO = 45
Variables:
nboletos: entero, representa el número de boletos que quiere el cliente.
total: entero, es la cantidad de dinero que el cliente debe pagar.
pago: entero, monto del pago del cliente.
cambio: entero, monto del cambio.
Nota: Observa que no es necesario utilizar variables para el número de billetes o monedas de las diferentes denominaciones, pues sólo se utiliza una vez el resultado del cálculo así que se puede imprimir directamente el resultado del mismo
Para verificar que el algoritmo funciona, a continuación se realiza una prueba de escritorio considerando que los datos de entrada son 5 boletos y el monto del pago son 500 pesos.
En la primera columna aparece la instrucción que se ejecuta, en la siguiente el dato que suponemos se ingresa, después están las operaciones que se realizan en la ALU, en la cuarta columna se muestran los valores de las variables después de que se ha realizado la instrucción y en la última columna se indica el mensaje que se imprimirá en la pantalla, cuando sea el caso.
Por otro lado, incluimos en la tabla de estado de la memoria la constante PRECIO sombreando el espacio correspondiente para indicar que no puede ser modificado.
Por último, sólo resta codificar el algoritmo en lenguaje C, compilarlo y ejecutarlo. En el siguiente documento se te presenta el algoritmo en C.

Actividad 1. Introducción al lenguaje C – Ejercicio C  
Bibliotecas y funciones
1. Escribe, compila y ejecuta el programa ventaBoletos.c que acabamos estudiar.
Para hacerlo, considera lo siguiente:
Analiza con detalle el algoritmo en C e identifica sus componentes
¿Se te ocurre otra forma de hacer lo mismo? Si sí, inténtalo.
¿Se le pueden añadir nuevas funciones al programa? Si que me indique distinga entre boletos para menores y adultos, a los boletos de menores aplicar descuento de 5 pesos
¿Qué parte del proceso se te complicó más?
2. Piensa en un problema sencillo que podría resolverse con lo que sabemos hasta ahora, publícalo la base de datos e intenta resolverlo. Si lo prefieres, ingresa a ésta y trata de resolver alguno de los problemas propuestos por tus compañeras(os) de grupo.
Puedes pedir ayuda para resolverlo, o bien, ayudar a otros a resolver sus problemas.
Para ingresar a la base de datos: En la ruta (parte superior izquierda del aula) da clic en Fundamentos. Se enlistarán las actividades de la Unidad 3 y ahí da clic en la Actividad 1. Introducción al lenguaje C.
Actividad 3. Análisis, diseño y codificación de un programa en C  
Realiza un programa en C que resuelva el problema que te proporcionará tu Facilitador(a). Utiliza lo que has aprendido hasta ahora para diseñar tu algoritmo.
1.-En un archivo de Word, realiza el análisis del problema (datos de entrada, salida y el método que seguirás para resolverlo).
2.-Posteriormente, en el mismo archivo, escribe el algoritmo representado en diagrama de flujo o en pseudocódigo. Guárdalo con el nombre FPR_U3_A3_XXYZ.doc
3.-Realiza una prueba de escritorio e inclúyela en el mismo archivo de Word y comprueba que tu algoritmo entregue la salida indicada.
Nota: Puedes ingresar al foro Introducción al lenguaje C para compartir tus dudas o para ayudar a resolver las de tus compañeros(as). Es probable que si tienes alguna dificultad en el proceso de desarrollo de tu programa alguien del grupo te pueda ayudar a resolverla, o puede ser que tú sepas la solución al problema de otro(a).
4.-Finalmente, codifica tu algoritmo en lenguaje C utilizando DevC++ y guarda el archivo con el nombre FPR_U3_A3_XXYZ.c. Después compílalo y ejecútalo con los mismos datos de la prueba de escrito.
5.-Añade a una carpeta comprimida llamada FPR_U3_A3_XXYZ.zip, el archivo de Word, el programa fuente (.c) y el ejecutable (.exe). Envíalos a tu facilitador(a) mediante el Sección de tareas. Espera y atiende los comentarios que te haga al respecto.
*Sustituye las XX por las dos primeras letras de tu primer nombre, la Y por la inicial de tu apellido paterno y la Z por la inicial de tu apellido materno.
Para enviar tu documento: En la ruta (parte superior izquierda del aula) da clic en Fundamentos. Se enlistarán las actividades de la Unidad 3 y da clic en la Actividad 3. Análisis, diseño y codificación de un programa en C.
Cierre de la Unidad  
¡Excelente! Ya vamos a la mitad del curso y comenzamos a realizar programas para resolver problemas simples haciendo uso de las funciones de C, sin embargo, aún nos falta aprender varias cosas que podemos implementar para que nuestros programas resuelvan problemas cada vez más complejos.
En la siguiente Unidad aprenderemos a utilizar las estructuras de control para que los programas que realicemos puedan repetir ciclos de instrucciones o sólo realizarlas si se cumplen o no determinadas condiciones.
Es importante que no dejes de practicar para que puedas detectar todas las dudas o fallas que tengas a la hora de programar con las funciones que hasta ahora conoces.
En los libros de Joyanes, L., & Zohanero, I. (2005) y López. L. (2005) se encuentran disponibles más ejercicios que puedes realizar para practicar.
¡Adelante!.
Fuentes de consulta  
Bibliografía general
Böhm, C., & Jacopini, G. (1966). Flow diagrams, Turing machines, and languages only with two formation rules. Communications of the ACM.
Cairó, O. (2005). Metodología de la programación: Algoritmos, diagramas de flujo y programas. México: Alfaomega.
Guerrero, F. (s.f.). mailxmail.com. Recuperado el 15 de agosto de 2010 de: http://www.mailxmail.com/curso-introduccion-lenguaje-c
Joyanes, L., & Zohanero, I. (2005). Programación en C. Metodología, algoritmos y estructuras de datos. España: Mc Graw Hill.
Kernighan, B., & Ritchie, D. (1991). El lenguaje de programación C. México: Prentice-Hall Hispanoamericana.
López, L. (2005). Programación estructurada en lenguaje C. México: Alfaomega.
Reyes, A., & Cruz, D. (2009). Notas de clase: Introducción a la programación. México: UACM.
Villela, H. T. Manual de C. Recuperado el 15 de agosto de 2010 de: http://www.fismat.umich.mx/mn1/manual/

No hay comentarios:

Publicar un comentario