Fundamentos de programacion

139
  FUNDAMENTOS  DE PROGRAMACIÓN ESIME Zacatenco Ingeniería Eléctrica En general los estudiantes necesitan herramientas básicas que lo ayuden a la búsqueda y el análisis de la información, así  lograr integrar sus conocimientos prácticos de ingeniería; para lo cual las herramientas de programación son una base fundamental. Primer Semestre Profesores: Alejandra Gutiérrez Reyes Enrique Martínez Roldán 

Transcript of Fundamentos de programacion

Page 1: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 1/139

 

FUNDAMENTOS DE PROGRAMACIÓN ESIME Zacatenco Ingeniería Eléctrica En general los estudiantes necesitan herramientas básicas que lo ayuden a la búsqueda y el análisis de la información, así  lograr integrar sus conocimientos prácticos de ingeniería; para lo cual las herramientas de programación son una base fundamental. 

Primer Semestre Profesores: Alejandra Gutiérrez Reyes 

Enrique Martínez Roldán 

Page 2: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 2/139

UNIDAD I INTRODUCCIÓN A LA PROGRAMACIÓN

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

2

CONTENIDO

Capitulo 1. Introducción a la Programación Pag.

1.1. Sistemas Operativos 1

1.1.1. Definición, características y función de un Sistema Operativo 11.1.2. Análisis Comparativo de Sistemas Operativos 3

1.2. Evolución de los Lenguajes de Programación 31.2.1. Definición, características y función de los Lenguajes de Programación 3

1.3. Interpretes y Compiladores 51.3.1. Definición de Interpretes y Compiladores 5

Capitulo 2. Fundamentos de Programación Estructurada

2.1. Estructura General de un Programa 7

2.2. Tipos de Datos y Operadores 102.2.1. Tamaños, declaración y modificadores 152.2.2. Operadores Lógicos, Aritméticos y de Asignación 25

2.3. Funciones de Biblioteca 262.3.1. Funciones de Entrada y Salida 292.3.2. Funciones Matemáticas 33

2.4. Funciones Generadas por el Usuario 342.4.1. Argumentos y Parámetros Formales 402.4.2. Funciones con y sin argumentos 432.4.3. Funciones que regresan Valores 47

Capitulo 3. Estructuras de Flujo Programático

3.1. Estructuras de Decisión 533.1.1. Simple 543.1.2. Ramificada 66

3.2. Estructuras de Iteración 85

3.3. Estructuras de Control 973.3.1. Ruptura de un Lazo 107

Capitulo 4. Estructuras de Datos

4.1. Arreglos Unidimensionales 1094.1.1. Concepto y Forma General 1094.1.2. Arreglos Numéricos y de Caracteres 115

4.2. Arreglos Bidimensionales 1164.2.1. Concepto y Forma General 1164.2.2. Arreglos Numéricos y de Caractres 120

4.3. Apuntadores 1234.3.1. Concepto 1244.3.2. Tipos de Apuntadores 1304.3.3. Operaciones con Apuntadores 1324.3.4. Relación de Apuntadores con Arreglos 133

Page 3: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 3/139

UNIDAD I INTRODUCCIÓN A LA PROGRAMACIÓN

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

3

1.1. Sistemas Operativos

1.1.1. Definición, características y función de un sistema operativo.

Un sistema operativo  es un software de sistema, es decir, un conjunto de programas de

computadora para permitir una administración eficaz de sus recursos. Comienza a trabajar cuando es cargado en memoria por un programa específico, que se ejecuta al iniciar el equipo,o al iniciar una máquina virtual, y gestiona el hardware de la máquina desde los niveles másbásicos, brindando una interfaz con el usuario. 

Cuando un programa desea acceder a un recurso material, no necesita enviar informaciónespecífica a los dispositivos periféricos; simplemente envía la información al sistema operativo,el cual la transmite a los periféricos correspondientes a través de su driver (controlador). Si noexiste ningún driver, cada programa debe reconocer y tener presente la comunicación con cadatipo de periférico.

Sistemas Operativos por su Estructura:

Requisitos de usuario: Sistema fácil de usar y de aprender, seguro, rápido y adecuado al uso al

que se le quiere destinar.Requisitos del software: Donde se engloban aspectos como el mantenimiento, forma deoperación, restricciones de uso, eficiencia, tolerancia frente a los errores y flexibilidad.

Máquina Virtual.Se trata de un tipo de sistemas operativos que presentan una interface a cada proceso,mostrando una máquina que parece idéntica a la máquina real subyacente. Estos sistemasoperativos separan dos conceptos que suelen estar unidos en el resto de sistemas: lamultiprogramación y la máquina extendida. El objetivo de los sistemas operativos de máquinavirtual es el de integrar distintos sistemas operativos dando la sensación de ser variasmáquinas diferentes.El núcleo de estos sistemas operativos se denomina monitor virtual y tiene como misión llevar acabo la multiprogramación, presentando a los niveles superiores tantas máquinas virtuales

como se soliciten.

Sistemas Operativos por Servicios:

Esta clasificación es la más comúnmente usada y conocida desde el punto de vista del usuariofinal.

Monousuario Los sistemas operativos monousuarios son aquéllos que soportan a un usuario a la vez, sinimportar el número de procesadores que tenga la computadora o el número de procesos otareas que el usuario pueda ejecutar en un mismo instante de tiempo. Las computadoraspersonales típicamente se han clasificado en este renglón.

Multiusuario Los sistemas operativos multiusuario son capaces de dar servicio a más de un usuario a la vez,ya sea por medio de varias terminales conectadas a la computadora o por medio de sesionesremotas en una red de comunicaciones. No importa el número de procesadores en la máquinani el número de procesos que cada usuario puede ejecutar simultáneamente.

Monotarea Los sistemas monotarea son aquellos que sólo permiten una tarea a la vez por usuario. Puededarse el caso de un sistema multiusuario y monotarea, en el cual se admiten varios usuarios almismo tiempo pero cada uno de ellos puede estar haciendo solo una tarea a la vez.

Page 4: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 4/139

UNIDAD I INTRODUCCIÓN A LA PROGRAMACIÓN

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

4

Multitarea Un sistema operativo multitarea es aquél que le permite al usuario estar realizando variaslabores al mismo tiempo. Por ejemplo, puede estar editando el código fuente de un programadurante su depuración mientras compila otro programa, a la vez que está recibiendo correo

electrónico en un proceso en background. Es común encontrar en ellos interfaces gráficasorientadas al uso de menús y el ratón, lo cual permite un rápido intercambio entre las tareaspara el usuario, mejorando su productividad.

Uniproceso Un sistema operativo uniproceso es aquél que es capaz de manejar solamente un procesador de la computadora, de manera que si la computadora tuviese más de uno le sería inútil. Elejemplo más típico de este tipo de sistemas es el DOS y MacOS.

Multiproceso Un sistema operativo multiproceso se refiere al número de procesadores del sistema, que esmás de uno y éste es capaz de usarlos todos para distribuir su carga de trabajo. Generalmenteestos sistemas trabajan de dos formas: simétrica o asimétricamente. Cuando se trabaja demanera asimétrica, el sistema operativo selecciona a uno de los procesadores el cual jugará elpapel de procesador maestro y servirá como pivote para distribuir la carga a los demásprocesadores, que reciben el nombre de esclavos. Cuando se trabaja de manera simétrica, losprocesos o partes de ellos (threads) son enviados indistintamente a cuales quiera de losprocesadores disponibles, teniendo, teóricamente, una mejor distribución y equilibrio en lacarga de trabajo bajo este esquema.

Se dice que un thread es la parte activa en memoria y corriendo de un proceso, lo cual puedeconsistir de un área de memoria, un conjunto de registros con valores específicos, la pila yotros valores de contexto.

Sistemas Operativos por la Forma de Ofrecer sus Servicios:

Esta clasificación también se refiere a una visión externa, que en este caso se refiere a la del

usuario, el cómo acceda los servicios. Bajo esta clasificación se pueden detectar dos tiposprincipales: sistemas operativos de red y sistemas operativos distribuidos.

Sistemas Operativos de Red 

Los sistemas operativos de red se definen como aquellos que tiene la capacidad de interactuar con sistemas operativos en otras computadoras por medio de un medio de transmisión con elobjeto de intercambiar información, transferir archivos, ejecutar comandos remotos y un sin finde otras actividades. El punto crucial de estos sistemas es que el usuario debe saber la sintaxisde un conjunto de comandos o llamadas al sistema para ejecutar estas operaciones, ademásde la ubicación de los recursos que desee accesar.

Sistemas Operativos Distribuidos 

Los sistemas operativos distribuidos abarcan los servicios de los de red, logrando integrar recursos (impresoras, unidades de respaldo, memoria, procesos, unidades centrales deproceso) en una sola máquina virtual que el usuario accesa en forma transparente. Es decir,ahora el usuario ya no necesita saber la ubicación de los recursos, sino que los conoce por nombre y simplemente los usa como si todos ellos fuesen locales a su lugar de trabajo habitual.

El sistema operativo cumple varias funciones:

•  Administración del procesador : el sistema operativo administra la distribución delprocesador entre los distintos programas por medio de un algoritmo de programación .

Page 5: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 5/139

UNIDAD I INTRODUCCIÓN A LA PROGRAMACIÓN

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

5

El tipo de programador depende completamente del sistema operativo, según elobjetivo deseado.

•  Gestión de la memoria de acceso aleatorio : el sistema operativo se encarga degestionar el espacio de memoria asignado para cada aplicación y para cada usuario, siresulta pertinente. Cuando la memoria física es insuficiente, el sistema operativo puede

crear una zona de memoria en el disco duro, denominada "memoria virtual". Lamemoria virtual permite ejecutar aplicaciones que requieren una memoria superior a lamemoria RAM disponible en el sistema. Sin embargo, esta memoria es mucho máslenta.

•  Gestión de entradas/salidas : el sistema operativo permite unificar y controlar el accesode los programas a los recursos materiales a través de los drivers (también conocidoscomo administradores periféricos o de entrada/salida).

•  Gestión de ejecución de aplicaciones : el sistema operativo se encarga de que lasaplicaciones se ejecuten sin problemas asignándoles los recursos que éstas necesitanpara funcionar. Esto significa que si una aplicación no responde correctamente puede"sucumbir".

•  Administración de autorizaciones : el sistema operativo se encarga de la seguridad enrelación con la ejecución de programas garantizando que los recursos sean utilizadossólo por programas y usuarios que posean las autorizaciones correspondientes.

  Gestión de archivos : el sistema operativo gestiona la lectura y escritura en el sistemade archivos, y las autorizaciones de acceso a archivos de aplicaciones y usuarios.•  Gestión de la información : el sistema operativo proporciona cierta cantidad de

indicadores que pueden utilizarse para diagnosticar el funcionamiento correcto delequipo.

1.1.2. Análisis Comparativo de Sistemas Operativos 

Análisis comparativo de Sistemas OperativosSistema Programación Usuario 

único Usuario múltiple 

Tarea única 

Multitarea 

DOS 16 bits X XWindows3.1 16/32 bits X no

preventivo

Windows95/98/Me 32 bits X cooperativoWindowsNT/2000 32 bits X preventivoWindowsXP 32/64 bits X preventivoUnix / Linux 32/64 bits X preventivoMAC/OS X 32 bits X preventivoVMS 32 bits X preventivo

Tabla 1. Análisis de Sistemas Operativos

1.2. Evolución de los lenguajes de programación

1.2.1. Definición, características y funciones de los lenguajes de programación 

Los lenguajes de programación son herramientas que nos permiten crear programas y

software.Una computadora funciona bajo control de un programa el cual debe estar almacenado en launidad de memoria; tales como el disco duro.Los lenguajes de programación de una computadora en particular se conoce como código demáquinas o lenguaje de máquinas.

Estos lenguajes codificados en una computadora específica no podrán ser ejecutados en otracomputadora diferente.

Para que estos programas funcionen para diferentes computadoras hay que realizar una

Page 6: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 6/139

UNIDAD I INTRODUCCIÓN A LA PROGRAMACIÓN

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

6

versión para cada una de ellas, lo que implica el aumento del costo de desarrollo.

Por otra parte, los lenguajes de programación en código de máquina son verdaderamentedifíciles de entender para una persona, ya que están compuestos de códigos numéricos sinsentido nemotécnico.

Los lenguajes de programación facilitan la tarea de programación, ya que disponen de formasadecuadas que permiten ser leídas y escritas por personas, a su vez resultan independientesdel modelo de computador a utilizar.

Los lenguajes de programación representan en forma simbólica y en manera de un texto loscódigos que podrán ser leídos por una persona.

Los lenguajes de programación son independientes de las computadoras a utilizar.

Existen estrategias que permiten ejecutar en una computadora un programa realizado en unlenguaje de programación simbólico. Los procesadores del lenguaje son los programas quepermiten el tratamiento de la información en forma de texto, representada en los lenguajes deprogramación simbólicos.

La ventaja del proceso interprete es que no necesita de dos fases para ejecutar el programa,sin embargo su inconveniente es que la velocidad de ejecución es más lenta ya que debeanalizar e interpretar las instrucciones contenidas en el programa fuente.

Los lenguajes de programación se pueden clasificar atendiendo a varios criterios:

• Según el nivel de abstracción• Según la forma de ejecución• Según el paradigma de programación que poseen cada uno de ellos

Nivel de abstracción 

Lenguajes Máquina 

Están escritos en lenguajes directamente inteligibles por la maquina (computadora), ya que susinstrucciones son cadenas binarias (0 y 1). Da la posibilidad de cargar (transferir un programa ala memoria) sin necesidad de traducción posterior lo que supone una velocidad de ejecuciónsuperior, solo que con poca fiabilidad y dificultad de verificar y poner a punto los programas.

Lenguajes de bajo nivel 

Los lenguajes de bajo nivel son lenguajes de programación que se acercan al funcionamientode una computadora. El lenguaje de más bajo nivel por excelencia es el código máquina. Aéste le sigue el lenguaje ensamblador, ya que al programar en ensamblador se trabajan con losregistros de memoria de la computadora de forma directa.

Lenguajes de medio nivel Hay lenguajes de programación que son considerados por algunos expertos como lenguajes demedio nivel (como es el caso del lenguaje C) al tener ciertas características que los acercan alos lenguajes de bajo nivel pero teniendo, al mismo tiempo, ciertas cualidades que lo hacen unlenguaje más cercano al humano y, por tanto, de alto nivel.

Lenguajes de alto nivel 

Los lenguajes de alto nivel son normalmente fáciles de aprender porque están formados por elementos de lenguajes naturales, como el inglés. En BASIC, uno de los lenguajes de alto nivel

Page 7: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 7/139

UNIDAD I INTRODUCCIÓN A LA PROGRAMACIÓN

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

7

más conocidos, los comandos como "IF CONTADOR = 10 THEN STOP" pueden utilizarse parapedir a la computadora que pare si el CONTADOR es igual a 10. Esta forma de trabajar puededar la sensación de que las computadoras parecen comprender un lenguaje natural; enrealidad lo hacen de una forma rígida y sistemática, sin que haya cabida, por ejemplo, paraambigüedades o dobles sentidos.

Según la forma de ejecución 

Lenguajes compilados 

Naturalmente, un programa que se escribe en un lenguaje de alto nivel también tiene quetraducirse a un código que pueda utilizar la máquina. Los programas traductores que puedenrealizar esta operación se llaman compiladores. Éstos, como los programas ensambladoresavanzados, pueden generar muchas líneas de código de máquina por cada proposición delprograma fuente. Se requiere una compilación antes de ejecutar las instrucciones de unproblema.

Según el paradigma de programación 

Un paradigma de programación representa un enfoque particular o filosofía para laconstrucción del software. No es mejor uno que otro, sino que cada uno tiene ventajas ydesventajas. Dependiendo de la situación un paradigma resulta más apropiado que otro.

1.3. Interpretes, Compiladores

1.3.1. Definición de Intérpretes y Compiladores 

Hay lenguajes de programación que utilizan compilador. La ejecución de un programa con compilador requiere de dos etapas:

1) Traducir el programa simbólico a código máquina

2) Ejecución y procesamiento de los datos.

Otros lenguajes de programación utilizan un programa intérprete o traductor, el cual analizadirectamente la descripción simbólica del programa fuente y realiza las instrucciones dadas.

Los compiladores son aquellos cuya función es traducir un programa escrito en un determinadolenguaje a un idioma que la computadora entienda (lenguaje máquina con código binario).

Al usar un lenguaje compilado (como lo son, por ejemplo, los lenguajes del popular VisualStudio de Microsoft), el programa desarrollado nunca se podrá ejecutar mientras haya errores,sino hasta que tras haber compilado el programa, ya no aparecen errores en el código.

El intérprete en los lenguajes de programación simula una máquina virtual, donde el lenguajede máquina es similar al lenguaje fuente.Se puede también utilizar una alternativa diferente de los compiladores para traducir lenguajesde alto nivel. En vez de traducir el programa fuente y grabar en forma permanente el códigoobjeto que se produce durante la compilación para utilizarlo en una ejecución futura, elprogramador sólo carga el programa fuente en la computadora junto con los datos que se van aprocesar. A continuación, un programa interprete, almacenado en el sistema operativo deldisco, o incluido de manera permanente dentro de la máquina, convierte cada proposición delprograma fuente en lenguaje de máquina conforme vaya siendo necesario durante elprocesamiento de los datos. El código objeto no se graba para utilizarlo posteriormente.

La siguiente vez que se utilice una instrucción, se la deberá interpretar otra vez y traducir alenguaje máquina. Por ejemplo, durante el procesamiento repetitivo de los pasos de un ciclo o

Page 8: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 8/139

UNIDAD I INTRODUCCIÓN A LA PROGRAMACIÓN

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

8

bucle, cada instrucción del bucle tendrá que volver a ser interpretada en cada ejecuciónrepetida del ciclo, lo cual hace que el programa sea más lento en tiempo de ejecución (porquese va revisando el código en tiempo de ejecución) pero más rápido en tiempo de diseño(porque no se tiene que estar compilando a cada momento el código completo). El intérpreteelimina la necesidad de realizar una de compilación después de cada modificación del

programa cuando se quiere agregar funciones o corregir errores; pero es obvio que unprograma objeto compilado con antelación deberá ejecutarse con mucha mayor rapidez queuno que se debe interpretar a cada paso durante una ejecución del código.

Ambiente integral del Lenguaje C:

C es un lenguaje de programación de propósito general que ofrece control de flujo yestructuras sencillas y un buen conjunto de operadores. No es un lenguaje de muy alto nivel ymás bien un lenguaje pequeño, sencillo y no está especializado en ningún tipo de aplicación.Este lenguaje ha sido estrechamente ligado al sistema operativo UNIX, puesto que fuerondesarrollados conjuntamente. Sin embargo, este lenguaje no está ligado a ningún sistemaoperativo ni a ninguna máquina concreta. Se le suele llamar lenguaje de programación desistemas debido a su utilidad para escribir compiladores y sistemas operativos, aunque deigual forma se puede desarrollar cualquier t ipo de aplicación.

Page 9: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 9/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

9

2.1. Estructura General de un Programa

Es muy útil, sobre todo cuando se empieza a trabajar con un nuevo lenguaje, disponer de unaplantilla con la estructura habitual y general de un programa en dicho lenguaje. Es de lo quetratará este tema.

Se dice que C es un lenguaje estrictamente modular: todo el código debe estar ubicado en elinterior de funciones.La función llamada main() es sólo eso, una función. Pero una función especial. Existe en todoslos programas, porque contiene el algoritmo o módulo principal del programa. La ejecución deun programa siempre empieza por la primera línea de la función main(). La función main(), como todas las funciones de C, puede devolver un valor. El valor devueltopor main() debe ser de tipo entero. Esto se utiliza para pasar algún valor al programa que hayallamado al nuestro, que suele ser el sistema operativo. Si main() no devuelve un número enteroal sistema operativo mediante una sentencia return , entonces nuestro programa devolverá unnúmero desconocido. Moraleja: es una buena idea incluir un return al final de la funciónmain(). Generalmente, la devolución de un 0 indica al sistema operativo que el programa afinalizado sin problemas, mientras que cualquier otro valor señala que se ha producido algúnerror.

Por lo tanto, la forma habitual de la función main() será:

int main(void){

...instrucciones del algoritmo principal...return 0;

}

Observa que main() no tiene argumentos, por lo que aparece el identificador  void  entreparéntesis en la declaración.

Es posible que se vea una definición de main() con argumentos, algo así:

int main(int argc, char* argv[]){

...instrucciones del algoritmo principal...return 0;

}

Esos dos argumentos sirven para capturar parámetros de entrada desde la línea de comandos.

En general, un programa en C consta de las siguientes partes:

• Directivas al procesador.• Definición de tipos de datos.• Declaración de variables.• Definición de funciones.

Aspectos importantes a definir:

1.- Comentarios:

Los comentarios en C comienzan con la secuencia '/*' y termina con la secuencia '*/'. Todo loque se encuentre entre estas dos secuencias es omitido por el compilador y solo nos sirve paraponer notas o anotaciones que nos sean útiles para ayuda a nuestro código (jamás seráncompiladas ni ejecutadas por C). Algunos compiladores (no todos) soportan el anidamiento decomentarios (comentarios dentro de comentarios), pero por no ser una facilidad común, no se

Page 10: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 10/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

aconseja su utilización. El uso de comentarios en un programa es fundamental para suentendimiento. Una proporción 50%-50% (código-comentario) no es exagerada.

Existen dos maneras de colocar un comentario, el de un párrafo completo deben estar comprendido entre /*.....*/, y aquellos comentarios que son de una sola línea van con doble //.

void main() /* Esta parte del programa es la cabecera principal */ { /* Llave que da inicio a la programación del cuerpo del

 programa */ 

// Comentarios de 1 sola línea// Cuerpo del programa principal

} // Llave que da fin a la programación del cuerpo del programa

2.- Directivas al procesador:

Las directivas al procesador se refiere, a que la etapa de compilación se realiza en dos fases,

una en la que un procesador atiende todas las directivas que contiene el código fuente y la otraetapa es la traducción a código objeto.

Todas las directivas al procesador comienzan con el caracter '#', también llamadasbibliotecas, es un archivo que contiene las funciones estándar que se pueden usar en losprogramas. Entre esas funciones se encuentran todas las operaciones de entrada y salida dedatos.

Cada función definida en la biblioteca estándar tiene asociada una cabecera (#include).

 // Zona de ficheros de cabecera de las librerías 

#include <....... . h> // h de Head #include <....... . h>

Cabeceras de ProgramaCabecera Propósito 

<ctype.h> Manejo de caracteres<errno.h> Informes de error <float.h> Define valores en coma flotante dependientes de la implementación<math.h> Definiciones usadas en la biblioteca matemática<setjmp.h> Soporte para saltos no locales<stddef.h> Define algunas constantes de uso común<stdio.h> Soporte para E/S de archivos<stdlib.h> Declaraciones variables<string.h> Soporte para las funciones de cadena<time.h> Soporte para las funciones de tiempo del sistema

Tabla 2. Cabeceras

3.- Definición de funciones:

Todas las funciones se definen colocando primero el tipo de retorno (void significa que lafunción no retorna nada como resultado de su ejecución. Por defecto si no se coloca tipo deretorno, se asume que la función retorna un valor entero); al tipo de retorno le sigue el nombre(la función main posee un significado especial, ya que es la función que toma el control cuandose ejecuta el programa); le siguen los argumentos separados por comas y encerrados entre

Page 11: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 11/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

paréntesis (aunque la función no reciba argumentos, se colocan los paréntesis vacios); y por último el cuerpo de la función encerrado entre llaves.

void main (void) // Programa principal típico de Turbo C {

// Llave de inicio del programa// Código del programa.....................

} // fin del programa

4.- Definición de Tipos de Datos:

La definición o declaración de datos se hace de dos tipos; una llamada declaración global, quese hace antes del void main ( ) y la cual es reconocida por todo el programa y la declaraciónlocal que es conocida en el programa principal, y se incluye dentro del void main ( ). 

 // Zona de variables globales 

int valor;float media_total;

 /* Variables locales del algoritmo principal */ 

int a, b;float x, y;

Todo programa en C, desde el más pequeño hasta el más complejo, tiene una función principal denominada main(),que es la función que toma el control cuando se corre el programa.Además, por encima de main() deben aparecer los prototipos de funciones (y esto implica a los

archivos de cabecera, si se utilizan funciones de librería) y las variables y constantes globales,si las hay. Por debajo de main() encontraremos el código del resto de funciones.

Por lo tanto, la estructura habitual de nuestros programas en C debería ser esta:

 /* Comentario inicial: nombre del programa,del programador, fecha, etc. */ 

 /* Archivos de cabecera (prototipos de funciones de librería) */ 

#include <archivo_cabecera.h>#include <archivo_cabecera.h>

/* Prototipos de funciones escritas por nosotros */ 

float función1 (argumentos);float función2 (argumentos);

/* Variables y constantes globales */ 

int variable_global;const char constante_global;#define PI 3.14

Page 12: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 12/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

 /* Algoritmo principal */ 

int main(void){

/* Variables locales del algoritmo principal */ int a, b;float x, y;

...

.../* Instrucciones del algoritmo principal */ 

...función1(argumentos);...función2(argumentos);...return 0;

}

/* Código completo de las funciones escritas por nosotros */ 

float función1 (argumentos){

/* Variables locales e instrucciones de este subalgoritmo */ }

float función2 (argumentos){

/* Variables locales e instrucciones de este subalgoritmo */ }

El tema de funciones se verá posteriormente a detalle en el tema 2.3. Un punto importante esenfatizar que todas las líneas de las sentencias terminan con el carácter de ( ; ).

2.2. Tipos de Datos y Operadores

Operadores 

Un operador es un carácter o grupo de caracteres que actúa sobre una, dos o más variablespara realizar una determinada operación con un determinado resultado. Ejemplos comúnesde operadores son la suma (+), la diferencia (-), el producto (*), etc. Los operadorespueden ser unarios, binarios y ternarios, según actúen sobre uno, dos o tres operandos,respectivamente.

En C existen muchos operadores de diversos tipos, que se verán a continuación. Ahora solomencionaré los tipos de operadores que hay, ya que posteriormente se explicará con un pocomas de detalle cada uno de ellos.

Operadores Aritméticos 

Los operadores aritméticos son los más sencillos de entender y de utilizar. Todos ellos sonoperadores binarios. En C se utilizan los cinco operadores siguientes:

- Suma (+)- Resta (–)- Multiplicación (*)- División (/)

Page 13: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 13/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

El quinto operador es el que proporciona el resto de la división (residuo)

- Módulo (%)

Todos estos operadores se pueden aplicar a constantes, variables y expresiones. El

resultado es el que se obtiene de aplicar la operación correspondiente entre los dosoperandos.

El único operador que requiere una explicación adicional es el operador Módulo ( %).En realidad su nombre completo es resto o residuo de la división entera. Este operador se aplica solamente a constantes, variables o expresiones de tipo int. Con el objeto de dejar mas en claro lo anterior, su significado es evidente: 23 % 4 es 3, ya que el resto de dividir 23por 4 es 3. Otro ejemplo seria; si a % b es cero entonces a es múltiplo de b.

Como se verá más adelante, en los otros subtemas una expresión es un conjunto devariables y constantes y también de otras expresiones más sencillas relacionadasmediante distintos operadores. Un ejemplo de expresión en la que intervienen operadoresaritméticos es el siguiente polinomio de grado 2 en la variable y:

9.0 - 5.0 * y + y * y / 3.0

Las expresiones pueden contener paréntesis (...) que agrupan a algunos de sustérminos. Puede haber paréntesis contenidos dentro de otros paréntesis. El significado de losparéntesis coincide con el que se usa en las expresiones matemáticas, con algunascaracterísticas importantes que se verán más adelante. En ocasiones, la introducción decaracteres espacio mejora la legibilidad de las expresiones.

Operadores De Asignación Aritmética 

Estos resultan de la unión de los operadores aritméticos con el operador de asignación el signo(=), o sea:

- Igual (=)- Suma igual (+=)- Resta igual (– =)- Multiplicación igual (*=)- División igual (/=)

Estos operadores se aplican de la siguiente manera: ( x += 5 ), en este ejemplo se toma eloperando de la izquierda lo suma con el operando de la derecha y lo asigna aloperando de la izquierda, en este caso la variable x.

Operadores de Incremento y Decremento 

El operador de incremento es el (++) y el de decremento es el (--), son operadores unarios loscuales tienen prioridad mas alta que otros operadores y sirven para incrementar o decrementar una unidad el valor de la variable a la que afectan.

Ahora describiremos algunas características de los operadores; pre-incremento y post-incremento: Estos operadores pueden ir inmediatamente delante o detrás de la variable.Si preceden a la variable, ésta es incrementada antes de que el valor de dicha variable seautilizado en la expresión en la que aparece. Si es lavariable la que precede al operador, la variable es incrementada después de ser utilizada en laexpresión.

A continuación se presenta un ejemplo de estos operadores:i = 2; j = 2;

Page 14: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 14/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

m = i++; /* después de ejecutarse esta sentencia m=2 e i=3*/n = ++j; /* después de ejecutarse esta sentencia n=3 y j=3*/

Estos operadores son muy utilizados. Es importante entender muy bien por qué losresultados m y n del ejemplo anterior son diferentes.

Operadores Relaciónales 

Estos establecen la magnitud relativa de dos elementos y son los siguientes:

Expresiones Lógicas:Expresión Significadoa < b Es a menor que ba > b Es a mayor que ba == b Es a igual a ba != b Es a diferente o no igual a ba <= b Es a menor o igual a ba >=b Es a mayor o igual a b

Tabla 3. Expresiones Lógicas

Recordemos que estas operaciones nos dan resultados lógicos de 1 ó 0 es decir valores deverdadero o falso;lenguaje C considera todo valor no cero como un valor verdadero.

Operadores Lógicos 

C proporciona operadores lógicos para combinar los resultados de varias condiciones.Una expresión compuesta es aquella que utiliza operadores como estos y que sepueden evaluar para obtener un único resultado de verdadero o falso.

Dos de los operadores lógicos son binarios porque usan dos operandos, devuelven unresultado basado en los operandos recibidos y en el operador.

AND ( && ): Este operador conocido como producto lógico retorna un valor de verdaderosi los operandos son verdaderos.

OR ( || ): El operador de suma lógica retorna un valor de verdadero si los operandos o uno delos operandos es verdadero.NOT ( ! ): Operador de negación, tiene por efecto invertir el resultado de la expresión que lesigue es decir si la expresión es verdadera después de aplicar este operador laexpresión será falsa y viceversa.

Los operadores lógicos tienen una prioridad bastante baja, menos que los operadores deigualdad pero mayor que el operador de asignación.

Jerarquía o Precedencia de OperadoresOperadores Unario / Binario Comentario!, &, +, -, sizeof()*, /, %+, -<, <=, >, >===, !=&&||=

UnarioBinarioBinarioBinarioBinarioBinarioBinarioBinario

Operadores UnariosMultiplicador AritméticoAdición AritméticosOperadores RelaciónalesOperadores de IgualdadMultiplicador LógicoAditivo LógicoOperador de Asignación

