Introduccion A La Informatica Algoritmos
Introduccion A La Informatica Algoritmos
Introduccion A La Informatica Algoritmos
la informática
Algorit m os y Progra m a ción en Lengua j e C
TOMO II
PRIMERA EDICION
Pag.
FUNDAMENTOS DE PROGRAMACIÓN 1
4.1. CONCEPTOS BÁSICOS DE ALGORITMOS 2
4.1.1 Algoritmo 2
4.1.2. Diferencia entre el lenguaje algorítmico y el informático. 2
4.1.3. Características de un algoritmo 2
4.1.4. Planteamiento de Problemas. 3
4.2. METAALGORITMO PARA CREAR ALGORITMOS 4
4.2.1. Fase de Formulación del Problema 4
4.2.2. Fase de resolución del problema 4
4.2.3. Fase de Implementación 6
4.3. EJERCICIOS RESUELTOS 9
4.3.1. Ejemplo 1: Lanzar dados hasta obtener par 10
4.3.2. Ejemplo 2: Conversión de temperaturas 14
4.3.3. Ejemplo 3: Ir al cine 15
4.3.4. Ejemplo 4: Palíndromo 16
4.4. EJERCICIOS PROPUESTOS 18
INTRODUCCIÓN A LAS ESTRUCTURAS DE DATOS 19
4.5. CONCEPTOS BÁSICOS DE ESTRUCTURAS DE DATOS 20
4.5.1. Tipos de datos 20
4.5.2. Clasificación de los Datos 20
4.5.3. Tipos de Datos en C 22
4.5.4. Operadores 23
4.5.5. Operadores en Lenguaje C 25
4.5.6. Representación de los datos, constantes, variables y tipos definidos 26
4.6. EJERCICIOS RESUELTOS 32
4.7. EJERCICIOS PROPUESTOS 34
HERRAMIENTAS DE PROGRAMACIÓN 35
4.8. HERRAMIENTAS DE PROGRAMACIÓN 36
4.8.1. Tipos de Herramientas de programación 36
4.9. EJERCICIOS RESUELTOS 47
4.10. EJERCICIOS PROPUESTOS 58
PROGRAMACIÓN ESTRUCTURADA 59
4.11. PROGRAMACIÓN ESTRUCTURADA 60
4.11.1. Estructura general de un programa 60
4.11.2. Estructuras Básicas de Control de Programa 68
4.12. EJERCICIOS PROPUESTOS 85
PROGRAMACIÓN MODULAR 87
4.13. PROGRAMACIÓN MODULAR 88
4.13.1. Subprogramas 88
4.13.2. Tipos de Subprogramas 89
4.13.3. Recursividad 114
4.14. EJERCICIOS PROPUESTOS 119
LI STA DE CUADROS
Pag.
Pag.
Pag.
Ejemplo 3: Ir Al Cine 15
Ejemplo 4: Palíndromo 17
OBJETIVOS
OBJETIVO GENERAL
ü Mediante este tomo se logrará conocer las metodologías y herramientas
utilizadas en la solución de problemas por computadora.
OBJETIVOS ESPECÍFICOS
ü Establecer los diferentes métodos para analizar y solucionar un problema dado
por medio de un algoritmo.
ü Configurar un modelo a seguir para analizar los problemas de tal forma que se
guíen con una estructura propia.
ü Manipular y conocer las diferentes He rramientas de Diseño de algoritmos como
diagramas de flujo, diagramas N-S y pseudocódigo.
ü Establecer una guía estándar para la elaboración de los algoritmos mediante
diagramas de flujo y pseudocódigo.
ü Manipular el lenguaje de programación C para implementar un algoritmo.
ü Establecer la cultura de la comprobación del algoritmo, que permita refinarlo y
darle una depuración mas adecuada.
ü Identificar claramente las partes de un algoritmo, de tal forma que se pueda dar
uniformidad y estructura a la solución de problemas.
FUN D AM EN TOS D E PROGRAM ACI ÓN
Introducción:
1
4.1. CONCEPTOS BÁSICOS DE ALGORITMOS
El lenguaje informático es aquel por medio del cual dicho algoritmo se codifica a
un sistema comprensible por el ordenador o computador. Este tipo de lenguaje es
más cercano a la máquina que al ser humano y podemos distinguir distintos tipos
dependiendo de la proximidad que se da a esta ultima. Se denomina lenguaje de
alto nivel aquel que es más cercano a la comprensión humana y lenguaje de bajo
nivel a aquellos que son más comprensibles por la máquina. En nuestro caso,
nosotros vamos a estudiar un lenguaje en la frontera de uno de bajo nivel y de uno
de alto nivel. La posibilidad de utilizar el lenguaje 'C' como un lenguaje de bajo
nivel, le da al mismo una potencia y rapidez especial.
2
4.1.4. Planteamiento de Problemas. Lo que pretende un algoritmo es sintetizar
de alguna forma una tarea, cálculo o mecanismo antes de ser trascrito al
ordenador. Los pasos que se deben seguir son los siguientes:
Pseudocódigo:
Algoritmo raíces;
Variables reales a, b, c, x, y;
Inicio
Escribir "Introduzca los coeficientes de mayor a menor grado."
Leer a, b, c
Todas las actividades que hacemos, en su mayoría siguen una serie consecutiva y
ordenada de pasos o algoritmos. Desde el momento en que estamos planeando
hacer algo, estamos diseñando un algoritmo. Por ejemplo: estando en casa, de
pronto se daña una bombilla, nuestro primer movimiento es el de cambiarla por
una nueva. El primer acto reflejo sería el tomar la bombilla dañada y bajarla de su
sitio. Después de un corto tiempo empezamos a analizar el problema con mayor
3
detenimiento y nos preguntamos ciertas cosas que nos hacen falta (datos de
entrada). ¿Dónde esta las bombillas nuevas?, como bajo la bombilla dañada,
siendo el caso que se encuentre en un sitio alto o difícil de tomar?; resolviendo
estas dudas sé que lo primero es apagar el circuito o en dado caso cortar la
energía en la caja de electricidad, luego buscar una butaca para alcanzar la
bombilla dañada, pero antes debo proteger mi mano, por si la bombilla esta aún
caliente, pero si es de neón no me preocupo esta no se calienta mucho (datos
auxiliares), luego debo ir por la bombilla nueva, enroscarla o colocarla con mucho
cuidado y prender el circuito para verificar que quedo bien instalada la bombilla
(datos de salida).
De esta manera podemos establecer unas etapas o pasos que nos permitan
solucionar problemas de forma algorítmica.
4.2.2. Fase de resolución del problema. En esta fase se hace el análisis y diseño
del algoritmo, para tener una buena visión de la misma se den tener en cuenta los
siguientes elementos en el análisis del problema:
4
Código
Fase de formulación Nombre
del problema Enunciado
Codificación y
Fase de Comprobación del
Implementación programa
Autodocumentación y
presentación
ü Salidas: Son las respuestas que presenta el algoritmos, y el objeto por el cual
se resuelve y satisface el problema dado. En el ejemplo anterior las salidas
corresponden a las raíces reales x, y o el mensaje “No Existen raíces reales”.
5
ENTRADAS PROCESOS SALIDAS
Proceso 1;
¿Cuántas salidas hay?
¿Cuántos Datos? Proceso 2;
¿Cuáles son salidas?
¿Qué Datos? ... ¿Cuál es la Precisión
¿Cuáles son Válidos? Proceso N;
de los resultados?
Fin.
¿Qué límites?
REALIMENTACIO
¿Los resultados son correctos?
Las preguntas del modelo, permiten establecer los Datos de Entrada, los Datos de
Salida, los Datos Auxiliares, y los procesos que se deben realizar para modelar y
diseñar el algoritmo.
6
presenta las Normas que escogeremos en este texto para la documentación de los
programas.
LENGUAJES DE PROGRAMACION
• 1955: FORTRAN.
• 1960: LISP, ALGOL, COBOL.
• 1965: APL, SNOBOL, PL/1, BASIC.
• 1970: PROLOG, ALGOL68, SIMULA67.
• 1975: C, PASCAL.
• 1980: MODULA-2, LIS, EUCLID.
• 1985: ADA.
7
Lenguaje C
En este libro se usará como lenguaje para implementación, C estándar.
Historia y Características
Descripción
ORIGENES DEL LENGUAJE C
El lenguaje C fue inventado e implementado por primera vez por Dennis Ritchie, usando UNIX
como sistema operativo. Debido a que se busco unificar implementaciones del lenguaje, para la
compatibilidad el los compiladores del lenguaje; la descripción del lenguaje se realiza siguiendo las
normas del ANSI C, (Instituto de Estándares Americanos para C);. Para lo cual Turbo C se clasifica
como un compilador rápido y eficiente que proporciona muchas características en este entorno,
satisfaciendo así las necesidades de una amplia variedad de programadores.
C se clasifica como un lenguaje de “nivel medio” debido a que combina elementos de lenguajes de
alto nivel con la funcionalidad del lenguaje ensamblador.
Aunque C tiene cinco tipos de datos básicos incorporados, no se trata de un lenguaje fuertemente
tipificado, pues C permite casi cualquier conversión de tipos; además C no lleva a cabo
comprobaciones de errores en tiempo de ejecución. Es el programador el único responsable de
llevar a cabo esas comprobaciones.
Permite además la manipulación directa de bits, bytes, palabras, direcciones y punteros; lo que lo
hace particularmente adecuado para la programación. Sin olvidar que C tan solo utiliza 32 palabras
claves que constituyen las órdenes que conforman este lenguaje.
UN LENGUAJE ESTRUCTURADO
Lenguaje estructurado en bloques: permite declarar procedimientos o funciones dentro de otros
procedimientos o funciones. De esta forma se aplican los conceptos de “globalidad” y “localidad”
mediante el uso de reglas de alcance.
BIBLIOTECA Y ENLACE
Biblioteca: archivo donde se encuentran las funciones estándar y se pueden usar en un programa.
Enlace: combina código escrito con el código objeto que ya se encuentra en la biblioteca.
8
4.3. Ejercicios Resueltos
Para el desarrollo de los ejemplos se diseño una plantilla (Figura 3) que permitirá
seguir cada uno de los elementos del diseño de algoritmos establecidos
anteriormente.
Código: Nombre
Formulación del
Problema Enunciado
9
Es importante aclarar que aunque se logre una buena destreza en el
entendimiento de los problemas a resolver con programas, nunca debe olvidarse
realizar los pasos de diseño previo del algoritmo, esto le dará la efectividad y
eficacia deseadas en la solución obtenida.
A continuación se van a presentar tres ejemplos que muestran como se debe usar
la plantilla propuesta, y a su vez como se solucionan problemas de diversos tipos.
Para el primer ejemplo se hará explícito el análisis del sistema (como se explicó en
4.2.2), estos elementos son los que se incorporan a la plantilla, posteriormente en
lo demás ejercicios se asume que el estudiante realiza el análisis previo y coloca
en la plantilla directamente los resultados del mismo.
Pares: 2 ,3,4,5 y 6
REALIMENTACIO
Probar el algoritmo si funciona
10
Descripción
Las entradas básicas son los dos dados, estos deben cumplir las características
de no estar cargados y ser ambos similares, para que halla la misma probabilidad
de caer cualquier número. Si un dado queda mal ubicado es decir, cuando por la
superficie en que cae el dado no queda una de sus caras totalmente horizontal, se
debe volver a repetir el tiro porque no se puede decidir cual valor obtuvo.
Se debe tirar los dados una vez se hallan revuelto por algún medio, ya sea en las
manos o utilizando un vaso dónde se depositan y de baten para luego lanzarlos a
la superficie.
Una restricción que se debe tener en cuenta es que los dados sus valores fluctúan
entre 2 y 6, cualquier otro valor es inválido.
11
Código: 1 Nombre Tirar los dados hasta obtener par
Formulación del
Problema Enunciado
Realizar un algoritmo que permita establecer como lanzar un par de dados
hasta conseguir un par.
Etapas de Resolución del Problema
Fase de Análisis del Problema
Resolución Las entradas básicas son los dos dados. Se debe tirar
los dados una vez se hallan revuelto por algún medio.
12
Prueba 1 Prueba 2
Paso Dado 1 Dado2 Paso Dado 1 Dado2
1-7 ? ? 1-7 ? ?
8 3 ? 8 4 ?
9 3 2 9 4 4
10 Falso; Devuelve a 6 10 Verdadero ; Continua en 11
11 Los dados fueron pares en 4.
12 Termina.
Codificación y programa Autodocumentado
// ___________________________________________________________
// Nombre: Lanzar Dados
// Descripción: El programa simula el lanzamiento de dos dados
// si los valores de los dos son pares, entonces el
// algoritmo presenta en pantalla el valor de uno de
// los dados.
// Destino: Programa de Ingeniería de Sistemas
// Datos Responsable: Miguel Angel Niño Zambrano UNICAUCA - FIET.
// Excep. / Errores: Ninguno implementado.
// Limitaciones: No hace validación de datos de entrada.
// ___________________________________________________________
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void main(void)
{
int intDado1, intDado2;
13
4.3.2. Ejemplo 2: Conve rsión de temperaturas
Código: 2 Nombre Conversión de Temperaturas
Formulación del Enunciado
Problema Elaborar un Programa que lea grados Celsius y los convierte en grados
Kelvin.
Etapas de Resolución del Problema
Análisis del Problema
Se Busca hacer una conversión de Celsius a Kelvin,
para esto debo:
Descripción: 1. Pedir el dato de grados Celsius.
2. Con la formula calcular los grados Kelvin
3. Finalmente retornar la respuesta (Kelvin).
Datos de Entrada Celsius
Datos de Salida Kelvin
Datos Auxiliares Fórmula: kelvin = Celsius + 273.15
Fase de Diseño y Verificación del Algoritmo
Resolución Formalización(Diagramas de Flujo, pseudocódigo)
//INICIANDO EL PROGRAMA
inicio
leer(Celsius)
kelvin = Celsius + 273.15
escribir(Kelvin)
fin
Comprobación del Algoritmo (traza)
Celsius Kelvin
15 288.15
El programa imprime: 288.15
Codificación y programa Autodocumentado
// ___________________________________________________________
// Nombre: Funciones
// Descripción: Conversión de Celsius a Kelvin
// Destino: Programa de Ingeniería de Sistemas
// Datos Responsable: Miguel Angel Niño Zambrano UNICAUCA - FIET.
// Excep. / Errores: Ninguno implementado.
// Limitaciones: No hace validación de datos de entrada (negativos)
// ___________________________________________________________
Fase de #include <stdio.h>
Implementación viod main(void)
{
float floCelsius, floKelvin; //Variables que guardan el dato de los grados
scanf(“%f”, &floCelsius);
floKelvin = floCelsius + 273.15;
Printf(“Los %1.2f Celsius son equivalentes a %1.2f Kelvin”, floCelsius,
floKelvin);
}
15
Ejecución
Los 15.00 Celsius son equivalentes a 288.15 Kelvin
14
4.3.3. Ejemplo 3: Ir al cine
Código: 3 Nombre Ir al Cine
Formulación del Enunciado
Problema Desarrollar un algoritmo que especifique los pasos que se hacen cuan una
persona decide ir a ver una película de cine. La película la selecciona de un
periódico.
Etapas de Resolución del Problema
Análisis del Problema
Para solucionar el problema, se debe seleccionar una
película de la cartelera del periódico, ir a la sala y
Descripción:
comprar la entrada para, finalmente, poder ver la
película.
Nombre de la Película, Dirección de la Sala y Hora de
Datos de Entrada
Proyección.
Datos de Salida Ver la Película.
Datos Auxiliares Entrada y Número de Asiento
Diseño y Verificación del Algoritmo
Formalización(Diagramas de Flujo, pseudocódigo)
inicio
//Seleccionar la Película
tomar el periódico
mientras no lleguemos a la cartelera
pasar la hoja
mientras no se acabe la cartelera
leer película
Fase de si nos gusta, recordar el título
Resolución elegir una de las películas seleccionadas
leer la dirección de la sala y la hora de proyección
//Comprar la Entrada
trasladarse a la sala
si no hay entradas, ir a fin
si hay cola
ponerse en el último
mientras no lleguemos a la taquilla
avanzar
si no hay entradas ir a fin
comprar la entrada
//Ver la película
leer el número de asiento de la entrada
buscar el asiento
sentarse
ver la película
fin
Comprobación del Algoritmo (traza)
Funciona
Fase de Codificación y programa Autodocumentado
Implementación No hay que Hacerla.
Ejemplo 3: Ir al Cine
15
4.3.4. Ejemplo 4: Palíndromo
Código: 4 Nombre Palíndromo
Formulación del Enunciado
Problema Averiguar si una palabra es un palíndromo. Nota: un palíndromo es una
palabra que se lee igual de izquierda a derecha que de derecha a izquierda.
Ej. radar
Etapas de Resolución del Problema
Análisis del Problema
Para comprobar si una palabra es un palíndromo, se
puede ir formando una palabra con los caracteres
invertidos con respecto al original y comprobar si la
Descripción: palabra al revés es igual a la original. Para obtener esa
palabra al revés se leerán en sentido inverso los
caracteres de la palabra inicial y se irán juntando
sucesivamente hasta llegar al primer carácter.
Datos de Entrada palabra.
Datos de Salida un mensaje que no dice si es o no palíndromo.
Datos Auxiliares cada carácter de la palabra, palabra al revés.
Diseño y Verificación del Algoritmo
Formalización(Diagramas de Flujo, pseudocódigo)
INICIO
Leer palabra
Leer ultimo
carácter
Fase de
Resolución
Juntar el Carácter
a los anteriores
Leer carácter
anterior
¿Más caracteres?
¿Palabras
Iguales?
“No es Palíndromo” “Es Palíndromo”
FIN
16
Comprobación del Algoritmo (traza)
No se hace.
Codificación y programa Autodocumentado
// ___________________________________________________________
// Nombre: Funciones
// Descripción: Este programa recibe una cadena de 20 caracteres
// máximo y evalúa si la palabra es palíndroma o no:
// Ej. ala es palíndroma. Se lee igual de adelante
// hacia atrás y lo contrario.
// Destino: Programa de Ingeniería de Sistemas
// Datos Responsable: Miguel Angel Niño Zambrano UNICAUCA - FIET.
// Excep. / Errores: Ninguno implementado.
// Limitaciones: No hace validación de datos de entrada.
// ___________________________________________________________
#include<stdio.h>
#include<conio.h>
#include<string.h>
void main(void)
{
char chaPalabra[20]; //Vector para almacenar la palabra digitada
char chaPalindroma[20]; //Vector para almacenar la palabra digitada
//al revés
int intLongitud; //Longitud de la palabra digitada
int intConti, intContj; //Contadores de bucles FOR.
Fase de
Implementación clrscr();
//leer la palabra a revisar
gets(chaPalabra);
longitud=strlen(chaPalabra);
Ejemplo 4: Palíndromo
17
4.4. Ejercicios Propuestos
Pr oble m a Pu n t os a t e n e r e n Cu e n t a
a) I r al baño. Solam ent e a bañar se.
b) I r al fút bol. Al est adio, con Posible Cola, y buscar la silla
c ) Poner la m esa par a la No. de I nv it ados, Colocar los Plat os y Sillas
com ida. cor r espondient es.
d) Hacer una t aza de t é
e) Lim piar plat os. Plat os, Pocillos, Cuchar as y Ollas.
f ) Hacer una Llam ada Tiene el t eléfono al fr ent e.
Telefón ica
g) Algor it m o que lea t r es Los núm er os son ent er os.
núm er os, y a cont in u ación
escr iba el m ayor de los
t r es.
Sugerencia : Ant es de com enzar a elabor ar el algor it m o ident ifique las ent r adas y las
salidas, elabor e esquem as o gr áficos pr opios que le per m it an concebir el pr oblem a y
luego siga los paso para la solución de algorit m os.
18
I N TROD UCCI ÓN A LAS ESTRUCTURAS D E D ATOS
Introducción:
Este capitulo presenta la forma como se almacena y se representan los datos que
manipulan en los programas. Las estructuras de datos manejadas en este
documento son los estáticos, puesto que son los tipos de datos en los que se
fundamentan los demás tipos de datos
19
4.5. CONCEPTOS BÁSICOS DE ESTRUCTURAS DE DATOS
Los datos estáticos son datos que se crean y definen en tiempo de diseño,
poseen una cantidad de memoria fija durante todo el programa, y no puede ser
agrandada o achicada en tiempo de ejecución.
Los datos dinámicos son los que se crean y se definen en tiempo de ejecución. A
su ve z los datos los podemos clasificar con respecto a su complejidad, en datos
simples y estructurados.
Los datos predefinidos son los que se encuentran como datos base de todos los
lenguajes de programación, a partir de ellos se pueden crear los demás tipos de
datos, con algunas operaciones especiales.
Los datos predefinidos por el usuario son los datos que define el mismo usuario
del lenguaje de programación, a partir de la combinación estructurada de los datos
predefinidos por el sistema.
4.5.2. Clasificación de los Datos. Los datos los podemos clasificar como se
muestra en la Figura 4. La clasificación más genérica que se le pueden dar los
datos en un principio son las siguientes:
NUMERICOS
Almacenan números y con ellos podremos realizar operaciones aritméticas. A su
vez pueden ser:
Ent er os
Es un subconjunto finito de los números enteros, están definidos en un rango. Son
todos los números positivos o negativos.
Ejemplo: 734, -123, 0, -1
Reales
Es un subconjunto de los números reales, se encuentran limitados por el tamaño y
20
la precisión. Son todos los números decimales.
Ejemplo: -0.123, 67.8, 32.02
Enteros
Numéricos Reales
Predefinidos
Booléanos (lógicos)
ALFANUMERICOS
Almacena caracteres alfanuméricos. Pueden ser:
Let r as
Desde la A hasta la Z.
Núm eros
Con ellos no se pueden realizar operaciones aritméticas.
BOOLEANOS
Sólo pueden tener dos valores: verdad o falso. Estos datos no pueden leerse
como datos, pero pueden imprimirse. Se forman a partir de los operadores
relacionales y lógicos.
21
4.5.3. Tipos de Datos en C
Ejemplos:
Int gintContador;
Int gintVar, intConti , intContj;
int true=1;
int false=0;
Reales Definición:
float <variable>
Ejemplos:
float gfloContador;
float gfloVar, gfloConti , gfloContj;
Alfanuméricos Definición:
(carácter) char <variable>
Ejemplos:
char gchaContador;
char gchaVar, gchaConti , gchaContj;
Tamaño y TIPO TAMAÑO EN BITS RANGO Los calificadores de tipo,
Calificadores Char
Int
8
16
0 a 255
-32768 a 32767
modifican el rango de
variables de un tipo de
de tipo Float 32 3.4E-38 a 3.4E+38 dato:
Double 64 1.7E-308 a 1.7E+308 unsigned (sin signo).
Void 0 sin valor signed (con signo)
short (corto)
Unsigned char 8 0 a 255
long (largo)
Signed char 8 -128 a 127
Se aplican a cualquier
long int 32 -2.147.483,648 a 2.147.483,648 tipo de datos.
Ejemplos:
Por defecto se C usa
long a; //define una variable a del rango long int
short y signed.
unsigned int //define una variable a de rango positivo int.
long float //define una variable reales 10 bytes.
22
4.5.4. Operadores. Todos los símbolos que representan enlaces entre cada uno
de los argumentos que intervienen en una operación se llaman operadores, y se
utilizan para construir expresiones. Los operadores pueden ser:
RELACIONALES O CONDICIONALES
Se utilizan para formar expresiones booleanas, es decir, expresiones que al ser
evaluadas producen un valor lógico: verdad o falso.
ARITMETICOS
Para tratar los números se utilizan los operadores aritméticos, que junto con las
variables numéricas forman expresiones aritméticas.
• + Suma
• - Resta
• * Multiplicación
• ^ Potenciación
• / División real
• DIV División entera
• MOD Resto de la división entera
ALFANUMERICOS
Se utiliza para unir datos alfanuméricos.
• + Concatenación
23
LOGICOS O BOOLEANOS
Combinan sus operandos de acuerdo con las reglas del Álgebra de Boole con el
fin de producir un nuevo valor que se convierta en el valor de la expresión.
• OR Suma lógica
• AND Producto lógico
• NOT Negación
OR u O
Es un operador binario, es decir, afecta a dos operadores. La expresión que
forma es cierta cuando al menos uno de sus operandos es cierto. Es el operador
lógico de disyunción.
AND o Y
Es un operador binario. La expresión formada es cierta cuando ambos operandos
son ciertos al mismo tiempo. Es el operador lógico de conjunción.
NOT o NO
Es un operador unario, es decir, sólo afecta a un operando. Afecta a la expresión
cambiando su estado lógico: si era verdad lo transforma en falso, y viceversa.
PARENTESIS
Los paréntesis se utilizan para anidar expresiones.
• ( ) Anidar expresiones
ORDEN DE EVALUACION
La prioridad a la hora de evaluar los operadores en cualquier expresión es:
24
4.5.5. Operadores en Lenguaje C
Operadores
Descripción Un operador es un símbolo que indica al compilador que lleve a cabo ciertas
manipulaciones matemáticas o lógicas. En C hay tres clases de operadores:
aritméticos, relacionales, lógicos y a nivel de bits.
Clasificación
25
Clasificación
El operador ?: Ejemplo:
Se utiliza para sustituir ciertas sentencias de la Sea la variable cont = 100 con una posición de
forma if, then, else. El operador ternario? memoria = 2000
m = &cont coloca a m en la posición de
Exp1 ? Exp2: Exp3; memoria de cont, o sea que m = 2000
donde exp1, exp2 y exp3 representan
expresiones. q=*m coloca a q con el valor de cont , o
sea q = 100
Evalúa Exp1. Si es cierta, evalúa Exp2 y toma
ese valor para la expresión. Si Exp1 es falsa, Operador de tiempo de compilación sizeof:
evalúa Exp3 tomando su valor para la Es un operador monario que devuelve la longitud
expresión. en bytes, de la variable o del especificador de
Ejemplo: tipo entre paréntesis al que precede, sizeof
x = 10; ayuda a generar código portable que dependa
y = x>9 ? 100 : 200; del tamaño de los tipos de datos incorporado en
Este mismo código escrito con la sentencia if / C. Por ejemplo, imagine un programa de base
else sería: de datos que necesite guardar 6 valores enteros
x = 10; por registro. Si se quiere transportar el programa
if ( x>9) y = 100; de base de datos a una gran variedad de
else y = 200; computadoras, no se debe asumir que un entero
ocupe dos bytes; se debe determinar la longitud
Los operadores de puntero & y *: real de los enteros usando sizeof.
El puntero es la dirección de memoria de una
variable, una variable de puntero es una La coma como operador:
variable específicamente declarada. Los En cadena varias expresiones “y” produce una
punteros tienen dos funciones principales: secuencia de operaciones, por ejemplo:
referencian en forma rápida los elementos de un x = ( y = 3 , y + 1 );
array y modifican los parámetros de llamadas de primero asigna el valor 3 a y y luego el valor 4 a
las funciones. x
CONSTANTES
Se llama constante a toda posición de memoria, referenciada por un nombre de
constante, donde se almacena un valor que no puede cambiarse o permanece
invariable a lo largo del proceso. Las constantes pueden ser:
26
Const ant es Num éricas Ent eras
Números con valor entero, ya sea positivo o negativo.
Ejemplo: an_recto = 90
Ejemplo: pi = 3.14159
VARIABLES
Se considera variable a una zona de memoria referencia por un nombre de
variable, donde se puede almacenar el valor de un dato, que puede cambiarse
cuando lo deseemos. El nombre de la variable es elegido por el usuario. Para
que estén perfectamente definidas las variables, hay que especificar:
• Su nombre.
• El tipo de dato: numérico, alfanumérico o booleano.
• El valor que va a tomar en un principio: inicialización.
2
Una palabra reservada es una palabra que utiliza el mismo lenguaje en el que se esta codificando
el programa, y es de uso exclusivo del mismo para poder interpretara las instrucciones
adecuadamente. Ej. Printf en lenguaje c.
27
Ejemplo: contador = 35
Variables Alfanum éricas
Se escriben de dos formas:
• nombre -variable = "comentario"
• nombre -variable = espacios( numero )
Variables Booleanas
Se escriben:
• nombre -variable = Valor-Booleano
EXPRESIONES
Es una combinación de Operadores y operandos. Los operandos son constantes,
variables o expresiones. Los operadores son de diferentes tipos: cadena,
aritméticos y lógicos como se vio anteriormente, según sus resultados se clasifican
en numéricas, alfanuméricas y booleanas.
Ejemplo: x = 10; y = x * x + 2
Expresiones
Descripción Los operadores, las constantes y las variables son la expresiones y es una
combinación válida de estos elementos.
Conversiones de tipos en las expresiones:
Se utilizan cuando en una expresión se mezclan constantes y variables de distintos tipos, se
convierten todos los operandos al tipo de mayor operando. Por ejemplo, short int lo convierte en
int.
Moldes:
Se puede forzar a que una expresión sea de un tipo determinado utilizando una construcción
denominada molde. A menudo los moldes son considerados como operadores. Como operador es
monario y tiene la tiene la misma precedencia que cualquier otro operador monario. Por ejemplo: Si
se quiere asegurar que la expresión x/2 se evalúe como tipo float, se puede escribir (float) x/2.
28
Espaciado y paréntesis:
Para dar mayor legibilidad se pueden añadir tabulaciones y espaciados. Ejemplo:
x=y/3-34*temp&127;
x = (y/3) - (34 * (temp & 127) );
el uso de espacios y paréntesis no reduce la velocidad del programa y conviene usarlos para hacer
más clara la lectura de los mismos.
Abreviaturas en C:
Las abreviaturas simplifican la escritura de ciertos tipos de sentencias de asignación. Ejemplo:
x = x+10 abreviado queda x+ = 10
El operador + = asigna a x el valor de x +10.
FUNCIONES
Son predefinidas por el lenguaje de programación escogido para la
implementación de los algoritmos, de les envían parámetros y retornan valores.
TIPOS PREDEFINIDOS
Tipos predefinidos del lenguaj e
Una de las ventajas fundamentales de los lenguajes de alto nivel es la posibilidad
que ofrecen al programador de definir sus propios tipos de datos. Mediante la
definición de tipos de datos se consigue que cada información que maneja el
computador tenga su sentido específico. El tipo establece los posibles valores que
puede tomar ese dato. Supone crear un nuevo nivel de abstracción dentro del
programa. Los tipos predefinidos más utilizados son:
29
• NIL: valor nulo
• REAL: tipo decimal normal
• TRUE: valor lógico verdadero
Ejemplo: TipoEdad = INTEGER (tipo definido) ; edad : TipoEdad (variable
declarada)
Tipos Subrango
Un tipo Subrango se define a partir de otro tipo ordinal3 ya definido, que se toma
como tipo base. La forma de realizar esto es declarar un identificador diferente
para el nuevo tipo y establecer los límites mínimo (primero) y máximo (último) del
Subrango de variación. Estos límites se escriben separados por dos puntos
seguidos y se encierran entre corchetes.
Ejemplo: DiaMes = [ 1 .. 31 ]
30
REGLAS PARA LA CONTRUCCION DE IDENTIFICADORES
Es este punto hemos definido los diferentes tipos de datos que se pueden usar
para codificar la información, y la manera como se codifica en un lenguaje de
computadora. Todos los datos y estructuras de los algoritmos y programas se
manejan y manipulan mediante identificadores, es decir mediante asignaciones de
nombres, los cuales posteriormente son referenciados en distintas partes del
algoritmo o programa.
Ejemplos:
31
4.6. Ejercicios Resueltos
1. Elabor e un cuadr o que r elacione los t ipos de dat os con las const ant es y las
var iables, m ediant e un ej em plo.
Constantes Variables
36
450.35 A
Numéricos
0.58 Nom
'A' Edad
'Juan' Ciudad
Cadena
'La Paz' Estatura
Falso
Lógicos Verdadero
a. 7+ 3 = 10 e. 7* 3 = 2 1
b. 10 Div 4 = 2 f. 5 Mod 7 = 5
c. 7- 3 = 4 g. 10/ 4= 2 .5
d. 20 Mod 3 = 2 h. 4 ^ 2 = 16
Ex p r e sión Re su lt a do Ex p r e sión Re su lt a do
1/ 4 0 .2 5 18 Div 2 9
30/ 30 1 .0 10 Mod 3 1
32
6/ 8 0 .7 5 10 Mod 2 0
-4 * 7+ 8/ 4 - 5
-28 + 8/ 4 - 5
-28 + 2 - 5
-26 - 5
-31
• A * ( B+ 3)
La con st a n t e 3 se su m a p r im e r o a l v a lor d e B, d e sp u é s e st e r e su lt a d o
se m u lt ip lica p or e l v a lor d e A.
• ( A* B) + 3
Se m u lt ip lica n p r im e r o y a con t in u a ción se su m a 3 .
• A + (B/ C) + D
Est a e x pr e s ión e q u iv a le a A+ B/ C + D
• Not 4 > 6
Pr od u ce u n e r r or , y a q u e e l op e r a d or N ot se a p lica a 4 .
33
4.7. Ejercicios Propuestos
• A * ( B+ 3) / ( C+ 4)
• ( A* B) + 3 ( A DI V B )
• A + (B/ C) + A^ ¾
34
H ERRAM I EN TAS D E PROGRAM ACI ÓN
Introducción:
35
4.8. HERRAMIENTAS DE PROGRAMACIÓN
DIAGRAMA DE FLUJO
Se utilizan para la representación gráfica de las operaciones ejecutadas sobre los
datos a través de todas las partes de un sistema de procesamiento de
información, diagrama de flujo del sistema , como para la representación de la
secuencia de pasos necesarios para describir un procedimiento particular,
diagrama de flujo de detalle.
Por cuestiones prácticas se no utilizará el diagrama N–S, sino el simple. Para una
referencia detallada del mismo se puede referir al libro de Fundamentos de
programación primera edición[5].
36
Símbolos Principales
Inicio / fin Escritura Indicador de
Var = Valor Asignación Var
Dirección
-- Anterior
Programación Estructurada
-- Anterior -- -- Anterior --
Condición
Si No Si
Condición Condición
-- Anterior --
-- Anterior -- -- Anterior --
No Var = VI, VF
Condición ---------------
Si ---------------
---------------
---------------
---------------
No
--------------- Condición
Si
-- Siguiente
-- Siguiente -- -- Siguiente --
Si No Si
Condición Condición
-- Anterior --
-- Anterior -- -- Anterior --
Si ---------------
---------------
---------------
---------------
No
--------------- Condición
Si
-- Siguiente - -
- - Siguiente -- - - Siguiente --
38
Existen unos símbolos que se explicarán en detalle en el módulo de programación
estructurada más adelante. Un Ejemplo sencillo usando estos estándares lo tenemos a
continuación:
inicio
base, altura
Fase de
Resolución
área =
base*altura/2
área
Fin
39
Código: 6 Nombre Calculo del mayor de tres números
F.P. Enunciado
Elaborar un programa que pida tres números enteros y calcule cual de ellos es el mayor.
Etapas de Resolución del Problema
Análisis del Problema
Datos de Entrada Numero 1, Numero 2, Numero 3
Datos de Salida El mayor
Datos Auxiliares No hay
ü Pedimos cada uno de los números
ü Se comparan sucesivamente cada uno de los números
Descripción: entre si hasta encontrar el mayor.
ü presentamos el resultado del mayor.
Diseño y Verificación del Algoritmo
Formalización(Diagramas de Flujo, pseudocódigo)
INICIO
NO Num1 > SI
Num2
Mayor
FIN
Traza 2
Num1 Num2 Num3 Mayor
10 6 11 ? Num1 > Num2; Num1 > Num3
10 6 11 11
Traza 3
Num1 Num2 Num3 Mayor
2 8 5 ? Num1 > Num2; Num2 > Num3
2 8 5 8
Codificación y programa Autodocumentado
F.I. No se presenta
Ejecución sin ejecución.
40
Código: 7 Nombre Imprimir un menú de opciones
F.P. Enunciado
Diseñar un programa que permita imprimir un menú de cuatro opciones. En cada opción
seleccionada debe presentar un mensaje indicando cual fue la opción seleccionada.
Etapas de Resolución del Problema
Análisis del Problema
Datos de Entrada La opción seleccionada (1..4)
Datos de Salida Un mensaje con la opción seleccionada.
Datos Auxiliares No hay
ü Desplegamos el menú en la pantalla
ü Esperamos a que el usuario digite una de las
Descripción: opciones.
ü Desplegamos un mensaje con la opción
seleccionada.
Diseño y Verificación del Algoritmo
Formalización(Diagramas de Flujo, pseudocódigo)
INICIO
1. Opción Uno
2. Opción dos
3. Opción tres
4. Salir
F.R. Opciòn
Opción =
NO Opción = 4
SI
FIN
41
Codificación y programa Autodocumentado
F.I. No se presenta
Ejecución sin ejecución.
n
Código: 8 Nombre Potencia de x
F.P. Enunciado
Elaborar un diagrama de flujo que calcule la potencia n de x, siendo x y n números enteros.
Etapas de Resolución del Problema
Análisis del Problema
Datos de Entrada X, n
n
Datos de Salida Valor de la potencia x
Datos Auxiliares No hay
ü Pedimos cada uno de los números
ü Se multiplica el valor de X n veces por si misma, se
suma cada una de las multiplicaciones.
Descripción: ü presentamos el resultado de la potencia. Por razones de
demostración se prendarán tres formas diferentes de
elaborar el ejercicio, siendo el más apropiado la primera.
Diseño y Verificación del Algoritmo
Formalización(Diagramas de Flujo, pseudocódigo)
F.R. X, n X, n X, n
NO
Cont = 1, n+1 Inc 1 n>0 Pot = Pot + X * X
SI
Pot = Pot + X * X n=n- 1
Pot = Pot + X * X
n = n -1
NO
n=0
Pot SI
Pot
Pot
FIN
FIN FIN
Comprobación del Algoritmo (traza)
No se hace, Se Supone que los números digitados son positivos y enteros. Se supone que al inicio Pot = 0
Codificación y programa Autodocumentado
F.I. No se presenta
Ejecución sin ejecución.
n
Ejemplo 8: Calculo de la Potencia x
42
PSEUDOCODIGO
Es un lenguaje de Especificación de algoritmos, que utiliza palabras reservadas, y
exige la identación, ósea la sangría en el margen izquierdo de algunas líneas. A
continuación se presenta la plantilla de estandarización del pseudocódigo utilizado
en este libro.
43
fin_mientras
repetir
<acciones>
hasta_que <condición>
//Presentar el resultado
Escribir(área);
fin.
Comprobación del Algoritmo (traza)
base altura área
4.5 7.2 16.2
Codificación y programa Autodocumentado
Fase de
Implementación No se presenta
Ejecución sin ejecución.
Ejemplo 9: Hallar el área de un Triángulo pseudocódigo
44
CODIFICACIÓN EN EL LENGU AJE DE PROGRAMACION (LENGUAJE C)
Una vez se han hechos los análisis de los algoritmos en diagrama de flujo o en
pseudocódigo se puede proceder a codificarlo en el lenguaje de programación
seleccionado. En este caso se ha elegido C, por las características mencionadas
anteriormente.
45
switch Esta condición puede estar predefinida como en
Aunque la escala if-else-if puede realizar el bucle for o no haber final determinado, como
pruebas multicamino, es poco elegante. El los bucles while y do.
código puede ser bastante difícil de seguir y
puede confundir incluso a su autor algún tiempo for()
después. Por estas razones, C incorpora una El formato general del bucle for de C se
sentencia de decisión de ramificación múltiple encuentra de una forma o de otra en todos los
denominada switch. Esta sentencia compara lenguajes de programación procedimentales. En
sucesivamente una variable con una lista de C, sin embargo, proporciona una potencia y
constantes enteras o de caracteres. Cuando se flexibilidad sorprendentes.
encuentra una correspondencia.
for(inicialización; condición; incremento)
switch (variable) { sentencia;
case constante1:
secuencia de sentencias • La inicialización normalmente es una
break; sentencia de asignación que se utiliza para
case constante2: iniciar la variable de control del bucle.
secuencia de sentencias • La condición es una expresión relacional que
break; determina cuándo finaliza el bucle.
case constante3: • El incremento define cómo cambia la
secuencia de sentencias variable de control cada vez que se repite el
break; bucle.
... while()
El segundo bucle disponible en C es el bucle
default: while. Su forma general es:
secuencia de sentencias
} while(condición) sentencia;
Hay tres cosas importantes que se deben saber donde sentencia es una sentencia vacía una
sobre la sentencia switch: sentencia simple o un bloque de sentencias que
se repiten. La condición puede ser cualquier
1. La sentencia switch se diferencia de la expresión y cualquier valor distinto de O es
sentencia if en que switch sólo puede cierto. El bucle itera mientras la condición es
comprobar la igualdad, mientras que if cierta. Cuando la condición se hace falsa, el
puede evaluar expresiones relacionales control del programa pasa a la línea siguiente al
o lógicas. código del bucle.
2. No puede haber dos constantes case
en el mismo switch que tengan los do while()
mismos valores. Por supuesto, una A diferencia de los bucles for y while, que
sentencia switch contenida en otra analizan la condición del bucle al principio del
sentencia switch puede tener mismo, el bucle do/while analiza la condición al
constantes case que sean iguales. final del bucle. Esto significa que el bucle
3. Si se utilizan constantes de tipo do/while siempre se ejecuta al menos una vez.
carácter en la sentencia switch, se
convierten automáticamente a sus do {
valores enteros. secuencia de sentencias ;
} while(condición);
Sentencias Repetitivas (Bucles)
En C, como en todos los lenguajes de break
programación modernos, las sentencias de La sentencia break tiene dos usos. Se puede
iteración (también denominadas de bucles) usar para finalizar un case en una sentencia
permiten que un conjunto de instrucciones sea switch.
ejecutado hasta que se alcance una cierta
condición.
46
También se puede usar para forzar la continue()
terminación inmediata de un bucle, saltando la La sentencia continue opera de forma similar a
evaluación condicional normal del bucle. break. Sin embargo, en vez de forzar la
terminación, continue fuerza una nueva iteración
exit() del bucle y salta cualquier código que exista
Se puede salir anticipadamente de un programa entre medias.
usando la función exit() de la biblioteca
estándar. Como la función exit() da lugar a la Etiquetas y goto
terminación inmediata del programa, forzando la Aunque el uso del goto ha decaído desde hace
vuelta al sistema operativo, su uso la convierte algunos años, recientemente se ha decidido
específicamente en un dispositivo de control de mejorar un poco su empañada imagen. Se debe
programa y muchos programadores de C se dejar anotar que no existen situaciones de
basan en ella. La forma general de la función programación que necesiten de su uso; más
exit( ) es esta: bien, puede resultar conveniente y beneficioso,
si se usa apropiadamente, en determinadas
void exit(int estado): situaciones de programación. Por ello, el goto
Generalmente se usa un cero como argumento no se utiliza en este libro fuera de esta sección.
de exit() para indicar que se trata de una (En un lenguaje como C, que tiene un rico
terminación normal del programa. Se utilizan conjunto de estructuras de control y permite un
otros argumentos para indicar algún tipo de control adicional usando break y continue, no es
error que pueda ser accedido por un proceso de muy necesario.) La idea principal que los
mayor nivel. programadores tienen sobre el goto es que
tiende a hacer los programas ilegibles. Sin
embargo, hay veces en las que el uso del goto
realmente clarifica el flujo del programa más que
confundirlo.
47
//Algoritmo que calcula el perímetro de una circunferencia
Algoritmo circunferencia;
var
real: radio, perímetro;
Const
Pi=3.1416;
inicio
//Lectura del radio
Leer (radio);
//Presentar el resultado
Escribir(perímetro);
fin.
Comprobación del Algoritmo (traza)
radio perímetro
3 18,8496
Codificación y programa Autodocumentado
// ___________________________________________________________
// Nombre: Perímetro de la Circunferencia
// Descripción: Este programa recibe la información del radio de
// la circunferencia y calcula su perímetro.
// Destino: Programa de Ingeniería de Sistemas
// Datos Responsable: Miguel Ángel Niño Zambrano UNICAUCA - FIET.
// Excep. / Errores: Ninguno implementado.
// Limitaciones: No hace validación de datos de entrada.
// ___________________________________________________________
#include <stdio.h>
#define pi 3.1416
Fase de #define escribe printf
Implementación
main()
{
//Definición de variables
int intRadio;
48
Código: 11 Nombre Usos de Variables
Formulación del Enunciado
Problema Elaborar un programa que permita demostrar el manejo básico de las
variables
Etapas de Resolu ción del Problema
Análisis del Problema
Datos de Entrada Ninguno
Datos de Salida Contenido de las variables
Datos Auxiliares Ninguno
ü Declarar variables locales y Globales
Descripción:
ü Imprimir los contenidos
Diseño y Verificac ión del Algoritmo
Formalización(Diagramas de Flujo, pseudocódigo)
//Algoritmo que ilustra el uso de la variables
Algoritmo UsodeVariables;
inicio
//Declaración de variables locales
Fase de var
Resolución entero: intnum1=4, intnum2, intnum3=6, intb=4;
49
Implementación // ___________________________________________________________
// Nombre: Usos de las Variables
// Descripción: El programa define variables locales y globales
// realiza operaciones básicas y presenta su
// contenido
// Destino: Programa de Ingeniería de Sistemas
// Datos Responsable: Miguel Ángel Niño Zambrano UNICAUCA - FIET.
// Excep. / Errores: Ninguno implementado.
// Limitaciones: No hace validación de datos de entrada.
// ___________________________________________________________
#include <stdio.h>
#include <conio.h>
50
Código: 12 Nombre Usos de Operadores
Formulación del Enunciado
Problema Elaborar un programa que permita demostrar el manejo básico de los
operadores y como se aplican a los diferentes datos.
Etapas de Resolución del Problema
Análisis del Problema
Datos de Entrada Ninguno
Datos de Salida Contenido de las variables
Datos Auxiliares Ninguno
ü Declarar variables locales y Globales
Descripción:
ü Realizar las operaciones
Diseño y Verificación del Algoritmo
Formalización(Diagramas de Flujo, pseudocódigo)
//Uso de los operadores aritméticos
var
entero: inta←1,intb← 2,intc←3,intr;
entero: intx,inty,intz,intd,inte, intNumero;
inicio
Escribir("Uso de los operadores aritméticos:");
intr← inta+intb;
Escribir(inta,"+”, intb, “=”,intr);
intr← intc-inta;
Escribir(intc,"-”, inta, “=”,intr);
intb=intb+1;
Fase de Escribir(“b + 1 =”,intb);
Resolución
//Uso de los operadores de asignación
inta← 1;intb← 2;intc←3;
inta← inta+5;
Escribir("Uso de los operadores de asignación:");
Escribir("a + 5 = ",inta);
intc← intc-1;
Escribir("c - 1 = ",intc);
intb← intb*3;
Escribir("b * 3 = ",intb);
51
//Uso de los operadores lógicos AND,OR,NOT.
//Compara un número introducido
Escribir("Uso de los operadores logicos AND,OR,NOT");
Escribir("Introduce un numero: ");
Leer (intNumero);
Si (NOT(intNumero>=0)) entonces
Escribir("El numero es negativo");
Sino
Si ((intNumero<=100) AND (intNumero>=25)) entonces
Escribir("El numero esta entre 25 y 100");
Sino
Si ((intNumero<25) OR (intNumero>100)) entonces
Escribir("El numero no esta entre 25 y 100");
Fin_si
Fin_si
Fin_si
Fase de
/* Uso de los operadores relaciónales. */
Resolución
/* Compara dos números entre ellos */
Escribir("Uso de los operadores relacionales");
Escribir("Introduce el valor de A: ");
Leer (inta);
Escribir("Introduce el valor de B: ");
Leer (intb);
Si (inta>intb) entonces
Escribir("A es mayor que B");
Sino
Si (inta<intb) entonces
Escribir("B es mayor que A");
Sino
Escribir("A y B son iguales");
Fin_si
Fin_si
Fin.
Comprobación del Algoritmo (traza)
(se deja como ejercicio)
Codificación y programa Autodocumentado
// ___________________________________________________________
// Nombre: Uso de Operadores
// Descripción: Este programa presenta el uso de los principales
// usos de los operadores: Se ilustran los aritméticos
// de asignación y relacionales entre otros. Para esto
// se realizan operaciones sencillas.
// Destino: Programa de Ingeniería de Sistemas
Fase de // Datos Responsable: Miguel Angel Niño Zambrano UNICAUCA - FIET.
Implementación // Excep. / Errores: Ninguno implementado.
// Limitaciones: No hace validación de datos de entrada.
// ___________________________________________________________
#include<stdio.h>
#include<conio.h>
52
main() /* Realiza varias operaciones */
{
/*Uso de los operadores aritméticos*/
int inta=1,intb=2,intc=3,intr;
printf("Uso de los operadores aritmeticos:\n");
intr=inta+intb;
printf("%d + %d = %d\n",inta,intb,intr);
intr=intc-inta;
printf("%d - %d = %d\n",intc,inta,intr);
intb++;
printf("b + 1 = %d\n",intb);
getch();
53
/* Uso de los operadores relacionales. */
/* Compara dos números entre ellos */
printf("Uso de los operadores relacionales\n");
printf("Introduce el valor de A: ");
scanf("%d",&inta);
printf("Introduce el valor de B: ");
scanf("%d",&intb);
if(inta>intb)
printf("A es mayor que B\n");
else if(inta<intb)
printf("B es mayor que A\n");
else
printf("A y B son iguales\n");
getch();
}
54
ü Declarar variables locales y Global es
Descripción:
ü Imprimir los contenidos
Diseño y Verificación del Algoritmo
Formalización(Diagramas de Flujo, pseudocódigo)
(se deja como ejercicio)
Comprobación del Algoritmo (traza)
(se deja como ejercicio)
// ___________________________________________________________
// Nombre: Uso de printf
// Descripción: El programa demuestra las variedades
// de uso de printf.
// Destino: Programa de Ingeniería de Sistemas
// Datos Responsable: Miguel Ángel Niño Zambrano UNICAUCA - FIET.
// Excep. / Errores: Ninguno implementado.
// Limitaciones: No hace validación de datos de entrada.
// ___________________________________________________________
#include <stdio.h>
#include <conio.h>
/* Uso de la sentencia printf() 1. */
55
El valor de intNum1 es 20
El valor de intNum2 es 10
Por tanto 20+10=30
El valor de intNum3 es -15
Ejecución El valor de intNum4 es 3
El valor de floNum1 es 9.325000e+02 o 932.500000
El valor de intNum6 es 25986
El valor de linNum1 es 1976524
El valor de floNum2 es 9.576
Ejemplo.13: Uso de printf
56
// ___________________________________________________________
// Nombre: Uso de printf
// Descripción: El programa demuestra las variedades
// de uso de printf.
// Destino: Programa de Ingeniería de Sistemas
// Datos Responsable: Miguel Ángel Niño Zambrano UNICAUCA - FIET.
// Excep. / Errores: Ninguno implementado.
// Limitaciones: No hace validación de datos de entrada.
// ___________________________________________________________
#include <stdio.h>
#include <conio.h>
/* Uso de la sentencia printf() 1. */
El valor de intNum1 es 20
El valor de intNum2 es 10
Por tanto 20+10=30
El valor de intNum3 es -15
Ejecución El valor de intNum4 es 3
El valor de floNum1 es 9.325000e+02 o 932.500000
El valor de intNum6 es 25986
El valor de linNum1 es 1976524
El valor de floNum2 es 9.576
Ejemplo 14: Calculo de promedio de un estudiante
57
4.10. Ejercicios Propuestos
1. Det er m inar el Máxim o Com ún Divisor de dos núm er os ent er os por el algor it m o de
Euclides.
2. Diseñar un algor it m o que lea e im pr im a una ser ie de núm er os dist int os de cer o. El
algor it m o debe t er m inar con un v alor cer o que no se debe im pr im ir . Finalm ent e se
desea saber la cant idad de v alor es leídos dist int os de cer o.
3. Diseñar un algorit m o que im prim a y sum e la serie de núm eros 3,6,9,12,...,99.
4. Diseñar un algorit m o para calcular la velocidad ( en m et r os / segundo) de los
cor r edor es de una car r er a de 1500 m et r os. La ent r ada ser án par ej as de núm er os
( m inut os, segundos) que dar án el t iem po de cada cor r edor . Por cada cor r edor se
im pr im ir á el t iem po en m inut os y segundos, así com o la v elocidad m edia. El Bucle
se ej ecut ar á hast a que dem os una ent r ada de 0, 0 que ser á la m ar ca de fin de
ent r ada de dat os.
5. Diseñar un algorit m o para det erm inar si un núm ero n es prim o ( un núm ero prim o
sólo es divisible por el m ism o y la unidad) .
6. Escribir un Algorit m o que calcule la super ficie de un t r iángulo en función de la base
y la alt ura.
7. Escr ibir un algor it m o que lea un v alor ent er o, lo doble, se m ult iplique por 25 y
visualice el r esult ado.
8. Diseñar un algor it m o que lea cuat r o v ar iables y calcule e im pr im a su pr oduct o, su
sum a y su m edia ar it m ét ica.
9. Diseñar un Pr ogr am a que lea el peso de un Hom br e en Libr as y nos dev uelv a su
peso en Kilogr am os y gr am os. Not a: Una libr a equivale a 0.453592 Kilogr am os.
10. Escribir un algorit m o que calcule y escriba en cuadrado de 821.
11. Realizar un algorit m o que calcule la sum a de los ent eros ent re 1 y 10, es decir,
1+ 2+ 3+ 4+ ...+ 10.
12. Realizar un algor it m o que calcule las pot encias de 2 ent r e 0 y 10.
13. Leer un car áct er y deducir si est á sit uado ant es u después de la < < m > > en or den
alfabét ico.
14. Leer dos car act er es y deducir si est án en or den alfabét ico.
15. Leer un car áct er y deducir si est á o no com pr endido ent r e las let r as I y M am bas
inclusiv e.
16. Leer dos cadenas de t ex t o y est ablecer si una cadena cont iene la ot r a, el algor it m o
debe im pr im ir la cadena cont enedor a y la cadena cont enida.
17. A par t ir de una cadena de car act er es est ablecer el num er o de let r as < < a> > que
cont iene.
18. Leer un núm er o de que puede t om ar sólo v alor es ent r e 0 y 3, dependiendo del
v alor escogido dev uelv e un m ensaj e especificando cual fue la opción seleccionada.
19. Leer una cadena y la pr esent e con las v ocales en m ay úscula y las dem ás let r as en
m inúscula.
20. Pr ogr am a que m uest r e el abecedar io en m ay úsculas: ( Not a: El ASCI I A= 65, B= 66,
..., Z= 90) .
58
PROGRAM ACI ÓN ESTRUCTURAD A
Introducción:
Las principales estructuras que deben existir en todo lenguaje son: simples
(asignaciones, lecturas, escrituras), Decisión (si simple, si doble, opción múl tiple) y
las repetitivas (Repetir hasta, Mientras hacer, Para un valor inicial hasta uno final
hacer). Estos elementos son primordiales y suficientes para elaborar soluciones
adecuadas a los problemas algorítmicos. Todos los procesos definidos en la
solución de un problema son traducidos a la computadora por medio de estas
estructuras.
59
4.11. PROGRAMACIÓN ESTRUCTURADA
En el capitulo anterior se presento todas las estructuras que se van a utilizar tanto
el los algoritmos como en la codificación en C. La programación estructurada se
refiere a la utilización de un número limitado de estructuras de control, que
simplifican la complejidad de los problemas y por consiguiente permiten
solucionarlo de una forma algoritmica.
INTRODUCCION
Un programa puede considerarse como una secuencia de acciones (instrucciones)
que manipulan un conjunto de objetos (datos). Contendrá por tanto dos bloques
para la descripción de los dos aspectos citados:
60
Part es principales de un program a
Dentro del bloque de instrucciones de un programa podemos diferenciar tres
partes fundamentales. En algunos casos, estas tres partes están perfectamente
delimitadas, pero en la mayoría sus instrucciones quedan entremezcladas a lo
largo del progra ma, si bien mantienen una cierta localización geométrica impuesta
por la propia naturaleza de las mismas.
//Bloque de Declaraciones de }
//funciones
Función <nombre_función) //Bloque de Declaraciones de
inicio //funciones
... funcion1()
fin. {
}
procedimiento <nombre>
inicio void funcion2()
... {
fin. }
61
CLASIFICACION DE LAS INSTRUCCIONES
Una instrucción se caracteriza por un estado inicial y final del entorno. El estado
final de una instrucción coincide con el inicial de la siguiente. No siempre una
instrucción modifica el entorno, pues su cometido puede limitarse a una mera
observación del mismo o a un cambio en el orden de ejecución de otras. Las
instrucciones pueden ser:
62
• Instrucción repetitiva: hace que se repitan una o varias instrucciones un
número determinado o indeterminado de veces (PARA, MIENTRAS, HASTA e
ITERAR).
Cont adores
Un contador es un campo de memoria cuyo valor se incrementa en una cantidad
fija, positiva o negativa, generalmente asociado a un bucle. Toma un valor inicial
antes de comenzar su función, y cada vez que se realiza
el suceso, incrementa su valor. Se utiliza en los siguientes casos:
• Para contabilizar el número de veces que es necesario repetir una acción
(variable de control de un bucle).
• Para contar un suceso particular solicitado por el enunciado del problema
(asociado a un bucle o independientemente).
Acum ulador es
Un acumulador es un campo de memoria cuyo valor se incrementa sucesivas
veces en cantidades variables. Se utiliza en aquellos casos en que se desea
obtener el total acumulado de un conjunto de cantidades, siendo preciso
inicializarlo con el valor 0. También en las situaciones en que hay que obtener un
total como producto de distintas cantidades se utiliza un acumulador, debiéndose
inicializar con el valor 1.
63
Instrucciones Primitivas
Diagrama de Flujo Pseudocódigo Lenguaje C
No existen //Declaración de Nuevos Tipos de Datos //Declaración de Librerías
Tipo #include <nombre_archivo.h>
//Declaración de tipos Enumerado //Declaración de Constantes
<nombre_tipo> = ( elem1, elem2, ... , elemN ); #define <nombre_dato> <valor_constante>;
64
Instrucciones de Declaración
Diagrama de Flujo Pseudocódigo Lenguaje C
//Entrada de Dat os //Entrada de Datos //Entrada de Datos
var1, var2 Leer(var1, var2,..., varn); scanf("especificaciones de formato",APUNTADORES DE
LAS VARIABLES);
//Asignación //Asignación
var1← <Expresión> var1←<Expresión>; //Asignación
var1=<Expresión>;
//Salida de Datos //Salida de Datos
Escribir(var1, var2,..., varn); //Salida de Datos
var1, var2 Escribir(“Texto de Salida”,var1, var2,..., varn); printf("mensajes y <especificaciones de
campo>",<LISTA DE VARIABLES>);
Instrucciones Compuestas
Diagrama de Flujo Pseudocódigo Lenguaje C
//Iguales al abs(x) //funciones para m anejo de caracteres más log(x): Logaritmo natural de x
pseudocódigo arctan(x) comunes del lenguaje c: log10(x): Logaritmo base 10 de x
cos(x) Strlen(v): Proporciona el número de caracteres pow(x,n): Eleva x al exponente n
Nombre función o exp(x) que componen el valor alfanumérico sin(x): Seno de x (en radianes)
procedimiento ln(x) almacenado en la variables V cos(x): Coseno de x (en radianes)
log10(x) Strlwr(v): Convierte los caracteres alfabéticos sqrt(x): Raiz cuadrada de x
redondeo(x) de la cadena en minúsculas randomize(x): Indica la semilla para generar
sen(x) Strupr(v): Convierte los caracteres alfabéticos números pseudoaleatorios.
cuadrado(x) de la cadena en mayúsculas tan(x): Tangente de x (en radianes)
raiz2(x) Strcmp(v,w): Compara la cadena v con la random(x): Genera un número pseudoaleatorio
trunc(x) cadena w, regresa un 0 si las cadenas son entre cero y (x-1).
Estas funciones iguales
ya han sido Strcpy(v,w): Copia la cadena W en la cadena v NOTA:Al momento de realizar los programas se
explicadas en la Strcat(v,w): Agrega la cadena w al final de la debe tener en cuenta que si no agrega las
Cuadro 1 cadena v directivas de preprocesamiento adecuadas,
Otras funciones: //funcion es aritméticas de biblioteca más algunas de las funciones no pueden ser
Borrar_Pantalla() usuales reconocidas por el compilador y se generara un
IrA(x,y) abs(x): Valor absoluto de x (argumento entero) error, en tal caso hay que verificar que la sintaxis
atan(x): Arcotangente de x (con resultados co sea correcta, que efectivamente se agregó las
valores de -1.57 a 1.57 en radianes) directivas correctas o en algunos casos activarlas
exp(x): Función exponencial. en OPTIONS/LINKER/LIBRARIES.
65
Instrucciones de Control
Diagrama de Flujo Pseudocódigo Lenguaje C
//Instrucciones Selectivas //Instrucciones Selectivas //Instrucciones Selectivas
//Decisión Simple //Decisión Doble //Decisión Simple //Decisión Simple
si <condición> entonces if (expresión) sentencia;
<acciones> else sentencia;
Si No Si fin_si
No --
//Decisión Doble
//Decisión Doble if (expresión) {
si <condición> entonces secuencia de sentencias
<acciones> }
//Decisión Múltiple si_no else {
<acciones> secuencia de sentencias
fin_si }
66
4.11.2. Estructuras Básicas de Control de Programa
Alternativas
Los programas, para un mejor funcionamiento y poder realizar un número mayor
de tareas, deben permitir emplear acciones alternativas para poder elegir una de
ellas cuando la situación lo requiera. Las instrucciones condicionales o tomas de
decisión permiten realizar acciones alternativas. Por tanto, la ejecución de una
línea o grupos de líneas del programa depende de si cumplen o no una o varias
condiciones.
TOMAS DE DECISION
Para preguntar se utiliza la instrucción o sentencia SI (IF). La contestación sólo
puede ser verdadero o falso, es decir, sí o no.
I nst rucción SI
si <condición> entonces
< instrucciones >
fin_si
• La cumple: realiza todas las instrucciones que hay dentro del SI, luego
continua ejecutando las que están fuera del SI.
• No la cumple: no entra en el SI. Sólo realiza las instrucciones siguientes al SI.
Es decir, las instrucciones del SI sólo las realiza cuando cumple la condición. Las
instrucciones que están fuera las realiza siempre, se cumpla o no la condición. Se
puede poner más de una condición, siempre y cuando estén unidas por los
operadores lógicos (AND, NOT, OR).
68
Resolución Datos de Entrada Numero
Datos de Salida “Es negativo”
Datos Auxiliares No hay
ü Pedimos el número
ü Preguntamos si es menor de cero
ü Si es menor de cero, entonces el número es
Descripción:
negativo.
ü Si es negativo presentar el mensaje.
ü Si no, no presentar nada.
Diseño y Verificación del Algoritmo
Formalización(Diagramas de Flujo, pseudocódigo)
//Algoritmo que verifica si el número leído es negativo
Algoritmo negativo;
var
real: Número;
inicio
//Limpia la pantalla
Borrar_Pantalla();
Número ← 0;
Escribir (“Introduce un Número”);
Leer (Número);
//Verificar si es negativo
si Número < 0 entonces
Escribr (“Es Negativo”);
Fin_si
fin.
Comprobación del Algoritmo (t raza)
Traza 1
Número Respuesta
3 Nada
Traza 2
Número Respuesta
-4 “Es Negativo”
69
Implementación // ___________________________________________________________
// Nombre: Uso de if
// Descripción: El programa demuestra el uso de la sentencia IF.
// Destino: Programa de Ingeniería de Sistemas
// Datos Responsable: Miguel Ángel Niño Zambrano UNICAUCA - FIET.
// Excep. / Errore s: Ninguno implementado.
// Limitaciones: No hace validación de datos de entrada.
// ___________________________________________________________
#include <stdio.h>
#include <conio.h>
/* Uso de la sentencia if. */
si <condición> entonces
< instrucciones_1 >
si_no
< instrucciones_2>
fin_si
70
• No las cumple: ejecuta las instrucciones que hay entre el SINO y el FINSI
(instrucciones_2).
Todo lo que se encuentre fuera del SI siempre lo va a realizar. SINO significa "en
caso contrario".
inicio
//Limpia la pantalla
Borrar_Pantalla();
Fase de Número ← 0;
Resolución Escribir (“Introduce un Número”);
Leer (Número);
//Verificar si es par
si Número = int(Número / 2) * 2 entonces
Escribr (“Es Par”);
Sino
Escribr (“Es Impar”);
Fin_si
fin.
Fase de Comprobación del Algoritmo (traza)
71
Resolución Traza 1
Número Respuesta
20 “Es impar”
Traza 2
Número Respuesta
21 “Es par”
Traza 3
Número Respuesta
22 “Es par”
72
I nst rucciones SI - SI NO anidadas
El anidamiento es una técnica utilizada para relacionar estructuras de
programación contenidas en otras estructuras, de tal forma que una estructura
puede contener otra estructura dentro de sus bloque de código y a su vez esa
estructura puede contener otra estructura y asi sucesivamente. Cuando anidamos
sólo estructuras SI – SINO es lo que se conoce como SI – ANIDADOS, éstos
permiten elaboar jerarquías de condiciones. Los anidamientos permitidos y no
permitidos lo podemos observar en la Figura 2. En los anidamientos también se
pueden utilizar repetitivos anidados o una combinación de anidamiento de
diferentes estructuras. La estructura de un SI – SINO anidado es como la
siguiente:
A B C
si condición_1 entonces
< instrucciones _1>
si condición_2 entonces
< instrucciones _2>
si_no
< instrucciones _3>
fin_si
si_no
< instrucciones _4>
si condición_3 entonces
< instrucciones _5>
si_no
< instrucciones _6>
fin_si
fin_si
73
Código: 17 Nombre Determinar Bebe, Niño o Adulto
F.P. Enunciado
Elaborar un algoritmo que una vez dado la edad pueda determinar si el usuario es un Bebe (1..3
años), Niño (3..13 años) o Adulto (13 o más años)
Etapas de Resolución del Problema
Análisis del Problema
Datos de Entrada Edad
Datos de Salida “Estas Equivocado”“Eres un Bebé”, “Eres un Niño”, “Eres un Adulto”
Equivocado (menor de 1 año), Bebe (1..3 años) o Niño (3..13 años),
Datos Auxiliares
Adulto (13 o más años).
ü Pedimos la edad
Descripción:
Traza 3 Traza 4
Edad Respuesta Edad Respuesta
10 “Eres un Niño” 20 “Eres un Adulto”
74
Implementación // ___________________________________________________________
// Nombre: Uso de if anidados
// Descripción: Se demuestra el uso de la sentencia else if.
// Destino: Programa de Ingeniería de Sistemas
// Datos Responsable: Miguel Ángel Niño Zambrano UNICAUCA - FIET.
// Excep. / Errores: Ninguno implementado.
// Limitaciones: No hace validación de datos de entrada.
// ___________________________________________________________
#include <stdio.h>
#include <conio.h>
/* Uso de la sentencia else if. */
//Borrar la pantalla
clrscr();
//Pedir el número
printf("Introduce tu edad: ");
scanf("%d",& intEdad);
if (intEdad <1)
printf("Te has equivocado.");
else if (intEdad <3) printf("Eres un beb‚");
else if (intEdad <13) printf("Eres un ni¤o");
else printf("Eres adulto");
getch();
}
Traza 1
Introduce tu edad: -5
Lo siento, te has equivocado.
Traza 2
Introduce tu edad: 2
Ejecución
Eres un bebe
Traza 3
Introduce tu edad: 10
Eres un ni±o
Traza 4
Introduce tu edad: 18
Eres adulto
Ejemplo.17: Determinar si es Bebe, Niño o Adulto
75
I nst rucción condicional m últ iple SEGÚN_SEA
Bucles
76
I nst ruccion MI ENTRAS
mientras <condición> hacer
<instrucciones_1>
fin_mientras
<instrucciones_2>
• Se cumple: va a realizar todas las instrucciones que están dentro del ciclo,
instruccion_1. Las estará repitiendo hasta que deje de cumplirse la condición.
Entonces sale del ciclo y continúa ejecutando las instrucciones que hay fuera
de él, instruccion_2.
• No se cumple: no entrará en el ciclo. Ejecuta las instrucciones que están
fuera de él, instruccion_2.
La condición del bucle no tiene por qué ser única: puede haber más de una,
siempre y cuando estén unidas por los operadores lógicos (AND, NOT, OR).
(Refiérase al Ejemplo 18). Lo expresamos:
• No se cumple: va a realizar todas las instrucciones que están dentro del ciclo,
instruccion_1. Las estará repitiendo hasta que se cumpla la condición.
Entonces sale del ciclo y continúa ejecutando las instrucciones que hay fuera
de él, instruccion_2.
• Se cumple: Saldrá del ciclo. Ejecuta las instrucciones que están fuera de él,
instruccion_2.
La condición del bucle no tiene por qué ser única: puede haber más de una,
siempre y cuando estén unidas por los operadores lógicos (AND, NOT, OR).
(Refiérase al Ejemplo 18). Lo expresamos:
77
Código: 18 Nombre Operaciones matemáticas simples
F.P. Enunciado
Introducir dos números por teclado y mediante un menú calcular su suma, su resta, su
multiplicación y su división. Validar que los números no sean negativos y la división por cero.
Etapas de Resolución del Problema
Análisis del Problema
Datos de Entrada Numero1, Numero2
Datos de Salida La suma, resta. Multiplicación y división de los numeros
Datos Auxiliares No hay
ü Pedimos los números, si alguno de ellos es negativo entonces se vuelve a pedir el
número hasta que sea positivo.
Descripción :
78
//Realizar el proceso según el valor de la opción digitada
según_sea Opcion hacer
1:IrA (10,20); Escribir("Su suma es: ");
IrA (10,33); Escribir(Numero1 + Numero2);
2:IrA (10,20); Escribir("Su resta es: ");
IrA (10,33); Escribir(Numero1 - Numero2);
3:IrA (10,20); Escribir("Su multiplicación es: ");
IrA (10,33); Escribir(Numero1 * Numero2);
4://validar la división por cero
si Numero2 <> 0 entonces
IrA (10,20); Escribir("Su división es: ");
F.R. IrA (10,33); Escribir(Numero1 / Numero2);
si_no
IrA (10,20); Escribir("División no válida, División por cero ");
fin_si
si_no
IrA (10,20); Escribir(“Opción incorrecta”);
fin_según
fin_mientras
fin.
Comprobación del Algoritmo (traza)
Se deja como ejercicio
Codificación y programa Autodocumentado
// ___________________________________________________________
// Nombre: Operaciones Matemáticas
// Descripción: Se demuestra el uso de Do, While y Switch
// Destino: Programa de Ingeniería de Sistemas
// Datos Responsable: Miguel Ángel Niño Zambrano UNICAUCA - FIET.
// Excep. / Errores: No se valida la entrada numérica.
// Limitaciones: Los Numeros deben ser Positivos. División por cero
// ___________________________________________________________
#include <stdio.h>
#include <conio.h>
/* Uso de las sentencias while, Do, Switch. */
clrscr();
//Leer los números hasta que sean positivos
do
{
gotoxy(10,20); printf("1er. Número: ");
gotoxy(10,29); scanf(&floNumero1);
gotoxy(12,20); printf( "2do. Número: ");
gotoxy(12,29); scanf("%f", &floNumero2);
}
while ((floNumero1 < 0) || (floNumero2 < 0));
79
//Repetir el menu hasta que se dijite Salir
while (intOpcion != 5)
{
intOpcion = 0;
clrscr();
gotoxy(6,20); printf("Menú de opciones");
gotoxy(10,25); printf("1.- Suma");
gotoxy(12,25); printf("2.- Resta");
gotoxy(14,25); printf("3.- Multiplicación");
gotoxy(16,25); printf("4.- División");
gotoxy(18,25); printf("5.- Salir del programa");
gotoxy(22,25); printf("Elige opción: ");
gotoxy(22,39); scanf("%d", &intOpcion);
clrscr();
80
El bloque de <instrucciones_1> se realiza n veces, dónde n = |v_final – v_inicial |.
Una vez el v_final = v_inicial se deti ene el ciclo y se ejecuta el bloque de
<instruccion_2.>.
Para el caso del lenguaje C se utiliza la instrucción FOR(), la cual tiene formas
más elaboradas de control de ciclo y de definición de varios contadores. El FOR
de C es diferente en su implementación con respecto al pseudocódigo, porque
este se debe manejar como un MIENTRAS con contadores.
inicio
//Usar un desde para la impresión
desde Contador ← 1 hasta 101 Inc 1 hacer
//Si el contador es 25 Continuar_For es un instrucción que salta la ejecución
//al sigiçuiente ciclo del desde
si Contador = 25 entonces
Continuar_For;
fin_si
Escribir(Contador);
fin_desde
fin.
Comprobación del Algoritmo (traza)
No se hace
Fase de Codificación y programa Autodocumentado
81
Implementación // _________________ __________________________________________
// Nombre: Contador de Números
// Descripción: Se demuestra el uso de for, Continue;
// Destino: Programa de Ingeniería de Sistemas
// Datos Responsable: Miguel Ángel Niño Zambrano UNICAUCA - FIET.
// Excep. / Errores: Ninguno implementado.
// Limitaciones: No hace validación de datos de entrada.
// ___________________________________________________________
#include <stdio.h>
#include <conio.h>
/* Uso de la sentencia CONTINUE. */
BUCLES ANIDADOS
Un ciclo puede estar formado por otro u otros ciclos. Al igual que sucedía con la
instrucción SI, que dentro de un SI podíamos tener todos los SI que fueran
necesarios, dentro de un bucle MIENTRAS pueden ir otro u otros bucles
MIENTRAS, de tal forma que el último de todos, el situado más interiormente, es
el primero en cerrarlo, en acabar. El primero de todos, situado más fuera, es el
último en termi nar.
82
forma se puede hacer con las demás estructuras repetitivas.
Inicio
//Usar un desde para la impresión
Fase de desde Tabla ← 1 hasta 11 Inc 1 hacer
Resolución desde Contador ← 1 hasta 11 Inc 1 hacer
Resultado ← Tabla * Contador;
Escribir(Tabla, “ por”, Contador, “ = “, Resultado);
fin_desde
fin_desde
fin.
Comprobación del Algoritmo (traza)
Tabla Contador Resultado
1 1 1
1 2 2
1 3 3
1 4 4
1 5 5
1 6 6
1 7 7
1 8 8
1 9 9
1 10 10
2 1 2
...
Fase de Codificación y programa Autodocumentado
83
Implementación // ___________________________________________________________
// Nombre: Tablas de Multiplicar
// Descripción: Se demuestra el uso de for anidado
// Destino: Programa de Ingeniería de Sistemas
// Datos Responsable: Miguel Ángel Niño Zambrano UNICAUCA - FIET.
// Excep. / Errores: Ninguno implementado.
// Limitaciones: No hace validación de datos de entrada.
// ___________________________________________________________
#include <conio.h>
#include <stdio.h>
/* Uso de la sentencia FOR anidada. */
1 por 1 = 1
1 por 2 = 2
1 por 3 = 3
1 por 4 = 4
1 por 5 = 5
Ejecución
1 por 6 = 6
1 por 7 = 7
1 por 8 = 8
1 por 9 = 9
1 por 10 = 10
<enter>
...
Ejemplo 20: Tablas de Multiplicar
84
4.12. Ejercicios Propuestos
1. Elabor e un algor it m o que sum e dos núm er os ent er os posit iv os, el algor it m o debe
cont r olar que la ent r ada de dat os cum pla con la condición est ablecida.
2. Elabore un algorit m o que lea dos núm eros y est ablezca si uno es m últ iplo del ot ro.
3. Elabore un algorit m o que lea t res coordenadas cart esianas ( X, Y) y det er m in e si
con ellas se puede form ar un t riángulo rect ángulo.
4. Elabor e un algor it m o que det er m ine si un punt o del plano car t esiano ( X , Y) se
encuent ra dent ro, fuera o sobre un circulo de radio R que t iene su cent r o en ( 0,0) .
5. Elabore un algorit m o que m uest re el valor de la coordenada Y de punt o X solicit ado
al usuar io, el cual se encuent r a en la t r ay ect or ia de una r ect a. De dicha r ect a
pr ev iam ent e se solicit an 2 punt os con sus r espect iv as coor denadas ( X , Y ) .
6. Elabore un algorit m o que lea n y r y m uest r e el siguient e r e sult ado: n ! / ( r ! * ( n
- r) ! ) .
7. Elabor e un algor it m o que m uest r e la sum a de los N pr im er os t ér m inos de la ser ie
1, 3, 5, 7, 9 , ...
8. Elabor e un algor it m o que lea un núm er o ent er o y com o r esult ado m uest r e el
num er o digit ado en for m a inv er t ida, por ej em plo si se t eclea el núm er o 853 debe
m ost rar el núm ero 358.
9. Elabor e un algor it m o que m uest r e la t abla de m ult iplicar de los pr im er os N
núm er os ent er os posit ivos.
10. Elabor e un algor it m o que m uest r e los N pr im er os t ér m inos de la ser ie de
Fibon n a ci, sabiendo que dicha ser ie inicia con T0 = 0 , T 1 = 1 y Tn = T n- 1 + Tn - 2.
11. Elabor e un algor it m o que m uest r e el N- nésim o t ér m ino de la siguient e ser ie: 1, 3,
8, 30, 144, 840, ...
12. Elabor e un algor it m o que calcule X y , t eniendo en cuent a que los dos v alor es son
ent r ados por el usuar io, y el lenguaj e de pr ogr am ación no cuent a con ningún t ipo
de función pr edefinida que per m it an hacer la oper ación ( Se deben ut ilizar
inst r ucciones r epet it ivas) .
13. Elabor e un algor it m o que calcule la sum at or ia de los N pr im er os t ér m inos de la
ser ie 1!, 2! , 3! , 4! , 5! , ...
14. Elabor e un algor it m o que list e los núm er o per fect os ent r e 1 y 200. Tenga en cuent a
que un núm ero perfect o es aquel cuya sum a de sus m últ iplos es igual al m ism o
núm ero. Por ej em plo 28 es un núm ero perfect o ya que 1 + 2 + 4 + 7 + 14 = 28.
15. Elabore un algorit m o que lea dos variables X, N y en un solo ciclo repet it ivo
DESDE calcule los siguient es v alor es 2 N y X N .
16. Elabor e un algor it m o que lea núm er os ent er os hast a que se digit e 99999. El
algor it m o debe escr ibir los siguient es r esult ados:
• La sum at oria de los núm ero leídos
• La cant idad de núm eros leídos
• El m enor núm ero leído
• El m ayor núm ero leído
• El núm ero leído que haya est ado m ás cerca de 1000.
17. Elabore un algorit m o que im prim a los núm eros de t res dígit os ( 1 0 0 < = X < 1 0 0 0 )
que sean iguales a las sum as de los cubos de sus dígit os. Est r at egia aconsej ada:
D ESD E AN I N AD OS.
18. Elabor e un algor it m o que det er m ine el m áx im o com ún div isor de dos núm er os
ent er os posit iv os, sabiendo que el MCD es el m enor núm er o que puede div idir a los
dos prim eros sin dej ar residuo.
85
19. Elabore un algorit m o que det erm ine el m ínim o com ún m últ iplo de dos núm eros
ent eros posit ivos, sabiendo que el MCM es el m enor núm ero que dividido por los
dos prim eros no dej a residuo.
20. Elabore un algorit m o que lea de un salón de clase el nom bre de un est udiant e y sus
t r es not as par ciales ( Equiv alent es en por cent aj e) hast a que el nom br e sea ‘0’. El
algorit m o debe decir:
• El nom bre del est udiant e, las t res not as parciales y la not a definit iva.
• Cuant os est udiant es fuer on digit ados.
• La not a prom edio definit iva del salón.
86
PROGRAM ACI ÓN M OD ULAR
Introducción:
87
4.13. Programación Modular
4.13.1. Subprogramas. Los programas realizados hasta ahora están todos ellos
descritos en un único programa, llamado programa principal. Cuando se habla de
modularidad, consiste en estructurar el programa principal en módulos más
pequeños llamados subprogramas o subrutinas. Un subprograma es un conjunto
de sentencias de un programa que realizan una determinada tarea y que pueden
ser ejecutadas desde más de un punto del programa principal. Cuando termine de
ejecutarse el subprograma continúan procesándose las instrucciones siguientes
del programa.
Una subrutina es como un boomerang: va, realiza lo que tenga que hacer y
regresa al punto de partida. Su estructura básicamente es la de cualquier
programa, con las diferencias lógicas en la parte inicial y final. A su vez, un
subprograma puede estar compuesto por varios subprogramas. Están descritos
fuera del programa principal.
• DO
• GOSUB
• PERFORM
• CALL
88
4.13.2. Tipos de Subprogramas.
Subrutinas
Las subrutinas son bloques de instrucciones que son llamadas bajo una etiqueta
de llamada (LABEL) y retornan al punto dónde fueron llamadas por una instrucción
de retorno (RETURN). Normalmente la estructura de este tipo de subprogramas
es como sigue:
Algoritmo Principal();
var
...
Inicio
...
Llamar ETIQUETA_SUBRUTINA;
...
fin.
ETIQUETA_SUBRUTINA:
<instrucción_1>
<instrucción_2>
...
<instrucción_N>
devolver;
Nótese que el llamado se hace con la palabra reservada Llamar la cual llama la
etiqueta definida en la cabecera del subprograma después del fin del programa
principal. Nótese también que la subrutina termina con la etiqueta devolver, la
cual permite establecer el fin del subprograma y continuar con la siguiente línea de
código de dónde fue llamada la subrutina.
Funciones y Procedimientos
Una función es una parte de código independiente del programa principal y de
otras funciones, que puede ser llamada enviándole unos datos (o sin enviarle
4
Algunos autores consideran los llamados a subrutinas (GO TO) como una falta de habilidad del
programador para resolver el problema con las herramientas de la programación estructurada y
modular.
89
nada), para que realice una determinada tarea y/o proporcione unos resultados.
Los procedimientos en su definición son similares a las funciones, pero se
diferencian en que éstos no devuelven información por si mismos. Aunque más
adelante se vera que los procedimientos y las funciones pueden afectar variables
del programa principal por medio de una técnica llamada parámetros por
referencia.
90
2. Los problemas anteriores se pueden agrupar a su vez en un grupo de
funciones matemáticas y otro de funciones de presentación.
3. Finalmente el esquema de solución podría ser el siguiente:
Incluir Matemática;
Incluir Presentación;
Programa Principal
Var
entero: a,b,Op;
Inicio
Librería Matemática Ventana(5,510,10); Librería de Presentación
Funcion Suma(a,b) Entrar a,b; Entrar Op Procedimiento Ventana (x,y,x1,y1)
Inicio En caso (Op) Inicio
Retornar(a+b); 0: Sumar(a,b) ....
Fin 1: Restar(a,b) Fin
Funcion Resta(a,b) 2: Multiplicar(a,b) Procedimiento Animar (x,y,x1,y1)
Inicio 3: Dividir(a,b) Inicio
Retornar(a-b); ....
Fin Fin
Funcion Multiplicar(a,b) Funcion TipoLetra (...)
Inicio Inicio
Retornar(a*b); ....
Fin Fin
Funcion Dividir(a,b)
Retornar(a/b);
nicio
91
La definición de un procedimiento es de la siguiente forma:
Los parámetros formales a su vez pueden ser de dos tipos: pará metros por valor
o parámetros por referencia , esto significa que los primeros crean una copia de
los datos de los parámetros actuales y son variables locales a la función y los
segundos se apuntan a la variable que hizo el llamado actual desde el programa
principal, permitiendo así que cualquier modificación que se realice a estas
variables sea visto en las variables del programa principal, Esta característica de
los parámetros por referencia envía información en las variables de la función a las
variables del programa principal al modificar su valor en cuerpo de la función. En
pseudocódigo se antepone la palabra reservada var antes de la definición del
parámetro para indicar que este parámetro es por referencia, si se omite se asume
que el llamado es por valor.
92
por defecto el tipo entero). En C si no se desea que la función devuelva ningún
valor, el tipo del valor de retorno deberá ser void, para el caso se convertirá en
procedimiento.
El valor de retorno es un valor único: no puede ser un vector o una matriz, aunque
sí un puntero a un vector o a una matriz. Sin embargo, el valor de retorno sí puede
ser una estructura, que a su vez puede contener vectores y matrices como
elementos miembros.
Funciones en Lenguaj e C
Funciones
Descripción En este apartado se presentarán todas las modalidades y posibilidades que se
pueden presentar en la implementación de funciones utilizando el lenguaje C.
La programación modular también se puede ver como una programación Top –Down. De esta
forma el programador, sólo se las tendrá que ver con diminutas piezas de programa, de pocas
líneas, cuya escritura y corrección posterior es una tarea simple. Tal es el criterio con que está
estructurado el lenguaje C, donde una de sus herramientas fundamentales son las funciones.
Todo compilador comercial trae una gran cantidad de Librerías de toda índole, matemáticas, de
entrada - salida, de manejo de textos, de manejo de gráficos, etc, que solucionan la mayor parte de
los problemas básicos de programación.
Sin embargo será inevitable que en algún momento tenga que crear mis propias funciones, las
reglas para ello son las que desarrollaremos en este capítulo.
Comencemos con algunos conceptos básicos: para hacer que las instrucciones contenidas en una
función, se ejecuten en determinado momento, es necesario escribir su nombre como una línea de
sentencia en mi programa.
93
Un concepto sumamente importante es que los argumentos que se les envían a las funciones son
los VALORES de las variables y NO las variables mismas. En otras palabras, cuando se invoca
una función de la forma pow10( a ) en realidad se está copiando en el "stack" de la memoria el
valor que tiene en ese momento la variable a, la función podrá usar este valor para sus cálculos,
pero está garantizado que los mismos no afectan en absoluto a la variable en sí misma.
Como veremos más adelante, es posible que una función modifique a una variable, pero para ello,
será necesario comunicarle la DIRECCION EN MEMORIA de dicha variable.
Las funciones pueden ó no devolver valores al programa invocante. Hay funciones que tan sólo
realizan acciones, como por ejemplo clrscr(), que borra la pantalla de video, y por lo tanto no
retornan ningún dato de interés; en cambio otras efectúan cálculos, devolviendo los resultados de
los mismos.
La invocación a estos dos tipos de funciones difiere algo, por ejemplo escribiremos:
clrscr() ;
c = getch() ;
donde en el segundo caso el valor retornado por la función se asigna a la variable c. Obviamente
ésta deberá tener el tipo correcto para alojarla.
Declaración De Funciones
Antes de escribir una función es necesario informarle al Compilador los tamaños de los valores que
se le enviarán en el stack y el tamaño de los valores que ella retornará al programa invocante.
Estas informaciones están contenidas en la DECLARACION del PROTOTIPO DE LA FUNCION.
El primer término del prototipo da como hemos visto el tipo del dato retornado por la función; en
caso de obviarse el mismo se toma, por omisión, el tipo int. Sin embargo, aunque la función
devuelva este tipo de dato, para evitar malas interpretaciones es conveniente explicitarlo.
Como que el "default" del tipo de retorno es el int, debemos indicar cuando la función NO retorna
nada, esto se realiza por medio de la palabra VOID ( sin valor). De la misma manera se actúa,
cuando no se le enviarán argumentos.
94
Definición de las Funciones
La definición de una función puede ubicarse en cualquier lugar del programa, con sólo dos
restricciones: debe hallarse luego de dar su prototipo, y no puede estar dentro de la definición de
otra función (incluida main()). Es decir que a diferencia de Pascal, en C las definiciones no pueden
anidarse.
NOTA: no confundir definición con llamada; una función puede llamar a tantas otras como desee .
La definición debe comenzar con un encabezamiento, que debe coincidir totalmente con el
prototipo declarado para la misma, y a continuación del mismo, encerradas por llaves se escribirán
las sentencias que la componen; por ejemplo:
include <stdio.h>
float mi_funcion(int i, double j ); /* DECLARACION observe que termina en ";" */
main()
{
float k ;
int p ;
double z ;
...........
k = mi_funcion( p, z ); /* LLAMADA a la función */
...........
} /* fin de la función main() */
Modalidades de Funciones
1) Funciones que no retornan valor y reciben parámetros:
#include <stdio.h>
void pausa(void) ;
main()
{
int contador = 1;
printf("VALOR DEL CONTADOR DENTRO DEL while \n");
while (contador <= 10)
{
if(contador == 5 )
pausa();
printf("%d\n", contador++);
}
pausa() ;
printf("VALOR DEL CONTADOR LUEGO DE SALIR DEL while: %d", contador) ;
return 0;
}
95
void pausa(void)
{
char c ;
printf("\nAPRIETE ENTER PARA CONTINUAR ") ;
while( (c = getchar()) != '\n') ;
}
Analicemos lo hecho, en la segunda línea hemos declarado la función pausa, sin valor de retorno
ni parámetros.
Luego esta es llamada dos veces por el programa principal, una cuando contador adquiere el valor
de 5 (antes de imprimirlo) y otra luego de finalizar el ciclo.
En cada llamada, el programa principal transfiere el comando a la función, ejecutándose hasta que
ésta finalice su propia secuencia de instrucciones. Al finalizar la función esta retorna el comando al
programa principal, continuándose la ejecución por la instrucción que sucede al llamado.
Si bien las funciones aceptan cualquier nombre, es una buena técnica de programación nombrarlas
con términos que representen, aunque sea vagamente, su operatoria.
Se puede salir prematuramente de una función void mediante el uso de RETURN, sin que este sea
seguido de ningún parámetro ó valor.
96
Analicemos paso a paso el programa anterior; las dos primeras líneas incluirán en el programa los
prototipos de las funciones de librería usadas, ( en este caso printf() y getch() ). En las dos
siguientes damos nom bres simbólicos a dos constantes que usaremos en las condiciones lógicas y
posteriormente damos los prototipos de dos funciones que hemos creado. Podrían haberse
obviado, en este caso particular, estas dos últimas declaraciones, ya que ambas retornan un int
(default), sin embargo el hecho de incluirlas hará que el programa sea más fácilmente
comprensible en el futuro.
Comienza luego la función main(), inicializando dos variables, i y fin, donde la primera nos servirá
de contador y la segunda de indicador lógico. Luego de imprimir el rótulo del programa, entramos
en un loop en el que permaneceremos todo el tiempo en que fin sea FALSO. Dentro de este loop,
incrementamos el contador, lo imprimimos, y asignamos a fin un valor que es el retorno de la
función finalizar(). Esta asignación realiza la llamada a la función, la que toma el control del flujo
del programa, ejecutando sus propias instrucciones.
Saltemos entonces a analizar a finalizar(). Esta define su variable propia, c, (de cuyas propiedades
nos ocuparemos más adelante) y luego entra en un do-while, que efectúa una llamada a otra
función, lea_char(), y asigna su retorno a c iterando esta operativa si c no es 'n' ó 's', note que: c !=
'n' && c != 's' es equivalente a: !( c == 'n' || c == 's' ).
La función lea_char() tiene como misión leer un carácter enviado por el teclado, ( lo realiza dentro
de la expresión relacional del IF ) y salvar la ambigüedad del uso de mayúsculas ó minúsculas en
las respuestas, convirtiendo las primeras en las segundas. Es fácil de ver que, si un carácter esta
comprendido entre A y Z, se le suma la diferencia entre los ASCII de las minúsculas y las
mayúsculas ( 97 - 65 = 32 ) para convertirlo, y luego retornarlo al invocante. Esta conversión fué
incluida a modo de ejemplo solamente, ya que existe una de Librería, tolower() declarada en
ctype.h, que realiza la misma tarea.
Mientras el valor retornado al programa principal sea FALSO, este permanecerá dentro de su while
imprimiendo valores sucesivos del contador, y llamadas a las funciones, hasta que finalmente un
retorno de CIERTO ( el operador presionó la tecla n) hace terminar el loop e imprimir el mensaje de
despedida.
Nota: preste atención a que en la función finalizar() se ha usado un do -while .¿Cómo modificaría el
programa para usar un while?. En la función lea_char se han usado dos returns, de tal forma que
ella sale por uno u otro. De esta manera si luego de finalizado el else se hubiera agregado otra
sentencia, esta jamás sería ejecutada.
En el siguiente ejemplo veremos funciones que retornan datos de tipo distinto al int.
Debemos presentar antes, otra función muy común de entrada de datos: scanf(), que nos permitirá
leer datos completos (no solo caracteres) enviados desde el teclado, su expresión formal es algo
similar a la del printf() ,
Donde en la secuencia de control se indicará que tipo de variable se espera leer, por ejemplo:
%d si se desea leer un entero decimal (int); %o octal; %x hexadecimal; %c carácter; %f leerá
un float; %ld leerá un long int; %lf leerá un double; %Lf leerá un long double.
97
Por "dirección de la variable" deberá entenderse que se debe indicar, en vez del nombre de la
variable en la que se cargará el valor leído, la dirección de su ubicación en la memoria de la
máquina. Esto suena sumamente apabullante, pero por ahora solo diremos, (más adelante
abundaremos en detalles ) que para ello es necesario simplemente anteponer el signo & al nombre
de la misma.
El tipo de las variables deberá coincidir EXACTAMENTE con los expresados en la secuencia de
control, ya que de no ser así, los resultados son impredecibles.
Por supuesto esta función tiene muchísimas más opciones, ( consulte el Manual de Librerías de su
Compilador, si tiene curiosidad ) sin embargo, por simplicidad, por ahora nos conformaremos con
las antedichas.
Usaremos también otra función, ya citada, clrscr(). Recordemos que esta es solo válida para
máquinas tipo PC compatibles y no corre bajo Windows.
Encaremos ahora un programa que nos presente primero, un menú para seleccionar la conversión
de ºC a Fahrenheit ó de centímetros a pulgadas, hecha nuestra elección, nos pregunte el valor a
convertir y posteriormente nos de el resultado.
Si suponemos que las funciones que usaremos en el programa serán frecuentemente usadas,
podemos poner las declaraciones de las mismas, así como todas las constantes que usen, en un
archivo texto, por ejemplo convers.h. Este podrá ser guardado en el subdirectorio donde están
todos los demás (INCLUDE) ó dejado en el directorio activo, en el cual se compila el programa
fuente de nuestro problema. Para variar, supongamos que esto último es nuestro caso.
CONV ERS.H
-----------------------------------------------------------------------------------------------------------------------------------
#include <conio.h>
#define FALSO 0
#define CIERTO 1
#define CENT_POR_INCH 25.4
void pausa(void);
void mostrar_menu(void);
int seleccion(void);
void cm_a_pulgadas(void);
void grados_a_fahrenheit(void);
double leer_valor(void);
---------------------------------------------------------------------------------------------------------------------------------
Vemos que un Header puede incluir llamadas a otros (en este caso conio.h). Hemos puesto
también la definición de todas las constantes que usaran las funciones abajo declaradas. De
dichas declaraciones vemos que usaremos funciones que no retornan nada, otra que retorna un
entero y otra que devuelve un double.
Veamos ahora el desarrollo del programa en sí. Observe que la invocación a convers.h se hace
con comillas, por haber decidido dejarlo en el directorio activo.
98
#include <stdio.h>
#include "convers.h"
void main() {
int fin = FALSO;
while (!fin) {
mostrar_menu();
switch(seleccion()) {
case 1: cm_a_pulgadas();
break;
case 2: grados_a_fahrenheit();
break;
case 3: fin = CIERTO;
break;
default: printf("\n¡Error en la Seleccion!\a\a\n");
pausa() ;
}
}
}
/* Funciones */
void pausa(void)
{
char c = 0;
printf("\n\n\nPRESIONE ENTER PARA CONTINUAR ") ;
while( (c = getch()) != '\r') ;
}
void mostrar_menu (void)
{
clrscr();
printf("\n Menu\n");
printf("---------------------------\n");
printf("1: Centimetros a pulgadas\n");
printf("2: Celsius a Fahrenheit\n");
printf("3: Terminar\n");
}
int seleccion(void)
{
printf("\nEscriba el número de su Selección: ");
return (getche() - '0');
}
void cm_a_pulgadas (void)
{
double centimetros; /* Guardará el valor pasado por leer_valor() */
double pulgadas ; /* Guardará el valor calculado */
printf("\nEscriba los Centimetros a convertir: ");
centimetros = leer_valor();
pulgadas = centimetros * CENT_POR_INCH;
printf("%.3f Centimetros = %.3f Pulgadas\n", centimetros, pulgadas);
pausa() ;
}
void grados_a_fahrenheit(void)
{
double grados; /* Guardará el valor pasado por leer_valor() */
double fahrenheit ; /* Guardará el valor calculado */
printf("\nEscriba los Grados a convertir: ");
grados = leer_valor();
fahrenheit = (((grados * 9.0)/5.0) + 32.0) ;
printf("%.3f Grados = %.3f Fahrenheit", grados, fahrenheit);
pausa();
}
double leer_valor(void)
{
double valor; /* Variable para guardar lo leido del teclado */
scanf("%lf", &valor);
return valor;
}
99
Veamos que hemos hecho: primero incluimos todas las definiciones presentes en el archivo
convers.h que habíamos previamente creado. Luego main() entra en un loop, que finalizará
cuando la variable fin tome un valor CIERTO, y dentro del cual lo primero que se hace es llamar a
mostrar_menú(), que pone los rótulos de opciones.
Luego se entra en un SWITCH que tiene como variable el retorno de la función selección()
(recuerde que tiene que ser un entero), según sea éste se saldrá por alguno de los tres CASE.
Observe que selección() lee el teclado mediante un getche(), (similar a getch() antes descripta,
pero con la diferencia que aquella hace eco del caracter en la pantalla) y finalmente devuelve la
diferencia entre el ASCII del número escrito menos el ASCII del número cero, es decir, un entero
igual numéricamente al valor que el operador quiso introducir.
Estas dos últimas proceden de igual manera: Indican que se escriba el dato y pasan el control a
leer_valor(), la que mediante scanf() lo hace, retornando en la variable valor, un double, que luego
es procesado por aquellas convenientemente. Como hasta ahora la variable fin del programa
principal no ha sido tocada, y por lo tanto continua con FALSO ,la iteración del while sigue
realizándose, luego que se ejecuta el BREAK de finalización del CASE en cuestión. En cambio, si
la selección() hubiera dado un resultado de tres, el tercer case, la convierte en CIERTO, con lo que
se finaliza el WHILE y el programa termina.
VARIABLES GLOBALES
Hasta ahora hem os diferenciado a las variable según su "tipo" (int, char double, etc), el cual se
refería, en última instancia, a la cantidad de bytes que la conformaban. Veremos ahora que hay
otra diferenciación de las mismas, de acuerdo a la clase de memoria en la que residen.
Si definimos una variable AFUERA de cualquier función (incluyendo esto a main()), estaremos
frente a lo denominado VARIABLE GLOBAL. Este tipo de variable será ubicada en el segmento de
datos de la memoria utilizada por el programa, y existirá todo el tiempo que esté ejecutándose
este.
Este tipo de variables son automáticamente inicializadas a CERO cuando el programa comienza a
ejecutarse.
Son accesibles a todas las funciones que estén declaradas en el mismo, por lo que cualquiera de
ellas podrá actuar sobre el valor de las mismas. Por ejemplo:
#include <stdio.h>
double una_funcion(void);
double variable_global ;
main() {
double i ;
printf("%f", variable_global ); /* se imprimirá 0 */
i = una_funcion() ;
printf("%f", i ); /* se imprimirá 1 */
printf("%f", variable_global ); /* se imprimirá 1 */
variable_global += 1 ;
printf("%f", variable_global ); /* se imprimirá 2 */
return 0 ;
}
double una_funcion(void)
{
return( variable_global += 1) ;
}
100
Observemos que la variable_global está definida afuera de las funciones del programa, incluyendo
al main(), por lo que pertenece a TODAS ellas. En el primer printf() del programa principal se la
imprime, demostrándose que está automáticamente inicializada a cero.
Luego es incrementada por una_funcion() que devuelve además una copia de su valor, el cual es
asignado a i ,la que, si es impresa mostrará un valor de uno, pero también la variable_global ha
quedado modificada, como lo demuestra la ejecución de la sentencia siguiente. Luego main()
también modifica su valor , lo cual es demostrado por el printf() siguiente.
Esto nos permite deducir que dicha variable es de uso público, sin que haga falta que ninguna
función la declare, para actuar sobre ella.
Puede resultar muy difícil evaluar su estado en programas algo complejos, con múltiples llamados
condicionales a funciones que las afectan, dando comúnmente origen a errores muy engorrosos de
corregir, por ello se debe tener restringido su uso sólo a casos en lo que es explícitamente
necesario.
VARIABLES LOCALES
A diferencia de las anteriores, las variables definidas DENTRO de una función, son denominadas
VARIABLES LOCALES a la misma, a veces se las denomina también como AUTOMATICAS, ya
que son creadas y destruidas automáticamente por la llamada y el retorno de una función,
respectivamente.
Este método permite que, aunque se haya definido un gran número de variables en un programa,
estas no ocupen memoria simultáneamente en el tiempo, y solo vayan incrementando el stack
cuando se las necesita, para luego, una vez usadas desaparecer, dejando al stack en su estado
original.
El identificador ó nombre que se la haya dado a una variable es sólo relevante entonces, para la
función que la haya definido, pudiendo existir entonces variables que tengan el mismo nombre,
pero definidas en funciones distintas, sin que haya peligro alguno de confusión.
La ubicación de estas variables locales, se crea en el momento de correr el programa, por lo que
no poseen una dirección prefijada, esto impide que el compilador las pueda inicializar previamente.
Recuérdese entonces que, si no se las inicializa expresamente en el momento de su definición, su
valor será indeterminado (basura).
VARIABLES DE REGISTRO
Otra posibilidad de almacenamiento de las variables locales es, que en vez de ser mantenidas en
posiciones de la memoria de la computadora, se las guarde en registros internos del
Microprocesador que conforma la CPU de la misma.
101
De esta manera el acceso a ellas es mucho más directo y rápido, aumentando la velocidad de
ejecución del programa. Se suelen usar registros para almacenar a los contadores de los FOR,
WHILE, etc.
Lamentablemente, en este caso no se puede imponer al compilador, este tipo de variable, ya que
no tenemos control sobre los registros libres en un momento dado del programa, por lo tanto se
SUGIERE, que de ser posible, ubique la variable del modo registro. El prefacio en éste caso será:
Hay que recalcar que esto es sólo válido para variables LOCALES, siendo imposible definir en un
registro a una global. Por otra parte las variables de registro no son accesibles por dirección, como
se verá más adelante
VARIABLES EXTERNAS
Al DEFINIR una variable, como lo hemos estado haciendo hasta ahora, indicamos al compilador
que reserve para la misma una determinada cantidad de memoria, (sea en el segmento de
memoria de datos, si es global ó en el stack, si es local), pero debido a que en C es normal la
compilación por separado de pequeños módulos, que componen el programa completo, puede
darse el caso que una función escrita en un archivo dado, deba usar una variable global definida
en otro archivo. Bastará para poder hacerlo, que se la DECLARE especificando que es EXTERNA
a dicho módulo, lo que implica que está definida en otro lado.
Supongamos que nuestro programa está compuesto por sólo dos módulos: mod_prin.c y
mod_sec.c los cuales se compilarán y enlazarán juntos, por medio del compilador y el linker, por
ejemplo corriendo: bcc mod_prin.c mod_sec.c si usaramos el compilador de Borland.
Si en el primer módulo (mod_prin.c) aparece una variable global, definida como: double var1 = 5 ;
El segundo módulo, ubicado en un archivo distinto de aquel, podrá reverenciarla mediante la
declaración de la misma : extern double var1 ;
De esta declaración vemos que la función valor_medio recibe dos argumentos ( x e y ) del tipo
double y devuelve un resultado de ese mismo tipo.
Cuando definamos a la función en sí, deberemos incluir parámetros para que alberguen los valores
recibidos, así escribiremos:
102
double valor_medio(double x, double y )
{
return ( (x + y) / 2.0 )
}
NOTA: No es necesario que los NOMBRES de los parámetros coincidan con los declarados
previamente, es decir que hubiera sido equivalente escribir: double valor_medio(double a, double
b) etc, sin embargo es una buena costumbre mantenerlos igual. En realidad en la declaración de
la función, no es necesario incluir el nombre de los parámetros, bastaría con poner solo el tipo, sin
embargo es práctica generalizada, explicitarlos a fin de hacer más legible al programa.
Aquí estamos utilizando la sintaxis moderna del lenguaje C, pudiéndose encontrar en versiones
arcaicas, definiciones equivalentes como :
Sin embargo es preferible utilizar la nomenclatura moderna, ya que esta facilita la rápida
comprensión del programa.
103
Veamos primero cual seria la salida de pantalla de este programa:
Vemos que luego de obtenidos, mediante scanf(), los tres datos x, y, z, los mismos son pasados a
la función de calculo en la sentencia de asignación de la variable resultado. La función inicializa
sus parámetros ( p_valor, s_valor e inc ) con los valores de los argumentos enviados ( x, y, z ) y
luego los procesa. La única diferencia entre un argumento y una variable local, es que ésta no es
inicializada automáticamente, mientras que aquellos lo son, a los valores de los argumentos
colocados en la expresión de llamada.
Acá debemos remarcar un importante concepto: éste pasaje de datos a las funciones, se realiza
COPIANDO el valor de las variables en el stack y No pasándoles las variables en sí. Esto se
denomina: PASAJE POR VALOR y garantiza que dichas variables no sean afectadas de ninguna
manera por la función invocada. Una clara prueba de ello es que, en la función valor_medio() se
incrementa p_valor y s_valor, sumándoseles el contenido del parámetro inc. Sin embargo cuando,
luego de retornar al programa principal, imprimimos las variables cuyos valores fueron enviados
como parámetros, vemos que conservan sus valores iniciales. Veremos más adelante que otras
estructuras de datos pueden ser pasadas a las funciones por direcciones en vez de por valor,
pudiendo aquellas modificarlas a gusto.
Debe aclararse que, el pasaje de argumentos, es también una OPERACION, por lo que las
variables pasadas quedan afectadas por las reglas de Conversión Automática de Tipo. Como
ejemplo, si x hubiera sido definida en la función main() como int, al ser pasada como argumento a
valor_medio() sería promovida a double. Especial cuidado debe tenerse entonces con los errores
que pueden producirse por redondeo ó truncamiento, siendo una buena técnica de programación
hacer coincidir los tipos de los argumentos con los de los parámetros.
104
Código: 21 Nombre Función Valor Absoluto
Formulación del Enunciado
Problema Como ejemplo supóngase que se va a calcular en contadas ocasiones el
valor absoluto de variables de tipo real.
Etapas de Resolución del Problema
Análisis del Problema
Parámetros floNumero: Número Flotante al cual se le calculará el
Formales valor absoluto
Retorno Valor_Abs: Valor flotante en valor absoluto
Datos Auxiliares
ü Se recibe el valor a cambiar en floNumero.
ü Si es negativo el número se devuelve su valor
Descripción:
cambiándole el signo. Si no se devuelve el mismo
numero.
Diseño y Verificación del Algoritmo
Fase de
Formalización(Diagramas de Flujo, pseudocódigo)
Resolución
//Función que retorna el valor absoluto de un número real.
105
Código: 22 Nombre Función Factorial
Formulación del Enunciado
Problema Desarrollar un programa que lea un número entero y calcule su factorial
mediante el llamado a una función recursiva.
Etapas de Resolución del Problema
Análisis del Problema
Datos Entrada intDato: Número al cual se le calculará el factorial.
Datos de Salida dblFactorial: Valor flotante del factorial calculado.
Datos Auxiliares Se sabe que Factorial(n) = Factorial (n-1) * n
Se pide el número entero a calcular el factorial.
ü
Fase de Se hace el llamado a la fu nción que calcula el
ü
Descripción:
Resolución factorial.
ü Se imprime el resultado de la función.
Diseño y Verificación del Algoritmo
Formalización(Diagramas de Flujo, pseudocódigo)
No se realizó ...
Comprobación del Algoritmo (traza)
No se realizo ...
Fase de Codificación y programa Autodocumentado
106
Implementación // ___________________________________________________________
// Nombre: Factorial
// Descripción: Devuelve el Factorial de un número.
// Destino: Programa de Ingeniería de Sistemas
// Datos Responsable: Miguel Ángel Niño Zambrano UNICAUCA - FIET.
// Excep. / Errores: Ninguno implementado.
// Limitaciones: No hace validación de datos de entrada.
// ___________________________________________________________
#include <stdio.h>
#include <conio.h>
void main(void)
{
int intDato;
long double dblFactorial;
//Limpiamos la pantalla
clrscr();
107
Código: 23 Nombre Programa Matemático
Enunciado
Formulación Desarrollar un programa que realice las operaciones matemáticas básicas: Suma,
del Problema Resta, Multiplicación, División a través de programación modular. El programa
debe desplegar un menú con las operaciones. Las operaciones se deben realizar
utilizando números reales.
Etapas de Resolución del Problema
Análisis del Problema
Los datos de entrada dependen del menú inicial y de las
funciones:
1) Sumar dos Números
2) Restar de Números
3) Multiplicar dos Números
Datos Entrada
4) Dividir dos Números.
5) Salir
Genéricamente todas las funciones recibirán dos números
flotantes los cuales serán operados entre si. La función de
División controla el error de división por cero.
suma: Si selecciona este elemento la salida será la suma
de los dos números presentados en un formato adecuado.
resta: Si selecciona este elemento la salida será la resta
de los dos números presentados en un formato adecuado.
multiplicación: Si selecciona este elemento la salida será
la multiplicación de los dos números presentados en un
Fase de Datos de Salida
formato adecuado.
Resolución división: Si selecciona este elemento la salida será la
división de los dos números presentados en un formato
adecuado. Si el usuario digita el segundo número igual a
cero se desplegará un mensaje diciendo que la división es
por cero.
Datos Auxiliares No hay.
ü Se presenta el menú de opciones.
ü Se realiza la operación que seleccione del menú.
Descripción: ü En todos los casos primero se piden los dos número
reales a operar.
ü Se imprime el resultado de la función utilizando un
formato adecuado.
Diseño y Verificación del Algoritmo
Formalización(Diagramas de Flujo, pseudocódigo)
No se realizó ...
Comprobación del Algoritmo (traza)
No se realizo ...
Fase de Codificación y programa Autodocumentado
108
Implementación El programa esta desarrollado utilizando el concepto de proyecto. Para esto existe un
archivo de proyecto el cual reúne los módulos en los que se divide la aplicación. A
continuación de presenta el módulo que contiene la lógica matemática.
MATEMATICA.H
#ifndef __MAT__H
#define __MAT__H
//Suma dos números reales
float suma(float floNum1, float floNum2,char * chaOper);
//Resta dos números reales
float resta(float floNum1, float floNum2,char * chaOper);
//Multiplica dos números reales
float multiplica(float floNum1, float floNum2,char * chaOper);
//Divide dos números reales
float divide(float floNum1, float floNum2,char * chaOper);
#endif
MATEMATICA.C
//---------------------------------------------------------------------------
#pragma hdrstop
//---------------------------------------------------------------------------
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include "matematica.h"
#pragma argsused
//Definiicion de los prototipos de Funciones
void pausa(void);
void mostrar_menu(void);
int seleccion(void);
float LeerNumeroFlo(void);
void LeerNumeros(float *floNumerUno, float *floNumeroDos);
void ImprimirResultado(const float,const float ,const float,const char *);
while (!intfin) {
mostrar_menu();
switch(seleccion()) {
case 1:
LeerNumeros (&floNum1, &floNum2);
ImprimirResultado(floNum1, floNum2,suma(floNum1, floNum2, charOper), charOper);
break;
case 2:
LeerNumeros(&floNum1, &floNum2);
ImprimirResultado(floNum1, floNum2,resta(floNum1,floNum2,charOper),charOper);
break;
case 3:
LeerNumeros(&floNum1, &floNum2);
ImprimirResultado(floNum1, floNum2,multiplica(floNum1,floNum2,charOper),charOper);
break;
109
case 4:
LeerNumeros(&floNum1, &floNum2);
ImprimirResultado(floNum1, floNum2,divide(floNum1,floNum2,charOper),charOper);
break;
case 5:
intfin = 1;
break;
default:
printf("\n¡Error en la Seleccion!\a\a\n");
pausa() ;
}
}
return 0;
}
void mostrar_menu(void)
{
clrscr();
printf("\n Menu\n");
printf("---------------------------\n");
printf("1: Sumar dos Numeros \n");
printf("2: Restar dos Números \n");
printf("3: Multiplicar dos Números\n");
printf("4: Dividir dos Números \n");
printf("5: Salir\n");
};
int seleccion(void)
{
printf("\nEscriba el número de su Selección: ");
return (getche() - '0');
};
float LeerNumeroFlo(void)
{
float floNum;
printf("\nEscriba un Numero: ");
scanf("%f",&floNum);
return (floNum);
};
void LeerNumeros(float *floNumeroUno, float * floNumeroDos)
{
*floNumeroUno = LeerNumeroFlo();
*floNumeroDos = LeerNumeroFlo();
};
110
MAT.C
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include "matematica.h"
//---------------------------------------------------------------------
//Nombre: Suma
//Descripción Esta función calcula la suma de dos números reales. No valida.
//Destino: Programa de Ingeniería de Sistemas
//Datos Responsable: MIGUEL ANGEL NIÑO ZAMBRANO -UCAUCA - FIET
//Excepciones /Errores: Ninguno Implementado.
//Limitaciones: Sólo recibe números float.
//---------------------------------------------------------------------
float suma(float floNum1, float floNum2,char * chaOper)
{
strcpy(chaOper,"sumado");
return (floNum1 + floNum2);
};
//---------------------------------------------------------------------
//Nombre: Resta
//Descripción Esta función calcula la resta de dos números
// flotantes. No hace ningún tipo de validación
//Destino: Programa de Ingeniería de Sistemas
//Datos Responsable: MIGUEL ANGEL NIÑO ZAMBRANO -UCAUCA - FIET
//Excepciones /Errores: Ninguno Implementado.
//Limitaciones: Sólo recibe números float.
//---------------------------------------------------------------------
float resta(float floNum1, float floNum2,char * chaOper)
{
strcpy (chaOper,"restado");
return (floNum1 - floNum2);
};
//---------------------------------------------------------------------
//Nombre: Multiplica
//Descripción Esta función calcula la multiplicación de dos números
// flotantes. No hace ningún tipo de validación
//Destino: Programa de Ingeniería de Sistemas
//Datos Responsable: MIGUEL ANGEL NIÑO ZAMBRANO -UCAUCA - FIET
//Excepciones /Errores: Ninguno Implementado.
//Limitaciones: Sólo recibe números float.
//---------------------------------------------------------------------
float multiplica(float floNum1, float floNum2,char * chaOper)
{
strcpy (chaOper,"multiplicado");
return (floNum1 * floNum2);
};
//---------------------------------------------------------------------
//Nombre: Divide
//Descripción Esta función calcula la división de dos números
// flotantes. Valida que floNum2<> 0
//Destino: Programa de Ingeniería de Sistemas
//Datos Responsable: MIGUEL ANGEL NIÑO ZAMBRANO -UCAUCA - FIET
//Excepciones /Errores: División por cero.
//Limitaciones: Sólo recibe números float.
//---------------------------------------------------------------------
float divide(float floNum1, float floNum2,char * chaOper)
{
if (floNum2!= 0)
{
strcpy (chaOper,"dividido");
return (floNum1 + floNum2);
}
else
{
printf("División por cero.");
return 0;
}
};
111
Ejecución 1:
Menu
---------------------------
1: Sumar dos Numeros
2: Restar dos N·meros
3: Multiplicar dos N·meros
4: Dividir dos N·meros
5: Salir
Escriba un Numero: 6
Ejecución 2:
Menu
---------------------------
1: Sumar dos Numeros
2: Restar dos N·meros
3: Multiplicar dos N·meros
4: Dividir dos N·meros
5: Salir
Menu
---------------------------
1: Sumar dos Numeros
2: Restar dos N·meros
3: Multiplicar dos N·meros
4: Dividir dos N·meros
5: Salir
Escriba un Numero: 3
Ejecución 4:
Menu
---------------------------
1: Sumar dos Numeros
2: Restar dos N·meros
3: Multiplicar dos N·meros
4: Dividir dos N·meros
5: Salir
Escriba un Numero: 0
Divisi¾n por cero.
4.00 dividido 0.00 es = 0.00
112
El ejemplo anterior presenta la mayoría de las características del manejo de
procedimientos y funciones en C. A continuación se explicara cada uno de sus
detalles para que sean teni dos en cuenta:
b. Variables por Valor: Estas variables son las que se definen por defecto
cuando sólo se define el tipo de datos y la variable, las variables de la
función tomas copia de los valores actuales enviados. Ejemplo:
float suma(float floNum1, float floNum2,char * chaOper); Cuando es llamada en
113
el programa principal se rremplazan los valores de floNum1 y flo çNum2.
c. Variables por referencia : En este caso se pasa la dirección de la
variable en el prototipo de la función y cuando se realiza el llamado de la
función esta puede cambiar el valor de la variable. El ejemplo de esto
esta en todas las funciones matemáticas que reciben la variable
charOper por referencia y la devuelven con el texto adecuado de la
operación realizada. Otro ejemplo se presenta con la función
LeerNumeros la cual define dos números flotantes que se envían por
referencia Ejemplo:
La definición del prototipo debe ser asi:
void LeerNumeros(float *floNumerUno, float *floNumeroDos);
El * define que esta variable recibe la dirección de sus variables actuales cuando
sea llamada.
El llamado es:
LeerNumeros(&floNum1, &floNum2);
El & es el operador que envía la dirección de la variables a las variable de la
función.
4.13.3. Recursividad
Definición.
La recursividad es una técnica de programación importante. Se utiliza para realizar
una llamada a una función desde la misma función. Otra forma de hacer la
definición es cuando una función se define en términos de si misma, es decir,
cuando en el cuerpo de la función hace llamados a subprogramas que para el
caso es la misma función que se esta definiendo. Como ejemplo útil se puede
presentar el cálculo de números factoriales. Los factoriales de 0 y 1 son, por
definición, 1. Los factoriales de números mayores se calculan multiplicando 1 * 2 *
..., incrementando el número de 1 en 1 hasta llegar al número para el que se está
calculando el factorial. El siguiente párrafo muestra una función, definida en
palabras, que calcula un factorial.
Para calcular el factorial de cualquier número mayor que 1 hay que calcular como
mínimo el factorial de otro número. La función que se utiliza para hacerlo es la
función en la que se encuentra en estos momentos, esta función debe llamarse a
114
sí misma para el número menor inmediato, antes de poder ejecutarse en el
número actual. Esto es un ejemplo de recursividad.
Directa Indirecta
Procedure Directa ( ... ); Procedure Indirecta ( ... );
begin begin
. .
. .
. .
Directa ( ... ); A ( ... );
. .
. .
. .
end; end;
Procedure A ( ... );
begin
.
.
.
Indirecta ( ... );
.
.
.
end;
Funcionamiento Interno.
Para entender el funcionamiento de las funciones recursivas refiérase a la Figura
3. La llamada recursiva puede surgir en un procedimiento o en una función (ver la
primera flecha vertical de izquierda a derecha). En algún punto del programa,
dónde se hace La llamada recursiva, la secuencia de comandos se bifurcan (ver
flecha oblicua Hacia la derecha) , haciendo un llamado a la misma función o
procedimiento inicial, inmediatamente en el computador se genera una copia de la
función original, con sus variables y sentencias para iniciar nuevamente la función
llamada. Este proceso sigue ocurriendo indefinidamente hasta que alguna de las
funciones o procedimientos llamados, validen una condición de parada (no
llamarse nuevamente), y esta comienza a devolver la ejecución a la función o
115
procedimiento que la llamó desde el punto dónde se inicio la secuencia de
comandos de cada función después del llamado recursivo se termina y devuelve a
la función que la llamo, así continúa sucesivamente hasta que se llega a la primera
función o procedimiento y termina el programa.
116
q Consumo de memoria: Hay que tener en cuenta el manejo de memoria
que tendrá la función, en términos algorítmicos se refiere a la complejidad
de la función recursiva, esta complejidad mide el tiempo que gasta la
función en realizar su objetivo, pero esta complejidad también se puede
medir en términos de los recursos de memoria que consume la función. Si
esta función recursiva tiene que llamarse un número N veces muy grande,
podría ocuparse la memoria del computador y provocar un error de
memoria. En este sentido hay que evaluar teóricamente las funciones
diseñadas antes de implementarlas. También juega en esto un papel
importante una correcta condición de parada.
Un ejemplo de funciones recursivas se presentó en el ejemplo de este capitulo de l
calculo factorial. Otro Ejemplo se presenta a continuación:
117
Implementación // ___________________________________________________________
// Nombre: Búsqueda Binaria
// Descripción: Realiza búsqueda binaria sobre el vector.
// Destino: Programa de Ingeniería de Sistemas
// Datos Responsable: Miguel Ángel Niño Zambrano UNICAUCA - FIET.
// Excep. / Errores: Ninguno implementado.
// Limitaciones: No hace validación de datos de entrada.
// ___________________________________________________________
void main(void)
{
int a[20],i,num,intento,pos;
clrscr();
for(i=0;i<20;i++)
a[i]=i*2;
num=24;intento=1;
pos=buscarbin(a,&intento,0,20,num);
printf("El numero %d se encuentra en la posici¢n %d, en el
intento %d:",num,pos,intento);
getch();
}
Ejecución No se Realizo...
118
4.14. Ejercicios Propuestos
119
BIBLIOGRAFÍA
[4] http://www.lafacu.com/apuntes/informatica/recursividad/.
120
Anexo A: Modelo de Autodocumentación de Programas
implementado en el PIS (Programa de Ingeniería de Software)
Universidad del Cauca
OBJETIVO
Establecer una directriz general a cumplir en el desarrollo de la documentación interna de los
programas a realizar en el curso.
COMENTARIOS
Los comentarios constituyen el principal componente de la documentación interna de los
programas. Sin embargo la escritura de buenos comentarios puede ser tan difícil y en ocasiones
tan importante como escribir buenos programas. Los comentarios se deben incluir en la cabecera
del programa, en la cabecera de cada módulo y en la cabecera de cada rutina.
NOTA: Es muy importante resaltar que un comentario (guía) que no sea correcto o no corresponda
a la versión final, puede generar problemas mayores en el mantenimiento de los programas que
no haber escrito nada.
121
Al nivel de módulo se debe documentar lo siguiente:
ü Nombre de la rutina.
ü Descripción de la tarea que realiza, explicando claramente las consideraciones importantes
que se tomaron para realizarla.
ü Desarrollo histórico del desarrollo de la rutina con los mismos elementos de la cabecera del
programa
ü Estructura de los datos de entrada y salida de la versión actual, los rangos aceptables de las
variables de entrada, donde, cuando, en que orden y el dispositivo que se usa para las
entradas.
ü Descripción de las estructuras de datos claves indicando: Nombre de la estructura de datos,
Tipo, Propósito, los módulos que acceden y modifican la estructura y el lugar donde esta
declarada.
Los comentarios también deben acompañar las declaraciones de las variables, las llamadas a
rutinas , las bifurcaciones y los bucles repetitivos, por ejemplo:
CODIGO AUTODOCUMENTADO
La razón principal de usar un conjunto coherente de convenciones de código es estandarizar la
estructura y el estilo de codificación de una aplicación de forma que el autor y otras personas
puedan leer y entender el código fácilmente.
Las convenciones de codificación correctas dan como resultado un código fuente preciso, legible y
sin ambigüedad, que es coherente con otras convenciones del lenguaje y lo más intuitivo posible.
122
El objetivo es hacer que el programa sea fácil de leer y de entender sin obstruir la creatividad
natural del programador con imposiciones excesivas y restricciones arbitrarias. Por tanto, las
convenciones sugeridas son breves y sugerentes.
Variables
Las constantes y variables requieren convenciones de nombres bien compuestas. En esta sección
se muestran las convenciones recomendadas para las constantes y variables permitidas por
C/C++. También se explican cuestiones relacionadas con la identificación del tipo de datos y su
alcance.
Las variables se deben definir siempre con el menor alcance posible. Las variables globales
pueden crear máquinas de estado enormemente complejas y hacer la lógica de una aplicación muy
difícil de entender. Las variables globales tambi én hacen mucho más difícil mantener y volver a
usar el código.
En una aplicación de C/C++, las variables globales se deben usar sólo cuando no exista ninguna
otra forma cómoda de compartir datos entre módulos. Cuando haya que usar variables globales, es
conveniente declararlas todas en un único módulo agrupadas por funciones y dar al mód ulo un
nombre significativo que indique su finalidad, como globales.c.
Una práctica de codificación correcta es escribir código modular siempre que sea posible. Por
ejemplo, si la aplicación muestra una pantalla de captura de datos, coloque todo el código
necesario para ejecutar la tarea de la entrada de datos en un único módulo. Esto ayuda a tener el
código de la aplicación organizado y facilita el entendimiento del mismo .
A excepción de las variables globales (que no se deberían pasar), los procedimientos y funciones
deben operar sólo sobre las variables que se les pasan. Además, los argumentos se deben pasar a
los procedimientos y a las funciones por valor a menos que sea necesario explícitamente cambiar
el contenido del argumento que se pasa (o en su defecto por que el argumento no se pueda pasar
por valor como por ejemplo los arreglos).
Las variables deben llevar un prefijo para indicar su tipo de datos como se puede apreciar en la
Cuadro 4. Opcionalmente, y en especial para programas largos, el prefijo se puede ampliar para
indicar el alcance de la variable.
123
Cuadro 4 Prefijos para los tipos de datos básicos de C
TIPO DE DATOS PREFIJO
unsigned char uch
char cha
enum enu
unsigned int uin
short int sin
int int
unsigned long ulo
long lon
float flo
double dou
long double ldo
A medida que aumenta el tamaño del proyecto, también aumenta la utilidad de reconocer
rápidamente el alcance de las variables. Esto se consigue escribiendo un prefijo de alcance de
una letra delante del tipo de prefijo, sin aumentar demasiado la longitud del nombre de las variables
como se muestra en la Cuadro 5.
Para nombres que se usen con frecuencia o para términos largos, se recomienda usar abreviaturas
estándar para que los nombres tengan una longitud razonable. En general, los nombres de
variables con más de 32 caracteres pueden ser difíciles de manejar.
Cuando se usen abreviaturas, hay que asegurarse de que sean coherentes en toda la aplicación.
Alternar aleatoriamente entre Cnt y Contar dentro de un proyecto provoca una confusión
innecesaria.
Constantes
124
El cuerpo del nombre de las constantes se debe escribir en mayúsculas. Aunque las constantes
estándar de C/C++ no incluyen información de tipo de datos y el alcance, los prefijos como INT,
UCH, CHA, G, M pueden ser muy útiles para entender el valor y el alcance de una constante, Por
ejemplo:
PRESENTACION VISUAL
Como presentación visual se entiende que los párrafos deben estar correctamente identados, que
los coment arios deben estar ubicados de tal forma que no obstruyan la ágil lectura del código
fuente y que las líneas de código no superan el número de las columnas que normalmente maneja
el monitor (80), caso en el cual se debe escribir la instrucción en dos líneas.
También dentro de este tópico se puede catalogar la impresión de los listados de tal forma que sea
agradable para el lector realizar alguna actividad sobre él. por ejemplo: líneas o espacios en blanco
que faciliten la comprensión del programa y el agrupamiento de sentencias de entrada y salida.
125