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