Tabla 4. Jerarquía de Operadores

Page 15: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 15/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

Los lenguajes de programación disponen de una serie de tipos de datos básicos, yproporcionan herramientas para crear estructuras a medida que faciliten el acceso a lainformación. Así en nuestro caso ficticio de resolver un sistema de ecuaciones podemosalmacenar los coeficientes de cada ecuación con lo que utilizaríamos como tipo de datolos números, si planteásemos el problema desde un punto de vista matricial nos interesaría

tener un tipo de datos matriz y lo ideal sería tener un tipo de datos ecuación. En este apartadodescribiremos los tipos básicos que proporciona el lenguaje C y dejaremos para temasposteriores la declaración de tipos complejos.

El C dispone de estos tipos básicos:

Para el sistema operativo MSDOS , en el símbolo del sistema de Windows XP (En TC++ 3.0 yBorland C++ 5.0):

Tipos de Datos y Rango:TIPOS FORMATO RANGO TAMAÑO DESCRIPCIÓN

Char %c -128 a 127 1 Para una letra o un dígito.unsigned char %u 0 a 255 1 Letra o número positivo.

Short -32.768 a 32.767 2 Entero corto con signounsigned %u 0 a 65.535 2 Entero corto sin signoInt %d, %i -32.768 a 32.767 2 Entero con signounsigned int %u 0 a 65.535 2 Entero sin signoshort int %d -32.768 a 32.767 2 Entero con signoLong %ld -2.147.483.648a 4 Entero largo con signounsigned long %ld 0 a 4.294.967.295 4 Entero largo sin signolong int %ld -2.147.483.648a 4 Entero largo con signo

unsigned long%ld 0 a 4.294.967.295 4 Entero largo sin signoFloat %f, %g,

%e, %E3.4E-38 a 3.4E+38decimales(6) 4

Para números con decimales

Double %f, %g,%e, %E

1.7E-308 a 1.7E+308decimales(10) 8

Para números con decimales

long double %f, %g,%e, %E

3.4E-4932 a 1.1E+4932decimales(10) 10

Para números con decimales

Tabla 5. Tipos de datos y su rango

Todos estos tipos salvo void son tipos numéricos. Incluso el tipo char.

Además de estos tipos podemos utilizar los modificadores signed y unsigned , los cuales sonaplicables a los tipos de datos enteros

Aunque el tipo char represente caracteres internamente para la computadora no es másque un número comprendido entre 0 y 255 que identifica un carácter dentro del códigoespecificado para tal propósito en el sistema en el que nos encontremos trabajando. El código

más utilizado para este tipo de representación es el ASCII.

Según la máquina, el compilador empleado y las opciones de compilación , "char"puede interpretarse con signo o sin signo. Esto es, de -128 a 127 o desde 0 a 255. Si serequiere una representación que no dependa de las opciones del compilador, etc., se puedeponer "signed char" o "unsigned char", según el caso.

Variables 

Como decíamos antes la computadora debe de disponer de los datos necesarios para resolver el problema para el que lo queramos programar. Difícilmente se podría resolver un sistema de

Page 16: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 16/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

ecuaciones si no se dispone de éstas. Para ello podemos definir variables. Las variablesalmacenan valores de un tipo especificado y en ellas almacenamos los datos de nuestroproblema, se denominan variables por que su valor puede cambiar a lo largo del programa.

Una variable sólo puede pertenecer a un tipo de dato. Para poder utilizar una variable, primero

tiene que ser declarada. Para referenciar una variable especificada es necesario que lapodamos identificar para ello se utiliza un nombre o identificador.

Las variables no se conservan después de que un programa termina su ejecución. Cuandofinaliza un programa, los datos son borrados. Si quieres que datos permanezcan puedesusar archivos para almacenarlos.

Declaración de Variables 

Las variables se utilizan para almacenar temporalmente datos dentro del programa. En C Hayque declarar todas las variables antes de usarlas. Cada variable tiene un tipo.

Es posible inicializar y declarar más de una variable del mismo tipo en la misma sentencia:

La declaración es:tipo nombre ;

Ejemplo:

int pepe; /* tipo de variable: int y nombre de la variable: a */

float b;

double c,d; /* tipo de las variables: double y nombre de las variables:

c y d */

char x; 

Nota: La declaración de variables debe hacerse al principio de la función. (Aunque algunoscompiladores lo admitan, no debe hacerse en cualquier lugar).

Asignación de Valores 

Para la asignación de valores se utiliza el signo ( = ) igual, por ejemplo:

A = 5; B = 4;

X = 43.453;

En C es posible asignar a varias variables un solo valor ejemplo:

a = b = c = 7;

x = y = n = 34;

p = d = m = 56.8;

k = i = 23;

Algunos lenguajes automáticamente inicializan variables numéricas a cero y variables tipo

carácter a blanco o a carácter nulo, en C no es así ya que se puede declarar la variable einicializarla al mismo tiempo, por ejemplo:

int x = 5, y = 1;

Hay que tener cuidado con lo siguiente:

Podríamos pensar que x e y son igual a 20, pero no es así. La variable x está sin valor inicial yla variable 'y' tiene el valor 20.

Ejemplo: Suma dos valores

Page 17: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 17/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

 Algoritmo:

iniciodeclarar variables

enteras num1=4, num2, num3 = 6escribir (‘ El valor de num1 es: ‘, num1)escribir (‘ El valor de num3 es:’, num3)num2← num1+num3escribir (‘ num1 + num3 = ‘, num2)pausafin

Programa:

#include <stdio.h>

int main (void){int num1=4, num2, num3=6;

 printf(" El valor de num1 es %d", num1); printf("\n El valor de num3 es %d", num3);num2=num1+num3;

 printf("\n num1 + num3 = %d\n", num2);system(“pause”);return 0;}

Alcance o Ámbito de las Variables (tipos de declaración de variables)

Según el lugar donde se declaren las variables tendrán un ámbito. Según el ámbito de lasvariables pueden ser utilizadas desde cualquier parte del programa o únicamente en la funcióndonde han sido declaradas. Las variables pueden ser:

- locales : Cuando se declaran dentro de una función. Las variables locales sólopueden ser referenciadas (utilizadas) por sentencias que estén dentro de la función que hansido declaradas. No son conocidas fuera de su función. Pierden su valor cuando se sale y seentra en la función. La declaración es como siempre.

-globales : Son conocidas a lo largo de todo el programa, y se pueden usar desde cualquier parte del código del programa. Mantienen sus valores durante toda la ejecución. Debanser declaradas fuera de todas las funciones incluida main (void). La sintaxis de creaciónno cambia nada con respecto a las variables locales. Inicialmente toman el valor 0 o nulo,según el tipo.

-de registro : Otra posibilidad es, que en vez de ser mantenidas en posiciones dememoria de la computadora, se las guarde en registros internos del microprocesador. De esta

manera el acceso a ellas es más directo y rápido. Para indicar al compilador que es unavariable de registro hay que añadir a la declaración la palabra register delante del tipo.Solo se puede utilizar para variables locales.

-estáticas : Las variables locales nacen y mueren con cada llamada y finalización deuna función, sería útil que mantuvieran su valor entre una llamada y otra sin por ello perder suámbito. Para conseguir eso se añade a una variable local la palabra static delante del tipo.

2.2.1. Tamaño, declaración y modificadores 

El Tipo de dato “int” 

Page 18: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 18/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

 En una variable de este tipo se almacenan números enteros (sin decimales). Unavariable tipo int se almacena en 2 bytes (16 bits), aunque algunos compiladores utilizan 4bytes (32 bits). El ANSI C no tiene esto completamente normalizado y existen diferencias entreunos compiladores y otros.

Con 16 bits se pueden almacenar 216 = 65536 números enteros diferentes: de 0 al 65535 paravariables sin signo, y de -32768 al 32767 para variables con signo (que pueden ser positivas ynegativas), que es la opción por defecto. Este es el rango de las variables tipo int.

Para poder usar una variable primero hay que declararla (definirla). Hay que decirle alcompilador que queremos crear una variable y hay que indicarle de qué tipo. Por ejemplo:

unsigned int numero;

int nota = 10;

Esto hace que declaremos una variable llamada número que va a contener un número enterosin signo y una variable nota con signo. En este caso la variable numero podrá estar entre 0 y 65535, mientras que nota deberá estar comprendida entre -32768 al 32767.Cuando a una variable int se le asigna en tiempo de ejecución un valor que queda fueradel rango permitido (situación de overflow o valor excesivo), se produceun error en el resultado de consecuencias tanto más imprevisibles cuanto que de ordinario elprograma no avisa al usuario de dicha circunstancia.

Cuando el ahorro de memoria es muy importante puede asegurarse que el computador utiliza 2bytes para cada entero declarándolo en una de las formas siguientes:

int numero;

Como se ha dicho antes, ANSI C no obliga a que una variable int ocupe 2 bytes, perodeclarándola como int sí que necesitará sólo 2 bytes (al menos en los PC’s).

Mostrar variables por pantalla 

Vamos a ir u poco más allá con la función printf. Supongamos que queremos mostrar el contenido de la variable x por pantalla:

 printf( "%i", x );

Suponiendo que x valga 10 (x=10) en la pantalla tendríamos:

10

Aquí se describe brevemente el significado de "%i" el cual no se muestra por pantalla, sesustituye por el valor de la variable que va detrás de las comillas. ( %i, de integer = entero eninglés).

Para ver el contenido de dos variables, por ejemplo x e y, podemos hacer:

 printf( "%i ", x ); printf( "%i", y );

resultado (suponiendo x=10, y=20):

10 20

Pero hay otra forma mejor:

 printf( "%i %i", x, y );

Page 19: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 19/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

 y así podemos poner el número de variables que queramos. Obtenemos el mismo resultadocon menos trabajo. No olvidemos que por cada variable hay que poner un %i dentro de lascomillas.También podemos mezclar texto con enteros:

 printf( "El valor de x es %i, ¡excelente! \n", x );

que quedará como:

El valor de x es 10, ¡excelente!

Como vemos %i al imprimir se sustituye por el valor de la variable. Veamos un ejemplo pararesumir todo:

Algoritmo:

iniciodeclara variables

enteras x← 20escribir ( ‘ El valor inicial de x es ‘, x )x← 60escribir ( ‘Ahora el valor es ‘, x );pausafin

Programa:

#include <stdio.h>

int main(){int x = 20;

 prinft( "El valor inicial de x es %i \n", x );

x = 60; printf( "Ahora el valor es %i \n", x );system(“pause”);return 1;

}

Cuya salida será:

El valor inicial de x es 20Ahora el valor es 60

Si imprimimos una variable a la que no hemos dado ningún valor no obtendremos ningún error al compilar pero la variable tendrá un valor cualquiera.

El Tipo de dato “char” 

Las variables de tipo char sirven para almacenar caracteres y se almacenan en un byte dememoria (8 bits).

En un bit se pueden almacenar dos valores (0 y 1); con dos bits se pueden almacenar 22 = 4valores (00, 01, 10, 11 en binario; 0, 1 2, 3 en decimal). Con 8 bits se podránalmacenar 28 = 256 valores diferentes (normalmente entre 0 y 255; con ciertoscompiladores entre -128 y 127).

Page 20: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 20/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

2

Los 128 primeros (0 a 127) son el ASCII estándar. El resto es el ASCII extendido y depende delidioma y de la computadora.

Para declarar una variable de tipo char hacemos:

char letra;char a, b, caracter;

Se puede declarar más de una variable de un tipo determinado en una sola sentencia.Se puede también inicializar la variable en la declaración. Por ejemplo, para definir la variablecarácter letra a y asignarle el valor ‘A’, se puede escribir:

char letra = ’A’;

letra = 65;

A partir de ese momento queda definida la variable letra con el valor correspondiente ala letra A. Recuérdese que el valor ’A’ utilizado para inicializar la variable letra es unaconstante carácter. En realidad, letra se guarda en un solo byte como un número entero, elcorrespondiente a la letra A en el código ASCII, (existe un código ASCII extendido queutiliza los 256 valores y que contiene caracteres especiales y caracteres específicos delos alfabetos de diversos países, como por ejemplo las vocales acentuadas y la letra ñ para elespañol latinoamericano).

En una variable char sólo podemos almacenar solo una letra, no podemos almacenar ni frasesni palabras.

En el ejemplo anterior, en ambos casos se almacena la letra 'A' en la variable. Esto es asíporque el códigoASCII de la letra 'A' es el 65.

Para imprimir un char usamos el símbolo %c (c de character=caracter en inglés):

letra = 'A'; printf( "La letra es: %c.", letra );

Resultado:

La letra es A.

También podemos imprimir el valor ASCII de la variable usando %i en vez de %c:

letra = 'A'; printf( "El código ASCII de la letra %c es: %i.", letra, letra );

Resultado:

El código ASCII de la letra A es 65.

Como vemos la única diferencia para obtener uno u otro es el modificador (%c ó %i) queusemos.Las variables tipo char se pueden usar (y de hecho se usan mucho) para almacenar enteros. Sinecesitamos un número pequeño (entre -127 y 127) podemos usar una variable char (8bits) envez de una int (16bits), con el consiguiente ahorro de memoria.

Todo lo demás dicho para los datos de tipo int se aplica también a los de tipo char. Unacuriosidad:

Page 21: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 21/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

2

 letra = 'A';

 printf( "La letra es: %c y su valor ASCII es: %i\n", letra, letra );letra = letra + 1;

 printf( "Ahora es: %c y su valor ASCII es: %i\n", letra, letra );

En este ejemplo letra comienza con el valor 'A', que es el código ASCII 65. Al sumarle 1 pasa atener el valor 66, que equivale a la letra 'B' (código ASCII 66). La salida de este ejemplo sería:

La letra es A y su valor ASCII es 65Ahora es B y su valor ASCII es 66

El Tipo de dato “long” 

Existe la posibilidad de utilizar enteros con un rango mayor si se especifica como tipolong en su declaración:

long int numero _ grande;

o, ya que la palabra clave int puede omitirse en este caso,

long numero _ grande;

El rango de un entero long puede variar según el computador o el compilador que seutilice, pero de ordinario se utilizan 4 bytes (32 bits) para almacenarlos, por lo que sepueden representar 232 =4.294.967.296 números enteros diferentes. Si se utilizan números con signo, podránrepresentarse números entre -2.147.483.648 y 2.147.483.647. También se pueden declarar enteros long que sean siempre positivos con la palabra unsigned:

unsigned long numero_positivo_muy_grande; 

En algunos computadores una variable int ocupa 2 bytes (coincidiendo con short) y enotros 4 bytes (coincidiendo con long). Lo que garantiza el ANSI C es que el rango de int no esnunca menor que el de short ni mayor que el de long.

El Tipo de dato “float” 

En muchas aplicaciones hacen falta variables reales, capaces de representar magnitudes quecontengan una parte entera y una parte fraccionaria o decimal. Estas variables sellaman también de punto flotante. De ordinario, en base 10 y con notación científica, estasvariables se representan por medio de la mantisa, que es un número mayor o igual que 0.1 ymenor que 1.0, y un exponente que representa la potencia de 10 por la que hay que multiplicar la mantisa para obtener el número considerado. Por ejemplo, π se representa como0.3141592654 . 101. Tanto la mantisa como el exponente pueden ser positivos y negativos.

Las computadoras trabajan en base 2. Por eso un número de tipo float se almacenaen 4 bytes (32 bits), utilizando 24 bits para la mantisa (1 para el signo y 23 para el valor) y 8

bits para el exponente (1 para el signo y 7 para el valor). Es interesante ver qué clase denúmeros de punto flotante pueden representarse de esta forma. En este caso hay quedistinguir el rango de la precisión. La precisión hace referencia al número de cifras con las quese representa la mantisa.

Declaración de una variable de tipo float: 

float numero;

Para imprimir valores tipo float Usamos %f.

Page 22: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 22/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

2

float num=4060.80; printf( "El valor de num es : %f", num );

El resultado será:

El valor de num es: 4060.80Si queremos escribirlo en notación exponencial usamos %e:

float num = 4060.80; printf( "El valor de num es: %e", num );

Que da como resultado:

El valor de num es: 4.06080e003

El Tipo de dato “double” 

Las variables tipo float tienen un rango y sobre todo una precisión muy limitada,insuficiente para la mayor parte de los cálculos técnicos y científicos. Este problema sesoluciona con el tipo double, que utiliza 8 bytes (64 bits) para almacenar una variable. Seutilizan 53 bits para la mantisa (1 para el signo y 52 para el valor) y 11 para el exponente (1para el signo y 10 para el valor).

Las variables tipo double se declaran de forma análoga a las anteriores: 

double numero_real_grande;

Por último, existe la posibilidad de declarar una variable como long double, aunque el ANSI Cno garantiza un rango y una precisión mayores que las de double. Eso depende del compilador y del tipo de computador. Estas variables se declaran en la forma:

long double real_muy_grande;

cuyo rango y precisión no está normalizado. Los compiladores de Microsoft para PC’s utilizan10 bytes (64 bits para la mantisa y 16 para el exponente).

Overflow: Qué pasa cuando nos saltamos el rango

El overflow es lo que se produce cuando intentamos almacenar en una variable unnúmero mayor del máximo permitido. El comportamiento es distinto para variables denúmeros enteros y para variables de números en coma flotante.

Tabla de tipos de datos

Tipo Definición Bits

Char Short

Carácter Entero corto con signo

(normalmente 8 bits)(normalmente 16 bits)

Int Entero con signo (depende de la implementación)

Unsigned Entero sin signo (depende de la implementación)

Long Entero largo con signo (normalmente 32 bits)

Float Flotante simple (normalmente 32 bits)

Double Flotante doble (normalmente 64 bits)

Tabla 6. Tipos de datos

Page 23: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 23/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

2

Con números enteros si corremos este programa

Algotimo:

inicio

declarar variablesEnteras num1num1← 2147483648escribir ( ‘ El valor de num1 es: ‘, num1 )pausafinPrograma:

#include <stdio.h>int main(void){int num1;num1 = 2147483648;

 printf( "El valor de num1 es: %i \n", num1 );getch();}

El resultado que obtenemos es:

El valor de num1 es: -2147483648

Comprueba si quieres que con el número anterior (2.147.483.647) no pasa nada.

Con números en coma flotante

El comportamiento con números en coma flotante es distinto. Dependiendo de la computadorasi nos pasamos del rango al ejecutar un programa se puede producir un error y detenerse laejecución.Con estos números también existe otro error que es el underflow. Este error se produce cuando

almacenamos un número demasiado pequeño.

Conversión de tipos: 

Cuando escribimos una expresión aritmética a+b, en la cual hay variables o valores dedistintos tipos, el compilador realiza determinadas conversiones antes de que evalúe laexpresión. Estas conversiones pueden ser para 'aumentar' o 'disminuir' la precisión del tipo alque se convierten los elementos de la expresión. Un ejemplo claro, es la comparación de unavariable de tipo int con una variable de tipo double. En este caso, la de tipo int es convertida adouble para poder realizar la comparación.

Los tipos pequeños son convertidos de la forma siguiente: un tipo char se convierte a int, con elmodificador signed si los caracteres son con signo, o unsigned si los caracteres son sinsigno. Un unsigned char es convertido a int con los bits más altos puestos a cero. Un signed

char es convertido a int con los bits más altos puestos a uno o cero, dependiendo del valor dela variable.

Para los tipos de mayor tamaño: si un operando es de tipo double, el otro esconvertido a double. Si un operando es de tipo float, el otro es convertido a float. Si unoperando es de tipo unsigned long, el otro es convertido a unsigned long. Si un operando es detipo long, el otro es convertido a long. Si un operando es de tipo unsigned, el otro es convertidoa unsigned. Si no, los operandos son de tipo int.

Otra clase de conversión implícita tiene lugar cuando el resultado de una expresión esasignado a una variable, pues dicho resultado se convierte al tipo de la variable (en este caso,

Page 24: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 24/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

2

ésta puede ser de menor rango que la expresión, por lo que esta conversión puede perder información y ser peligrosa). Por ejemplo, si i y j son variables enteras y x es double:

x = i*j – j + 1;

En C existe también la posibilidad de realizar conversiones explícitas de tipo (llamadascasting, en ingles). El casting es pues una conversión de tipo, forzada por elprogramador. Para ello basta preceder la constante, variable o expresión que se deseaconvertir por el tipo al que se desea convertir, encerrado entre paréntesis. En el siguienteejemplo,

k = (int) 1.7 + (int) masa;

la variable masa es convertida a tipo int, y la constante 1.7 (que es de tipo double) también. Elcasting se aplica con frecuencia a los valores de retorno de las funciones.

Ejemplo:

Algoritmo:

iniciodeclarar variables

reales aenteras b

a← 2.8b← 10escribir ( ‘ a (real) = ‘, a)escribir ( ‘ a convertido en entero: ‘, (int) a)escribir ( ‘ b (entero): ‘, b)escribir (‘ b convertido en real: ‘, (float) b)pausafin

Programa:

#include <stdio.h>int main (void){float a;int b;a = 2.8;b = 10;

  printf("\n a (real) = %f", a); /* a = 2.8000 */   printf("\n a convertido en entero: %d", (int) a); /* a convertidoen entero : 2 */ 

  printf("\n b (entero): %d", b); /* b : 10 */   printf("\n b convertido en real: %f", (float) b); /* b convertidoen real : 10.0000 */ 

system(“pause”);return 1;}

Constantes 

Se entiende por constantes aquel tipo de información numérica o alfanumérica que no puedecambiar más que con una nueva compilación del programa. Como ya se ha dichoanteriormente, en el código de un programa en C pueden aparecer diversos tipos deconstantes que se van a explicar a continuación.

Page 25: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 25/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

2

Constantes Enteras 

Un constante entero decimal está formado por una secuencia de dígitos del 0 al 9,constituyendo un número entero. Las constantes enteros decimales están sujetas a las mismasrestricciones de rango que las variables tipo int y long, pudiendo también ser unsigned.

El tipo de una constante se puede determinar automáticamente según su magnitud,o de modo explícito posponiendo ciertos caracteres, como en los ejemplos que siguen:

Constantes de tipo enteroLongitud Constante

2348445815253u ó 253U

739l ó 739L583ul ó583UL

constante tipo intconstante tipo long (es mayor que 32767)constante tipo unsigned int

constante tipo longconstante tipo unsigned long 

Tabla 7. Constantes Enteras

En C se pueden definir también constantes enteras octales, esto es, expresadas en base 8 condígitos del 0 al 7. Se considera que una constante está expresada en base 8 si el primer dígitopor la izquierda es un cero (0). Análogamente, una secuencia de dígitos (del 0 al 9) y de letras(A, B, C, D, E, F) precedida por 0x o por 0X, se interpreta como una constante enterahexadecimal, esto es, una constante numérica expresada en base 16. Por ejemplo:

Ejemplos conversionesConversión Código

011 110xA0xFF

constante octal (igual a 9 en base 10)constante entera decimal (no es igual a 011)constante hexadecimal (igual a 10 en base 10)constante hexadecimal (igual a 162-1=255 en base10)

Tabla 8. Ejemplos de Conversiones

Es probable que no haya necesidad de utilizar constantes octales y hexadecimales, peroconviene conocer su existencia y saber interpretarlas por si hiciera falta. La ventaja de losnúmeros expresados en base 8 y base 16 proviene de su estrecha relación con la base 2 ( 8 y16 son potencias de 2), que es la forma en la que la computadora almacena la información.

Constantes de punto flotante 

Como es natural, existen también constantes de punto flotante, que pueden ser de tipo float,double y long double. Una constante de punto flotante se almacena de la misma forma que lavariable correspondiente del mismo tipo. Por defecto si no se indica otra cosa las constantes depunto flotante son de tipo double. Para indicar que una constante es de tipo float se le añadeuna f o una F; para indicar que es de tipo long double, se le añade una l o una L. En cualquier caso, el punto decimal siempre debe estar presente si se trata de representar un número real.

Estas constantes se pueden expresar de varias formas. La más sencilla es un conjunto dedígitos del 0 al 9, incluyendo un punto decimal. Para constantes muy grandes o muypequeñas puede utilizarse la notación científica; en este caso la constante tiene una parteentera, un punto decimal, una parte fraccionaria, una e o E, y un exponente entero (afectando a

Page 26: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 26/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

2

la base 10), con un signo opcional. Se puede omitir la parte entera o la fraccionaria, pero noambas a la vez. Las constantes de punto flotante son siempre positivas. Puedeanteponerse un signo (-), pero no forma parte de la constante, sino que con ésta constituye unaexpresión, como se verá más adelante. A continuación se presentan algunos ejemplos válidos:

Ejemplos de ConstantesEjemplo Constante 

1.23  23.963f .00874

23e2.874e-2.874e-2f  

constante tipo double (opción por defecto)constante tipo floatconstante tipo double

constante tipo double (igual a 2300.0)constante tipo double en notación científica (=.00874)constante tipo float en notación científica

Tabla 9. Ejemplos de Constantes

Seguidos de otros que no son correctos:

Ejemplos incorrectos de constantes

1,2323963f 

error: la coma no esta permitidaerror: no hay punto decimal ni carácter e ó E

.e4-3.14

error: no hay ni parte entera ni fraccionariaerror: sólo el exponente puede llevar signo

Tabla 10. Ejemplos incorrectos de constantes

Constantes carácter 

Una constante carácter es un carácter cualquiera encerrado entre apóstrofos (tal como 'x' o 't').El valor de una constante carácter es el valor numérico asignado a ese carácter según elcódigo ASCII. Conviene indicar que en C no existen constantes tipo char; lo que se llama aquíconstantes carácter son en realidad constantes enteras.

Hay que señalar que el valor ASCII de los números del 0 al 9 no coincide con el propio valor numérico. Por ejemplo, el valor ASCII de la constante carácter '8' es 56.

