Captulo 3 - Desarrollo de
Programas Estructurados
Lenguaje de Programacin
EE.GG.CC.
Introduccin (1)
Programa: Conjunto de instrucciones escritas en algn lenguaje de programacin, que permite al computador ejecutar una lista de acciones finita, predeterminada y no ambigua.
Anlisis del problema: qu nos piden resolver?
Diseo del algoritmo: pseudo cdigo o diagrama de flujo.
Elaboracin del programa en un lenguaje de programacin.
Introduccin (2)
En cursos anteriores se aprendi: Tcnica del diseo
descendente: top-down
Dividir un programa en partes ms pequeas: sub programas o mdulos
Forma de trabajo comn de Pascal y C/C++
Funcin
Principal
Funcin
Intermedia1
Funcin
Intermedia2
Funcin
Intermedia3
Funcin
Intermedia2.1
Funcin
Intermedia2.2
3.1 Qu es un programa?
Un programa es un conjunto de lneas de cdigo escritas en un lenguaje de programacin determinado.
Estructura general de un programa
Entradas Procedimiento Salidas
Cmo se resuelve un problema ?
Tener una completa comprensin del problema
Nos debemos hacer tres preguntas: Qu salidas debemos generar?
Qu entradas debemos ingresar para obtener las salidas solicitadas?
Cul es el procedimiento que debemos usar para transformar las entradas en las salidas?
Un planteamiento correcto nos evitar perder tiempo en la implementacin de algoritmos que posteriormente nos demos cuenta que son incorrectos.
3.2 Qu es un Algoritmo?
Algoritmo: procedimiento dado en trminos de
Acciones que deben realizarse
Secuencia de estas acciones
Primero se determina qu hace el programa.
Luego se determina cmo lo hace.
3.2 Qu es un Algoritmo? (2)
Se divide el problema en varios subproblemas que se solucionan de forma independiente (divide y vencers). Esto se denomina diseo modular.
En este paso es conveniente la utilizacin de diagramas de flujo o pseudocdigo.
Control del programa:
Especificar secuencia en la que los enunciados sern ejecutados
3.3 Qu es un Pseudocdigo?
Lenguaje artificial y formal que nos ayuda a desarrollar algoritmos.
Similar al lenguaje cotidiano.
No se ejecuta en la computadora.
Nos ayuda a pensar en un programa antes de escribirlo.
Fcil de convertir en un programa C
Consiste tan solo de enunciados
Representacin Grfica de un algoritmo
Smbolo de rectngulo :
Indica una accin
valo :
Indica comienzo o fin de un programa
3.4 Qu son los Diagramas de Flujo?
INICIO
Estructuras Lgicas
Todo algoritmo puede expresarse mediante 3 estructuras lgicas:
La secuencia.
La condicin.
La repeticin.
Notacin grfica
Secuencia
Condicin
Notacin grfica (2)
Repeticin
Estructura de seleccin por condicin
Estructura de Seleccin if
La estructura de seleccin if es utilizada para realizar una de dos acciones distintas en base a una condicin.
Estructuras selectivas en C: if (1)
Estructura selectiva if -else
Funcionamiento similar que en Pascal
Sintaxis: versin simple
if (expresin)
sentencia 1;
else
sentencia 2;
Diferencia con Pascal:NO SE USA LA PALABRA
THEN
Diferencia con Pascal:SE ESCRIBE ; ANTES DE ELSE
Estructuras selectivas en C: if (2)
Sintaxis: versin bloquesif (expresin)
{
..
}
else
{
..
}
Bloque de instrucciones del if
Bloque de instrucciones del else
Estructura de Seleccin if Por ejemplo, el siguiente pseudocdigo:
Si la nota del alumno es mayor o igual a 11Imprimir Aprobado
La condicin la nota del alumno es mayor o igual a 11 tiene dos posibilidades: es verdadera o es falsa.
Si la condicin es verdadera Se ejecuta la accin de imprimir y el programa contina al
siguiente enunciado
Si la condicin es falsa: El enunciado de impresin es ignorado y el programa contina al
siguiente enunciado
Estructura de Seleccin if Veamos otra vez el ejemplo:
Si la nota del alumno es mayor o igual a 11Imprimir Aprobado
Si lo traducimos al lenguaje C:if ( nota_alumno >= 11 )
printf( Aprobado\n" );
Observar que el cdigo en C se parece al pseudocdigo
La sangra permite que los programas sean ms fciles de leer, pues C ignora los espacio en blanco
Estructura if: representacin en diagrama de flujo
Estructura if es del tipo una-entrada/una-salida
verd
falso
nota >= 11 print Aprobado
En lenguaje C:
Es cero falso
No es cero verdadero
Estructura de Seleccin if/else
if
Slo realiza una accin si la condicin es verdadera
if/else
Especifica una accin a realizarse si la condicin es verdadera y otra accin si la condicin es falsa
Estructura de Seleccin if/else Otro ejemplo en pseudocdigo:
Si la nota del alumno es mayor o igual a 11Imprime Aprobado
de lo contrarioImprime Jalado
Notar las convenciones de espaciado y tabulado
Traducido a C :if ( nota >= 11 )
printf( Aprobado\n");
else
printf( Jalado\n");
Estructura de Seleccin if/else
Diagrama de flujo de la estructura if/else
verdfalso
Jalado
Aprobado
nota >= 11
Estructura de Seleccin if/else
Enunciados compuestos:
Uso de llaves
Ejemplo:
if ( nota >= 11 )
printf( Aprobado.\n );
else {
printf( jalado.\n);
printf( Debe repetir el curso.\n );}
Sin las llaves, el enunciadoprintf( Debe repetir el curso.\n );
se ejecutaria siempre
Notacin abreviada del if/else Operador condicional ternario (cond ? X :Y)
Usa tres argumentos (condicin, valor para condicin verdadera, valor para condicin falsa)
Por ejemplo: if(nota>=11)
aprobados = 1;
else
aprobados = 0;
Lo anterior se puede escribir de la siguiente manera:aprobados = (nota>=11)? 1:0;
Notacin abreviada del if/else
Tambin se puede combinar con otras funciones como por ejemplo printf().
Por ejemplo:printf("%s\n", (nota>=11)? Aprobado":Jalado");
Tambin se puede escribir de la siguiente manera:
(nota>=11)? printf( Aprobado\n ):printf( Jalado\n );
Anidacin de estructuras if/else
Se pone a prueba casos mltiples colocando estructuras if/else dentro de estructuras if/else.
Se cumple con una condicin, el resto de los enunciados se evitan.
Anidacin de estructuras if/else ejemplo
Si la nota del alumno es mayor o igual a 16Imprimir A
de lo contrario Si la nota del alumnos es mayor o igual a 12
Imprimir Bde lo contrario
Si la nota del alumno es mayor o igual a 8 Imprimir C
de lo contrario Si la nota del alumno es mayor o igual a 4
imprimir Dde lo contrario
imprimir E
Enunciado en C ifthenelse1.c
Estructuras de seleccin mltiple
La estructura de Seleccin Mltiple
switch
switch
Permite realizar una ramificacin mltiple, ejecutando slo una de varias posibilidades, dependiendo de los diferentes valores que puede tomar una variable.
switch: Diagrama de Flujo
caso aVerdadero
Falso
Acciones del caso a
caso bVerdadero
Falso
Acciones del caso b
caso zVerdadero
Falso
Acciones del caso z
Acciones por defecto
Formato Series de etiquetas case y el caso opcional default
switch ( variable ){
case '1':
acciones
case '2':
acciones
default:
acciones
}
break; permite salir de la estructura
La estructura de Seleccin Mltiple
switch
switch1.c
switch2.c
Estructuras de repeticin controlada
Estructuras de repeticin controlada
Con control al inicio del bloque:while()
Con control al final del bloque:do-while()
Con control al inicio y con contadores:for()
Instrucciones de control:break
continue
La estructura while()
while = mientras
Estructura El programador especifica que una accin se repite
mientras cierta condicin se mantenga como verdadera
Pseudocdigo:Mientras haya ms cosas en mi lista de compras
Comprar el siguiente item y sacarlo de mi lista
El bucle while se repite hasta que la condicin sea falsa
La estructura de repeticin while
Ejemplo: int producto = 2;
while ( producto
Algoritmos tpicos de repeticin
Validacin de ingreso de datos.
Repeticin controlada por contador.
Repeticin controlada por centinela.
Ingreso de dato con validacin
Se pide leer del teclado una variable entera mayor que cero:
int dato=0;
while(1){
printf(Ingrese dato mayor que cero:):
scanf(%d, &dato);
if(dato > 0) break;
}
Ingreso de dato con validacin (2)
Se pide leer del teclado una variable entera mayor que cero y menor que 20:
int dato=0;
while(1){
printf(Ingrese dato entre 0 y 20:):
scanf(%d, &dato);
if(dato > 0 && dato < 20) break;
}
Algoritmo de Repeticin Controlada por Contador
El bucle se repite hasta que el contador alcanza cierto valor.
Se usa cuando el nmero de repeticiones es conocido con anticipacin.
Ejemplo de algoritmo de Repeticin Controlada por Contador
Ejemplo: Una clase de diez estudiantes toma un test. Las notas (enteros del 0 al 20) estn disponibles. Determinar el promedio de las notas de la clase
Pseudocdigo: Poner total en cero
Poner contador de notas en uno
Mientras el contador de notas es menor o igual a 10ingrese la sgte notaSumar la nota al totalSumar uno al contador
Calcular el promedio de la clase como el total dividido entre diez
Imprimir el promedio de la clase
1 /* Fig. 3.6: fig03_06.c
2 Programa de promesio de la clase con
3 repeticin controlada por contador*/
4 #include
5
6 int main()
7 {
8 int contador, nota, total, promedio;
9
10 /* inicializacin */
11 total = 0;
12 contador = 1;
13
14 /* proceso */
15 while ( contador
Ingrese nota: 98
Ingrese nota : 76
Ingrese nota : 71
Ingrese nota : 87
Ingrese nota : 83
Ingrese nota : 90
Ingrese nota : 57
Ingrese nota : 79
Ingrese nota : 82
Ingrese nota : 94
El promedio de la clase es: 81
Ejecucin del Programa
Formulando Algoritmos con refinamiento descendente paso a paso
El problema se convierte en :
Desarrolle un programa de promedios de la clase que pueda procesar un nmero arbitrario de notas, cada vez que se ejecute el programa.
Nmero de alumnos desconocido
Como se culmina el programa?
Formulando Algoritmos con refinamiento descendente paso a paso
Debe usarse un valor centinela
Tambin conocido como valor seal, un valor substituto o valor bandera
Nos ayuda a indicar el fin del ingreso de datos.
El bucle termina cuando el usuario ingresa el valor escogido como centinela
El valor centinela se escoge de tal forma que no se confunda con un valor posible (en nuestro ejemplo conviene el valor -1 )
Formulando Algoritmos con refinamiento descendente paso a paso
Refinamiento descendente paso a paso
Empezamos con una representacin general de seudocdigo:
Determinar el promedio de la clase correspondiente al examen
Dividimos la rep. general en tareas pequeas y las enlistamos en orden:
Inicializar variablesIngreso, suma y cuenta de las notas del examenCalcular e imprimir el promedio
Formulando Algoritmos con refinamiento descendente paso a paso
La mayora de los programas se dividen en tres fases:
Inicializacin: se inicializan las variables
Proceso: Se ingresan los valores de datos y se ajustan las variables de programa correspondientes
Terminacin: calculo e impresin de los resultados finales
Formulando Algoritmos con refinamiento descendente paso a paso
Se refina la fase de inicializacin
Inicializar variables en:Inicializa total a ceroInicializa contador a cero
Refinar
Ingreso,suma y cuenta de las notas en Ingrese la primera nota(While) mientras el usuario no haya ingresado el centinela
Sumar la nota a totalSumar uno al contador de notasIngrese la siguiente nota (puede ser el sentinela)
Formulando Algoritmos con refinamiento descendente paso a paso
Refinar Calcular e imprimir el promedio en
(If ) si el contador no es igual a ceroPoner el promedio como el total dividido entre el
contadorImprimir el promedio
(else) de lo contrarioImprimir No se ingresaron notas
1. Se inicializan las
variables
2. Ingreso de usuario
2.1 Realizar bucle
1 /* Fig. 3.8: fig03_08.c
2 programa de promedio de la clse con
3 repeticin controlado por centinela */
4 #include
5
6 int main()
7 {
8 float promedio; /* new data type */
9 int contador, nota, total;
10
11 /* initializacion */
12 total = 0;
13 contador = 0;
14
15 /* proceso */
16 printf( Ingrese nota, -1 para finalizar: " );
17 scanf( "%d", ¬a );
18
19 while ( nota != -1 ) {
20 total = total + nota;
21 contador = contador + 1;
22 printf( " Ingrese nota, -1 para finalizar: " );
23 scanf( "%d", ¬a );
24 }
Promedio2.c
3. Clculo de Promedio
3.1 Imprime resultados
Salida del programa
25
26 /* terminacion */
27 if ( contador != 0 ) {
28 promedio = ( float ) total / contador;
29 printf( Promedio de la clase es %.2f", promedio );
30 }
31 else
32 printf( No se ingresaron notas\n" );
33
34 return 0; /* Fin del programa */
35 }
Ingrese nota, -1 para finalizar: 75
Ingrese nota, -1 para finalizar: 94
Ingrese nota, -1 para finalizar: 97
Ingrese nota, -1 para finalizar: 88
Ingrese nota, -1 para finalizar: 70
Ingrese nota, -1 para finalizar: 64
Ingrese nota, -1 para finalizar: 83
Ingrese nota, -1 para finalizar: 89
Ingrese nota, -1 para finalizar: -1
Promedio de la clase es 82.50
Estructuras de control anidadas
Problema
El colegio tiene una lista de notas para 10 alumnos.
Escribir un programa que analice los resultados.
Si ms de 8 alumnos aprobaron, imprimir el mensaje Aumentar el nivel"
Estructuras de control anidadas
Tener en cuenta: El programa debe procesar 10 resultados de
pruebaDebe usarse un lazo controlado por contador.
Deben usarse dos contadoresUno para el nmero de aprobados, otro para los
jalados.
Estructuras de control anidadas
Representacin generalAnalice los resultados del examen y decida si debe aumentarse
el nivel
Primer RefinamientoInicializar variables
Ingrese las diez notas y cuente los aprobados y jalados
Imprimir un resumen de los resultados del exmenes y decidir si se debe aumentar el nivel
Refine Inicializar variablesInicializar aprobados con cero
Inicializar jalados con cero
Inicializar contador de notas con uno
Estructuras de control anidadas
Refinar Ingrese las diez notas y cuente los aprobados y jalados
(While) mientras el contador de alumnos es menor o igual a 10Ingrese el siguiente resultado de examen
(If ) si el alumno aprob
Incremente en uno aprobados(else) de lo contario
Incremente en uno jalados
Incremente en uno el contador de alumnos
Estructuras de control anidadas
Refinar Imprimir un resumen de los resultados del exames y decidir si se debe aumentar el nivel
Imprimir el nmero de aprobados
Imprimir el nmero de jalados
(If) Si mas de 8 alumnos aprueban Imprimir Levantar el nivel
/*
Analisis de resultados de un examen */
#include
int main()
{
/* inicializacion de variables */
int pasaron = 0, jalaron = 0, estudiantes = 1, nota;
/* proceso de 10 notas; bucle controlado por contador */
while ( estudiantes = 11 ) /* if/else anidado en un while */
pasaron++;
else
jalaron++;
estudiantes++;
}
printf( "Pasaron %d\n", pasaron );
printf( "Jalaron %d\n", jalaron );
if ( jalaron > 8 )
printf( "Aumentar el nivel de enseanza\n" );
getch();
return 0;
}
Analisis1.c
Ms estructuras de control
Estructura de repeticin do-while()
Repeticin controlada por contador
Estructura de repeticin for()
Estructura de repeticin for(): Notas y Observaciones
Ejemplos usando la estructura for()
Enunciados break y continue
Resumen de programacin estructurada
La estructura de repeticin
do/while
Estructura de repeticin do/while Similar a while
La condicin para la repeticin se evala despus que el lazo es ejecutado Todas las acciones se ejecutan al menos una vez
Formato:do {
enunciado;
} while ( condicion );
Ejemplodo {
printf( "%d ", contador );
} while (++contador
do/while: Diagrama de Flujo
condicinVerdadero
Falso
acciones
1. Inicializacin
2. Bucle
3. Impresin
Salida
1 /* Estructura do while */
2
3 #include
4
5 int main()
6 {
7 int contador = 1;
8
9 do {
10 printf( "%d ", contador );
11 } while ( ++contador
Estructuras de repeticin
Otras estructuras de control de repeticin for
do/while
break
Usado para salir en forma inmediata y rpida de ciertas estructuras de control
continue
Usado para saltarse el resto de una estructura de repeticin, continuando con la siguiente iteracin del ciclo
Lo esencial de la repeticin
Bucle o Lazo
Grupo de instrucciones que la computadora ejecuta en forma repetida mientras cierta condicin se mantiene como verdadera
Repeticin controlada por contador
Repeticin Definida: se conoce cuntas veces se ejecuta el lazo
Se usa una variable de control para contar repeticiones
Lo esencial de la repeticin (2)
Repeticin controlada por centinela
Repeticin indefinida
Se usa cuando la cantidad de repeticioness es desconocida
El valor de centinela indica fin de los datos"
Repeticin Controlada por contador
La repeticin controlada por contador requiere:
El nombre de una variable de control (contador de bucle)
El valor inicial de la variable de control
Una condicin que compruebe el valor final de la variable de control (si se debe seguir con el ciclo)
El incremento (o decremento) con el cual, cada vez que se termine un ciclo, la variable control ser modificada.
Estructura de repeticin for
Formato a usarse con bucles forfor ( inicializacin; CondiciondeContinuaciondeCiclo;
incremento ) enunciado
Ejemplo: for( int contador = 1; contador
Estructura de repeticin for
La sentencia for reemplaza a bucles del tipo
while del siguiente tipo:inicializacin;while (CondiciondeContinuaciondeCiclo)
{
enunciado o accin;
incremento;}
Inicializacin e incremento
Se separan por comas
Ejemplo:
for (i = 0, j = 0; j + i
Estructura de repeticin for
Observaciones
Expresiones Aritmticas
Las partes de Inicializacin, Condicicin de continuacin de bucle e Incremento pueden contener expresiones aritmticas.
Si x es igual a 2 e y es igual a 10
for ( j = x; j
Estructura de repeticin for
Notas
"Incremento" puede ser negativo (decremento): x--.
Si la Condicin de continuacin de bucle es inicialmente falsa, el enunciado no se
ejecuta y el Control procede con el siguiente enunciado despus de la estrucutura for.
1. Inicializacin
2. Estructura de repeticin
for
Salida
1 /* Suma con for */
2
3 #include
4
5 int main()
6 {
7 int suma = 0, numero;
8
9 for ( numero = 2; numero
Los enunciados break y
continue
break
Causa una salida inmediata de una estructura tipo while, for, do/while o switch
La ejecucin del programa contina con la primera sentencia despus de la estructura.
Usos comunes de break
Salida temprana de un lazo
Saltar el resto de una estructura switch
Los enunciados break y
continue
continue
Salta los enunciados restantes del cuerpo de una estructura while, for o do/while
Contina con la siguiente iteracin del lazo
while y do/while
Se realiza la evaluacin de la continuacin del lazo inmediatamente despus que continue es ejecutada
for
La expresin de incremento es ejecutada, y luego es evaluada la condicin de continuacin del lazo
1. Inicializa variable
2. Lazo
3. Imprime
Salida
1 /* Fig. 4.12: fig04_12.c
2 Using the continue statement in a for structure */
3 #include
4
5 int main()
6 {
7 int x;
8
9 for ( x = 1; x
Programacin Estructurada
Ventaja:
Ms fcil de entender, probar, depurar y modificar programas.
Reglas para una Programacin
Estructurada
Se utilizan estructuras de una sola-entrada / una sola-salida.
Reglas: 1. Empezar con el diagrama ms simple posible.
2. Verificar qu acciones pueden ser reemplazadas por 2 acciones en secuencia.
3. Verificar qu acciones pueden ser reemplazadas por una estructura de control (if, if/else, switch, while, do/while o for).
Reglas de programacin estructurada
.
.
.
Regla 2 Regla 2 Regla 2
Regla 1 Inicie con el diagrama ms simple posible
Regla 2 Cualquier rectngulo puede ser reemplazado por dos rectngulos
en secuencia.
Programacin Estructurada
Regla 3
Regla 3 Reemplazar algunos rectngulos con estructuras de control
Regla 3Regla 3
Programacin Estructurada
Todos los programas pueden estar compuestos de 3 controles bsicos: Secuencia manejada por el compilador. Seleccin if, if/else o switch.
Repeticin while, do/while o for.
Slo pueden ser combinadas de 2 maneras: Anidando (Nesting) Apilando (Stacking)
Cualquier seleccin puede ser reescrita como un if()
Cualquier repeticin puede ser reescrita como unwhile()
Estructuras de Control
Ejemplos Resueltos
Problema 1
Elaborar un programa que calcule y muestre el factorial de un nmero ingresado. Considerar que el programa debe validar que el nmero ingresado sea natural.
Problema 2
Elaborar un programa en C que calcule y muestre el nmero de neper elevado al nmero ingresado x, usando aproximaciones por series. Adicionalmente, deber ingresarse el nivel de aproximacin n.
Considerar que la sumatoria de la serie correspondiente es:
0 !n
nx
n
xe
Problema 3: El mtodo de Newton
Escribir un programa que resuelva la ecuacin f(x)=0 utilizando el mtodo de Newton. Para esto deber tener en cuenta que debe ingresar un valor inicial X0 y considere el intervalo de derivacin diferencial como h=0.00001 y el intervalo de convergencia e=0.0001. Adicionalmente, debe considerar un mximo nmero de repeticiones N=30, en el caso la solucin no se pueda hallar y evitar que el programa entre en un lazo infinito. Pruebe el programa con diferentes valores de h, e y N.
Problema 3: El mtodo de Newton
x
f(x)
tangente de f(x) = f(x2)
x1x2
tangente de f(x) = f(x1)
Raz: f(x) = 0
Problema 4: El mtodo Runge-Kutta
Las leyes que gobiernan los fenmenos de la naturaleza se expresan habitualmente en forma de ecuaciones diferenciales.
El movimiento de los cuerpos se expresa con una ecuacin diferencial de segundo orden, por ejemplo: la ecuacin que describe los sistemas oscilantes, la propagacin de las ondas, la transmisin del calor, la difusin, el movimiento de partculas subatmicas, etc.
Problema 4: El mtodo Runge-Kutta
Sea una ecuacin diferencial de primer orden, con una condicin inicial.
Se elige un intervalo de paso h, y se calculan cuatro constantes k1, k2, k3, k4 de acuerdo con el procedimiento esquematizado en la siguiente tabla.
Segn el procedimiento ordinario de Runge-Kutta, a partir del valor de x en el instante t se determina el valor de x en el instante t+h mediante la frmula que figura en la ltima fila de dicha tabla.
Problema 4: El mtodo Runge-Kutta
Problema 4: El mtodo Runge-Kutta
Elaborar un programa en C para resolver un ecuacin diferencial mediante el procedimiento de Runge-Kutta que se aplica de forma directa a una ecuacin diferencial de primer orden:
dx/dt = 1.0 - t + 4.0*x y x(0.0)=1
Atencin de Preguntas
Fin del Captulo 3