Ciertos caracteres no representables gráficamente, el apóstrofo (') y la barra invertida (\) y otroscaracteres, se representan mediante tabla de secuencias de escape con ayuda de la barrainvertida (\).

Los caracteres ASCII pueden ser también representados mediante el número octalcorrespondiente, encerrado entre apóstrofos y precedido por la barra invertida. Por ejemplo,'\07' y '\7' representan el número 7 del código ASCII (sin embargo, '\007' es la representaciónoctal del carácter '7').

El ANSI C también admite secuencias de escape hexadecimales, por ejemplo '\x1a'.

Page 27: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 27/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

2

 Cadenas de caracteres 

Una cadena de caracteres es una secuencia de caracteres delimitada por comillas ("),como por ejemplo: "Esto es una cadena de caracteres". Dentro de la cadena, pueden

aparecer caracteres en blanco y se pueden emplear las mismas secuencias de escape válidaspara las constantes carácter. Por ejemplo, las comillas (") deben estar precedidas por (\),para no ser interpretadas como fin de la cadena; también la propia barra invertida (\). Esmuy importante señalar que el compilador sitúa siempre un byte nulo (\0) adicional al final decada cadena de caracteres para señalar el final de la misma. Así, la cadena "mesa" no ocupa 4bytes, sino 5 bytes. A continuación se muestran algunos ejemplos de cadenas de caracteres:

"Informática I" "'A'"" cadena con espacios en blanco ""Esto es una \"cadena de caracteres".\n"

2.2.2. Operadores Lógicos Aritméticos y de Asignación 

Constantes de tipo Enumeración: 

En C existen una clase especial de constantes, llamadas constantes enumeración. Estasconstantes se utilizan para definir los posibles valores de ciertos identificadores o variables quesólo deben poder tomar unos pocos valores. Por ejemplo, se puede pensar en una variablellamada dia_de_la_semana que sólo pueda tomar los 7 valores siguientes: lunes, martes,miércoles, jueves, viernes, sábado y domingo. Es muy fácil imaginar otros tipos de variablesanálogas, una de las cuales podría ser una variable booleana con sólo dos posibles valores: SIy NO, o TRUE y FALSE, u ON y OFF. El uso de este tipo de variables hace más claros ylegibles los programas, a la par que disminuye la probabilidad de introducir errores.

En realidad, las constantes enumeración son los posibles valores de ciertas variables definidascomo de ese tipo concreto.

Las enumeraciones se crean con enum:

enum nombre_de_la_enumeración{

};

Ejemplo 1:

nombres de las constantes

enum día {lunes, martes, miércoles, jueves, viernes, sábado, domingo};

Esta declaración crea un nuevo tipo de variable el tipo de variable día que sólo puede tomar uno de los 7 valores encerrados entre las llaves. Estos valores son en realidad constantes tipoint: lunes es un 0, martes es un 1, miércoles es un 2, etc. Ahora, es posible definir variables,

llamadas dia1 y dia2, que sean de tipo día, en la forma (observe que en C deben aparecer laspalabras enum día)

enum día dia1, dia2;

y a estas variables se les pueden asignar valores en la forma

dia1 = martes;

Los valores enteros que se asocian con cada constante tipo enumeración pueden ser controlados por el programador. Por ejemplo, la declaración,

Page 28: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 28/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

2

 enum día {lunes=1, martes, miércoles, jueves, viernes, sábado,domingo};

asocia un valor 1 a lunes, 2 a martes, 3 a miércoles, etc., mientras que la declaración,

enum día {lunes=1, martes, miércoles, jueves=7, viernes, sábado,domingo};

asocia un valor 1 a lunes, 2 a martes, 3 a miércoles, un 7 a jueves, un 8 a viernes, un 9 asábado y un 10 a domingo.

Tabla de operadores lógicos, aritméticos y de asignación:

Operador Definición 

+, -

++, --

suma, resta

incremento, decremento*, /, % multiplicación, división, módulo>>, << rotación de bits a la derecha, izquierda.& AND booleano| OR booleano^ EXOR booleano~ complemento a 1! complemento a 2, NOT lógico==, != igualdad, desigualdad&&, || AND, OR lógico<, <= menor, menor o igual>, >= mayor, mayor o igual

Tabla 11. Operadores

2.3. Funciones de BibliotecaUno de los principales objetivos de la programación modular es la reutilización de código, estoes escribir una función de manera que cualquier otra persona puede utilizarla en sus códigos.

En el estándar de C, se establecen una serie de funciones, denominadas de biblioteca; quecualquier compilador debe incorporar, de forma que cualquier programa que utilice dichasfunciones pueda ser compilado sin errores en cualquier máquina.

Existen funciones predefinidas, que se encuentran disponibles en la biblioteca estándar de C ynos sirven para; manipulación de cadenas, manipulación de caracteres, entrada/salida,verificación de errores, y muchas otras operaciones útiles para cualquier programador de C.Esto hace que el trabajo del programador sea más sencillo debido a que estas funcionesproporcionan muchas de las capacidades que se requieren. Las funciones de la biblioteca

estándar son parte del ambiente de programación en C.

Para usar las bibliotecas de funciones y las llamadas al sistema en un programa de Csimplemente se debe llamar la función apropiada de C.

Ejemplos de las funciones de la biblioteca estándar que han sido vistas son las funciones deE/S de alto nivel -fprintf(), malloc(), entrada y salida simples printf(), scanf(), operadoresaritméticos, generadores de números aleatorios como random(), srandom(), lrand48(),drand48(), etc. y funciones para conversión de cadenas a los tipos básicos de C (atoi(), atof(),etc.) son miembros de la biblioteca estándar stdlib.h. 

Page 29: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 29/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

2

Todas las funciones matemáticas como sin(), cos(), sqrt() son funciones de la bibliotecaestándar de matemáticas (math.h).

Para muchas llamadas del sistema y funciones de las bibliotecas se tiene que incluir el archivocabecera apropiado, por ejemplo: stdio.h, math.h .

Para usar una función se debe asegurar de haber puesto los correspondientes #include en elarchivo de C. De esta forma la función puede ser llamada correctamente, es importanteasegurarse que los argumentos tengan los tipos esperados, de otra forma la funciónprobablemente producirá resultados extraños.

La mayoría de las bibliotecas contienen cientos de funciones utilizables que nos puedenahorrar una cantidad importante de tiempo de programación.

Una biblioteca es una colección de funciones, proporcionadas por el compilador para utilizarsedentro de un programa, para usar una función de estas bibliotecas (“librerías”), se debe incluir el archivo de encabezado correspondiente que contiene el prototipo de la función y una vezlisto; la función solo se usa (entonces la función realiza la operación para lo que fue creada), ylisto.El prototipo de encabezado contiene los prototipos correctos y simplemente tendrás que incluir el archivo de encabezado mediante la declaración #include y luego se podrá llamar a la funciónque se desee.

Ejemplo:

#include <stdio.h>

Donde #include es el prototipo de encabezado y <stdio.h> es la biblioteca de C, en dondedentro de ella se encontrarán muchas funciones de biblioteca que se pueden usar dentro de unprograma, las cuales ya realizan una función determinada,

Ejemplos de algunas funciones que se encuentran en las diferentes bibliotecas:

Biblioteca math.hFunciones

Funcionesacosceil

asincos

atancosh

atan2exp

fabs floor fmod frexpldexp log log10 modf pow sin sinh sqrttan tanh

Tabla 12. Función math.hBiblioteca string.h

FuncionesFuncionesmemchr 

memset

memcmp

strcat

memcpy

strchr 

memmove

strcmpstrcoll strcpy strcspn strerror strlen strncat strncmp strncpystrpbrk strrchr strspn strstr strtok strxfrm

Tabla 13. Función string.hBiblioteca stdlib.h

FuncionesFuncionesabortatoi

absatol

atexitbsearch

atof calloc

Page 30: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 30/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

3

div exit free getenvlabs ldiv malloc mblenmbstowcs mbtowc qsort randrealloc srand strtod strtolstrtoul system wctomb

Tabla 14. Función stdlib.h

Biblioteca stdio.hFunciones

Funcionesclearerr fflush

fclosefgetc

feof fgetpos

ferror fgets

fopen formato fprintf fputcfputs fread freopen fscanf fseek fsetpos ftell fwritegetc getchar gets perror printf putc putchar putsremove rename rewind scanf setbuf setvbuf sprintf sscanf 

tmpfile tmpnam ungetc vfprintf vprintf vsprintf Tabla 15. Función stdio.h

Biblioteca time.hFunciones

Funcionesasctimegmtime

clocklocaltime

ctimemktime

difftimestrftime

timeTabla 16. Función time.h

Un ejemplo de un programa donde se usan dos funciones de biblioteca llamadas getchar() yputchar(), las cuales se encuentran respectivamente en la biblioteca stdio.h , sería el siguiente.

Algoritmo:

iniciodeclarar variables

Entera cc← getchar( )mientras (c != EOF) hacer 

putchar(c)c← getchar()

fin_mientraspausafin

Programa:#include <stdio.h>

void main(){int c;

c = getchar();while (c != EOF){

Page 31: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 31/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

3

putchar(c);c = getchar();

}getch();}

El mismo ejemplo solo un poco más simple de realizar.

Algoritmo: 

iniciodeclarar variables

enteras cmientras ((c = getchar()) != EOF) hacer 

putchar(c)fin_mientraspausafin

Programa: 

#include <stdio.h>

void main(){int c;

while ((c = getchar()) != EOF){ putchar(c);}

 } 

Ejemplo que cuenta el número de caracteres de una cadena.

Algoritmo:

iniciodeclarer variables

float ncnc ← 0mientras ((getchar()) != EOF) hacer 

incrementar en uno ncescribir ( ‘ nc ‘)

fin_mientraspausafin

Programa:

#include <stdio.h>

void main(){long nc;nc = 0;

while ((getchar()) != EOF)++nc;

Page 32: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 32/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

3

printf("%ld\n", nc);

 } 

2.3.1 funciones de entrada y salida 

Cuando nos referimos a entrada/salida estándar (E/S estándar) queremos decir que los datos obien se están leyendo del teclado, ó bien se están escribiendo en el monitor de video. Como seutilizan muy frecuentemente se consideran como los dispositivos de E/S por default y nonecesitan ser nombrados en las instrucciones de E/S.

En C no existe ninguna palabra clave para realizar la entrada y salida de datos (E/S). Serealizan a través de funciones de biblioteca específicamente stdio.h.

Las funciones principales que realizan la entrada y salida sin formato son:

getchar(): Lee un carácter del teclado, espera hasta que se pulsa una tecla y entoncesdevuelve su valor.

putchar(): Imprime un carácter en la pantalla en la posición actual del cursor.

gets(): Lee una cadena de caracteres introducida por el teclado y la sitúa en una direcciónapuntada por su argumento de tipo puntero a carácter.

puts(): Escribe su argumento de tipo cadena en la pantalla seguida de un carácter de salto delínea.

El siguiente fragmento de código lee un carácter del teclado y lo muestra por pantalla. Acontinuación lee una cadena (de 10 caracteres incluido el carácter nulo) y también la muestrapor pantalla:

Algoritmo:

iniciodeclarar variables

carácter cadena[10]entera i

i← getchar( )putchar( i )escribir ( ‘ Digita una cadena de caracteres ‘)gets (cadena)escribir ( ‘ Imprime la cadena de caracteres ‘ )puts (cadena)pausafin

Programa:

#include <stdio.h>main(){char cadena[10];int i;i=getchar();

 putchar(i); printf(“ Digita una cadena de caracteres \n “);

Page 33: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 33/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

3

gets(cadena); printf(“ Imprime la cadena de caracteres \n”); puts(cadena);getch();}

Las funciones principales que realizan la entrada y salida con formato, es decir, se pueden leer y escribir en distintas formas controladas, son:

printf(): Escribe datos en la consola con el formato especificado.

scanf(): Función de entrada por consola con el formato especificado.

Su sintaxis es la siguiente:

printf (" caracteres de transmisión y escape", lista de argumentos); 

scanf (" caracteres de transmisión y escape", lista de argumentos); 

Ejemplos:

código en C Impresión en pantalla

 printf(“ Hola como estas “);  Hola como estas

int j;j=100;

  printf(“ Tu resultado es: %d “, j ); Tu resultado es: 100

flota y;y=45.45;

 printf(“ El valor %f , corresponde a la variable y ”, y);

El valor 45.45, corresponde a la variable y 

Los caracteres de transmisión son precedidos de un % para distinguirlos de los normales:Caracteres de transmisión y el argumento que transmite:

Caracteres de transmisiónModificador Tipo de dato %c%s

Int: un carácter simpleChar *: una cadena de caracteres

%d %i Int: un número decimal%o octal sin signo%x %X hexadecimal sin signo%u decimal sin signo%f Float o double, en notación fija%e %E Float o double, en notación científica%g %G Float o double en notación científica si el exponente es

menor de diez a la menos cuatro, o fija en caso contrario.

%p escribe el número que corresponde al puntero

%% Escribe un signo de %Tabla 17. Modificador y su argumento

.

Page 34: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 34/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

3

Una l precediendo al tipo (por ejemplo, %l5d) significa que transmitiremos un long int, si, por elcontrario, es una h significa que transmitiremos un short int.

Existe otro tipo de carácter especial, los caracteres de escape, que tienen un significadoespecial. Los caracteres de escape son los siguientes:

Caracteres de escapeCarácter de escape Significado \n\t

Nueva líneaTabulador 

\b Espacio atrás\r Retorno de carro\f Comienzo de página\a Pitido sonoro\¿ Comilla simple\" Comilla doble\\ Barra invertida\xdd Código ASCII en notación hexadecimal

(cada d representa un dígito)\ddd Código ASCII en notación octal (cada d

representa un dígito)

Tabla 18. Caracteres de escape

La lista de argumentos estará separada por comas. Debe existir una correspondencia directivaentre los caracteres de transmisión (aquellos que comienzan con un %) y la lista deargumentos a transmitir.

Cabe destacar una diferencia en la lista de argumentos entre las funciones printf() y scanf().En está ultima función (scanf()), la lista de argumentos va precedida por el operador dedirección(&), puesto que scanf() requiere que los argumentos sean las direcciones de lasvariables, en lugar de ellas mismas.

Ejemplo de printf() con scanf();

Algoritmo:

InicioDeclarar variables

Enteras ent1Enteras ent2Enteras suma

Escribir ( ‘ Introducir el primer número ‘ )Leer ent1escribir ( ‘ Introducir el segundo número ‘ )leer ent2suma ← ent1 + ent2escribir ( ‘ La suma es ‘, suma )pausafin

Programa:ama suma/* Programa suma */ #include <stdio.h>

Page 35: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 35/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

3

int main(){int ent1; /* declaración de variable, es el primer número */ int ent2; /* segundo número a introducir por el usuario */ int suma; /* variable en donde se guardará la suma */ 

  printf(“Introducir el primer número \n”); /* Indicación */ scanf(“%d”,&ent1); /* Lectura de primer entero*/ 

  printf(“Introducir el segundo número \n”); /* Indicación */ scanf(“%d”,&ent2); /* Lectura del segundo entero*/ suma=ent1+ent2; /* Realiza la suma */ 

  printf(“La suma es %d \n”); /* Imprime la suma */ return 0; /* Indica que el programa terminó con éxito*/ getch();}

scanf(“%d”,&ent1);

%d es una cadena de control de formato, en éste caso indica que el usuario introducirá  unentero (int ent1;)

 printf(“La suma es %d \n”, suma);

%d es una cadena de control de formato, en éste caso indica que se imprimirá  el valor numérico de la variable suma

Al declarar las variables enteras ent1, ent2, suma en C, en realidad corresponde a lugares enla memoria de la computadora.

int ent1;

Toda variable en C tiene un nombre , un tipo , y un valor. Cuando la instrucción

scanf(“%d”,&ent1);

se ejecuta el valor escrito por el usuario se colocará en una dirección o localidad de lamemoria donde se le haya asignado a la variable ent1.

2.3.2. Funciones matemáticas 

Para poder usar las funciones matemáticas, se debe usar la biblioteca de funcionesmatemáticas que permite al programador reutilizar ciertos cálculos matemáticos comunes, estaes biblioteca <math.h>.

La biblioteca de matemáticas es relativamente fácil de usar, al igual que las vistas previamente.Se debe incluir la directiva de preprocesamiento #include <math.h>, y entonces se podránutilizar todas las funciones que se encuentren en dicha librería, como las que se enlistaron enlas funciones de biblioteca anteriormente.

Se muestra a continuación una lista de funciones matemáticas. Son fáciles de usar y algunasde ellas han sido ya usadas previamente.

Funciones Matemáticasdouble acos(double x) Calcula el arco coseno de x.

double asin(double x) Calcula el arco seno de x.

double atan(double x) Devuelve el arco tangente en radianes.

Page 36: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 36/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

3

double atan2(double y, doublex)

Calcula el arco tangente de las dosvariables x e y. Es similar a calcular elarco tangente de y / x, excepto en que lossignos de ambos argumentos son usadospara determinar el cuadrante del

resultado.

double ceil(double x) Redondea x hacia arriba al entero máscercano.

double cos(double x) Devuelve el coseno de x, donde x estádado en radianes.

double cosh(double x) Devuelve el coseno hiperbólico de x.

double exp(double x) Devuelve el valor de e (la base de loslogaritmos naturales) elevado a lapotencia x.

double fabs(double x) Devuelve el valor absoluto del número enpunto flotante x.

double floor(double x) Redondea x hacia abajo al entero más

cercano.double fmod(double x, doubley)

Calcula el resto de la división de x entrey. El valor devuelto es x - n * y, donde nes el cociente de x / y.

double frexp(double x, int*exp)

Se emplea para dividir el número x enuna fracción normalizada y un exponenteque se guarda en exp.

long int labs(long int j)double ldexp(double x, int exp)double log(double x);double log10(double x)double modf(double x, double*iptr)

Divide el argumento x en una parteentera y una parte fraccional. La parteentera se guarda en iptr.

double pow(double x, doubley) Devuelve el valor de x elevado a y.double sin(double x)double sinh(double x)double sqrt(double x)double tan(double x)double tanh(double x)

Tabla 19. Funciones Matemáticas

Estas funciones matemáticas, realizan una función específica para lo que fueron creadas y elprogramador no tiene que preocuparse por crear el código para realizar dicha función,únicamente las tiene que utilizar dentro del programa que lo desee.

2.4. Funciones Generadas por el usuarioLa experiencia ha demostrado que la mejor manera de desarrollar y mantener un programagrande es construirlo a partir de piezas o componentes mas pequeños, esta técnica se llamadivide y vencerás. Las funciones son bloques de programa que definen tareas específicas, lascuales pueden utilizarse en diversos puntos del programa, estas funciones es en donde seproduce toda la actividad que realiza un programa.

C fué diseñado como un lenguaje de programación estructurado, también llamadoprogramación modular. Por esta razón, para escribir un programa se divide éste en varios

Page 37: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 37/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

3

módulos, en lugar de uno solo largo. El programa se divide en muchos módulos (rutinaspequeñas llamadas funciones).

Ejemplo de ello se muestra en el esquema siguiente, como los procesos (funciones) estánaparte del programa principal y son llamados por él, en el lugar adecuado. 

PRINCIPAL PROCESO A PROCESO B

Figura 1. Funciones

Una función es un conjunto de líneas de código que realizan una tarea específica y puederetornar un valor. Las funciones pueden tomar parámetros que modifiquen su funcionamiento.Las funciones son utilizadas para descomponer grandes problemas en tareas simples y paraimplementar operaciones que son comúnmente utilizadas durante un programa y de estamanera reducir la cantidad de código. Cuando una función es invocada se le pasa el control ala misma, una vez que esta finalizó con su tarea el control es devuelto al punto desde el cual lafunción fue llamada.

Así pues, un programa en C se compone de varias funciones, cada una de las cuales realizauna tarea principal.

Una función es, sencillamente, un conjunto de sentencias que se pueden llamar desdecualquier parte de un programa. Las funciones permiten al programador un grado deabstracción en la resolución de un problema.

Las funciones en C no se pueden anidar. Esto significa que una función no se puede declarar dentro de otra función. La razón para esto es permitir un acceso muy eficiente a los datos. En Ctodas las funciones son externas o globales, es decir pueden ser llamadas desde cualquier punto del programa.

Si un programa contiene varias funciones, sus definiciones deben aparecer en cualquier orden,pero deben ser independientes unas de otras. Existen dos tipos de funciones: funciones predefinidas (de biblioteca) y las funciones creadaspor el programador. 

Una función se invoca (es decir, se hace que realice la tarea para la que fue creada) medianteuna llamada a la función. La llamada a la función especifica el nombre de la función yproporciona información (como argumentos) que la función invocada necesita para hacer sutrabajo.

Todas las variables definidas dentro de una función, son variables locales que solo se conocendentro de la función en la que se definen, esta comienza a existir cuando se entra a la función yse destruye al salir de ella. Así, las variables locales no pueden conservar sus valores entredistintas llamadas a la función. Los dos puntos importantes para la creación de una funciónson los siguientes: la reutilización de código (ya que la función se puede utilizar cuantas veces

INICIO

FIN

INICIO INICIO

FIN FIN

PROCESO A

PROCESO B

PROCESO A PROCESO B

Page 38: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 38/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

3

sea necesario dentro de un programa y así no escribirla mas de una vez), y la otra es que unprograma se pueda dividir en bloques de sentencias mas simples y pequeñas, para su mejor solución.

Cada función se debe limitar para que realice una tarea sencilla y bien definida, y el nombre de

la función debe expresar de manera efectiva dicha tarea, ya que este tipo de funciones soncreadas dependiendo de la necesidad del usuario sobre un determinado problema. Estopromueve la reutilización de código que es esencial en la programación.

El tipo devuelto por una función, debe ser compatible con el tipo que se espera que devuelvaen la función de llamada, o el compilador dará un warning.

Forma general de una función: 

tipo_dev nombre_de_la_función (lista de parámetros){

Cuerpo de la función}

El tipo_dev especifica el tipo de dato que devuelve la función. Una función puede devolver cualquier tipo de dato excepto un array. El nombre de la función es cualquier identificador válido, la lista de parámetros es una lista de nombres de variables separados por comas consus tipos asociados. Los parámetros reciben los valores de los argumentos cuando se llama ala función. Una función puede no tener parámetros, en cuyo caso la lista de parámetros estávacía y por lo tanto se puede usar la palabra clave void entre los paréntesis.

Por ejemplo, aquí se muestra una declaración de funciones con parámetros correcta ya que acada variable le corresponde un tipo e incorrecta porque a algún parámetro le hace falta su tipoy esto es un error:

void F(float r, int v, flota j); /* correcto */ void F(float t,g, float h); /* incorrecto */ 

Los parámetros de una función también se conocen dentro de ella únicamente, estoscomienzan a existir cuando se entra a la función y se destruyen al salir de ella.

Ejemplos  de funciones sin parámetros  

Algoritmo:

declarar función cuadrado( )inicio

declara variable real res y Nlimpiar pantallaescribir ( ‘ Programa que obtiene mediante una función el cuadrado de un numero ‘)llamar a función cuadrado( )escribir ( ‘ Fin de nuestro programa ‘)pausa

fin

función cuadrado( )inicio

escribir ( ‘ Función Cuadrado ‘)escribir ( ‘ Da el numero a evaluar ‘)leer Nres← N * Nescribir ( ‘ El cuadrado de ‘, N ,’ es: ‘, res)escribir ( ‘ Fin de la Función ‘)

fin_cuadrado

Page 39: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 39/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

3

 Programa:

#include <stdio.h>#include <stdlib.h>#include <conio.h>

void cuadrado( );

void main( ){

float res,N;clrscr( );

 printf(“Programa que obtiene mediante una función el cuadrado deun numero \n “);cuadrado( );

 printf(“ Fin de nuestro programa “);getch( );

}

void cuadrado( ){

 printf(“ \n Función Cuadrado \n “); printf(“ Da el numero a evaluar \n “);scanf(“%f”,&N);res = N * N;

  printf(“ El cuadrado de %f es: %f “, N,res); printf(“ \n Fin de la Función “);

}

El siguiente programa nos muestra a dos funciones sin parámetros, las cuales se mandanllamar dentro del programa principal main( ).

Algoritmo:

declarar función1( )declarar funcion2( )inicio

limpiar pantallaescribir ( ‘ Programa que desarrolla dos funciones ‘)llamar a función1( )llamar a funcion2( )return 0escribir ( ‘ Fin de nuestro programa ‘)pausa

fin

función funcion1( )

inicioescribir ( ‘ Función Uno ‘)escribir ( ‘ La función uno no toma argumentos ‘)escribir ( ‘ Fin de la función uno ‘)

fin_funcion1

función funcion2( )inicio

escribir ( ‘ Función Dos ‘)escribir ( ‘ La función dos tampoco toma argumentos ‘)escribir ( ‘ Fin de la función dos ‘ )

Page 40: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 40/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

4

fin_funcion2

Programa:

#include <stdio.h>#include <stdlib.h>#include <conio.h>

void funcion1( ); /* declaración de una función */ void funcion2( void); /* declaración de una función */ 

int main( ){

clrscr( ); printf(“Programa que desarrolla dos funciones \n “);Funcion1( ); /* llama a la función 1 sin argumentos */ Funcion2( ); /* llama a la función 2 sin argumentos */ 

return 0; /* indica terminación exitosa */  printf(“ Fin de nuestro programa “);

getch( );} /* fin del main */ 

void funcion1( ){

 printf(“ \n Función Uno \n “); printf(“ La función uno no toma argumentos \n “); printf(“ \n Fin de la Función uno “);

}

/* La función dos en su lista de parámetros tiene la palabra void paraespecificar que la función no recibe parámetros */ 

void funcion2(void )

{ printf(“ \n Función Dos \n “); printf(“ La función dos tampoco toma argumentos \n “); printf(“ \n Fin de la Función dos “);

}

En caso de tener una lista de parámetros la función, su forma general sería:

tipo_dev función ( tipo var1, tipo var2, tipo var3, … , tipo varN )

Por ejemplo, a continuación se muestran unos ejemplos de declaraciones correctas eincorrectas de los parámetros de una función:

void f( int i, int l, int m); /* declaraciones correctas */ void f( float g, int h, float y);void f( int k, float u, float k, int r);

void f( int g,h,j ); /* declaraciones incorrectas,cada variable debe */ 

void flota(float f,j,r ); /* tener su propio tipo*/ 

void f( float g,t, int g,h );

Page 41: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 41/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

4

Los parámetros formales tienen que ser del mismo tipo que los argumentos usados al llamar una función (el compilador no dará error pero los resultados serán inesperados).

Al igual que con variables locales, se pueden hacer asignaciones a los parámetros de unafunción o usarlos en cualquier expresión válida. Se pueden usar como cualquier otra variable.

Una función es visible para ella misma y otras funciones desde el momento en que se define.Es visible para el propio cuerpo de la función, es decir, la recursividad esta permitida. Elcódigo de una función es privado a esa función y sólo se puede acceder a él mediante unallamada a esa función. Las variables definidas dentro de una función son locales (a no ser quelas definamos globales) por lo que no conservan su valor de una llamada a otra.

Ámbito de una función: 

El ámbito en un lenguaje son las reglas que controlan si un fragmento de código conoce o tieneacceso a otro fragmento de código o de datos.

El ámbito de una función determina no sólo en qué partes de un programa se puede llamar aesa función, sino también a qué definiciones tiene acceso la función. Las mismas reglas de

ámbito que se aplican a los identificadores de variable se aplican a los identificadores defunción. Una función declarada en el ámbito global estará disponible en todo el código.

Llamada a una función: 

Las funciones son llamadas para su ejecución desde cualquier parte del código, teniendo encuenta que antes deben haber sido declaradas (y por supuesto definidas).

nombre_función (void); // sin parámetros

nombre_función ( m, t); //con parámetros

La llamada de una función se produce mediante el uso de su nombre en una sentencia,

pasando una lista de argumentos que deben coincidir en número y tipo con los especificadosen la declaración (en otro caso se produciría una conversión de tipos o resultadosinesperados). Las llamadas a las funciones solo cambian si estas contiene parámetros o no, sino tienen simplemente se pone la palabra void dentro de los paréntesis y si tienen parámetrosse pone la lista de las variables en cuyo espacio caerá el valor dado en el programa principal.

A continuación se muestra un programa ejemplo, con parámetros.

Ejemplo  de función con parámetros 

Algoritmo:

declarar función haz_algo( entero alas, real pies, entero ojos )inicio

declara variable entera ala ← 10real pie← 100.55entero ojo← 20

limpiar pantallaescribir ( ‘ Programa de dos funciones con parámetros ‘)llamar a función haz_algo( 3, 12.5, 4 )llamar a la función haz_algo ( ala, pie, ojo )escribir ( ‘ Fin de nuestro programa ‘)pausa

fin

Page 42: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 42/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

4

 función haz_algo(entero alas, real pies, entero ojos )inicio

escribir ( ‘ Hay ‘ ala ‘ alas ‘ )escribir ( ‘ Hay ‘ pie ‘ pies ‘ )

escribir ( ‘ Hay ‘ ojo ‘ ojos ‘ )fin_haz_algo

Programa:

#include <conio.h>#include <stdio.h>#include <iostream.h>

void haz_algo (int alas, float pies, int ojos);

void main( ){

int ala = 10;float pie = 100.55;

int ojo = 20;clrscr();

 printf( “ Programa de dos funciones con parámetros \n “)haz_algo (3, 12.5, 4);haz_algo (ala, pie, ojo);

 printf( “ Fin de nuestro programa “);getch();

}

void haz_algo (int alas, float pies, int ojos){

 printf ( " \n Hay %d alas. \n ", alas); printf ( " \n Hay %f pies. \n ", pies); printf ( " \n Hay %d ojos. \n ", ojos);

}

La salida de este programa será:

Hay 3 alas.Hay 12.5 pies.Hay 4 ojos.Hay 10 alas.Hay 100 55 pies.Hay 20 ojos.

2.4.1. Argumentos y Parámetros Formales 

Llamamos parámetros a la lista de argumentos que dentro de una función se encuentranencerrados entre paréntesis ejemplo de ellos es:

float Promedio(int A, int B){

float r;r=(A+B)/2.0;return r;

}

Page 43: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 43/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

4

En donde (int A, int B) es la lista de parámetros que tiene esta función, los cuales son utilizadosdentro de ella para realizar un determinado cálculo, en lenguaje C se contemplan dos formasde pasar argumentos a las subrutinas, esto es pasarle valores a los parámetros que tiene lafunción, tantos parámetros tenga serán los argumentos que se enviarán a la función.

Características de los parámetros:

Representados por variables de un tipo dados

Incluyen información que es válida únicamente dentro de la función

Esta información puede modificarse a nivel local, (dentro de la función). Según el tipo depaso de parámetros la información volverá a tomar el valor con que entró, o el de la últimamodificación.

Existen dos tipos de paso con parámetros:

1.- Por valor: valor que entra es el mismo que con el que sale

2.- Por dirección: si el parámetro es modificado, este tomará el de la últimamodificación.

Los métodos son dos: llamadas por valor y por referencia. En general, se pueden pasar argumentos a las funciones de dos formas, por valor y por referencia.

La llamada por valor copia el valor de un argumento en el parámetro formal de la función. Deesta forma, los cambios en los parámetros de la función no afectan a las variables que se usanen la llamada (es la llamada más usual, es decir, en general no se pueden alterar las variablesusadas para llamar a la función).

La llamada por referencia copia la dirección del argumento en el parámetro. Dentro de la

función se usa la dirección para acceder al argumento usado, significando que los cambioshechos a los parámetros afectan a la variable usada en la llamada.

Ejemplos de función con parámetros:

Sintaxis:

Tipo_Retorno nombre_función (argumentos)

{

Sentencias;

}

Algoritmo:

función entera suma(entero a, entero b )inicio

retorna ( a + b )fin_suma

iniciodeclara variable

entera x← 6

Page 44: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 44/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

4

entero y← 7limpiar pantallaresultado← suma ( 6 , 7 )escribir ( ‘ Resultado: ‘, resultado )escribir ( ‘ Fin de nuestro programa ‘)

return 0pausafin

Programa:

#include  <stdio.h> int suma(int a,int b) { 

return  (a + b); } int  main { 

int  x = 6 ,y = 7; int  resultado; clrscr();

resultado  =   suma(6,7);  printf(" Resultado: %d\n",resultado);

 printf(“ Fin de nuestro programa “);

return  0;getch(); 

Ejemplo de paso por valor:

Algoritmo:

función entera valor_a(entero var_1 )inicio

escribir ( ‘ Valor de la Var_1 : ‘, decremento var_1 )retorna 0

fin_valor_a

iniciodeclara variable

entera var_1← 5limpiar pantallaescribir ( ‘ Valor de var_1 : ‘, var_1 )llamar a función valor_a ( var_1 )escribir ( ‘ Fin de nuestro programa ‘)return 0pausa

fin

Programa:

#include  <stdio.h> int valor_a (int var_1) { 

 printf(“ Valor de a Var_1 : %d \n “,--

var_1);

return 0; } int  main (void) 

Page 45: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 45/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

4

{ int var_1 = 5;clrscr(); printf(“ Valor de a Var_1 : %d \n “,var_1);

valor_a(var_1); 

 printf( “ Fin de nuestro programa “);

return  0; } 

El valor que debe devolver una función se indica con la palabra return. La evaluación de laexpresión debe dar una valor del mismo tipo de dato que el que se ha definido como resultado.La declaración de una variable puede incluir una inicialización en la misma declaración.

Se debe tener muy en cuenta que en C todos los argumentos son pasados 'por valor'. No existeel concepto de paso de parámetros 'por variable' o 'por referencia'. Veamos un ejemplo:

Algoritmo de la función:

función entera incremento (entero v )inicio

retorna ( v + 1 )fin_incremento

iniciodeclara variable

entera a , blimpiar pantallab← 3a← incremento ( b )/ * a = 4 mientras que b = 3 por lo tanto ‘b’ no ha cambiado su valor después de la llamadaa la función * /pausa

fin

Programa de la función:int incremento ( int v )

{ return v + 1; }

main (void )

{

int a, b;

clrscr();

b = 3;

a = incremento(b);

/* a = 4 mientras que b = 3 por lo tanto ‘b’ no ha cambiado su valor después de la llamada a la función */  

getch();

}

En el ejemplo anterior el valor del parámetro de la función incremento, aunque se modifiquedentro de la función, no cambia el valor de la variable b de la función main. Todo el textocomprendido entre los caracteres /* y */ son comentarios al programa y son ignorados por elcompilador.

Page 46: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 46/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

4

 Si quisiéramos modificar el valor de los argumentos sería necesario pasar como argumento sudirección de memoria esto se haría utilizando punteros. A esto se le llama paso de parámetrospor referencia.

2.4.2. Funciones con y sin argumentos 

Las funciones que no tienen dentro de los paréntesis del nombre de la función ningúnparámetro (variable), se dice que son funciones sin argumentos, por lo tanto este tipo defunciones no devuelve ningún valor al programa principal, esto es; el programa principal norecibe ningún resultado para mostrarlo en su ejecución.

Entonces los programas que tienen funciones que no tienen argumentos, solo realizan suslíneas y al momento de mandar llamar a la función realizan todo lo que este dentro de lafunción, después devuelven el mando al programa principal y este continúa con sus propiaslíneas, un ejemplo de un programa con una función que no tienen argumentos, sería algo comolo siguiente:

Algoritmo:

Declarar función hola( )inicio

limpiar pantallaescribir ( ‘ Que tal… ‘ )llamar a la función hola( )pausa

fin

función hola ( )inicio

escribir ( ‘ Hola a todos, este es un ejemplo de mensaje de una función ‘ )escribir ( ‘ Hasta pronto amigos ‘ )

fin_hola

Programa:

#include<stdio.h>#include<conio.h>void hola(); /* Declaración de la función hola() */ 

void main( ){

clrscr(); printf(“ Que tal… \n “);hola();getch();

}

void hola() /* No existen parámetros dentro de los paréntesis delnombre de la función */ 

{  printf(“ Hola a todos, este es un ejemplo de mensaje de unafunción \n “); printf(“ Hasta pronto amigos “);

}

Al correr el siguiente programa se vería como sigue:

Page 47: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 47/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

4

Que tal…Hola a todos, este es un ejemplo de mensaje de una funciónHasta pronto amigos

Otro ejemplo de funciones sin argumentos, es el siguiente programa; que calcula la diferencia

en minutos entre dos horas distintas dadas desde el teclado por el usuario. La función se llamaminutos(), si observan dentro de los paréntesis no va ningún tipo de parámetros, esto la haceuna función sin argumentos que no devuelve al compilador ningún valor, para despuésmostrarlo, acepta el tiempo que el usuario introduce en horas y minutos y lo convierte aminutos, devolviendo este valor en un tipo entero. La función presenta la particularidad de notener argumentos.

Ejemplo Algoritmo:

Declarar función minutos( )inicio

limpiar pantalladeclarar variables

enteras minutos1, minutos2

escribir ( ‘ Escribe la primer hora (formato 3:22): ‘ )minutos1← minutos( )escribir ( ‘ Escribe la segunda hora (posterior): ‘ )minutos2← minutos( )escribir ( ‘ La diferencia es ‘, minutos2 – minutos1 , ‘ minutos ‘ )pausa

fin

función entera minutos ( )inicio

declarar variablesenteras horas, mins

escribir ( ‘ Da las horas y los minutos ‘ )leer ( horas , mins )

return ( horas * 60 + mins )fin_minutos

Programa:

/* Programa que calcula la diferencia entre dos horas distintas */ #include <stdio.h>int minutos(void);void main(void){clrscr();int minutos1, minutos2;

 printf("Escribe la primera hora (formato 3:22): ");minutos1=minutos(); /* obtiene los minutos */ 

 printf("Escribe la segunda hora (posterior): ");minutos2=minutos(); /* obtiene los minutos*/ 

 printf("La diferencia es %d minutos.\n", minutos2-minutos1);getch();

}

int minutos(void){int horas, mins;

 printf(“Da las horas y los minutos \n “);scanf("%d:%d", &horas, &mins);

Page 48: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 48/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

4

return (horas*60+mins);}

La función return, le sirve al compilador para regresar al comando principal del programa laoperación ahí expuesta, en este ejemplo devolverá al programa principal la operación queresulta de (horas*60+mins)

Por otro lado las funciones con argumentos son aquellas que dentro del paréntesis si tienenvalores o variables, las cuales se usan dentro de cada función para realizar algo, y despuésdevolverlo al programa principal par mostrarlo.

En C todos los argumentos que se pasan a una función se pasan por valor. En otras palabras,se pasa una copia del valor del argumento y no el argumento en sí (por ello, este procedimientose conoce en algunas ocasiones como paso por copia ). Al pasar una copia del argumentooriginal a la función, cualquier modificación que se realice sobre esta copia no tendrá efectosobre el argumento original utilizado en la llamada de la función. Se puede considerar unargumento pasado por valor como una variable local de la función a la que se ha pasado, de talmodo que los cambios que se realicen sobre ésta tendrán efecto sólo dentro de la función.

Supongamos que en un determinado programa debemos calcular repetidamente el valor mediode dos variables, una solución razonable sería crear una función que realice dicho cálculo, yllamarla cada vez que se necesite. Para ello será necesario, en cada llamada, pasarle losvalores de las variables para que calcule su valor medio. Esto se define en la declaración de lafunción especificando, no solo su valor de retorno sino también el tipo de argumentos querecibe:

double valor_medio(double x, double y) ;

De esta declaración vemos que la función valor_medio recibe dos argumentos ( x e y ) del tipodouble, por lo tanto devuelve un resultado de ese mismo tipo .

Cuando definamos a la función en sí, deberemos incluir parámetros para que alberguen losvalores recibidos, así escribiremos:

double valor_medio(double x, double y ){return ( (x + y) / 2.0 )}

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, sinembargo es una buena costumbre mantenerlos igual. En realidad en la declaración de lafunció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.Por ejemplo, en la creación de la función se puede poner de estas dos maneras y es totalmentecorrecto:

double valor_medio(double x, double y) ó

double valor_medio(double, double)

Sin embargo es preferible utilizar la nomenclatura moderna, ya que esta facilita la rápidacomprensión del programa.Veamos un ejemplo, para determinar el comportamiento de los parámetros, supongamosdesear un programa que calcule el valor medio de dos variables incrementadas en un valor fijo,es decir:

Page 49: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 49/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

4

( ( x + incremento ) + ( y + incremento ) ) / 2.0

Lo podríamos resolver de la siguiente forma :

Algoritmo:

declarar función double valor_medio(double p_valor, double s_valor, double inc )inicio

limpiar pantalladeclarar variables

double x, y, zescribir ( ‘ Ingresa el primer valor ‘ )lee xescribir ( ‘ Ingresa el segundo valor ‘ )leer yescribir ( ‘ ingresa el incrementeo ‘ )leer zllamar a la función valor_medio ( x, y. z )escribir ( ‘ Valor con que quedaron las variables ‘ )

escribir ( ‘ Primer valor: ‘ , x )escribir ( ‘ Segundo valor: ‘ y )escribir ( ‘ Incremento: ‘, z )pausa

fin

función double valor_medio (double p_valor, double s_valor, double inc )iniciodeclarar variable

double resultadop_valor ← p_valor + incs_valor ← s_valor + incres← (p_valor + s_valor ) / 2.0escribir ( ‘ Tu resultado del valor medio es: ‘, res )

fin_valor_medio

Programa:

#include <stdio.h>

/* Declaración de la función y el tipo de sus parámetros */ double valor_medio(double p_valor, double s_valor, double inc);

void main(){clrscr();double x, y, z;

 printf(”Ingrese el primer valor: “) ;scanf(”% lf”, &x ) ;

 printf(”\n Ingrese el segundo valor: “);scanf(”% lf”, &y ) ;

  printf(”\n Ingrese el incremento : “);scanf(”% lf”, &z) ;valor_medio( x, y, z ); /* llamada a la función y 

  pasaje de argumentos */  printf(”\n\n Valor con que quedaron las variables: “) ;

Page 50: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 50/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

5

 printf(”\n Primer valor : %lf “, x ) ; printf(”\n Segundo valor: %lf “, y ) ; printf(”\n Incremento : %lf “, z ) ;getch();}

/* Definición de la función y sus parámetros */ double valor_medio( double p_valor, double s_valor, double inc ){double resultado;

  p_valor += inc;s_valor += inc;resultado =( (p_valor + s_valor ) / 2.0 );

 printf(“ Tu resultado del valor medio es: %lf “, resultado);} 

Cabe destacar que el resultado de esta función esta dado dentro de la misma, en la función sevan los valores dados desde el teclado, en ella se evalúan y se despliega el valor ahí mismo,por lo tanto al mandar llamarla, desglosa todo y luego el programa principal continúadesglosando los valores individuales de las variables.

2.4.3. Funciones que regresan valores 

La función en si misma es llamada definición de la función y generalmente contiene unpequeño programa. La primera línea de la definición de la función se llama encabezado de lafunción y es idéntico al prototipo de la función con la diferencia que no termina con ; El cuerpode la función se encierra entre llaves { }.

Su sintaxis dentro de lenguaje C es la siguiente:

Tipo_dato nombre_función(argumento formal 1, argumento formal 2, ...argumento N );

La especificación del tipo de valor devuelto por la función, seguido del nombre de la función y(opcionalmente) un conjunto de argumentos, separados por comas y cerrados entre paréntesisy punto y coma al final del prototipo. Después del nombre de la función deben seguir un par deparéntesis vacíos si la definición de la función no incluye ningún argumento con o sin la palabravoid . El estándar ANSI C permite que el tipo de datos de cada argumento sea seguido delnombre del argumento dentro de la declaración de la función, es decir, tipo_dato nombre_función (tipo1 arg1, tipo2 arg2, ... , tipoN argN); en donde arg1, .., argN  hacenreferencia al primer argumento, al segundo , etc. Las declaraciones de funciones escritas deestá forma se llaman prototipos de funciones .

Después del encabezado y de abrir la llave de inicio se deberán declarar las variables locales.La función termina con la sentencia return(0) que marca el final de la función. Cuando lafunción termina el control del programa retorna a la función main a el mismo lugar donde fuellamada la función. La definición de la función se define después de cerrar la llave del main . Lasentencia return también hace que se devuelva el control al punto de llamada.

Sólo se puede incluir una expresión (variable u operación) en la sentencia return . Por lo tanto,una función sólo puede devolver un valor al punto de llamada mediante la sentencia return .Una definición de función puede incluir varias sentencias return, conteniendo cada una de ellasuna expresión distinta. Las funciones que incluyen varias bifurcaciones suelen requerir variassentencias return . La sentencia return puede no incluirse en la definición de una función,aunque esto se considera generalmente como una programación pobre. Si una función alcanzael final del bloque sin encontrarse una sentencia return , se devuelve el control al punto dellamada sin devolverse ninguna información. Se recomienda utilizar en estos casos unasentencia return vacía. Cuando una función no va a regresar ningún valor se antecede la

Page 51: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 51/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

5

palabra void  al nombre de la función, pero si esta si va a devolver un valor, entonces seantecede la palabra del tipo de dato que devolverá ejemplo (int, float, double).

La función se realiza en el momento en que desde el programa principal se hace referencia asu nombre, o dicho en otras palabras, en el momento en que se llama la función. Hay dos

formas de llamar una función. Escribiendo su nombre como una instrucción (esto es parafunciones sencillas que no regresan valor). Otra forma es escribiendo su nombre y la lista deparámetros (para funciones complejas con parámetros). El llamado de la función se puedehacer en cualquier momento, en cualquier posición dentro de nuestro programa. Se puedellamar a una función especificando su nombre, seguido de una lista de argumentos cerradosentre paréntesis y separados por comas. Si la llamada a la función no requiere ningúnargumento, se debe escribir a continuación del nombre de la función un par de paréntesisvacíos. La llamada a la función puede aparecer sola, o puede ser uno de los operandos de unaexpresión más compleja.

Ejemplos de funciones que regresan valores al comando principal del programa serían:

Algoritmo que obtiene el cubo de un número dado desde el teclado:

declarar variables globales

flotantes res, numflotante cubo ( entero x )

inicioescribir ( ‘ Ingrese un número ‘ )leer ( num )res← cubo ( num )escribir ( num , ‘ al cubo es: ‘ , res )return 0;

finfunction flotante cubo( entera x )inicio

return x*x*xfin_cubo

Programa:

#include<stdio.h>float num;float res, cubo(int x);

main(){

 printf("ingrese un número ");

scanf("%f",&num);res = cubo(num); printf("%f al cubo es: %f " ,num, res);return 0;}

float cubo(int x){return x*x*x;}

Otro ejemplo de una función que regresa un valor al programa principal, es la siguiente de lapotencia de un número dando desde el teclado, la base y la potencia a la cual se quiere elevar.

Page 52: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 52/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

5

Algoritmo:

declarar variables globales

enteras b, e

flotante potencia ( entero m, entero n )

inicioescribir ( ‘ INGRESE DOS NUMEROS.. ‘ )leer ( b , e )escribir ( potencia ( b , e ) )pausa

fin

function flotante potencia ( entera m, entera n )inicio

declarar variablesentera iflotante yy ← 1desde i = 1 hasta i < = n incremento 1 hacer y ← y * mreturn y

fin_cubo

Programa:

#include<stdio.h>#include <math.h>int b, e;

float potencia(int m, int n);

main(void){

  printf(" INGRESE DOS NÚMEROS.. ");scanf("%d %d",&b,&e);

 printf("%f",potencia(b, e));getch();}

float potencia(int m, int n){int i;float y;y=1;for(i=1;i<=n;i++)

y=y*m;

return y;}

Si se observa muy bien el programa anterior, notará que la función potencia recibe dosparámetros (m y n), pero solo devuelve al programa principal un valor de retorno (y), que es elque se muestra en el segundo printf del programa principal main().

Page 53: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 53/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

5

El siguiente ejemplo no regresa un valor al programa principal, sino solamente imprime enpantalla los valores de área y longitud, al llamar a la función circulo ().

Algoritmo:

declarar variables globales

entera r función circulo ( entero m )

iniciolimpiar pantallaescribir ( ‘ INGRESE EL VALOR DEL RADIO.. ‘ )leer ( r )llamar a función circulo ( r )pausa

fin

function circulo ( entera m )

iniciodeclarar variablesflotante pi

pi← 3.1416escribir ( ‘ AREA: ‘ , pi * m * m )escirbir ( ‘ LONGITUD: ‘ , 2 * pi * m )

fin_cubo

Programa:

#include<stdio.h>int r;void circulo(int m);

main(void){clrscr();

  printf(" INGRESE EL VALOR DEL RADIO.. ");scanf("%d",&r);circulo(r); // llamada a un procedimientogetch();}

void circulo(int m) // procedimiento{

float pi; pi=3.1416;

 printf("AREA: %f \n ", pi*m*m); printf("LONGITUD: %f ", 2*pi*m);}

El siguiente programa que tiene la función intercambio( ), muestra los valores dentro de lafunción, cuando ésta es mandada a llamar por el programa principal.

La función contiene dos parámetros (x, y); que toman los valores que se ingresan en elprograma principal como (a,b), para procesarlos dentro de la función e intercambiar susvalores, luego entonces ser mostrados en el printf de la función.

Page 54: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 54/139

UNIDAD II FUNDAMENTOS DE PROGRAMACIÓN ESTRUCTURADA

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

5

Algoritmo:

declarar función

intercambio ( entera x, entera y )

declarar variables globales

enteras temp, a , b

iniciolimpiar pantallaescribir ( ‘ Ingrese a: ‘ )leer ( a )escribir ( ‘ Ingrese b: ‘ )leer ( b )llamar a la función intercambio ( a , b )pausa

fin

function intercambio ( entera x, entera y )inicio

temp← xx← yy← tempescribir ( ‘ Nuevos valores de a: ‘ , x , ‘ y b: ‘ , y )

fin_intercambio

Programa:

#include<stdio.h>void intercambio(int x,int y);

int temp,a,b;

main(void){clrscr();

 printf("ingrese a: ");scanf("%d",&a);

 printf("ingrese b: ");scanf("%d",&b);intercambio(a,b);getch();}

void intercambio(int x, int y)

{temp = x;x = y;y = temp;

 printf(" Nuevos valores de a:=%d y b:=%d",x,y);}

Page 55: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 55/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

5

3.1. Estructuras de Decisión

Control de Flujo 

Las sentencias estudiadas hasta ahora son ejecutadas una tras otra. El control de flujo de un

lenguaje especifica el orden en el que se ejecuta cada sentencia. Las sentencias para controlar el flujo que podemos encontrar son:

Estructuras de decisión o selección Estructuras de repetición

En C el carácter (;) representa el fin de una instrucción y se puede agrupar un grupo desentencias utilizando las llaves ({ }) y formar lo que se conoce como una instruccióncompuesta.

Las estructuras de decisión, como su nombre lo indica, son estructuras que se usan en casotal de que un algoritmo tenga alguna pregunta o tenga que decidir sobre una operacióncualquiera.

Para realizar las condiciones, se debe repasar los operadores relacionales: igual (=), mayor que (>), menor que (<), mayor igual que (> =), menor igual que (<=) y diferente (<>) o (!=).Las condiciones se pueden realizar de la siguiente manera:

variable contra variable:si (salario = salario_neto) entonces

variable contra constante:si (salario > 5´000.000) entonces

constante contra variable:si (500.000 < salario_neto) entonces

variable contra cálculo:

si (salario >= salario+aumento) entonces

cálculo contra variable:si (salario–aumento <= salario_neto) entonces

constante contra cálculo:si (450.000 != salario - dismin) entonces

Las estructuras de decisión permiten seleccionar la próxima sentencia a ejecutarse sobre labase de una decisión (expresión lógica o variable lógica), los tipos de estructuras de decisiónque podemos encontrar son:

Simple Ramificada

Las sentencias de decisión o también llamadas de control de flujo son estructuras de controlque realizan una pregunta la cual retorna verdadero o falso (evalúa una condición) y seleccionala siguiente instrucción a ejecutar dependiendo la respuesta o resultado.

Estas sentencias de decisión en lenguaje C, son conocidas como ciclo if (simple y anidado) yciclo switch (simple y anidado), las cuales se abordarán un poco más adelante.

Page 56: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 56/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

5

3.1.1. Simple 

En algún momento dentro de nuestros algoritmos, es preciso cambiar el flujo de ejecución delas instrucciones, es decir, el orden en que las instrucciones son ejecutadas. Muchas de lasveces tenemos que tomar una decisión en cuanto a que se debe ejecutar basándonos en una

respuesta de verdadero o falso (condicional). La ejecución de las instrucciones, incluyendouna estructura de control como el condicional funcionan de esta manera:

Las estructuras de control simple es cuando sólo se requiere de una sola estructura o una solapregunta. Su sintaxis es la palabra Si, seguida de una pregunta o condición (la cual vaencerrada en medio de paréntesis), y por último si la condición es verdadera se ejecuta lasiguiente sentencia que se encuentra después de la condición, o se ejecuta el bloque desentencias que se encuentran después de la condición, siempre y cuando estén encerradasentre llaves. Sabemos que un bloque de sentencias forzosamente están encerradas entrellaves, y estas se ejecutan juntas dentro de un ciclo condicional, así como todo algoritmo tienesu fin, todas las estructuras de decisión terminan o tiene su fin, con la llave final del bloque desentencias.

Estructura de Selección if simple 

En medio de la estructura, solo se colocan las instrucciones, cálculos u operaciones que sedeban desarrollar cuando la pregunta sea verdadera. Las demás operaciones van fuera de laestructura de decisión. Las instrucciones o cálculos se deben colocar un poco corridos hacia laderecha para identificar perfectamente donde empieza la estructura y donde termina, esto solopara darle vista y entendimiento a nuestro programa.

Las instrucciones comienzan a ejecutarse de forma secuencial (en orden) y cuando se llega auna estructura condicional, la cual esta asociada a una condición, se decide que camino tomar dependiendo siempre del resultado de la condición siendo esta falsa o verdadera.

Cuando se termina de ejecutar este bloque de instrucciones se reanuda la ejecución en lainstrucción siguiente a la de la condicional.

Por lo tanto una estructura de decisión simple es una condición, esta estructura evalúa lacondición, luego: Si la condición es cierta entonces ejecuta el conjunto de sentencias definidasentre las llaves de dicha sentencia. Si la condición es falsa entonces no ejecuta el conjunto desentencias definidas dentro de las llaves y entonces se salta todo el bloque y continúa en lasiguiente instrucción inmediata de donde termina el ciclo condicional.

Veremos la sintaxis del ciclo if dentro del lenguaje C.

si (condición) entoncessentencia

si (condición) entonces{

sentencias}

En el caso de la sintaxis anterior la diferencia entre ambas es el número de sentencias que seencuentra en el bloque de instrucciones, en la primera solo hay una sentencia por lo tanto, nohay necesidad de utilizar llaves que representan un bloque de instrucciones, y en la segundahay mas de una instrucción por lo cual se requiere del uso de llaves, ya que sin ellas leestaremos diciendo al compilador que bajo esa condición solo realice una instrucción, y si hayun bloque de instrucciones se le indica al compilador que bajo esa condición realice todo lo quese encuentra entre llaves.

Page 57: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 57/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

5

Por lo tanto, llamamos sentencias a un bloque de instrucciones en el cual se pueden introducir operaciones, cálculos, escritura y lectura de variables, etc. También pueden incluir condiciones,que entonces se les llamarían ciclos anidados, los cuales más adelante se verán a detalle.

Una de las estructuras más simples del ciclo if es la siguiente:

si (condición)sentencia

if (condición)

sentencia

Ejemplos del ciclo de selección if simple

if (x>0.0) printf(“x es positivo \n”);

if (a<b){b+=a;}

Nota: Observe que cuando hay una sola instrucción a ejecutarse dentro del if, las llaves son opcionales .

Diagrama de flujo de la condición if simple

Figura 2. Diagrama de flujo ciclo if simple

Algoritmo:

si (x > 0.0) entoncesescribir ( ‘ x es positivo ‘ )

fin_si

si (a<b) entoncesb← b + a

fin_si

Cuando hay dos o más sentencias asociadas al if van encerradas entre llaves { }, como en elejemplo siguiente:

Segmento de Programa:

Sicondición

acciones

falso

cierto

Page 58: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 58/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

5

if (nota > 15){

eliminado++; printf(“Estudiante eliminado \n”);

}

Algoritmo:

si (nota > 15) entonceseliminado← eliminado + 1escribir ( ‘ Estudiante eliminado ‘ )

fin_si

Otro ejemplo simple del ciclo if 

if (x >= 0.0){

y += x;cont++;

}

Algoritmo:

si ( x > 0.0 ) entoncesy← y + xcont← cont + 1

fin_si

Ejemplo en el que se piden tres números desde el teclado y el programa nos diga si la suma dedos de ellos; es igual al tercero de ellos, si se dieran estos números 5 3 2 el programa daríaiguales, ya que la suma de dos de ellos (3 2) nos dan el tercero, si se dieran estos números 62 1 el programa daría distintos.

Algoritmo:

iniciodeclarar variables

enteras A, B, Cescribir ( ‘ Introduzca tres números enteros ‘ )leer A, B, Csi ( A + B = C ) entonces

escribir ( ‘ Iguales ‘ )fin_sisi ( A + C = B ) entonces

printf( ‘ Iguales ‘ )fin_sisi ( B + C = A ) entonces

escribir ( ‘ Iguales ‘ )

fin_sisi ((A + B != C) && (A + C != B) && (B + C != A)) entonces

escribir ( ‘ Distintos ‘ )fin_sipausafin

Programa:

#include <stdio.h>#include <conio.h>

Page 59: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 59/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

5

 int main (){int A, B, C;

 printf(“Introduzca tres números enteros\n”);scanf(“%i %i %i”, &A, &B, &C);if (A + B == C) printf(“Iguales”);

if (A + C == B) printf(“Iguales”);

if (B + C == A) printf(“Iguales”);

if ((A + B != C) && (A + C != B) && (B + C != A)) printf(“Distintos”);

return 0;getch();}

Otros ejemplos de estructura de selección if simple serian:

Algoritmo:

Iniciodeclarar variables

enteras edadlimpiar pantallaescribir ( ‘ ¿Qué edad tienes? ‘ ) 

leer edad 

si ( edad > 20 ) entoncesescribir ( ‘ Eres mayor de edad ‘ )

fin_sipausafin

Programa: 

#include <iostream.h>#include <stdio.h>

void main() 

{int edad;clrscr();

 printf("¿Qué edad tienes? \n"); 

scanf(“%d”,&edad); if ( edad > 20 )

 printf("Eres mayor de edad");getch();

}

En el caso que sigue se muestra una modificación del ciclo if, teniendo ahora más de unalínea.

Algoritmo:

iniciodeclarar variables

enteras edadlimpiar pantalla

Page 60: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 60/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

6

escribir ( ‘ ¿Qué edad tienes? ‘ ) 

leer edad 

si ( edad > 20 ) entoncesescribir ( ‘ Eres mayor de edad ‘ )escribir ( ‘ Te estas volviendo viejo ‘ )

fin_sipausafin

Programa:

#include <iostream.h>#include <stdio.h>

void main(){int edad;clrscr();

 printf("¿Qué edad tienes? \n"); 

sacnf(“%d”,&edad); if ( edad > 20 )

{ printf("Eres mayor de edad"); printf("Te estas volviendo viejo ");}

getch();}

La diferencia entre estos dos programas se situa dentro del ciclo “ if “, cuando este tiene unasentencia y cuando tiene dos o más, que es cuando se abren y cierran llaves.

Estructura de Selección if – else 

Ahora veremos el ciclo if – else, que es agregar una sentencia de (en caso contrario), o partefalsa de la sentencia.

La estructura if / else lo que hace es ejecutar una acción si el resultado de la evaluación de laexpresión es verdadera y otra acción si el resultado de la evaluación es falsa.

La diferencia con utilizar sólo la estructura if es que si la expresión evaluada es verdadera sóloen ese caso se ejecuta una acción de otro modo se pasa de largo. En cambio en la estructura if / else si la expresión es falsa entonces se ejecuta otra acción.

En síntesis lo que hace esta estructura es realizar una acción si la expresión es verdadera yotra si es falsa.

Su sintaxis sería:

if (condición){

Serie de sentencias 1 //parte verdadera}else{

Serie de sentencias 2 //parte falsa}

Page 61: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 61/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

6

Que se lee, si la condición es verdadera realiza (la serie de sentencias 1), pero si la condiciónfuera falsa; entonces, realiza (la serie de sentencias 2).

La estructura condicional if...else es la que nos elegir entre dos caminos dependiendo de lacondición. Traducida literalmente del inglés, se la podría llamar la estructura "si...si no", es

decir, "si se cumple la condición, haz esto, y si no, haz esto otro".Aquí se muestra un segmento de programa con el ciclo if – else, muy sencillo para poder entender esta definición y su sintaxis.

Algoritmo:

declarar variablesenteras edad

escribir ( ‘ Dame tu edad por favor ‘ ) 

leer ( edad ) 

si ( edad < 18 ) entoncesescribir ( ‘ no puedes acceder, eres menor de edad ‘ )

si_noescribir ( ‘ Bienvenido acceso permitido ‘ )

fin_si

Programa:

int edad; printf(“ Dame tu edad por favor \n”);scanf(“%d”, &edad);if  (edad <  18)  printf("No puedes acceder, eres menor de edad \n"); 

else  printf("Bienvenido acceso permitido \n");  

Esta estructura de toma de decisión tiene un diagrama de flujo como el siguiente:

Diagrama de flujo ciclo if-else

Figura 3. Ciclo if-else

Aquí tenemos un ejemplo para ilustrar la estructura if / else.

INICIO

FIN

LEER N

N = 1 PROCESO BPROCESO A

SALIDA

SINO

Page 62: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 62/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

6

Algoritmo:

Iniciolimpiar pantalladeclarar variables

entera edadif ( edad > 20 ) entoncesescribir ( ‘ Eres mayor de edad ‘ )

elseescribir ( ‘ No eres mayor de edad ´)

fin_sipausa

fin

Programa:

#include <stdio.h>#include <conio.h>

void main(){int edad;clrscr();if ( edad > 20 )

 printf("Eres mayor de edad");else

 printf("No eres mayor de edad");getch();} 

El cual tendría un diagrama de flujo como el siguiente:

Diagrama de flujo if - else

Figura 4. Diagrama if - else

El anterior diagrama de flujo funciona de la siguiente manera: 

1. Si Edad es mayor que 20 (verdadero) entonces se muestra: “Eres mayor de edad”. 

2. Si no (falso) entonces se muestra: “No eres mayor de edad”.

Edad > 20 printf ("Eres mayor deedad");

printf ("No eres mayor deedad");

verdaderofalso

Page 63: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 63/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

6

A continuación se verá otro ejemplo con if – else que nos proporciona de dos números cual esel menor, observe que el tipo de variables utilizadas son de tipo float, por lo tanto al leer lasvariables pedidas desde el teclado; el modificador que se usa es ( %f ) respectivamente, y por último al imprimir el valor de menor dentro de la comillas se incluye el modificador nuevamente( %f ), para en ese preciso lugar imprimir el resultado de la variable ( menor ), que se encuentra

después de las comillas.

Algoritmo:

iniciodeclarar variables

flotantes a, b, menor limpiar pantallamenor ← 0.0escribir ( ‘ Dame el valor para a: ‘ )leer ( a )escribir ( ‘ Dame el valor para b ‘ )leer ( b )si ( a >b ) entonces

escribir ( ‘ a es el numero menor ‘ )menor ← asi_no

escribir ( ‘ b es el numero menor ‘ )menor ← b

fin_siescribir ( ‘ Tu valor menor es el siguiente: ‘ , menor )pausa

fin

Programa:

#include <stdio.h>#include <conio.h>

void main(){float a,b,menor;clrscr();menor=0.0;

 printf(“ Dame el valor para a : \n”);scanf(“%f”, &a);

 printf(“ Dame el valor para b : \n”);scanf(“%f”, &b);

if ( a > b ){

 printf(" a es el número menor ");menor=a;

}else{

 printf(" b es el número menor ");menor=b;

} printf(“ Tu valor menor es el siguiente: \t %f “, menor);getch();}

Page 64: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 64/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

6

El siguiente ejemplo transforma una cantidad dada a pesetas o a euros, dando como un valor constante de 166.7 a PTS_POR_EURO, que se declara al inicio.

Algoritmo:

declarar constante PTS_POR_EURO 166.7iniciodeclarar variables

flotantes CantidadOriginal, CantidadConvertidacarácter PtsOEuros

limpiar pantallaescribir ( ‘ Introduce P si quieres convetir pesetas ‘ )escribir ( ‘ o E si quieres convertir euros ‘ )PtsOEuros← getchar( )PtsOEuros← toupper ( PtsOEuros )si (PtsOEuros = ‘E’ ) entonces

escribir ( ‘ cuantos Euros ?‘ )si_no

escribir ( ‘ cuantas pesetas ? ‘ )leer ( CantiodadOriginal )

si (PtsOEuros = ‘P’ ) entoncesescribir ( ‘ Son ‘ , CantidadConvertida , ‘ pesetas ‘ )

si_noescribir ( ‘ Son ‘ , CantidadConvertida , ‘ Euros ‘ )

pausafin

Programa:

#define PTS_POR_EURO 166.7

void main(){

float CantidadOriginal, CantidadConvertida;char PtsOEuros;/* Pide al usuario que elija si convertir pesetas o euros*/ Clrscr();

 printf("Introduce P si quieres convertir pesetas, "); printf(" o E si quieres convertir euros:");

PtsOEuros=getchar(); /* Espera a que introduzca un caracter */ PtsOEuros=toupper(PtsOEuros); /* Pasa a mayusculas el caracter*/ /* El mensaje que muestra depende de PtsOEuros */ if (PtsOEuros=='E')

 printf("Cuantos euros ? ")else

 printf("Cuantas Pesetas ? ");

scanf("%f", &CantidadOriginal); /* Lee la suma a convertir */ 

if (PtsOEuros=='E') /* el cálculo depende de PtsOEuros */ CantidadConvertida = CantidadOriginal*PTS_POR_EURO;

elseCantidadConvertida= CantidadOriginal/PTS_POR_EURO;

if (PtsOEuros == 'P') /* El mensaje depende de PtsOEuros */ /* muestra el resultado con 3 decimales */ 

 printf("Son %.3f pesetas\n ", CantidadConvertida);

Page 65: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 65/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

6

else printf("Son %.3f Euros\n ", CantidadConvertida);

getch();}

Estructura de Selección switch simple 

El switch es una estructura de decisión múltiple, que permite elegir ejecutar diferentes códigosdependiendo de un valor.

En forma ocasional, un algoritmo tendrá una serie de decisiones, en las cuales una variable oexpresión se probará por separado contra cada uno de los valores (constantes enteros) quepueda asumir, y se tomarán diferentes acciones. Para esta forma de toma de decisiones seproporciona una estructura de selección múltiple switch..case . La estructura switch  estáformada de una serie de etiquetas case, y de un caso opcional default. 

Estructura general:

switch (variable)

{ case valor1: sentencia1;sentenciaN;break;

case valor2: sentencia1;sentenciaN;break;

case valorN: sentencia1;sentenciaN;break;

default: sentencia1;sentenciaN;break;

};

La variable a evaluar en la sentencia switch debe ser de tipo int o char únicamente. La palabrareservada switch  es seguida por el nombre de la variable entre paréntesis. Esto se conocecomo la expresión de control. Después de esta expresión se abre una llave { para el inicio delos cases. El valor de esta expresión es comparado con cada una de las etiquetas case. Si ocurre unacoincidencia, se ejecutaran la sentencias correspondientes a dicho case , y de inmediatomediante el enunciado break se sale de la estructura switch. El enunciado break causa que elcontrol del programa continúe con el primer enunciado que sigue después de la estructuraswitch.

Se utiliza el enunciado break, porque de lo contrario los cases en un enunciado switch seejecutarían juntos. Si en alguna parte de la estructura case no se utiliza break, entonces, cadavez que ocurre una coincidencia en la estructura se ejecutarían todos los enunciados de los

cases restantes. Si no existe coincidencia, el caso default es ejecutado y se imprime por logeneral un mensaje de error. Después de terminar con la sentencia de la expresión default secierra la llave } del switch. La expresión default es opcional.

Cada case puede tener una o mas sentencias. La estructura switch es diferente a todas lasdemás estructuras, en el sentido de que no se requieren llaves alrededor de varias sentenciasdentro de un case. Se pueden utilizar varias etiquetas, que significa que el mismo conjunto deacciones ocurrirá para cualquiera de estos casos.

Ejemplo:

Page 66: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 66/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

6

case ‘D’ : case ‘d’ : printf(“ La letra es D ”);break;

Al utilizar una estructura switch, recuerde que puede ser usada sólo para probar una expresión integral o caracter constante . Una constante de caracter se representa como un caracter 

especifico, entre comillas sencillas como ‘d’. Los caracteres deben ser encerrados dentro decomillas sencillas para que sean reconocidos como constantes de caracter. Las constantesenteras son solo números enteros.

Algoritmo:

switch (valor)

{ case ‘1’ : ejecuta esto si valor es 1 

break; case ‘2’ : ejecuta esto si valor es 2

break; case ‘3’ : ejecuta esto si valor es 3 

break; default : ejecuta esto si valor no es ninguno de los anteriores 

break; }; 

Cada case puede ejecutar múltiples líneas de código. Todos deben terminan con un break, queindica que debe seguirse la ejecución del programa luego de ejecutar las líneas superiores. Laejecución continúa luego de la estructura switch . El caso default se ejecuta si no hubocoincidencia entre el contenido de valor y los case superiores.

Un ejemplo del uso de la estructura switch en C:

Algoritmo:

iniciodeclarar variables

entero hijoslimpiar pantallaescribir ( ‘ Ingrese la cantidad de hijos que usted tiene: ‘ )leer ( hijos )según_sea ( hijos ) hacer 

‘0’ : escribir ( ‘ No le corresponde asignacón familiar por hijos ‘ )break; 

‘1’ : escribir ( ‘ Le corresponde 500 pesos de asignacón familiar por su único hijo ‘ )break; 

‘2’ : escribir ( ‘ Le corresponden 750 pesos de asignacón familiar por sus dos hijos ‘ )break; 

default : escribir ( ‘ Le corresponden 1000 pesos de asignacón familiar por tener masde dos hijos ‘ )break;

fin_según_sea pausa

fin

Programa:

Page 67: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 67/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

6

int hijos;clrscr( );

 printf(“Ingrese la cantidad de hijos que usted tiene: \n”);scanf(“%d”, &hijos);switch (hijos){

case ‘0’:  printf(“No le corresponde asignación familiar por hijo\n”);break;

case ‘1’:

 printf(“Le corresponden 500 pesos de asignaciónfamiliar por su único hijo\n”);break;

case ‘2’:

 printf(“Le corresponden 750 pesos de asignaciónfamiliar por sus dos hijos\n”);break;

default: printf(“Le corresponden 1000 pesos de asignaciónfamiliar por tener más de dos hijos\n”);break;

};

Se define la variable del tipo entero hijos, se le pide al usuario que ingrese el número de hijosque posee y luego entra en acción la estructura switch , actuando de diferentes formasdependiendo del valor de la variable hijos en tiempo de ejecución.

Otro ejemplo del switch sería el siguiente:

Algoritmo:

iniciodeclarar variables

entero xcarácter m

limpiar pantallaescribir ( ‘ Seleccione una opción del menú ‘ )escribir ( ‘ 1. Sumar ( ++ ) 2. Restar ( - - ) ‘ )leer ( m )según_sea ( m ) hacer 

‘1’ : incrementar X en unoescribir ( , x , )break; 

‘2’ : decrementar X en unoescribir ( , x , )break; 

fin_según_seapausa

fin

Programa:

Page 68: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 68/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

6

 

main(){int x;char m;

clrscr( ); printf("Seleccione una opción del menú: "); printf("\n1.Sumar (++) \n 2.Restar(--) \n");scanf ("%c" ,&m);

 printf("Teclee el numero");scanf("%d" ,&x);

switch (m){case '1': /*Uso de comillas solas porque es comocaraceter*/ x++;

 printf("%d", x);break; /*necesario sino se sigue hasta que encuentre un break*/ 

case '2':x--;

 printf("%d",x);break;

}

return 0;}

3.1.2. Ramificada 

Para hacer estructuras condicionales más complejas podemos anidar sentencias if, es decir,colocar estructuras if dentro de otras estructuras if. Con un solo if podemos evaluar y realizar una acción u otra según dos posibilidades, pero si tenemos más posibilidades que evaluar debemos anidar Ifs para crear el flujo de código necesario para decidir correctamente.

Por ejemplo, si deseo comprobar si un número es mayor menor o igual que otro, tengo queevaluar tres posibilidades distintas. Primero puedo comprobar si los dos números son iguales,si lo son, ya he resuelto el problema, pero si no son iguales todavía tendré que ver cuál de losdos es mayor, en situaciones como ésta es cuando tenemos que utilizar y apoyarnos deestructuras anidadas, la sintaxis de estas condicionales sería:

Sintaxis:

if (condición1)

sentencia1elseif (condición2)

sentencia2else

if (condición3)sentencia3

Segmento de algoritmo:

si (condición1) entonces

Page 69: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 69/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

6

sentencias1si_no

si (condición2) entoncessentencias2

si_no

si (condición3) entoncessentencias3fin_si

fin_sifin_si

A veces es importante utilizar las llaves para aclarar el sentido semántico de los if anidados, yaque estos empiezan a ser cada vez mas grandes y por ende tienen más líneas de código lascuales si no definimos bien en que parte del programa se quieren realizar, se revolverían y elcódigo sería inentendible.

Ejemplo que determina de 3 números cual es el mayor, con el ciclo if – else, de esta manerahay que fijarse muy bien en el primer if que ejecuta todo su bloque de sentencias ( que es otro

if – else ) una anidación de ciclos, y en el else del mismo if se vuelve a anidar otro if – else enotro bloque de sentencias, por lo cual se comparan perfectamente los tres números para dar elnúmero mayor.

Algoritmo:inicio

declarar variablesenteras A← 0, B← 0, C← 0

limpiar pantallaescribir ( ‘ Ingrese 3 números ‘ )leer ( A, B, C )si ( A > C ) entonces

si ( A > C ) entoncesescribir ( ‘ A es el número mayor ‘ )

si_no escribir ( ‘ C es el número mayor ‘ )fin_si

si_nosi ( B > C ) entonces

escribir ( ‘ B es el número mayor ‘ )si_no

escribir ( ‘ C es el número mayor ‘ )fin_si

fin_sipausafin

Programa:

#include <iostream.h>#include <stdio.h>#include <conio.h>

void main(){int A=0, B=0, C=0;clrscr( );

 printf(”Ingrese 3 números”);

Page 70: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 70/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

7

scanf(“%d %d %d”,&A, &B, &C); //Lectura de valores por teclado

if ( A > B ){

if (A > C ) printf(”A es el número mayor \n”);

else printf(”C es el número mayor \n”);

}else{

if ( B > C ) printf(”B es el número mayor \n”);

else printf(”C es el número mayor \n”);

}getch();}

Otro ejemplo en el cual se incluyen ifs anidados:

Algoritmo:

iniciodeclarar variables

enteras numero1← 23, numero2← 63limpiar pantallasi ( numero1 == numero2 ) entonces

escribir ( ‘ Los dos números son iguales ‘ )escribir ( numero1, numero2 )

si_nosi ( numero1 > numero2 ) entonces

escribir ( ‘ El primer número es mayor que el segundo ‘ )escribir ( numero1, numero2 )

si_noescribir ( ‘ El primer número es menor que el segundo ‘ )escribir ( numero1, numero2 )

fin_sifin_si

pausafin

Programa:

int numero1=23, numero2=63;clrscr( );if (numero1 == numero2){

 printf(“Los dos números son iguales \n "); printf( “%d = %d “, numero1, numero2);

}else{

if (numero1 > numero2){

 printf(“ El primer número es mayor que el segundo \n "); printf( “%d > %d “, numero1, numero2);

}

Page 71: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 71/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

7

else{

 printf("El primer número es menor que el segundo \n"); printf( “%d < %d “, numero1, numero2);

}getch( );}

En el anterior segmento de programa, primero se evalúa si los dos números son iguales. Encaso positivo se muestra un mensaje informándolo. En caso contrario ya sabemos que sondistintos, pero aun debemos averiguar cuál de los dos en mayor. Para eso se hace otracomparación para saber si el primero es mayor que el segundo. Si esta comparación daresultados positivos mostramos un mensaje diciendo que el primero es mayor que el segundo,en caso contrario indicaremos que el primero es menor que el segundo.

Los sangrados también son opcionales en todo caso y nos sirven sólo para ver el código deuna manera más ordenada. Mantener el código muy bien estructurado y escrito de una maneracomprensible es muy importante, ya que nos hará la vida más agradable a la hora deprogramar y sobre todo más adelante cuando tengamos que revisar programas más extensos.

Se pueden colocar instrucciones de control dentro de otras instrucciones de control, por ejemplo un bloque If...Else dentro de otra sentencia de control If…Else o incluso dentro de otrasentencia de control llamada switch que vimos anteriormente y entonces así, crear anidaciones. Cuando una instrucción de control se coloca dentro de otra, se dice que estáanidada .

Note que en el caso de este if anidado no se necesitan abrir y cerrar llaves en el if interno, yaque al abrir un if y enseguida volver a abrir otro; este se liga y solo que ubiera más de unainstrucción a realizar en ese if interno se abrirían llaves de lo contrario queda como esta eneste ejemplo.

Para ver mejor lo dicho anteriormente se repetirá el ejercicio anterior con más de unainstrucción dentro del if interno para notar claramente donde sería la modificación.

Algoritmo:

si ( condicion ) entoncessi ( condicion ) entonces

Instrucciones a ejecutar cuando la condición es verdaderaEn el caso de haber mas de una instrucción a realizar 

si_noInstrucciones a ejecutar cuando la condición es falsaEn el caso de haber tres líneas o más a realizar Esta sería la tercera líneaY podríamos seguirnos cuantas líneas fueran necesariasLas llaves se abren al ser dos o más líneas

Fin_si

si_no Instrucción a ejecutar cuando la condición es falsafin_si

Programa:

if (condición)if (condición)

{

Page 72: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 72/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

7

Instrucciones a ejecutar cuando la condición esverdadera;En el caso de haber mas de una instrucción a realizar;}

else{Instrucciones a ejecutar cuando la condición es falsa;En el caso de haber tres líneas o más a realizar;Esta sería la tercera línea;Y podríamos seguirnos cuantas líneas fueran necesarias;Las llaves se abren al ser dos o más líneas;}

elseInstrucción a ejecutar cuando la condición es falsa;

Programa que determina de cuatro números cual es el mayor:

Ejemplo Algoritmo:

inicio

declarar variablesenteras a, b, c, d, mayor 

limpiar pantallaescribir ( ‘ Programa que indica cual de los 4 números es mayor ‘ )escribir ( ‘ Introduce 4 números enteros ‘ )leer ( a, b, c, d )si ( a > b ) entonces

si ( a > c ) entoncessi ( a > d ) entonces

mayor ← asi_no

mayor ← dfin_si

si_no

si ( c > d ) entoncesmayor ← c

si_nomayor ← d

fin_sifin_si

si_nosi ( b > c ) entonces

si ( b > d ) entoncesmayor ← b

si_nomayor ← a

fin_sisi_no

si ( c > d ) entoncesmayor ← c

si_nomayor ← d

fin_sifin_si

fin_siescribir ( ‘ El mayor es ‘, mayor )

pausafin

Page 73: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 73/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

7

Ejemplo Programa:

#include <stdio.h>#include <conio.h>

void main(){

int a, b, c, d, mayor;

clrscr (); printf ("Programa que indica cual de 4 numeros es el mayor\n"); printf ("Introduce 4 numeros enteros:\n");scanf ("%i%i%i%i", &a, &b, &c, &d);

if (a > b)if (a > c)

if (a > d)mayor = a;

elsemayor = d;

elseif (c > d)

mayor = c;

elsemayor = d;

elseif (b > c)

if (b > d)mayor = b;

elsemayor = a;

elseif (c > d)

mayor = c;else

mayor = d; printf ("El mayor es %i", mayor);getch();}

Este es un claro ejemplo en el cual se manipulan varios if’s anidados para dar solución a unproblema de número mayor.

Si se desea ejecutar más de una instrucción, es posible ejecutar varias instrucciones en formacondicional al incluirlas en bloques mediante { }, al igual que en el ejemplo anterior.

Las instrucciones que se van a ejecutar como resultado de comprobar la condición pueden ser de cualquier tipo, incluida otra instrucción if anidada dentro de la instrucción if original. En lasinstrucciones if anidadas, la cláusula else pertenece a la última instrucción if que no tiene unacláusula else correspondiente. Por ejemplo:

Page 74: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 74/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

7

if (x > 10)

if (y > 20)

 printf(" El valor es mayor ");

else

 printf( " El valor es menor "); 

En este ejemplo, se mostrará El valor es menor si la condición (y > 20) se evalúa como false.No obstante, si desea asociar El valor es menor a la condición (x >10), deberá utilizar llaves,como se muestra a continuación:

if (x > 10){

if (y > 20) printf(" El valor es mayor ");

}else

 printf( " El valor es menor ");

En este caso, se mostrará El valor es menor si la condición (x > 10) se evalúa como false.

La razón por la que los if’s anidados son tan problemáticos es que puede ser difícil saber queelse se asocia con que if.

Por ejemplo:

if (x)if (y)

 printf ("1");else printf("2");

¿A qué if se refiere el else?

Afortunadamente, C proporciona una regla muy sencilla para resolver este tipo de situaciones.En C una sentencia else siempre se refiere al if precedente mas próximo que no tenga yaasociada una sentencia else. En este caso, el else esta asociado con la sentencia if(y).

Para asociar el else con el if(x), se debe usar llaves para saltarse la asociación normal, talcomo se muestra aquí:

if (x){if (y)

 printf ("1");}

else printf("2");

Ahora, el else esta asociado con el if(x), porque ya no pertenece al bloque del if (y). Debido alas reglas de alcance de C, ahora el else no tiene conocimiento de la sentencia if (y), ya que noestán en el mismo bloque de código.

La escala if-else-if 

Una construcción común en programación es la if-else-if. Su forma general es:

Page 75: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 75/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

7

  if (expresión)sentencia;

else if (expresión)sentencia;

else if (expresión)sentencia;

.

.

.elsesentencia;

Utilizando una escala if-else-if, el programa del número mágico queda como:

Algoritmo:

iniciodeclarar variables

enteras magico← 123, intentolimpiar pantallaescribir ( ‘ Adivine el número mágico: ‘ )leer ( intento )si ( intento == magico ) entonces

escribir ( ‘ **** Correcto **** ‘ )escribir ( magico, ‘ es el número mágico ‘ )

si_nosi ( intento > magico ) entonces

escribir ( ‘ Incorrecto . . Demasiado alto ‘ )si_no

escribir ( ‘ Incorrecto . . Demasiado bajo ‘ )fin_si

fin_sipausafin

Programa:

#include <stdio.h>

main (void){

int magico = 123; /* numero magico*/ int intento;

 printf("adivine el numero magico: ");scanf("%d ", &intento);if (intento == magico)

{ printf("** Correcto**");

 printf(" %d es el número mágico ", magico);}

else if (intento > magico) printf(".. Incorrecto .. Demasiado alto");

else printf(".. Incorrecto .. Demasiado bajo");

return 0;}

Page 76: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 76/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

7

Ahora bien dentro de las estructuras de decisión ramificadas también existe el ciclo switchcomo lo vimos anteriormente simple, pero ahora ramificado, recordaremos la sintaxis simpleque se usa para de ella partir a la sintaxis ramificada:

switch (expresión entera)

{

case exp_constante_1:acciones a realizar cuando la expresión tiene el valor exp_constante_1;

break;

case exp_constante_2:acciones a realizar cuando la expresión tiene el valor exp_constante_2;

break;

...especificar todos los casos

default:acciones a realizar cuando la expresión no coincide con ningunode los casos;

break;

}

La sintaxis del switch anidado sería:

Algoritmo:

según_sea ( opción uno ) hacer 1 : según_sea ( opcion uno ) hacer 

1 : escribir ( ‘ Mensaje ‘ )break

2 : escribir ( ‘ Mensaje ‘ )break

3 : escribir ( ‘ Mensaje ‘ )break

default: escribir ( ‘ Mensaje ‘ )fin_según_sea

break

2 : según_sea ( opcion dos ) hacer 1 : escribir ( ‘ Mensaje ‘ )

break2 : escribir ( ‘ Mensaje ‘ )

break3 : escribir ( ‘ Mensaje ‘ )

breakdefault: escribir ( ‘ Mensaje ‘ )fin_según_sea

breaken caso contrario : break

fin_según_sea

Programa:

switch(opcion)

Page 77: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 77/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

7

{case 1:switch(opcion uno)

{case 1:printf("Mensaje");break;case 2:printf("Mensaje");break;

case 3:printf("Mensaje");break;default: printf(“Mensaje”);break;}

break;case 2:switch(opcion dos)

{case 1:printf("Mensaje");break;case 2:printf("Mensaje");break;case 3:printf("Mensaje");break;default: printf(“Mensaje”);break;

}break;default:break;}

Y así podríamos continuar agregando más switch anidados, cuantos seannecesarios para resolver la problemática que se tenga, el ciclo switch anidado nossirve para meter condiciones dentro de una ya establecida como en el ejemplo quesigue, nos da la conversión de números arábigos a números romanos de tal maneraque se aniden los ciclos switch, en este primer ejemplo el ciclo switch tiene unpequeño error que se despeja en el ejercicio que le sigue, vamos a checar el primer caso:

Ejemplo con switch anidado:

Algoritmo:

declarar función tranf (entera, entera)iniciodeclarar variables

enteras um, c, d, u, nlimpiar pantallaescribir ( ‘ Ingrese un número ‘ )leer ( n )um ← n/1000c ← n/100%10d ← n/10%10u ← n%10llamar a la función tranf(um,1)llamar a la función tranf(c,2)llamar a la función tranf(d,3)

llamar a la función tranf(u,4)pausafin

función tranf (entera y, entera x )inicio

escribir ( ‘ Ingrese un número ‘ )leer ( x )según_sea ( x ) hacer 1 : según_sea ( y ) hacer 

1 : escribir ( ‘ M ‘ )

Page 78: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 78/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

7

break2 : escribir ( ‘ MM ‘ )

break3 : escribir ( ‘ MMM ‘ )

break

default: breakfin_según_seabreak

2 : según_sea ( y ) hacer 1 : escribir ( ‘ C ‘ )

break2 : escribir ( ‘ CC ‘ )

break3 : escribir ( ‘ CCC ‘ )

Break1 : escribir ( ‘ CD ‘ )

break2 : escribir ( ‘ D ‘ )

break3 : escribir ( ‘ DC ‘ )

break1 : escribir ( ‘ DCC ‘ )

break2 : escribir ( ‘ DCCC ‘ )

breakbreak

default: breakfin_según_sea

break

3 : según_sea ( y ) hacer 1 : escribir ( ‘ X ‘ )

break2 : escribir ( ‘ XX ‘ )

break3 : escribir ( ‘ XXX ‘ )

Break4 : escribir ( ‘ XL ‘ )

break5 : escribir ( ‘ L ‘ )

break6 : escribir ( ‘ LX ‘ )

break7 : escribir ( ‘ LXX ‘ )

break8 : escribir ( ‘ LXXX ‘ )

break9 : escribir ( ‘ CX ‘ )

breakdefault: break

fin_según_seabreak

4 : según_sea ( y ) hacer 1 : escribir ( ‘ I ‘)

break2 : escribir ( ‘ II ‘ )

Page 79: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 79/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

7

break3 : escribir ( ‘ III ‘ )

break4 : escribir ( ‘ IV ‘ )

break

5 : escribir ( ‘ V ‘ )break6 : escribir ( ‘ VI ‘)

break7 : escribir ( ‘ VII ‘ )

break8 : escribir ( ‘ VIII ‘)

break9 : escribir ( ‘ IX ‘)

breakdefault:break;

fin_según_seabreak

default: breakfin_según_sea

Programa:

#include<conio.h>#include<stdio.h>

void tranf(int,int);

void main(void){int um,c,d,u,n;clrscr();

 printf("ingrese numero");

scanf("%d",&n);um=n/1000;c=n/100%10;d=n/10%10;u=n%10;tranf(um,1);tranf(c,2);tranf(d,3);tranf(u,4);getch( );}void tranf(int y, int x){

 printf("ingrese numero");scanf (“ %d “, &x);switch(x){case 1:switch(y)

{case 1:printf("M");break;case 2:printf("MM");break;case 3:printf("MMM");break;default:break;}

Page 80: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 80/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

8

case 2:switch(y){case 1:printf("C");break;case 2:printf("CC");break;case 3:printf("CCC");break;

case 4:printf("CD");break;case 5:printf("D");break;case 6:printf("DC");break;case 7:printf("DCC");break;case 8:printf("DCC");break;case 9:printf("DCCC");break;default:break;}

case 3:switch(y){case 1:printf("X");break;case 2:printf("XX");break;case 3:printf("XXX");break;case 4:printf("XL");break;

case 5:printf("L");break;case 6:printf("LX");break;case 7:printf("LXX");break;case 8:printf("LXXX");break;case 9:printf("XC");break;default:break;}

case 4:switch(y){case 1:printf("I");break;case 2:printf("II");break;case 3:printf("III");break;case 4:printf("IV");break;

case 5:printf("V");break;case 6:printf("VI");break;case 7:printf("VII");break;case 8:printf("VIII");break;case 9:printf("IX");break;default:break;}

default:break;}

El ejemplo anterior contiene un pequeño error de llaves (rango), si es que lo pudieron detectar solo hay que corregirlo, pero si no, el ejemplo siguiente nos da la modificación pertinente.

El error radica en las llaves que le faltan al primer switch.

Algoritmo:

declarar función tranf (entera, entera)iniciodeclarar variables

enteras um, c, d, u, nlimpiar pantallaescribir ( ‘ Ingrese un número ‘ )leer ( n )

Page 81: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 81/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

8

um ← n/1000c ← n/100%10d ← n/10%10u ← n%10llamar a la función tranf(um,1)

llamar a la función tranf(c,2)llamar a la función tranf(d,3)llamar a la función tranf(u,4)pausafin

función tranf (entera y, entera x )inicio

escribir ( ‘ Ingrese un número ‘ )leer ( x )según_sea ( x ) hacer 1 : según_sea ( y ) hacer 

1 : escribir ( ‘ M ‘ )break

2 : escribir ( ‘ MM ‘ )break

3 : escribir ( ‘ MMM ‘ )break

default: breakfin_según_sea

break

2 : según_sea ( y ) hacer 1 : escribir ( ‘ C ‘ )

break2 : escribir ( ‘ CC ‘ )

break3 : escribir ( ‘ CCC ‘ )

Break1 : escribir ( ‘ CD ‘ )

break2 : escribir ( ‘ D ‘ )

break3 : escribir ( ‘ DC ‘ )

break1 : escribir ( ‘ DCC ‘ )

break2 : escribir ( ‘ DCCC ‘ )

breakbreak

default: breakfin_según_sea

break

3 : según_sea ( y ) hacer 1 : escribir ( ‘ X ‘ )

break2 : escribir ( ‘ XX ‘ )

break3 : escribir ( ‘ XXX ‘ )

Break4 : escribir ( ‘ XL ‘ )

break

Page 82: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 82/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

8

5 : escribir ( ‘ L ‘ )break

6 : escribir ( ‘ LX ‘ )break

7 : escribir ( ‘ LXX ‘ )

break8 : escribir ( ‘ LXXX ‘ )break

9 : escribir ( ‘ CX ‘ )break

default: breakfin_según_seabreak

4 : según_sea ( y ) hacer 1 : escribir ( ‘ I ‘)

break2 : escribir ( ‘ II ‘ )

break3 : escribir ( ‘ III ‘ )

break4 : escribir ( ‘ IV ‘ )

break5 : escribir ( ‘ V ‘ )

break6 : escribir ( ‘ VI ‘)

break7 : escribir ( ‘ VII ‘ )

break8 : escribir ( ‘ VIII ‘)

break9 : escribir ( ‘ IX ‘)

breakdefault:break;

fin_según_seabreak

default: breakfin_según_sea

pausafin

Programa:

#include <stdio.h>#include <stdlib.h>

void tranf(int,int);

int main(void){int um,c,d,u,n;system("cls");

 printf("ingrese numero: ");scanf("%d",&n);um=n/1000;c=n/100%10;d=n/10%10;u=n%10;

Page 83: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 83/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

8

tranf(um,1);tranf(c,2);tranf(d,3);tranf(u,4);

 putchar('\n');

system("pause");return 0;}

void tranf(int y, int x){switch(x){

case 1:switch(y){case 1:printf("M");break;case 2:printf("MM");break;case 3:printf("MMM");break;default:break;

}

break;case 2:switch(y)

{case 1:printf("C");break;case 2:printf("CC");break;case 3:printf("CCC");break;case 4:printf("CD");break;case 5:printf("D");break;case 6:printf("DC");break;case 7:printf("DCC");break;case 8:printf("DCC");break;case 9:printf("DCCC");break;default:break;

}break;case 3:switch(y)

{case 1:printf("X");break;case 2:printf("XX");break;case 3:printf("XXX");break;case 4:printf("XL");break;case 5:printf("L");break;case 6:printf("LX");break;case 7:printf("LXX");break;case 8:printf("LXXX");break;case 9:printf("XC");break;default:break;

}break;

case 4:switch(y){

case 1:printf("I");break;case 2:printf("II");break;case 3:printf("III");break;case 4:printf("IV");break;case 5:printf("V");break;case 6:printf("VI");break;

Page 84: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 84/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

8

case 7:printf("VII");break;case 8:printf("VIII");break;case 9:printf("IX");break;default:break;

}

break;default:break;}

getch();} 

Este es un ejemplo que se resuelve mediante dos formas con if’s anidados y con switchanidados. Para demostrar que lo que se realiza con un ciclo if se puede realizar de la mismamanera con un ciclo switch y viceversa.

Ejemplo:

Un restaurante ofrece el siguiente menú, con los siguientes costos por platillo:1.-Carne en su Jugo 89.60

2.- Hígado encebollado 60.25

Adicionalmente el cliente puede elegir uno de los siguientes postres, por los cuales se agregaráal costo del platillo las cantidades que se indican:

1) Flan 5.002) Gelatina 3.503) No desea postre (el cliente pagará 10.00 pesos menos por su platillo).

El programa deberá pedir la información referente al platillo y al postre, a través de un menú yal final mostrará un mensaje con el monto que el cliente deberá pagar. El siguiente programasoluciona el problema anterior con estructuras if anidadas.

Algoritmo:

iniciodeclarar variables

enteras postrecarácter platilloreal postre← 0.0

limpiar pantallaescribir ( ‘ Que platillo desea el cliente ‘ )escribir ( ‘ a)Carne en su Jugo ó b)Hígado encebollado ‘ )escribir ( ‘ Proporcione la Opción (a ó b): [ ] ‘ )leer ( platillo )si ( platillo = 1 ) hacer 

escribir ( ‘ Que postre desea el cliente: ‘ )escribir ( ‘ 1) Flan, 2) Gelatina 3) No desea postre ‘ )

escribir ( ‘ Proporcione la Opción (1,2 ó 3): [ ] ‘ )leer ( postre )

si ( postre = 1 ) entoncescosto← 89.60+5.00si_no si ( postre = 2 ) entonces

costo← 89.60+3.50si_no si ( postre = 3 ) entonces

costo← 89.60-10.00si_no

escribir ( ‘ Error en la selección del postre ‘ )si_no si ( platillo = 2 ) entonces

Page 85: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 85/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

8

escribir ( ‘ Seleccione postre ‘ )escribir ( ‘ Seleccione la opción [ 1,2 ó 3 ] : ‘ )leer ( postre )si ( postre = 1 ) entonces

costo=60.25+5.00

si( postre = 2 ) entoncescosto=60.25+3.50si( postre = 3 ) entonces

costo=60.25-10.00si_no

escribir ( ‘ Error en la selección del platillo ‘ )fin_si

fin_siescribir ( ‘ El total a pagar es ‘ ,costo )pausafin

Programa:

#include <stdio.h>#include<conio.h>void main(){

int platillo,postre;float costo=0.0;

 printf("\n\n Que platillo desea el cliente\n");  printf(" 1)Carne en su Jugo ó 2)Hígado encebollado\n"); printf("Proporcione la Opción (1 ó 2): [ ]\b\b");scanf("%d", &platillo);

if(platillo==1){ printf("\n Seleccione postre\n"); printf("1-Flan, 2-Gelatina 3-No desea postre)\n"); printf("Proporcione la Opción (1,2 ó 3): [ ]\b\b");

scanf("%d",&postre);if (postre==1)costo=89.60+5.00;

else if (postre==2)costo=89.60+3.50;

else if (postre==3)costo=89.60-10.00;

else printf("\n Existe un error en la selección del postre\n");

}else if(platillo==2){ printf("\n Seleccione postre\n"); printf("Proporcione la Opción (1,2 ó 3): [ ]\b\b");

scanf("%d", &postre);if (postre==1)costo=60.25+5.00;

if (postre==2)costo=60.25+3.50;

if (postre==3)costo=60.25-10.00;

}else printf("Error en la selección del platillo\n");

 printf("\n El total a pagar es %8.2f \n",costo);

Page 86: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 86/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

8

getch();}

Solución con estructuras switch anidadas, las opciones del platillo serán ahora a y b.

Algoritmo:iniciodeclarar variables

enteras postrecarácter platilloreal postre← 0.0

limpiar pantallaescribir ( ‘ Que platillo desea el cliente ‘ )escribir ( ‘ a)Carne en su Jugo ó b)Hígado encebollado ‘ )escribir ( ‘ Proporcione la Opción (a ó b): [ ] ‘ )leer ( platillo )según_sea ( platillo ) hacer 

‘ A ‘ : escribir ( ‘ Que postre desea el cliente: ‘ )escribir ( ‘ 1) Flan, 2) Gelatina 3) No desea postre ‘ )escribir ( ‘ Proporcione la Opción (1,2 ó 3): [ ] ‘ )leer ( postre )según_sea ( postre ) hacer 

1 : costo← 89.60+5.00break;

2 : costo← 89.60+3.50break;

3 : costo← 89.60-10.00break;default: escribir ( ‘ Error en la selección del postre ‘ )break

fin_según_seabreak

‘ B ‘ : escribir ( ‘ Que postre desea el cliente: ‘ )escribir ( ‘ 1) Flan, 2) Gelatina 3) No desea postre ‘ )escribir ( ‘ Proporcione la Opción (1,2 ó 3): [ ] ‘ )leer ( postre )según_sea ( postre ) hacer 

1 : costo← 60.25+5.00break;

2 : costo← 60.25+3.50break;

3 : costo← 60.25-10.00break;default: escribir ( ‘ Error en selección del postre ‘ )break

fin_según_seabreak

default : escribir ( ‘ Error en la selección del platillo ‘ )fin_según_seabreak

escirbir ( ‘ El total a pagar es : ‘ , costo )pausafin

Programa:

#include <stdio.h>

Page 87: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 87/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

8

#include<conio.h>void main(){

char platillo;int postre;float costo=0.0;clrscr();

 printf("\n\nQue platillo desea el cliente\n");  printf(" a)Carne en su Jugo ó b)Hígado encebollado\n"); printf("Proporcione la Opción (a ó b): [ ]\b\b");scanf("%c",&platillo);

switch(platillo){

case 'A':

 printf("\n\n Que postre desea el cliente:\n");  printf("1) Flan, 2) Gelatina 3) No desea postre\n"); printf("Proporcione la Opción (1,2 ó 3): [ ]\b\b\b");scanf("%d", &postre);switch(postre)

{case 1:costo=89.60+5.00;break;case 2:costo=89.60+3.50;break;case 3:costo=89.60-10.00;break;default:printf("\n Error en la selección del postre\n");

}break;case 'B':

 printf("\n\n Que postre desea el cliente:\n");  printf("1) Flan, 2) Gelatina 3) No desea postre\n"); printf("Proporcione la Opción (1,2 ó 3): [ ]\b\b\b");

scanf("%d", &postre);switch(postre){

case 1:costo=60.25+5.00;break;case 2:costo=60.25+3.50;break;case 3:costo=60.25-10.00;break;default:printf("\n Error en selección del postre\n");

}break;default: printf("\n Error en la selección del platillo\n");

} printf("\nEl total a pagar es %8.2f \n", costo);

getch();}

3.2. Estructuras de Iteración

Todos los programas que se han visto a lo largo de este manual se ejecutan en formasecuencial, es decir una sentencia después de la otra y así sucesivamente. Cada instrucciónempezando en el inicio se ejecutan una seguida de la otra y algo muy importante, ninguna deellas se repite, por lo tanto se dice que s un programa secuencial porque sus instrucciones vanejecutándose una por una continuamente hasta llegar al final del programa.

Page 88: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 88/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

8

 Así, esta programación es muy sencilla y se realizan programas a su vez sencillos, por otrolado poco a poco se va requiriendo de una programación más controlada, en la cual podamosdecidir en que momento ejecutamos una serie de instrucciones y bajo que condición.

En lenguaje C existen otras sentencias bajo las cuales se pueden repetir una serie deinstrucciones mientras se cumpla una determinada condición y características.

Las estructuras de iteración son también llamados ciclos y se usan en la programación pararealizar una y otra vez un conjunto de instrucciones hasta que se cumpla una determinadacondición.

Estos ciclos de iteración o repetición son muy utilizados, ya que permiten al programador repetir un segmento de código las veces que se desee; sin necesidad de volver a escribir cadavez que se va a utilizar y así lograr simplificar código de programación.

Lenguaje C soporta tres tipos de estructuras de iteración que son: while, do-while y for, loscuáles describiremos a continuación.

Dentro de estos tres tipos, existen los llamados pre – condicionales y post – condicionales queson el ciclo while y do – while respectivamente y en lo que respecta al ciclo for, este puedeentrar en cualquiera de los dos ya que con una serie de modificaciones en su estructura puedellegar a ser pre – condicional o post – condicional.

El nombrar pre – condicional a un ciclo quiere decir que primero va a evaluar la condición paraluego ver si realiza el bloque de sentencias, si esta condición es verdadera o se cumple,entonces entramos a realizar el bloque de sentencias de dicho ciclo, pero si esta condición esfalsa desde el inicio, nunca entramos a realizar ninguna tarea del bloque de sentencias; esto esun ciclo pre – condicional es el cual va a evaluar la condición antes de realizar el bloque desentencias, un ejemplo claro de esto es un ciclo while, y cuando se habla de un ciclo post –condicional se dice que es cuando la condición se evalúa al final del bloque de sentencias. Unavez que ya se realizó el bloque de sentencias en la parte final se encuantra la condición, en esemomento se evalúa y si es falsa deja de repetir el bloque de sentencias, pero si es verdaderacontinúa repitiendo el bloque de sentencias; por lo tanto un ejemplo de este ciclo es el do –while; el cual primero realiza el bloque de sentencias sin importar la condición y al final evalúala condición.

En este caso el ciclo do – while por fuerza siempre realiza al menos una vez todas lassentencias que se encuentran dentro de él, sin importar que la expresión de la condición seafalsa desde un principio, mientras que el ciclo while si su condición es falsa en un principionunca se ejecuta el bloque de sentencias ni una sola vez, solo cuando esta sea verdadera.

Estructura de Iteración while 

Analizaremos el ciclo while por primera instancia el cual primero evalúa la condición para luegoentonces, si ésta se cumple o es (verdadera) realice el bloque de sentencias de dichaestructura, de lo contrario el control del programa pasará a la siguiente instrucción inmediatadespués del ciclo de repetición, ejemplo de esto es el siguiente diagrama de flujo donde semuestra como el ciclo while para poder realizar un bloque de sentencias determinado, primerotiene que evaluar su condición (expresión lógica) mientras esta sea verdadera se ejecuta elbloque de sentencias y si está condición es falsa el programa dirige su flujo a la sentenciasiguiente instrucción inmediata después del ciclo de repetición como se muestra acontinuación.

Diagrama de Flujo del ciclo While

Page 89: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 89/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

8

 

Figura 5. Diagrama de flujo ciclo While

La sintaxis o forma general del ciclo de repetición while en su forma simple o más sencilla es ladel inciso a), mientras que el inciso b) muestra la forma más estructurada de un ciclo while elcual consta de una serie de sentencias (bloque de sentencias) que van encerradas entre llaves{ }, si la sentencia a ejecutar en el ciclo while es únicamente una no se utilizan la llaves, pero siel bloque consta de más de una sentencia se le debe poner las llaves para indicar que todo esebloque de sentencias se realizará cuando la condición sea verdadera.

Sintaxis:

a) mientras (condición) hacer Sentencia;

b) mientras (condición) hacer {

Sentencia1;Sentencia2;

.

.

.SentenciaN;

}

En lenguaje de programación meramente Lenguaje C se escribiría como sigue, tomando encuenta lo anterior respectivamente:

a) while (condición)sentencia;

b) while (condición){

Sentencia1;Sentencia2;

falsa

sentencia

sentencia

sentencia

sentencia

mientras

condición

Sentencia siguiente

verdadera

Page 90: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 90/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

9

Sentencia3;...

sentenciaN;

}Nótese que al terminar la línea del while no se pone un punto y coma, mientras que en lasdemás instrucciones todas al final terminan con un punto y coma, exceptuando también lasllaves; esto es debido a que un punto y coma ( ; ) indica la terminación de una instrucciónconcluida y por lo tanto la línea del while no es una instrucción para terminar, si no por elcontrario; es el inicio del ciclo de repetición.

En esta estructura el conjunto de instrucciones que forma parte del bucle (un ciclo) se repitemientras se cumple una determinada condición. Como es bien sabido la finalidad de lapalabra reservada while es ejecutar una instrucción una y otra vez mientras que una condicióndada sea cierta, cuando la condición de ciclo while ya no es lógicamente verdadera, el ciclotermina.

Veamos ahora un ejemplo de la estructura de repetición while. Este segmento de programa nosindica cuantas veces se ejecuta un ciclo de repetición y lo muestra en pantalla.

Algoritmo:

R = 0mientras ( R < 6 ) hacer 

escribir ( R )incrementar R en uno

fin_mientras

Programa:

R = 0;while (R < 6){

 printf(“ \n %d “, R);R = R + 1;

}

La salida de este programa es el valor de la variable R, que va incrementándose de uno en unocada vez que se ejecuta el bloque de sentencias ( conjunto de instrucciones dentro de lasllaves) del ciclo y nos da: 0, 1, 2, 3, 4 y 5. Por lo tanto el bucle se repite seis veces.

Este es otro ejemplo que contará los números enteros positivos dados desde el teclado, en elmomento en el que se teclee un número negativo se detiene la iteración y da por terminado elprograma.

Algoritmo:

algoritmo enterosvariables

enteras número, contador inicio

escribir( ‘ Programa que cuenta los números enteros positivos ‘ )contador  0leer (numero)mientras ( numero > 0 ) hacer 

contador  contador + 1leer (numero)

Page 91: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 91/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

9

fin_mientrasescribir ( ‘ El número de enteros dados fue ‘, contador )pausa

fin

Programa Enteros:#include <stdio.h>#include<conio.h>void main(){

int numero, contador; printf("\n\n Programa que cuenta los números enteros positivos\n");contador=0;

 printf(" Dame un número \n");scanf("%d",&numero);while ( numero > 0 ){

contador = contador + 1;scanf(“%d”,&numero);

} printf(“ El número de enteros dados fue : \t %d “, contador);getch();

}

El programa anterior al final muestra cuantos números enteros se introdujeron, dicho valor lotiene la variable contador, que actúa como un contador (término que más adelante sedescribe) dando la acumulación de uno en uno durante cada vuelta del ciclo.

Una condición está formada básicamente por una serie de estructuras llamadas expresionesestas a su vez están formadas por cualquier sentencia que devuelve una operación booleanaque como resultado dentro del paréntesis nos den un dato expresado en falso o verdadero, entrue or false o en cero o uno, para poder determinar si la condición proporcionada se cumple ono se cumple y poder así saber, si se ejecuta el bloque de sentencias o no.

La condición también puede ser el nombre de una variable y el valor de la expresión dependerádel contenido de la variable. Aunque sea una variable no booleana, siempre se podrá usar, sivale 0 será como si la condición no se cumpliera, y siempre que sea diferente de 0, seconsiderará que la condición se cumple. Dentro de estas expresiones se usan los operadoresaritméticos y lógicos vistos con anterioridad, y para saber que resultado arroja cada expresiónpodemos hacer uso de nuestras tablas de verdad, que a continuación se muestran.

Dentro de las formas más usadas es sin duda las sentencias comparativas en donde seemplean implícitamente las tablas de verdad que es el resultado de una operación lógica.

Tablas de verdad

And:

A B A&&B F F FF V FV F FV V V

Tabla 20. Tabla de verdad And

Or:

A B A || B 

Page 92: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 92/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

9

F F FF V VV F VV V V

Tabla 21. Tabla de verdad Or 

Not:

A ! AF VV F

Tabla 22. Tabla de verdad Not

Los operadores relacionales se usan para expresar condiciones y describir la relación entre dosvalores, son muy útiles porque con ellas la expresión se vuelve más exacta, es decir; el randoya no queda abierto sino tiene un límite de inicio y fin con el cual se puede dar por terminado elciclo de repetición.

Tabla 23. Operadores Relacionales

También para describir expresiones más exactas y precisas en las condiciones se usan losoperadores lógicos and, or y not, los cuales se pueden utilizar conjuntamente con losoperadores relacionales para construir expresiones exactas a lo que queremos construir dentrode los programas.

OPERADOR DESCRIPCIÓN < Menor que> Mayor que<= Menor o igual que>= Mayor o igual que==!=

IgualDiferente que

OPERADOR DESCRIPCIÓN ! Not&& And!= Or 

Page 93: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 93/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

9

Tabla 24. Operadores Lógicos

Ejecución de un bucle cero veces:

Véase que en una estructura mientras (while) la primera cosa que ocurre es la evaluación de laexpresión (condición) booleana; si esta condición se evalúa a falsa en ese momento, entoncesel cuerpo del bucle nunca se ejecuta.

Puede parecer inútil ejecutar el cuerpo del bucle cero veces, ya que no tendría efecto alguno elrealizar un programa en donde nunca entraremos al cuerpo del while. Sin embargo, a veceses la operación querida.

Ejemplo:

Algoritmo:

K← 0escribir ( ‘ Dame un número ‘ )leer (numero)mientras ( numero > 0 ) hacer K← k + 1leer ( numero )fin_mientras

Este ciclo de repetición nunca se ejecutará si el primer número leído desde el teclado es unnúmero negativo o es igual a cero.

Programa:

K = 0; printf( “ Dame un número: \n “);scanf(“%d”, &numero);while ( numero > 0){

K++;scanf (“%d”, &numero);

}

Bucles infinitos:

Algunos bucles no exigen un fin y otros nunca encuentran el fin porque tienen un error en sudiseño. Por ejemplo, en una estación de tren se requiere de un programa que requiere delregistro de altas y bajas de sus pasajeros, este ciclo se está repitiendo constantemente y nuncatermina hasta que la computadora se apague y por el contrario puede haber un programa quenunca se repita o que nunca termine su repetición porque nunca se cumpla la condición.

Un ciclo que nunca termine se le llama ciclo infinito o sin fin. Los ciclos infinitos que no sonintencionalmente provocados, son dañinos para la programación ya que en muchas ocasiones

no sabemos porque sucede un error en el ciclo sobre todo cuando se empieza a programar,muchos de estos errores no provocados se empiezan a comprender más cuando tenemos unpoco de práctica al programar.

Consideremos el ejemplo de tasa de interes con un incremento de dos, en un rango entre 20 y40 por 100.

Algoritmo:

escribir ( ‘ Dame el capital total que gustes ‘ )leer (total_cap)

Page 94: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 94/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

9

tasa_int← 20escribir ( ‘ Programa que realiza una tasa de interes ‘ )mientras (tasa_int < > 40 ) hacer interes← tasa_int * 0.01 * total_cap //el capital es capital/100 (0.01)escribir ( ‘ El interes que se produjo es: ‘ , interes)

tasa_int←

tasa_int + 2fin_mientrasescribir ( ‘ Linea siguiente ‘ )

Los valores que siguen a la tasa_int serían 20, 22, 24, 26, 28, 30, 32, 34, 36, 38 y 40, demanera que al tomar la variable tasa_int el valor de 40 este bucle mientras (while) se termina yse va la ejecución del programa a la siguiente instrucción después del ciclo de repetición quees el mensaje “Línea siguiente”.

Programa:

 printf(“ Dame el capital total que gustes \n\n”);scanf(“%d”, &total_cap);tasa_int = 20;

 printf(“ Programa que realiza una tasa de interes \n\n “);while (tasa_int < > 40 ){

interes = tasa_int * 0.01 * total_cap; printf(“ El interes que se produjo es : \t %d “, interes);tasa_int = tasa_int + 2;

} printf(“ Línea siguiente \n “);

Supongamos que la línea de ( tas_int = tasa_int + 2 ), se cambiara por ( tasa_int = tasa_int +3), entonces aquí los valores de la tasa_int serían: 23, 26, 29, 32, 35, 38, 41… , por lo tanto lacondición del ciclo while nunca se cumplira y el bucle se vuelve infinito.

Problemas como este nos determinan las maneras en que podemos terminar un ciclo derepetición, sobre todo si utilizamos los operadores relacionales de menor o igual y mayor o

igual podremos tener expresiones más exactas.

En el siguiente ejemplo se utilizan los operadores relacionales para que la condición tenga unlímite determinado, realiza una suma acumulativa de números dados desde el teclado, hay queponer atención a la condición para que se aprecie como está funcionando ahora esa condición.

Algoritmo:

escribir ( ‘ Programa que suma N cantidad de números ‘ )suma← 0escribir ( ‘ Existen otros números en la lista s/n ‘ )leer (opcion)mientras ( opcion = S ) o ( opcion = s ) hacer 

escribir ( ‘ Dame un numero ‘ )

leer (numero)suma← suma + numeroescribir ( ‘ Hay más numeros s/n ‘ )leer (opcion)

fin_mientrasescribir ( ‘ El total de los numeros sumados es: ‘, suma )

Programa:

 printf(“ Programa que suma N cantidad de numeros \n\n “);suma = 0;

Page 95: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 95/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

9

 printf( “ Existen otros numeros en a lista \n\n “);scanf( “%c”, &opcion);while (( opcion = ‘S’) || (opcion = ‘s’)){

 printf(“ Dame un numero: \n\t “);scanf( “%f”, &numero);suma = suma + numero;

 printf(“ Hay más números s/n “);scanf( “%c”, &opcion);

} printf(“ El total de los numeros sumados es: %f \n “, suma );

Este método es muy bueno pero poco eficaz sobre todo cuando una lista es demasiadogrande, entonces se usan variables que tengan una señal de parada como las vistasanteriormente.

Un método muy interesante y eficaz para detener un ciclo de repetición es usar un valor centinela. Un valor centinela es un valor específico para indicar el final de una lista de datos.Por ejemplo, supongamos que tenemos una lista de calificaciones de los alumnos del tercer semestre de la carrera de ingeniería que entran en un rango de 0 a 10 de las cuales tenemosque obtener sus promedios, entonces un valor centinela es o podría ser -9, ya que esta jamáspodrá ser una calificación valida para un alumno y por lo tanto cuando este valor aparezca sedará por terminada la lista y por ende el bucle. Si la lista es de números positivos un valor centínela podría ser un número negativo que índique el final de la lista. El siguiente ejemplomuestra como se usa un valor centinela en una lista de calificaciones.

Algortimo:

suma_calif ← 0;Cont← 0escribir ( ‘ Da la calificaión: ‘ )leer (calif)mientras ( calif >= 0 ) hacer 

suma_calif ← suma_calif + calif escribir ( ‘ Da la calificación: ‘)leer (calif)cont← cont + 1

fin_mientrasprom← suma_calif / contescribir ( ‘ Tu promedio es de : ‘ , prom)

Programa:

suma_calif = 0;cont = 0;

  prinf(“ Da la calificación: \n ”);scanf(“ %f “, &calif);

while (calif > = 0){

suma_calif = suma_calif + calif;cont = cont + 1;

  printf(“ Da la calificación: \n “);scanf (“ %f “, &calif );

} prom = suma_calif / cont; printf(“ Tu promedio es de: \t %f “,prom);

Page 96: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 96/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

9

Cuando se usa un valor centinela se podrían dar por ejemplo los siguientes valores 10, 5.5, 7,3.5, 9, y -9, entonces nuestro valor centinela sería -9 que es un valor que se lee pero no sesuma en la lista, nótese tambien que el pedir la calificación (valor que estamos comprobando)se hace al final del bloque de sentencias, esto para poder comprobar de inmediato el valor alentrar al while, si este es un valor negativo como lo es el -9 de inmediato el ciclo se detiene.

Hay que poner atención tambien en que el promedio de estas calificaciones se realiza fuera delciclo de repetición, para tener primero la acumulación del número de calificaciones el cual esllevado por la variable cont; y luego la suma de las calificaciones la divide entre el número decalificaciones que son dando entonces un promedio de claificaciones final.

Otros ejemplos para detener un ciclo de repetición es dar una condición en la cual ya no seaprobable que existan más datos de entrada, como el ejemplo siguiente:

a) Algoritmo: 

i = 0;mientras ( i < 6 ) hacer 

escribir ( ‘ El valor de i es : ‘ , i )i = i + 1

fin_mientras

b) Algoritmo: 

i = 0mientras ( i < 6 ) hacer 

i = i + 1escribir ( i )

fin_mientras

a) Programa :

i = 0;while ( i < 6 ){

 printf(“ El valor de i es : \t %d “, i);i = i + 1;

}

b) Programa: 

i = 0;while ( i < 6 ){

i = i + 1; printf ( “ %d “, &i );

}

Estos algoritmos nos indican cuantas veces se ejecuta un ciclo de repetición (bucle). Elalgoritmo “a” y el algoritmo “b” muestran exactamente lo mismo; las vueltas que da un ciclo derepetición, pero el acomodar las líneas del contador y el printf de diferente manera nos muestrauna salida diferente como se muestra a continuación:

La salida en el inciso “ a) “ es el valor que toma la variable de control “ i “ al inicio de cadaejecución del ciclo: 0, 1, 2, 3, 4 y 5. Por lo tanto el bucle se ejecuta sies veces, mientrasen inciso “ b) “ se ejecuta exactamente las mismas veces pero el contador “ i “ lleva los

Page 97: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 97/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

9

siguientes valores: 1, 2, 3, 4, 5 y 6 debido a que en este caso el incremento de la variable “ i “es primero y luego imprime el valor en pantalla por eso es el cambio de los valores.

Estructura de iteración Do – While: 

El ciclo hacer – mientras (do – while ), es muy similar al ciclo while antes visto ambos realizanun ciclo de repetición, solo cambia la manera en que se acomoda la condición dentro del ciclode repetición.

A veces es importante que un ciclo de repetición se ejecute al menos una vez antes decomprobar la condición, en el ciclo while si la expresión booleana era falsa no se ejecutaba elbloque de sentencias, por eso en ocasiones es necesario contar con otro tipo de estructuras derepetición.

Sintaxis:

hacer {

Bloque de sentencias;}mientras ( condición )

hacer sentencia;

mientras ( condición )

Nótese que la diferencia entre los dos tipos de sintaxis es que en una mientras haya más deuna instrucción (línea de codigo), se tienen que poner llaves que engloben al bloque desentencias, mientras en el que solo hay una instrucción no se agregan llaves, la línea seejecuta automáticamente como parte del ciclo de repetición.

El ciclo do – while repite todo el bloque de sentencias al menos una vez ya que al entrar a estenunca evalúa alguna condición, por lo tanto, entra y empieza a ejecutar las sentencias; hastallegar al final de estas, es entonces donde compara la condición para determinar si ésta esfalsa o verdadera. Si la condición es falsa el flujo del programa continúa en la siguienteinstrucción fuera del ciclo de repetición, pero si esta es verdadera entonces regresa el flujo albloque inicial de instrucciónes del ciclo de repetición y vuelve a repetirlas hasta llegar otra vez ala condición y así sucesivamente mientras la condición sea verdadera.Diagrama de Flujo:

falsa

sentencia

sentencia

sentencia

sentencia

mientrascondición

verdadera

Page 98: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 98/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

9

 

Figura 6. Diagrama de Flujo del Ciclo Do

Ejemplo:

Algoritmo que desarrolla el factorial de un número N con la formula:

N! = N . (N-1) . (N-2), … , 3 . 2 . 1

Algoritmo factorial_numero 

inicio

declarar variablesenteras Q, Nreal factorial

escribir ( ‘ Programa que da el factorial de un numero dado desde el teclado ‘ )escribir ( ‘ Da el número para obtener el factorial ‘ )leer ( N )factorial← 1Q ← 1hacer 

factorial← factorial * QQ ← Q + 1

mientras ( Q < = N )escribir ( ‘ El factorial del número ‘ N ‘ es: ‘ , factorial )pausa

finPrograma factorial_numero

#include <stdio.h>#include<conio.h>void main(){

int Q, N;float factorial;

 printf("\n\n Programa que da el factorial de un numero dado desdeel teclado ‘ ); printf( “ Da el número para obtener el factorial \n “);scanf("%d",&N);factorial = 1;

Q = 1;do{

factorial = factorial * Q;Q = Q + 1;

}while ( Q < = N);

 printf(“ El factorial del número %d es: %f “, N , factorial );getch();

}

Page 99: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 99/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

9

En un ciclo de repetición como lo es el do-while primero se ejecuta el cuerpo del bucle siempreal menos una vez. Cuando este se ejecuta lo primero que se realiza es el bloque desentencias, para al final evaluar la expresión booleana resultante de la condición, si dichacondición es falsa se ejecuta al menos una vez el bloque y si la condición se evalúa averdadera se regresa el control al inicio del bloque de sentencias y se vuelven a ejecutar todas

para llegar de nueva cuenta a la evaluación de la condición; si esta sigue siendo verdadera sevuelve a repetir y así sucesivamente hasta que la condición resulte ser falsa y da por terminadoel proceso.

El siguiente programa imprime los 100 primeros números

Algoritmo:

Algoritmo cien_numerosiniciodeclarar variables

enteras numeronumero← 1escribir ( ‘ Programa cien números ‘)hacer 

escribir ( ‘ numero ‘ )numero← numero + 1

mientras ( numero < = 100 )pausafin

Programa:

#include <stdio.h>#include<conio.h>void main(){

int numero;numero = 1;

 printf ( “ Programa cien numerous \n “ );do{ printf( “ %d \n “, numero);numero = numero + 1;

}while ( numero < = 100);getch();}

Diferencias de la estructura while y do-while:

o La estructura while ejecuta el bloque de sentencias mientras la condición seaverdadera, como esta se encuentra al inicio del ciclo; si esta es falsa nunca se ejecutael bloque de sentencias.

o La estructura do-while ejecuta siempre el bloque de sentencias al menos una vez, sinimportar la condición que tenga, ya que esta se evalúa al final del ciclo de repetición(después de todas las sentencias).

o La estructura do-while se ejecuta al menos una vez, por el contrario, la estructura whilees más general y permite la posibilidad de que nunca se ejecute el bucle.

3.3. Estructuras de Control

Page 100: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 100/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

Las estructuras de control de un lenguaje de programación se refieren a él orden en que lasinstrucciones de un algoritmo se ejecutarán. El orden de ejecución de las sentencias oinstrucciones determina el flujo de control.

Estas estructuras de control son por consiguiente fundamentales en los lenguajes de

programación y en los diseños de algoritmos especialmente los pseudocódigos.

Las tres estructuras de control básico son:

• secuencia• selección• repetición

Figura 7. Estructuras de Control

Por lo regular en un programa los enunciados son ejecutados uno después del otro, en el ordenen que aparecen escritos. Esto se conoce como ejecución secuencial. Sin embargo, existenenunciados que le permiten al programador especificar que el enunciado siguiente a ejecutar pueda ser otro diferente al que sigue en secuencia. Esto se conoce como transferencia decontrol.

Todos los programas pueden ser escritos en términos de solo tres estructuras de control, asaber, la estructura de secuencia, la estructura de selección y la estructura de repetición obucle.

Hay dos tipos de sentencias condicionales o de selección, la sentencia if y switch, por otro ladopara las de iteración se encuentran los bucles for, while, do-while.

Sentencia if Sintaxis en su forma simple:

si ( condición ) entoncesSentencia1

fin_si

Sintaxis en su forma compuesta:

si ( condición ) entonces

A

B

C

Secuencia

C

A B

SiNo

Selección Iteración

C

B

No

Si

Page 101: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 101/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

Sentencia1si_no

Sentencia2fin_si

La forma general de estas sentencias es:if (expresión)

sentencia1

if (expresión)sentencia1 /*bloque1*/ 

elsesentencia2 /*bloque2*/ 

Cuando dentro de cada sentencia se ejecutará más de una proceso, se deben de poner llavespara delimitar cuantas sentencias ejecutará cada bloque y en donde han de terminar estas.

Sintaxis del ciclo if con más de una sentencia:

si ( condición ) entonces{

bloque de Sentencias}fin_si

Sintaxis en su forma compuesta:

si ( condición ) entonces{

bloque de sentencias}

si_no{

bloque de sentencias}fin_si

La forma general de estas sentencias es:

if (expresión){

sentencia1;sentencia2;sentencia3;

.

.

.SentenciaN;

}

if (expresión){

sentencia1a; /*bloque1*/ sentencia2a;sentencia3a;

.

Page 102: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 102/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

.

.sentenciaNa;

}else{

Sentencia1b;Sentencia2b; /*bloque2*/ Sentencia3b;

.

.

.sentenciaNb;

}

Si la ejecución es verdadera se ejecuta la sentencia1 bloque1, si es falsa se ejecuta lasentencia 2 o bloque2. En donde los objetos de if y else son sentencias simples. La sentenciaif es opcional.

Es importante saber que solo se ejecutará una sentencia o un bloque, nunca ambos.

Diagrama de Flujo del ciclo If:

Figura 8. Sentencia if 

Un ejemplo de uso de esta sentencia es el siguiente fragmento de programa, que decide si unnúmero es par:

Algoritmo:

declarar variablesenteras numero← 0

esPar ← 0si ( ( numero % 2 ) = 0 ) entoncesesPar ← 1

fin_si

Programa:

int numero = 0,esPar = 0;

Condición

Sentencia 2 Sentencia 1

SiNo

Page 103: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 103/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

if ((numero % 2) == 0)esPar = 1;

Sentencia Switch: 

Esta sentencia es de decisión con bifurcación múltiple, compara sucesivamente una variablecon una lista de enteros. Cuando se obtiene una igualdad, se ejecuta una sentencia o bloquede sentencias. El default se ejecuta si no se encuentran igualdades. El default es opcional y sino esta presente no tiene lugar ninguna opción cuando todas las comprobaciones fallan.El switch defiere del if del que solo puede probar una igualdad, mientras que if puede evaluar una expresión relacional o lógica.La sentencia break se utiliza dentro de cada case, originando que el control del programa salgade la sentencia completa del switch y continua en la sentencia siguiente al switch, si no seencuentran las sentencias break, todas las sentencias antes y después de la igualdad seejecutarán.

Se puede pensar que case es una etiqueta para indicar donde debe seguir la ejecución,después de leer una opción desde el teclado.

La forma general de esta sentencia es:

según_sea (expresión exp) hacer {

exp 1 : sentencia 1a;sentencia 2a;

.

.

.break

exp 2 : sentencia 1b;sentencia 2b;

.

.

.breakexp 3 : sentencia 1c;

sentencia 2c;...

breakdefault : sentencia 1xbreak

fin_según_sea

Su representación en programación es:

switch (expresión){case exp 1:

sentencia 1;sentencia 2;break;

case exp 2:sentencia 1;sentencia 2;break;

Page 104: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 104/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

 case exp N:

sentencia N;break;

default:sentencia D;

}

Diagrama de Flujo: 

Figura 9. Estructura Switch

Sentencia for 

Esta sentencia tiene como característica que permite la declaración de las variables dentro desu estructura. Ayudando a ser más entendible y legible su ejecución, como en él se inicializanlos valores de las variables, se pueden dar incrementos o decrementos en las cantidades queuno desee al instante, esto es, antes de entrar al ciclo de repetición el programador ya sabecomo va empezar y terminar con exactitud el ciclo y de cuanto en cuanto va a ir avanzando lavariable.

Sintaxis:

para ( inicialización; condición; incremento) hacer 

sentenciaCon más de una sentencia dentro del cuerpo del ciclo for quedaría:

para ( inicialización; condición; incremento) hacer {

bloque de sentencias}

En Lenguaje C propiamente estaría:

sentencias

breakbreak

Inicio

Evalúa Expresión

Case 1 Case 1Case 1Case 1

sentenciassentenciassentencias

break break

fin

sentencias

breakbreak

Page 105: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 105/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

 for simple:

for (expresion 1; expresion 2; expresion 3)sentencia;

for compuesto por mas de una sentencia:

for (expresion 1; expresion 2; expresion 3){

Sentencia1;Sentencia2;

Sentencia3;

.

.

.

sentenciaN;

}

Expresión1 (inicialización).- declaración de las variables y asignación de valores iniciales.Expresión2 (condición).- instrucción que puede evaluarse de tal forma que se obtenga comoresultado un valor de verdad (falso/true), mientras la condición se cumpla, se ejecutará.Expresión3 (control).- es el conjunto de instrucciones, separadas por comas, que controlan lavariación de los valores de las variables utilizadas.

Diagrama de Flujo del ciclo For 

Sentencias

I← vi

I > vf I← vi + y

Sentencias

Sentencias

No

Si

Page 106: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 106/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

 

Figura 10. Estructura for 

En el diagram de flujo anterior se expresa el ciclo for con las literales siguientes: I = variable, vi= valor inicial, vf = valor final y Y = como un valor cualquiera de incremento para que nos ayude

a salir del ciclo de repetición. Si la variable no cumple la condición, el ciclo se seguirárepitiendo, hasta que la condición se cumpla o sea verdadera el ciclo (bucle) se dará por terminado y por ende continúa el programa en la siguiente instrucción después del ciclo for.

Algoritmo:

iniciodeclarar 

entero contador para ( contador = 1; contador <= 10; contador++ ) hacer 

escribir ( ‘ contador ‘ )fin_para

Programa:

#include <stdio.h>main(){

int contador;for (contador=1; contador<=10; contador++) printf("%d ", contador);

}

Sentencia while 

Si se desea hacer que una parte del programa se repita mientras se cumpla una ciertacondición, se puede usar la sentencia “while”.Mientras la condición se mantenga verdadera, el bloque de instrucciones se ejecutará ‘x’cantidad de veces. Es necesario que alguna vez la condición se haga falsa, pues de locontrario se haría un bucle infinito, por lo tanto es necesario que en el bloque se ejecute algunaacción que haga falsa la condición.

La forma general de esta sentencia es:

while (expresión)sentencia;

Page 107: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 107/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

 

Algoritmo:De un mientras simple

mientras ( condición ) hacer sentencia

Algoritmo:De un mientras compuesto con más de una línea en el cuerpo del bucle

mientras ( condición ) hacer {

bloque de sentencias}

Diagrama de Flujo del While

Figura 11. Sentencia While

Un ejemplo que nos diga si cada número que tecleemos es positivo o negativo, y que parecuando tecleemos el número 0, podría ser:

Algoritmo:

iniciodeclarar variable

entera numeroescribir ( ‘ Teclea un número (0 para salir) ‘ )leer numeromientras numero > 0 hacer 

si numero > 0escribir ( ‘ Es positivo ‘ )

si_no

sentencias

Mientrascondición

Cuerpo delprograma

(sentencias)

No

Si

Page 108: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 108/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

escribir ( ‘ Es negativo ‘ )fin_siescribir ( ‘ Teclea otro numero ( 0 para salir ) ‘ )leer numero

fin_mientras

finPrograma:

#include <stdio.h>main(){

int numero; printf("Teclea un número (0 para salir): ");scanf("%d", &numero);

while (numero!=0){

if (numero > 0) printf("Es positivo\n");

else

 printf("Es negativo\n"); printf("Teclea otro número (0 para salir): ");scanf("%d", &numero);

}}

Sentencia do-while 

Tiene un comportamiento similar al while, solo que en este caso la sentencia do-while, primeroejecutará la serie de instrucciones y después se evalúa la condición, con esto se asegura queel bloque se ejecutará al menos una sola vez.

Sintaxis:

hacer sentencias

mientras (condición)

En lenguaje C es así:

dosentencia;

while (condición);

En el caso de la siguiente sintaxis se abren y cierran llaves debido a que no solo es unasentencia la que se va a realizar dentro del ciclo de repetición, sino que se ejecutarán muchaslíneas de código (sentencias).

do { bloque de sentencias; 

 }while (condición); 

Diagrama de Flujo del ciclo Do – While

Sentencias

Acciones

Mientrascondición

verdadera

Falsa

Page 109: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 109/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

 

Figura 12. Estructura do-while

Veremos ahora un ejemplo en el cual se va a requerir una clave de acceso y no se va a dejar entrar hasta que se teclee la opción correcta. 

Algoritmo:

iniciodeclarar variables

Enteras valida = 711, clavehacer 

escribir ( ‘ Introduzca su clave numérica: ‘ )leer clavesi clave != valida

escribir ( ‘ No válida ! ‘ )fin_si

mientras_que ( clave != valida )escribir ( ‘ Aceptada. ‘ )fin

Programa:

#include <stdio.h>int main(){

int valida = 711;int clave;

do{ printf("Introduzca su clave numérica: ");scanf("%d", &clave);

if (clave != valida)

 printf("No válida!\n");}

while (clave != valida); printf("Aceptada.\n");

}

3.3.1 Ruptura de un Lazo 

Los enunciados break  y continue  son utilizados para modificar el flujo de control dentro de unprograma.

Page 110: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 110/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

Sentencia break 

La sentencia break tiene dos usos. El primer uso es terminar un case en la sentencia del switch .El segundo es ser utilizado dentro de las estructuras de control causa la inmediata salida dedicha estructura (por lo tanto no sigue repitiéndose el bloque y continúa la ejecución de las

instrucciones que le siguen a la estructura de control).

Cuando se encuentra la sentencia break en un bucle, la computadora termina inmediatamenteel bucle y el control del programa vuelve a la sentencia siguiente del bucle, por ejemplo:

Algoritmo:

iniciodeclarar variables

entero tpara ( t = 0;t < 100;t++ ) hacer 

escribir ( ‘ t ‘ )si ( t = 10 ) entonces

romper fin_si

fin_parapausafin

Programa:

int main(){int t;for(t=0;t<100;t++){ printf(“%d”,t);

if(t==10)

break;}

getch();}

Este programa imprime el número de 0 a 10 en la pantalla y después termina porque el break causa la salida inmediata del bucle. El break salta la prueba condicional t<100 construida en elbucle.

Sentencia continue  

La sentencia continue funciona de manera similar a la sentencia break. Sin embargo, en vez deforzar la continuación, continue fuerza la siguiente iteración y salta cualquier código entremedias. Por ejemplo, el siguiente programa solo visualiza los números pares.

Algoritmo:

iniciodeclarar variables

entero xpara ( x = 0; x < 100; x++ ) hacer 

si ( x % 2 ) entoncescontinua

fin_si

Page 111: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 111/139

UNIDAD III ESTRUCUTRAS DE FLUJO PROGRAMÁTICO

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

escribir ( ‘ x ‘ )fin_parapausafin

Programa:int main(){

int x;for(x=0;x<100;x++){

if(x%2) continue; printf(“%d”,x);

}getch();}

Cada vez que el programa genera un número impar, la sentencia if ejecuta ya que el resto deun numero impar entre 2 es igual a 1, que es verdad. Así un número impar provoca la ejecuciónde continue, que provocará que ocurra la siguiente iteración, saltando la sentencia printf.

En los bucles while y do - while, una sentencia continue provoca que el control del programavaya directo a la prueba condicional y después continue el proceso del bucle. En el caso del for la computadora realiza primero la parte de incremento del bucle y después la pruebacondicional, después continúa finalmente el bucle.

Se puede usar continue para expeditar la terminación de un bucle forzando a la computadora arealizar la prueba condicional tan pronto como encuentra alguna condición de terminación.

Page 112: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 112/139

UNIDAD IV ESTRUCUTRAS DE DATOS

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

4.1. Arreglo Unidimensionales

4.1.1. Concepto y forma general 

Un arreglo unidimensional es un tipo de datos estructurado que está formado de una colección

finita y ordenada de datos del mismo tipo. Es la estructura natural para modelar listas deelementos iguales.

El tipo de acceso a los arreglos unidimensionales es el acceso directo, es decir, podemosacceder a cualquier elemento del arreglo sin tener que consultar a elementos anteriores oposteriores, esto mediante el uso de un índice para cada elemento del arreglo que nos da suposición relativa. Para implementar arreglos unidimensionales se debe reservar espacio enmemoria, y se debe proporcionar la dirección base del arreglo, la cota superior y la inferior. 

La declaración de arreglos sigue la estructura general de las declaraciones, es decir consta deun especificador de clase de almacenamiento opcional, un especificador de tipo de dato, elidentificador del arreglo, el operador u operadores de arreglo con su respectiva dimensión y elinicializador es opcional.

Sintaxis:

Tipo de dato nombre_del_arreglo [dimensión]; 

Como ejemplo se tiene:

int a[5];float arre[50];char vector[20];

El tipo de acceso a los arreglos unidimensionales es el acceso directo, es decir, podemosacceder a cualquier elemento del arreglo sin tener que consultar a elementos anteriores oposteriores, esto mediante el uso de un índice para cada elemento del arreglo que nos da su

posición relativa.Para implementar arreglos unidimensionales se debe reservar espacio en memoria, y se debeproporcionar la dirección base del arreglo, la cota superior y la inferior. 

Figura 13. Arreglo Unidimensional

Un arreglo (array) matriz o vector es un conjunto ordenado de elementos homogéneos; esto es,un arreglo unidimensional va de uno en uno empezando en la localidad número cero y de estamanera se puede accesar en cualquier instante a la localidad que se desee. Un arreglo se

Elemento 1

Elemento 2

Elemento 3

Elemento 4

.

.

.

Elemento N

Page 113: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 113/139

UNIDAD IV ESTRUCUTRAS DE DATOS

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

dice que es homogéneo porque todos sus elementos son del mismo tipo, por eso nuncapodremos encontrar un arreglo que contenga en su interior valores enteros conjuntamente convalores de tipo carácter o veceversa.

Los arreglos están formados por un conjunto de elementos de un mismo tipo de datos que se

almacenan bajo un mismo nombre, y se diferencian por la posición que tiene cada elementodentro del arreglo de datos. Al declarar un arreglo, se debe inicializar sus elementos antes deutilizarlos. Para declarar un arreglo tiene que indicar su tipo, un nombre único y la cantidad deelementos que va a contener. Por ejemplo, las siguientes instrucciones declaran tres arreglosdistintos:

float costo_partes[50];

int edad_empleados [100];

float precios_acciones [25];

int calificaciones [100];

tipo nombre_arreglo tamaño del arreglo

Figura 14. Estructura de un arreglo

Para acceder a valores específicos del arreglo, use un valor de índice que apunte al elemento

deseado. Por ejemplo, para acceder al primer elemento del arreglo calificaciones debe utilizar el valor de índice 0 (calificaciones[0]). Los programas en C siempre indican el primer elementode un arreglo con 0 y el último con un valor menor en una unidad al tamaño del arreglo.

El índice siempre va entre corchetes e indica la posición y orden de un vector, por ejemploestos serían ejemplos de arreglos y sus índices.

A[1], A[2], A[3], … , A[N]

Arr[0], arr[1], arr[2], … , arr[n]

Calificaciones [0]

Calificaciones [1]

Calificaciones [2]

.

.

.

Calificaciones [99]

Page 114: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 114/139

UNIDAD IV ESTRUCUTRAS DE DATOS

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

La inicialización de arreglos se realiza por medio del conjunto de valores iniciales de losdistintos elementos del arreglo, agrupado por medio de llaves.La asignación de valores al arreglo unidimensional es en orden de secuencia con respecto alvalor del índice [0] a [N].

Asignación de un arreglo de tipo entero llamado “ a “ y uno de tipo real llamado “ datos “:int a[5] = {1,2,3,5,6};

float datos[6] = { 3.4, 6.8, 2.2, 10, 6.6, 9.9 }

En el siguiente ejemplo se muestra el llenado de un arreglo (vector) con valores de cero a 10,empezando a llenar en la localidad cero y terminando en la localidad nueve.

Algoritmo:

inicioconstante Tam 10declarar variables

entero i, a[Tam]para (i = 0; i < Tam; i++) hacer 

a[i]← 0fin_parapara (i = 0; i < Tam; i++) hacer 

escribir ( ‘ a[i] ‘ )fin_para

return 0;fin

Programa:

#include <stdio.h>#define Tam 10int main(void)

{int i, a[Tam];

for(i = 0; i < Tam; i++)a[i] = 0;

for(i = 0; i < Tam; i++) printf ("%d\n", a[i]);

return 0;}

Cuando se usan arreglos, una operación común es usar una variable índice para acceder a loselementos de un arreglo. Suponiendo que el arreglo se llamará valores, y la variable índice icontiene el número 3, la siguiente instrucción asignará el valor 400 a dicho vector, como sifuera una variable simple al ocupar una posición de memoria:

Valores [3]← 400

Valores [3] = 400;

Partes de un arreglo: 

Page 115: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 115/139

UNIDAD IV ESTRUCUTRAS DE DATOS

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

Nombre X[0] X[1] X[2] X[3] X[4] X[5] X[6] e índice 

Elemento1 Elemento2 Elemento3 Elemento7 Figura 15. Elementos de un arreglo

Los componentes. Hacen referencia a los elementos que forman el arreglo, es decir, a losvalores que se almacenan en cada una de las casillas del mismo. Los índices, permiten hacer referencia a los componentes del arreglo, en forma individual especifican cuántos elementostendrá el arreglo y además, de qué modo podrán accesarse a esos componentes. 

Componentes

Figura 16. Componentes de un arreglo

Las operaciones que se pueden realizar con vectores durante el proceso de resolución de unproblema son:

· Lectura/ escritura

· Asignación

· Actualización (inserción, eliminación, modificación)

· Recorrido (acceso secuencial)

· Ordenación

· Búsqueda

Ejemplos:

Sea arre un arreglo de 70 elementos enteros con índices enteros. Su representación nosqueda:

23 778 10 51 100 ……. 11 99

“0” “1” “2” “3” “4” …….. “68” “69”

Figura 17. Arreglo de enteros

S1 S2 S3 . . . SN

14.0  8.0 10.5 4.5 12.0 5.5 10.0

Page 116: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 116/139

UNIDAD IV ESTRUCUTRAS DE DATOS

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

Lectura El proceso de lectura de un arreglo consiste en leer y asignar un valor a cada uno de suselementos. Normalmente se realizan con estructuras repetitivas, aunque pueden usarseestructuras selectivas. Usamos los índices para recorrer los elementos del arreglo:

Algoritmo:para ( i = 1; i <= 70; i++ ) hacer 

leer ( arre[i])fin_desde

Programa:

for ( i = 1; i <= 70; i++ )scanf ( “%d” , & arre [i]);

Escritura:  Es similar al caso de lectura, sólo que en vez de leer el componente del arreglo, lo escribimos.

Algoritmo:

leer (N)para ( i = 1 ; i <= N ; i++ ) hacer 

escribir ( arre[i] )fin_para

Programa:

scanf ( “%d” , & N);for ( i = 1; i <= N; i++ )

 printf ( “ %d \n ” , arre [i]);

Asignación:  No es posible asignar directamente un valor a todo el arreglo; sino que se debe asignar el valor deseado en cada componente. Con una estructura repetitiva se puede asignar un valor a todoslos elementos del vector.

Por ejemplo:

arre[1] = 120;(asignación de un valor constante único a una casilla del vector)

arre[3] = arre[1] / 4; (asignar una operación)

Se puede asignar un valor constante a todos los elementos del vector:

Algoritmo:

para ( i = 1; i <= 5; i++ ) hacer arre[i]← 3

fin_desde

Programa:

for ( i = 1; i <= 5; i++ )arre [i] = 3;

O bien

Page 117: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 117/139

UNIDAD IV ESTRUCUTRAS DE DATOS

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

 arre = 3 (con arre del tipo arreglo)

Inicialización Para inicializar con cero todos los elementos del arreglo:

Algoritmo:

para ( i = 1; i <= 70; i++ ) hacer arre[i]← 0

fin_para

Programa:

for ( i = 1; i <= 70; i++ )arre [i] = 0;

0 0 0 0 0 ……. 0 0

1 2 3 4 5 ........ 69 70

Arre [ 70 ]

Figura 18. Arreglo con for 

Acceso Secuencial. (Recorrido)

El acceso a los elementos de un vector puede ser para leer en él o para escribir (visualizar sucontenido). Recorrido del vector es la operación de efectuar una acción general sobre todos loselementos de ese vector.

Actualización.Incluye añadir (insertar), borrar o modificar algunos de los ya existentes. Se debe tener encuenta si el arreglo está o no ordenado. Añadir datos a un vector consiste en agregar un nuevoelemento al final del vector, siempre que haya espacio en memoria.

Ejemplo.

Algoritmo:

iniciodeclarar variables

entero i

entero a[ 5 ]para ( i = 0; i < 4; i++ ) hacer excribir ( ‘ Ingrese el elemento: ‘ )leer ( a [ i ] )

fin_parapara ( i = 0; i < 4; i++ ) hacer 

excribir ( ‘ Elemento: ‘ , a [ i ] )fin_parapausafin

Page 118: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 118/139

UNIDAD IV ESTRUCUTRAS DE DATOS

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

Programa:

#include<stdio.h>#include<conio.h>void main()

{int a[5]; // Definición de un arreglo de 5 posicionesint i;

// Pedimos el ingreso de 5 númerosfor(i=0; i<4; i++)

//No olvidar que los arreglos van de 0 a longitud-1{

 printf(“ Ingrese el elemento: ”);scanf(“%d”,&a[i]);

}// Para imprimir será

for(i=0; i<4; i++){

 printf(“ Elemento: %d ”,a[i]);

}getch();

}

4.1.2. Arreglos numéricos y de caracteres 

Un vector a de 10 enteros de tipo int se declara así:

int a[10];

El vector a comprende los elementos a[0], a[1], a[2], . . . , a[9], todos de tipo int. Los índices delos vectores en C empiezan en cero.

 Al igual que ocurría con las variables “normales”, podemos dar valor a los elementos de unarreglo al principio del programa.

Esta vez los indicaremos todos entre llaves, separados por comas

 Algoritmo:

iniciodeclarar variables

entero numero [ 5 ] = { 200, 150, 100, -50, 300 }entero suma

suma = numero [0] + numero[1] + numero [2] + numero[3] + numero [4]escribir ( ‘ Su suma es ‘, suma )

pausafin

Programa:

#include <stdio.h>main(){int numero[5] ={200,150,100,-50,300};//Un array de 5 números enterosint suma; // Un entero que será la suma

Page 119: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 119/139

UNIDAD IV ESTRUCUTRAS DE DATOS

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

suma = numero[0]+numero[1]+numero[2]+numero[3]+numero[4]; printf("Su suma es %d", suma);getch();

}

En una misma línea puedes declarar más de un vector, siempre que todos compartan el mismotipo de datos para sus componentes. 

Las cadenas en C son vectores de caracteres (elementos de tipo char) con una peculiaridad: eltexto de la cadena termina siempre en un carácter nulo.El carácter nulo tiene código ASCII 0 y podemos representarlo tanto con el entero 0 como conel carácter ’\0’.

Declaración de cadenas 

Las cadenas se declaran como vectores de caracteres, así que debes proporcionar el númeromáximo de caracteres que es capaz de almacenar: su capacidad. Esta cadena, por ejemplo, sedeclara con capacidad para almacenar 10 caracteres:

char a[10];

Puedes inicializar la cadena con un valor en el momento de su declaración:

char a[10] = "cadena";

Se muestra la declaración como un vector de 10 caracteres y lo hemos inicializado asignándolela cadena "cadena". Es decir, es como si hubiésemos inicializado la cadena de este otromodo, equivalente:

char a[10] = { ’c’, ’a’, ’d’, ’e’, ’n’, ’a’, ’\0’ };

4.2. Arreglos bidimensionales4.2.1. Concepto y forma general 

Los arreglo bidimensionales son una forma de lograr que nuestro programa pueda hacer tablas, utilizando un índice que será siempre un dato del tipo entero. La mayoría de lasdefiniciones de qué es una tabla son como la siguiente, "Una tabla es un conjunto de variablesque comparten el mismo tipo de dato y nombre y a las que se hace referencia a través de uníndice" (el índice como ya se dijo antes debe ser un tipo de dato entero).

Este tipo de arreglos al igual que los anteriores es un tipo de dato estructurado, finito ordenadoy homogéneo.

El acceso a ellos también es en forma directa por medio de un par de índices. Los arreglos

bidimensionales se usan para representar datos que pueden verse como una tabla con filas ycolumnas. La primera dimensión del arreglo representa las columnas, cada elemento contieneun valor y cada dimensión representa una relación.

Elemento 1,1 ….. Elemento 1,nElemento 2,1 …. Elemento 2,nElemento 3,1 …. Elemento 3,n…. …. ….Elemento m,1 …. Elemento m,n

Page 120: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 120/139

UNIDAD IV ESTRUCUTRAS DE DATOS

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

Figura 19. Matriz M x N

También es importante mencionar que algunos autores hacen uso del termino "vector" en loslenguajes de programación (igual que en las matemáticas) para referirse a las tablas de unasola dimensión y que matriz siempre se refiere a tablas bidimensionales.

Sintaxis de un arreglo bidimensional:

Tipo de dato nombre del arreglo [filas][columnas];

La representación en memoria se realiza de dos formas: almacenamiento por columnas o por renglones.

Un arreglo bidimensional “ a “, que contienen tres filas y cuatro columnas (es decir un arreglode tres por cuatro). En general, a este tipo de arreglo con m  filas y n columnas se le llamaarreglo de n x m (bidimensional). 

Es un conjunto de datos homogéneo, finito y ordenado, donde se hace referencia a cadaelemento por medio de dos índices. El primero se utiliza para los renglones (filas) y el segundopara las columnas. También puede definirse como un arreglo de arreglos. Internamente enmemoria se reservan MxN posiciones consecutivas para almacenar todos los elementos delarreglo. 

Declaración de una matriz:

arreglo [ liminf1, limsup1, liminf2, limsup2 ]

filas columnas

Por ejemplo:

1 <= I <= M1 <= J <= N

Se representaría como se muestra a continuación en forma de una tabla

1 2 J N1

2

IM

Figura 20. Declaración de una matriz

Algoritmo para el recorrido por filas:

constantesM =valor1N = valor2

declarar variablesreal Matriz [M][N]

para ( i = 1; i<= M; i++ ) hacer 

… …... …

Page 121: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 121/139

UNIDAD IV ESTRUCUTRAS DE DATOS

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

para ( j = 1; j<= N; j++ ) hacer escribir ( Matriz [ i] [j ] )

fin_desdefin_desde

Programa:#include <stdio.h>#define M valor1#define N valor2main(){float Matriz[M][N]//Un array de M x N números realesfor(i=1;i<=M;i++)for ( j = 1; j<= N; j++ )

 printf(" %f ", Matriz [M][N]);getch();}

El recorrido por columnas se hace de manera similar, invirtiendo el sentido de los índices.

constantesM valor1N valor2

declarar variablesreal Matriz [N][M]

para ( i = 1; i<= N; i++ ) hacer para ( j = 1; j<= M; j++ ) hacer 

escribir ( Matriz [ i] [j ] )fin_desde

fin_desde

Programa:

#include <stdio.h>#define M valor1#define N valor2main(){float Matriz[N][M]//Un array de M x N números realesfor(i=1;i<=N;i++)for ( j = 1; j<= M; j++ )

 printf(" %f ", Matriz [N][M]);getch();}

Ejemplos.1) Rellenar una matriz identidad de 4 por 4 elementos.

Una matriz identidad es aquella en la que la diagonal principal está llena de unos y el resto delos elementos son cero. Para llenar la matriz identidad se debe verificar que cuando los índicesi y j sean iguales, la posición vale 1, en caso contrario se asigna cero al elemento i, j.

1 0 0 0

0 1 0 0

Page 122: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 122/139

UNIDAD IV ESTRUCUTRAS DE DATOS

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

0 0 1 0

0 0 0 1

Figura 21. Matriz Identidad

Algoritmoiniciopara ( i = 1; i<= 4; i++ ) hacer 

para ( j = 1; j <= 4; j++) hacer si ( i = j ) entonces

Matriz [i] [j] 1si_no

Matriz[i] [j] 0fin_si

fin_desdefin_desde

fin

Programa:

#include <stdio.h>void main(){for(i=1;i<=4;i++)

for ( j = 1; j<= 4; j++ )if (i == j )

Matriz [i][j] = 1;else

Matriz [i][j] = 0;getch();}

Las operaciones en arreglos pueden clasificarse de la siguiente forma:

a) lectura Este proceso consiste en leer un dato de un arreglo y asignar un valor a cada uno de suscomponentes.

La lectura se realiza de la siguiente manera:

Algoritmo:

escribir ( ‘ Cuantos valores deseas que tenga el arreglo ‘ )leer ( N )para ( i=1; i<= N; i++ ) hacer 

leer ( arreglo[i] )

Programa:

 printf ( “ Cuantos valores deseas que tenga el arreglo “);scanf (“%d”, &N);for ( i=1; i<= N; i++ )

scanf ( “%d”, & arreglo [i] );

b) escritura Consiste en después de asignarle valores a cada elemento del arreglo, mostrarlos en pantalla.La escritura se realiza de la siguiente manera:

Page 123: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 123/139

UNIDAD IV ESTRUCUTRAS DE DATOS

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

Algoritmo:

escribir ( ‘ Cuantos valores deseas que tenga el arreglo ‘ )leer ( N )para ( i=1; i<= N; i++ ) hacer 

leer ( arreglo[i] )para ( i=1; i<= N; i++ ) hacer 

escribir ( arreglo [i] );

Programa:

 printf ( “ Cuantos valores deseas que tenga el arreglo “);scanf (“%d”, &N);for ( i=1; i<= N; i++ )

scanf ( “%d”, &arreglo [i] );

for ( i=1; i<= N; i++ ) printf( “ %d “, arreglo [i] );

c) asignación No es posible asignar directamente un valor a todo el arreglo, por lo que se realiza mediantelos ciclo de repetición cualquiera de ellos como el for, el do – while ó el while con cualquiera deellos el resultado es exactamente el mismo, y es de la manera siguiente:

Algoritmo:

escribir ( ‘ Cuantos valores deseas que tenga el arreglo ‘ )leer ( N )para ( i=1; i<= N; i++ ) hacer 

arreglo[i] i

Programa:

 printf ( “ Cuantos valores deseas que tenga el arreglo “);scanf (“%d”, &N);for ( i=1; i<= N; i++ )

arreglo [i] = i;

En el caso anterior el arreglo es llenado propiamente con la misma variable del ciclo for, por lotanto; el arreglo contiene valores que van del 1 al valor N que dio el usuario.

d) actualización Dentro de esta operación se encuentran las operaciones de eliminar, insertar y modificar datos.Para realizar este tipo de operaciones se debe tomar en cuenta si el arreglo está o noordenado.

La definición formal del parámetro le permite al compilador determinar las características del

valor del puntero que será pasado en tiempo de ejecución.

4.2.2. Arreglos numéricos y de caracteres 

En una cadena que definamos como “char texto[40]” lo habitual es que realmente no ocupemoslas 39 letras que podríamos llegar a usar. Si guardamos 9 letras (y el carácter nulo que marcael final), tendremos 30 posiciones que no hemos usado. Pero estas 30 posicionesgeneralmente contendrán “basura”, lo que hubiera previamente en esas posiciones dememoria, porque el compilador las reserva para nosotros pero no las “limpia”, por lo tanto elcarácter que marca el final de nuestra cadena es el nulo “/0”.

Page 124: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 124/139

UNIDAD IV ESTRUCUTRAS DE DATOS

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

Hay una función de cadena predefinida por lenguaje C que nos dice cuantas letras hemosusado realmente en nuestra cadena sin necesidad de contabilizarlo nosotros mismos, lo haceautomáticamente y es “strlen”, que se usa así:

 Algoritmo:

iniciodeclarar variables

carácter texto[ 40 ]escribir ( ‘ Introduce una palabra: ‘ )leer ( texto )escribir ( ‘ Has tecleado ‘ , strlen (texto) , ‘ letras ‘ )pausafin

Programa:

#include <stdio.h>#include <string.h>

main(){char texto[40];

 printf("Introduce una palabra: ");scanf("%s", texto);

 printf("Has tecleado %d letras", strlen(texto));getch();

}

Como es de esperar, si escribimos “Hola”, esta orden nos dirá que hemos tecleado 4 letras (nocuenta el carácter nulo “\0” que se añade automáticamente al final).Si empleamos esta orden, o alguna de las otras órdenes relacionadas con cadenas de textoque veremos en este tema, debemos incluir la cabecera <string.h>, que es donde se definentodas ellas. 

Hemos visto que si leemos una cadena de texto con “scanf”, se paraba en el primer espacio enblanco y no seguía leyendo a partir de ese punto. Existen otras órdenes que están diseñadasespecíficamente para manejar cadenas de texto, y que nos podrán servir en casos como éste.

Para leer una cadena de texto (completa, sin parar en el primer espacio), usaríamos la orden“gets”, así:

gets(texto);  

De igual modo, para escribir un texto en pantalla podemos usar “puts”, que muestra la cadenade texto y avanza a la línea siguiente: 

puts(texto); 

Sería equivalente a esta otra orden:

 printf("%s\n", texto);

Cuando queremos dar a una variable el valor de otra, normalmente usamos construccionescomo a = 2, o como a = b. Pero en el caso de las cadenas de texto, esta NO es la formacorrecta, no podemos hacer algo como saludo = "hola" ni algo como texto1 = texto2. Sihacemos algo así, haremos que las dos cadenas estén en la misma posición de memoria, yque los cambios que hagamos a una de ellas se reflejen también en la otra. La forma correctade guardar en una cadena de texto un cierto valor es:

Page 125: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 125/139

UNIDAD IV ESTRUCUTRAS DE DATOS

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

 strcpy (destino, origen); 

Es decir, debemos usar una función llamada strcpy (cadena destino, cadena origen), que seencuentra también en <string.h>. Vamos a ver dos ejemplos de su uso:

strcpy (saludo, "hola");strcpy (textoDefinitivo, textoProvisional);

En este ejemplo el mensaje cadena “hola” es copiado en la variable llamada saludo.Es nuestra responsabilidad que en la cadena de destino haya suficiente espacio  reservadopara copiar lo que queremos. Si no es así, estaremos sobrescribiendo direcciones de memoriaen las que no sabemos qué hay.

Para evitar este problema, tenemos una forma de indicar que queremos copiar sólo losprimeros n bytes de origen, usando la función strncpy, así:

strncpy (destino, origen, n); 

Vamos a ver un ejemplo, que nos pida que tecleemos una frase y guarde en otra variable sólolas 4 primeras letras:

Algoritmo:

iniciodeclarar variables

carácter texto1[ 40 ]carácter texto2[ 40 ]carácter texto3[ 10 ]

limpiar pantallaescribir ( ‘ Introduce una frase: ‘ )leer ( texto1 )copiar_cadena (text2, texto1)escribir ( ‘ Una copia de tu texto es: ‘, texto2 )copiar_cadena_n ( texto3, texto1, 4)escribir ( ‘ Y sus cuatro primeras letras son: ‘, texto3 )pausafin

Programa:

#include <stdio.h>#include <string.h>main(){char texto1[40], texto2[40], texto3[10];clrscr();

 printf("Introduce un frase: ");

gets(texto1);strcpy(texto2, texto1);

 printf("Una copia de tu texto es: %s\n", texto2);strncpy(texto3, texto1, 4);

 printf("Y sus cuatro primeras letras son %s\n", texto3);getch();

Finalmente, existe otra orden relacionada con estas dos: podemos añadir una cadena al finalde otra (concatenarla), con:

Page 126: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 126/139

UNIDAD IV ESTRUCUTRAS DE DATOS

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

strcat (destino, origen); 

Vamos a ver un ejemplo de su uso, que nos pida nuestro nombre, nuestro apellido y cree unanueva cadena de texto que contenga los dos, separados por un espacio:

Algoritmo:

iniciodeclarar variables

carácter texto1[ 40 ]carácter texto2[ 40 ]carácter texto3[ 40 ]

limpiar pantallaescribir ( ‘ Introduce tu nombre: ‘ )leer ( texto1 )escribir ( ‘ Introduce tu apellido: ‘ )leer ( texto2 )concatenar ( texto1, “ “ )concatenar (texto1, texto2 )escribir ( ‘ Te llamas ‘, texto1 )pausafin

Programa:

#include <stdio.h>#include <string.h>main(){char texto1[40], texto2[40], texto3[40];clrscr();

 printf("Introduce tu nombre: ");gets(texto1);

 printf("Introduce tu apellido: ");

gets(texto2);strcat(texto1, " "); /* Añado un espacio al nombre */ strcat(texto1, texto2); /* Y luego el apellido */ 

 printf("Te llamas %s\n", texto1);getch();

}

4.3. Apuntadores

Hasta ahora teníamos una serie de variables que declaramos al principio del programa o decada función. Estas variables, que reciben el nombre de ESTÁTICAS, tienen un tamañoasignado desde el momento en que se crea el programa.

Un Apuntador es una variable que contiene una dirección de memoria, la cual corresponderá aun dato o a una variable que contiene el dato. Los apuntadores también deben de seguir lasmismas reglas que se aplican a las demás variables, deben tener nombre únicos y deben dedeclararse antes de usarse.

Cada variable que se utiliza en una aplicación ocupa una o varias posiciones de memoria.Estas posiciones de memoria se accesan por medio de una dirección.

* h

h

Page 127: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 127/139

UNIDAD IV ESTRUCUTRAS DE DATOS

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

1000 1001 1002 1003 1004 1005

H e l l o

Figura 22. Puntero

En la figura el texto “ Hello “ esta guardado en memoria, comenzando en la dirección 1000.Cada carácter ocupa un espacio de dirección único en memoria. Los apuntadores proporcionanun método para conservar y llegar a estas direcciones en memoria. Los apuntadores facilitan elmanejo de datos, debido a que conservan la dirección de otra variable o ubicación de datos.

Los apuntadores dan flexibilidad a los programas en C y en C++; también permiten que estoscrezcan dinámicamente. Utilizando un apuntador hacia un bloque de memoria que se asigna almomento de ejecución, un programa puede ser más flexible que uno que asigna toda sumemoria de una sola vez. También, un apuntador es más fácil de guardar que una estructuragrande o un objeto de una clase. Debido a que un apuntador sólo guarda una dirección, puedefácilmente pasarse a una función. Uno de las desventajas que pueden presentar losapuntadores es que un apuntador sin control o no inicializado puede provocar fallas en elsistema, además de que su uso incorrecto puede generar fallas muy complejas de encontrar.

Este tipo de variables son sencillas de usar y rápidas... si sólo vamos a manejar estructuras dedatos que no cambien, pero resultan poco eficientes si tenemos estructuras cuyo tamaño nosea siempre el mismo.

Es el caso de una agenda: tenemos una serie de fichas, e iremos añadiendo más. Sireservamos espacio para 10, no podremos llegar a añadir la número 11, estamos limitando elmáximo. Una solución sería la de trabajar siempre en el disco: no tenemos límite en cuanto anúmero de fichas, pero es muchísimo más lento.

Lo ideal sería aprovechar mejor la memoria que tenemos en el ordenador, para guardar en ellatodas las fichas o al menos todas aquellas que quepan en memoria. Una solución “típica” (peromala) es sobredimensionar: preparar una agenda contando con 1000 fichas, aunquesupongamos que no vamos a pasar de 200. Esto tiene varios inconvenientes: se desperdiciamemoria, obliga a conocer bien los datos con los que vamos a trabajar, sigue pudiendo versesobrepasado, etc.

La solución suele ser crear estructuras DINÁMICAS, que puedan ir creciendo o disminuyendosegún nos interesen. Ejemplos de este tipo de estructuras son:

Las pilas. Como una pila de libros: vamos apilando cosas en la cima, o cogiendo de lacima.

Las colas. Como las del cine (en teoría): la gente llega por un sitio (la cola) y sale por el opuesto (la cabeza).

Las listas, en las que se puede añadir elementos, consultarlos o borrarlos en cualquier posición.

Y la cosa se va complicando: en los árboles cada elemento puede tener varios sucesores, etc.Todas estas estructuras tienen en común que, si se programan bien, pueden ir creciendo odecreciendo según haga falta, al contrario que un array, que tiene su tamaño prefijado.En todas ellas, lo que vamos haciendo es reservar un poco de memoria para cada nuevoelemento que nos haga falta, y enlazarlo a los que ya teníamos. Cuando queramos borrar unelemento, enlazamos el anterior a él con el posterior a él (para que no “se rompa” nuestraestructura) y liberamos la memoria que estaba ocupando. 

4.3.1. Concepto 

Page 128: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 128/139

UNIDAD IV ESTRUCUTRAS DE DATOS

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

Un puntero no es más que una dirección de memoria. Lo que tiene de especial es quenormalmente un puntero tendrá un tipo de datos asociado: por ejemplo, un “puntero a entero”será una dirección de memoria en la que habrá almacenado (o podremos almacenar) unnúmero entero.

Hay 2 operadores que se usan cuando trabajan con direcciones en un programa en C; elOperador de Indirección ( * ) y el de Dirección (&). Estos operadores son diferentes de lostratados anteriormente.

El Operador de Dirección ( &) regresa la dirección de una variable. Este operador estáasociado con la variable a su derecha: &h; esta línea regresa la dirección de memoria de lavariable h, la que contiene nuestra máquina internamente.

El Operador de Indirección ( * ) trabaja a la inversa del operador de Dirección. También estaasociado con la variable a su derecha, toma la dirección y regresa el dato que contiene esadirección de memoria. Por ejemplo, la siguiente línea determina la dirección de la variable h yluego usa el operador de Indirección para accesar la variable y darle un valor de 42:

*(&h)=42;

La declaración de un puntero de manera general es:

tipo *nombre del apuntador;

Tipo : Especifica el tipo de objeto apuntado y puede ser cualquier tipo visto con anterioridad.

Nombre de apuntador: Es el identificador del apuntador.

El espacio de memoria requerido para un apuntador, es el número de bytes necesarios paraespecificar una dirección de memoria, debiendo apuntar siempre al tipo de dato correcto.

Considere el siguiente programa y observe a las variables de dirección e Indirección trabajar:

Algoritmo:

iniciodeclarar variables

entero x 1, y 2entero *ip

limpiar pantallaescribir ( ‘ Antes del uso de los apuntadores ‘ )escribir ( ‘ X = ‘, x , ‘ Y = ‘, y, ‘ *ip = ‘ , *ip )ip &xy *ip*ip 10

escribir ( ‘ Después del uso de los operadores ‘ )escribir ( ‘ X = ‘, x , ‘ Y = ‘, y, ‘ *ip = ‘ , *ip )pausafin

Programa:

#include<stdio.h>#include<conio.h>int x=1; y=2;

Page 129: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 129/139

UNIDAD IV ESTRUCUTRAS DE DATOS

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

int *ip; /* ip es apuntador a int */ void main(){clrscr();

 printf(“ Antes del uso de los apuntadores “); printf(“ \n X = %d Y = %d *ip = %d “, x,y,*ip);ip = &x; /* ip ahora apunta a x */ y = *ip; /* y vale 1 */ *ip = 10; /* ahora x vale 10 */ 

 printf (“ Después del uso de los operadores “); printf(“ \n X = %d Y = %d *ip = %d “, x,y,*ip);getch();}

La salida (corrida) del programa anterior es:

Antes del uso de los operadores:X= 1 y=2 *ip = 0

Después del uso de los operadores:

X= 10 y=1 *ip = 10

Vamos a ver qué símbolo usamos en C para designar los punteros:

int num; /* "num" es un número entero */int *pos; /* "pos" es un "puntero a entero" (dirección de

memoria en la que podremos guardar un entero) */

Es decir, pondremos un asterisco entre el tipo de datos y el nombre de la variable. Eseasterisco puede ir junto a cualquiera de ambos, también es correcto escribir int* pos; estanomenclatura ya la habíamos utilizado aun sin saber que era eso de los punteros. Por ejemplo,cuando queremos acceder a un fichero, hacemos FILE* fichero; antes de entrar en más

detalles, y para ver la diferencia entre trabajar con “arrays” o con punteros, vamos a hacer dosprogramas que pidan varios números enteros al usuario y muestren su suma. El primeroempleará un “array” (una tabla, de tamaño predefinido) y el segundo empleará memoria quereservaremos durante el funcionamiento del programa.

El primero podría ser así:

Algoritmo:

iniciodeclarar variables

entero datos [100]entero cuantosentero i

largo suma

0limpiar pantallahacer 

escribir ( ‘ Cuantos números desea sumar ? ‘ )leer ( cuantos )si ( cuantos > 100 ) hacer 

escribir ( ‘ Demasiados. Solo se puede hasta 100. ‘ )fin_si

mientras ( cuantos > 100 )para ( i = 0; i < cuantos; i++ ) hacer 

Page 130: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 130/139

UNIDAD IV ESTRUCUTRAS DE DATOS

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

escribir ( ‘ X = ‘, x , ‘ Y = ‘, y, ‘ *ip = ‘ , *ip )pausafin

Programa:

#include <stdio.h>main() {int datos[100];

/* Preparamos espacio para 100 numeros */ int cuantos;

/* Preguntaremos cuantos desea introducir */ int i;

/* Para bucles */ long suma=0;

/* La suma, claro */ clrcsr();do {

 printf(" Cuantos numeros desea sumar? ");scanf(" %d ", &cuantos);

if (cuantos>100)/* Solo puede ser 100 o menos */ 

 printf("Demasiados. Solo se puede hasta 100.");} while (cuantos>100);

/* Si pide demasiado, no le dejamos */ /* Pedimos y almacenamos los datos */ 

for (i=0; i<cuantos; i++) { printf(" Introduzca el dato número %d: ", i+1);scanf(" %d ", &datos[i]);}

/* Calculamos la suma */ for (i=0; i<cuantos; i++)suma += datos[i];

 printf(" Su suma es: %ld\n ", suma);

}

Los más avispados se pueden dar cuenta de que si sólo quiero calcular la suma, lo podríahacer a medida que leo cada dato, no necesitaría almacenar todos. Vamos a suponer que sínecesitamos guardarlos (en muchos casos será verdad, si los cálculos son más complicados).

Entonces nos damos cuenta de que lo que hemos estado haciendo hasta ahora no es eficiente:• Si quiero sumar 1000 datos, o 500, o 101, no puedo. Nuestro límite previsto era de 100, asíque no podemos trabajar con más datos.• Si sólo quiero sumar 3 números, desperdicio el espacio de 97 datos que no uso.• Y el problema sigue: si en vez de 100 números, reservamos espacio para 5000, es más difícilque nos quedemos cortos pero desperdiciamos muchísima más memoria.

La solución es reservar espacio estrictamente para lo que necesitemos, y eso es algo que

podríamos hacer así:

Algoritmo:

iniciodeclarar variables

entero *datosentero cuantosentero ilargo suma 0

limpiar pantalla

Page 131: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 131/139

UNIDAD IV ESTRUCUTRAS DE DATOS

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

hacer escribir ( ‘ Cuantos números desea sumar ? ‘ )leer ( cuantos )datos (entero *) malloc (cuantos * sizeof(entero))si (datos = NULL)

escribir ( ‘ No caben tantos datos en memoria. ‘ )fin_simientras ( datos = NULL )fin_hacer 

escribir ( ‘ Introduzca el dato número ‘, i+1 )leer ( datos + i )

fin_parapara ( i = 0; i < cuantos; i++ ) hacer 

suma suma + *datos + ifin_paraescribir ( ‘ Su suma es: ‘, suma )liberar (datos)pausafin

Programa:

#include <stdio.h>#include <stdlib.h>main(){int* datos; /* Necesitaremos espacio para varios numeros */ int cuantos; /* Preguntaremos cuantos desea introducir */ int i; /* Para bucles */ long suma=0; /* La suma, claro */ do{

 printf("Cuantos numeros desea sumar? ");scanf("%d", &cuantos);

datos = (int *) malloc (cuantos * sizeof(int));if (datos == NULL) /* Solo puede ser 100 o menos */ 

 printf("No caben tantos datos en memoria.");} while (datos == NULL); /* Si pide demasiado, no le dejamos */ 

/* Pedimos y almacenamos los datos */ for (i=0; i<cuantos; i++) {

 printf("Introduzca el dato número %d: ", i+1);scanf("%d", datos+i);}

/* Calculamos la suma */ for (i=0; i<cuantos; i++)suma += *(datos+i);

 printf("Su suma es: %ld \n", suma);free(datos);

}

Este programa funciona perfectamente si sólo queremos sumar 5 números, pero también sinecesitamos sumar 120.000 (y si caben tantos números en la memoria disponible de nuestroequipo, claro).

Vamos a ver las diferencias:

En primer lugar, lo que antes era int  datos[100] que quiere decir “a partir de la posición dememoria que llamaré datos, quede espacio para a guardar 100 números enteros”, se ha

Page 132: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 132/139

UNIDAD IV ESTRUCUTRAS DE DATOS

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

convertido en int * datos que quiere decir “a partir de la posición de memoria que llamaré datosvoy a guardar varios números enteros (pero aún no sé cuantos)”.

Luego reservamos el espacio exacto que necesitamos, haciendo datos = (int *) malloc (cuantos* sizeof ( int ); Esta orden suena complicada, así que vamos a verla por partes:

• “malloc” es la orden que usaremos para reservar memoria cuando la necesitemos (es laabreviatura de las palabra “memory” y “allocate”).

• Como parámetro, le indicamos cuanto espacio queremos reservar. Para 100 númerosenteros, sería “100*sizeof(int)”, es decir, 100 veces el tamaño de un entero. En nuestro caso,no son 100 números, sino el valor de la variable “cuantos”. Por eso hacemos “malloc(cuantos*sizeof(int))”.

• Para terminar, ese es el espacio que queremos reservar para nuestra variable “datos”.Y esa variable es de tipo “int *” (un puntero a datos que serán números enteros). Para que todovaya bien, debemos “convertir” el resultado de “malloc” al tipo de datos correcto, y lo hacemosforzando una conversión como vimos en el apartado 2.4 (operador “molde”), con lo que nuestraorden está completa:

datos = (int *) malloc (cuantos * sizeof(int));

• Si “malloc” nos devuelve NULL como resultado (un “puntero nulo”), quiere decir que no haencontrado ninguna posición de memoria en la que nos pudiera reservar todo el espacio que lehabíamos solicitado.

• Para usar “malloc” deberemos incluir “stdlib.h” al principio de nuestro fuente.La forma de guardar los datos que teclea el usuario también es distinta. Cuando trabajábamoscon un “array”, hacíamos scanf( “ %d “, &datos[i]) (“el dato número i”), pero con punterosusaremos scanf(“ %d “, datos+i) (en la posición datos + i). Ahora ya no necesitamos el símbolo“ampersand” (&). Este símbolo se usa para indicarle a C en qué posición de memoria debealmacenar un dato. Por ejemplo, float x; es una variable que podremos usar para guardar unnúmero real. Si lo hacemos con la orden “scanf”, esta orden no espera que le digamos en quévariable deber guardar el dato, sino en qué posición de memoria. Por eso hacemos scanf("%f",&x); En el caso que nos encontramos ahora, int* datos ya se refiere a una posición de memoria(un puntero), por lo que no necesitamos & para usar “scanf”.

Finalmente, la forma de acceder a los datos también cambia. Antes leíamos el primer datocomo datos[0], el segundo como datos[1], el tercero como datos[2] y así sucesivamente. Ahorausaremos el asterisco (*) para indicar que queremos saber el valor que hay almacenado en unacierta posición: el primer dato será *datos, el segundo *(datos+1), el tercero será *(datos+2) yasí en adelante. Por eso, donde antes hacíamos suma += datos[i]; ahora usamos suma +=*(datos+i).

También aparece otra orden nueva: free. Hasta ahora, teníamos la memoria reservadaestáticamente, lo que supone que la usábamos (o la desperdiciábamos) durante todo el tiempoque nuestro programa estuviera funcionando. Pero ahora, igual que reservamos memoria justoen el momento en que la necesitamos, y justo en la cantidad que necesitamos, tambiénpodemos volver a dejar disponible esa memoria cuando hayamos terminado de usarla. De esose encarga la orden “free”, a la que le debemos indicar qué puntero es el que queremos liberar. 

El ejemplo anterior era “un caso real”. Generalmente, los casos reales son más aplicables quelos ejemplos puramente académicos, pero también más difíciles de seguir. Por eso, antes deseguir vamos a ver un ejemplo más sencillo que nos ayude a asentar los conceptos:

Reservaremos espacio para un número real de forma estática, y para dos números reales deforma dinámica, daremos valor a dos de ellos, guardaremos su suma en el tercer número ymostraremos en pantalla los resultados.

Page 133: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 133/139

UNIDAD IV ESTRUCUTRAS DE DATOS

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

 Algoritmo:

iniciodeclarar variables

real n1real *n2, *sumalimpiar pantallan1 5.0n2 (float *) malloc (sizeof(float))*n2 6.7suma (float *) malloc (sizeof(float))*suma n1 + *n2escribir ( ‘ El valor prefijado para la suma era ‘, *suma)escribir ( ‘ Ahora es tu turno: Introduce el primer número ‘)leer ( n1 )escribir ( ‘ Introduce el segundo número ‘ )leer ( n2 )*suma n1 + *n2escribir ( ‘ Ahora la suma es ‘, *suma)liberar (n2)liberar (suma)pausafin

Programa:

#include <stdio.h>#include <stdlib.h>main() {float n1; /* Primer número, estático */ float *n2, *suma; /* Los otros dos números */ n1 = 5.0; /* Damos un valor prefijado a n1 (real)

*/ n2 = (float *) malloc (sizeof(float));

/* Reservamos espacio para n2 */ *n2 = 6.7; /* Valor prefijado para n2 (puntero a

real) */ suma = (float *) malloc (sizeof(float));

/* Reservamos espacio para suma */ *suma = n1 + *n2; /* Calculamos la suma */ 

 printf("El valor prefijado para la suma era %4.2f\n",*suma);

 printf("Ahora es tu turno: Introduce el primer número ");scanf("%f",&n1); /* Leemos valor para n1 (real) */ 

 printf("Introduce el segundo número ");scanf("%f",n2); /* Valor para n2 (puntero a real) */ *suma = n1 + *n2; /* Calculamos nuevamente la suma */ 

 printf("Ahora la suma es %4.2f\n", *suma);free(n2); /* Liberamos la memoria reservada */ free(suma);}

Las diferencias son:

n1 es un “float”, así que le damos valor normalmente: n1 = 0; Y pedimos su valor con scanf usando & para indicar en qué dirección de memoria se encuentra: scanf("%f", &n1).

Page 134: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 134/139

UNIDAD IV ESTRUCUTRAS DE DATOS

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

n2 (y también “suma”) es un “puntero a float”, así que debemos reservarle espacio con “malloc”antes de empezar a usarlo, y liberar con “free” el epacio que ocupaba cuando terminemos deutilizarlo. Para guardar un valor en la dirección de memoria “a la que apunta”, usamos unasterisco: *n2 = 0; Y pedimos su valor con scanf, pero sin necesidad de usar &, porque elpuntero ES una dirección de memoria: scanf("%f", n2).

En este ejemplo, no hemos comprobado si el resultado de “malloc” era NULL, porque sólopedíamos espacio para dos variables, y hemos dado por sentado que sí habría memoriadisponible suficiente para almacenarlas; en un caso general, deberemos asegurarnos siemprede que se nos ha concedido ese espacio que hemos pedido.

4.3.2. Tipos de Apuntadores 

Como se ha visto a lo largo de este manual todas las variables se enlazan a tipos específicos,con lo cual es de concluirse que una variable apuntador también; por lo cual se enlazan a tiposde datos específicos del lenguaje (apuntadores a variables de cierto tipo), de forma tal que a unapuntador sólo se le pueden designar direcciones de variables del mismo tipo, que seespecífico en la declaración del apuntador. Este termino es algo complejo de entender por lo tanto se verá un ejemplo de su manejo:

Algoritmo:

entero *apun1real *apun2entero aapun1 &aapun2 &a

Programa:

int *apun1;float *apun2;int a;apun1 = &a; // Esto es válido

apun2 = &a; // Esto no es válido (ya que el puntero 2 es detipo float, y por lo tanto debe apuntar haciauna variable del mismo tipo y en este caso noes así, con lo cual se genera un error)

Cotidianamente, un apuntador inicializado de una manera adecuada apunta a alguna posiciónespecífica de la memoria. Sin embargo, algunas veces es posible que un apuntador nocontenga una dirección válida, en cuyo caso es incorrecto desreferenciarlo (obtener el valor alque apunta) porque el programa tendrá un comportamiento impredecible y probablementeerróneo, aunque es posible que funcione bien. Un apuntador puede contener una direccióninválida debido a dos razones:

1. Cuando un apuntador se declara, al igual que cualquier otra variable, el mismo posee unvalor cualquiera que no se puede conocer con anticipación, hasta que se inicialice con algún

valor (dirección), por ejemplo:

Algoritmo:

real *apun;escribir ( ‘ El valor apuntado por apun es: ‘ , *apun ) // Incorrecto*apun 3.5 // Incorrecto

Programa:

float *apun;

Page 135: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 135/139

UNIDAD IV ESTRUCUTRAS DE DATOS

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

 printf ( " El valor apuntado por apun es: " , *apun );// Incorrecto*apun = 3.5; // Incorrecto

2. Después de que un apuntador ha sido inicializado, la dirección que posee puede dejar de ser válida si se libera la memoria reservada en esa dirección, ya sea porque la variable asociada

termina su ámbito o porque ese espacio de memoria fue reservado dinámicamente y luego seliberó1, ejemplo de esto es el siguiente:

Algoritmo:

entero *apunentero bfunction func()

entero a 40apun &ab *apun; // Correcto*apun 23; // Correcto

Fin_func

iniciolimpiar pantallallamar a la función func()b *apun // Incorrecto*apun 25 // Incorrectopausafin

Programa:

int *apun, b;void func(){int a = 40;apun = &a;

b = *apun; // Correcto*apun = 23; // Correcto}void main(){clrscr();func();b = *apun; // Incorrecto*apun = 25; // Incorrectogetch();}

Si se intenta desreferenciar un apuntador que contiene una dirección inválida pueden ocurrir 

cosas como las siguientes:

Se obtiene un valor incorrecto en una o más variables debido a que no fue debidamenteinicializada la zona de memoria que se accede a través de la dirección en cuestión. Esto puedeocasionar que el programa genere resultados incorrectos.

Si casualmente la dirección es la misma de otra variable utilizada en el programa, o está dentrodel rango de direcciones de una zona de memoria utilizada, existe el riesgo de sobreescribir datos de otras variables. Existe la posibilidad de que la dirección esté fuera de la zonade memoria utilizada para almacenar datos y más bien esté, por ejemplo, en la zona donde sealmacenan las instrucciones del programa. Al intentar escribir en dicha zona, fácilmente puede

Page 136: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 136/139

UNIDAD IV ESTRUCUTRAS DE DATOS

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

ocurrir que el programa genere un error de ejecución y el sistema operativo lo detenga, o que elprograma no responda y deje al sistema operativo inestable.

En muchos casos el sistema operativo detecta el acceso inadecuado a una dirección dememoria, en cuyo caso detiene abruptamente el programa.

4.3.3. Operaciones con apuntadores 

Si declaramos una variable como int n=5 y posteriormente hacemos n++, debería resultar claroque lo que ocurre es que aumenta en una unidad el valor de la variable n, pasando a ser 6.Pero ¿qué sucede si hacemos esa misma operación sobre un puntero?

Algoritmo:

Declarer variablesentero *n

n (int *) malloc (sizeof(int))*n 3n n + 1

Programa:

int *n;n = (int *) malloc (sizeof(int));*n = 3;n++; 

Después de estas líneas de programa, lo que ha ocurrido no es que el contenido de la posiciónn sea 4. Eso lo conseguiríamos modificando “*n”, de la misma forma que le hemos dado suvalor inicial. Es decir, deberíamos usar (*n) ++.

En cambio, nosotros hemos aumentado el valor de “n”. Como “n” es un puntero, estamosmodificando una dirección de memoria. Por ejemplo, si “n” se refería a la posición de memorianúmero 10.000 de nuestro ordenador, ahora ya no es así, ahora es otra posición de memoriadistinta, por ejemplo la 10.001.Porque, como ya sabemos, el espacio que ocupa una variable en C depende del sistemaoperativo. Así, en un sistema operativo de 32 bits, un “int” ocuparía 4 bytes, de modo que laoperación n++.

Haría que pasáramos de mirar la posición 10.000 a la 10.004. Generalmente no es esto lo quese quiere, sino modificar el valor que había almacenado en esa posición de memoria. Olvidar ese * que indica que queremos cambiar el dato y no la posición de memoria puede dar lugar afallos muy difíciles de descubrir (o incluso a que el programa se interrumpa con un aviso de“Violación de segmento” porque estemos accediendo a zonas de memoria que no hemosreservado. 

4.3.4. Relación de apuntadores con arreglos 

En C hay muy poca diferencia “interna” entre un puntero y un array. En muchas ocasiones,podremos declarar un dato como array (una tabla con varios elementos iguales, de tamañopredefinido) y recorrerlo usando punteros. Vamos a ver un ejemplo:

Algoritmo:

iniciodeclarar variables

entero datos [ 10 ]entero i

Page 137: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 137/139

UNIDAD IV ESTRUCUTRAS DE DATOS

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

limpiar pantallapara ( i = 1; i < 10; i++ ) hacer 

datos [ i ] i * 2fin_parapara ( i = 1; i < 10; i++ ) hacer 

escribir ( datos + i )fin_parapausafin

Programa:

main(){int datos[10];int i;

/* Damos valores normalmente */ clrscr();for (i=0; i<10; i++)datos[i] = i*2;

/* Pero los recorremos usando punteros */ for (i=0; i<10; i++)

 printf ("%d ", *(datos+i));getch();}

Pero también podremos hacer lo contrario, declarar de forma dinámica una variable usando“malloc” y recorrerla como si fuera un array:

Algoritmo:

iniciodeclarar variables

entero *datos

entero ilimpiar pantalladatos ( entero * )escribir ( ‘ Uso como puntero … ‘ )para ( i = 0; i < 20; i++ ) hacer 

*(datos + i ) i * 2fin_parapara ( i = 0; i < 20; i++ ) hacer 

escribir ( *( datos + i ) )fin_paraescribir ( ‘ Uso como array … ‘ )para ( i = 0; i < 20; i++ ) hacer 

datos [ i ] i * 3fin_para

para ( i = 0; i < 20; i++ ) hacer escribir ( datos [ i ] )

fin_paraliberar (datos)pausafin

Programa:

#include <stdio.h>#include <stdlib.h>

Page 138: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 138/139

UNIDAD IV ESTRUCUTRAS DE DATOS

Autores: Alejandra Gutierrez Reyes - Enrique Martínez Roldán - Academia de Computación – Ingenieria Eléctrica

ESIME Zacatenco IPN

1

 main(){int *datos;int i;

/* Reservamos espacio */ datos = (int *) malloc (20*sizeof(int));

/* Damos valores como puntero */ clrscr();

 printf(" Uso como puntero... ");for (i=0; i<20; i++)*(datos+i) = i*2;

/* Y los mostramos */ for (i=0; i<10; i++)

 printf ("%d ", *(datos+i));/* Ahora damos valores como array */ 

 printf("\n Uso como array... ");for (i=0; i<20; i++)datos[i] = i*3;

/* Y los mostramos */ 

for (i=0; i<10; i++) printf ("%d ", datos[i]);

/* Liberamos el espacio */ free(datos);getch();}

Existe otra posibilidad de usar punteros y arreglos, que son los arreglos de punteros,

Igual que creamos “arrays” para guardar varios datos que sean números enteros o reales,podemos hacerlo con punteros, esto es podemos reservar espacio para “20 punteros aenteros” haciendo:

int *datos[20];

Tampoco es algo especialmente frecuente en un caso general, porque si fijamos la cantidad dedatos, estamos perdiendo parte de la versatilidad que podríamos tener al usar memoriadinámica. Pero sí es habitual cuando se declaran varias cadenas:

char *mensajesError[3]={"Fichero no encontrado", "No se puede escribir", "Fichero sin datos"};

Un ejemplo de su uso sería este:

Algoritmo:

iniciodeclarar variables

carácter *mensajesError[3] {"Fichero no encontrado","No se puede escribir", "Fichero sin datos"}limpiar pantallaescribir ( ‘ El primer mensaje de error es: ‘, mensajesError[0])escribir ( ‘ El segundo mensaje de error es: ‘, mensajesError[1])escribir ( ‘ El tercer mensaje de error es: ‘, mensajesError[2])pausafin

Page 139: Fundamentos de programacion

5/9/2018 Fundamentos de programacion - slidepdf.com

http://slidepdf.com/reader/full/fundamentos-de-programacion-559bf6a6e4987 139/139

UNIDAD IV ESTRUCUTRAS DE DATOS

1

Programa:

#include <stdio.h>main() {char *mensajesError[3]={"Fichero no encontrado","No se puedeescribir","Fichero sin datos"};clrscr();

 printf("El primer mensaje de error es: %s\n",mensajesError[0]); printf("El segundo mensaje de error es: %s\n",mensajesError[1]); printf("El tercer mensaje de error es: %s\n",mensajesError[2]);getch();}