Fundamentos de Informática
Dpto. de ATC, Universidad de Sevilla - Página 1 de 18
1
Capítulo 3:Capítulo 3:
2
INTRODUCCIÓN A LA PROGRAMACIÓN IMPERATIVA
Programación en lenguaje C
INSTRUCCIÓN DE ASIGNACIÓN Y COMPOSICIÓN SECUENCIAL
Variables: Declaraciones Tipos de datos Modificadores de tipos de datos
ConstantesLa Sentencia de AsignaciónExpresiones aritméticasConversiones de tipos de datos
3
Funciones estándar de E/S: scanf y printfEspecificación de formatosSecuencias de escape
Expresiones de condiciónExpresiones relacionalesExpresiones lógicasPrecedencia de operadores
ESTRUCTURAS CONDICIONALESEstructura if-else
ESTRUCTURAS ITERATIVASbucle whilebucle do … whilebucle for
4
FUNCIONESÁmbito de variables: variables locales y globales
PUNTEROSVECTORES
Cadenas de caracteresMATRICESFICHEROSESTRUCTURAS
Fundamentos de Informática
Dpto. de ATC, Universidad de Sevilla - Página 2 de 18
5
El ordenador sólo reconoce el lenguaje máquina (lenguaje ensamblador).Las programadores tienen dificultades para trabajar con este lenguaje.Solución: lenguajes de programación de alto nivel (por ejemplo el lenguaje C).
Pueden sustituir varias instrucciones en lenguaje máquina por una sola instrucción de un lenguaje más cercano al lenguaje matemático
Más fácil desarrollo/mantenimiento software.No es necesario conocer el hardware del ordenador Portabilidad software.
6
Es necesario un proceso de traducción de lenguaje en alto nivel a lenguaje máquina (lenguaje ensamblador) TraducciónDos posibilidades de traducción: compilar o interpretar un programa escrito en un lenguaje de alto nivel.
Código lenguaje C
variable3 = variable2 + 5;
Código ensamblador
MOV R3, [R4] ; R3 variable2
ADD R3, 5 ; R3 variable2 + 5
MOV [R5], R3 ; variable3 R3
7
Compilar: mediante un programa llamado compilador se genera un fichero ejecutable (.exe) a partir de un fichero con código fuente escrito en un lenguaje de alto nivel (.c).Interpretar: mediante un programa llamado intérprete se traduce sentencia a sentencia (instrucción a instrucción) y a continuación se ejecuta el código de la sentencia traducida.Ventajas/desventajas: la compilación permite la ejecución de programas más rápida y da la posibilidad de optimizar código. La traducción ahorra compilación, necesita menos tamaño (no hay .exe) y facilita la portabilidad.
8
El proceso de compilación y ejecución tiene varios pasos:
1. Escribir código fuente a partir algoritmo archivo .c
2. “Compilar” el código fuente archivo código objeto .obj
3. “Enlazar” (“link”) el fichero .obj con otros ficheros con código objeto. Necesarios para poder generar un fichero ejecutable archivo .exe
4. Ejecutar el archivo .exe por medio del S.O.
PROGRAMADOR
COMPILADOR
“LINKADOR”
PROCESO DE COMPILACIÓN
ALGORITMO
LENGUAJE DE ALTO NIVEL (.C)
FICHERO OBJETO (.OBJ)OTROS OBJ,LIBRERIAS,
S.O. (I/O)
FICHERO EJECUTABLE (.EXE)
HARDWARE
EJECUCIÓN (S.O.)
Fundamentos de Informática
Dpto. de ATC, Universidad de Sevilla - Página 3 de 18
9 10
Todos los programas en C tienen una función main o principal. Su formato ó sintaxis:
ESTRUCTURA DE UN PROGRAMA EN C: la función main
main ()
{
// Esto es un comentario y no se trata como sentencia
/* Esto también
es un comentario y no se traduce a código máquina */
lista_de_sentencias/instrucciones;
}
Los paréntesis () denotan que es una función. Todo en C se divide en funciones.
11
Las llaves { y } denotan inicio y fin de programa respectivamente.La lista de sentencias en la función main puede incluir la declaración de numerosos tipos de datos (por ej.vectores), estructuras selectivas, estructuras iterativas (por ej. bucles), ... e incluso llamadas a otras funciones.Comentarios: sirven para hacer anotaciones en el código fuente para facilitar su comprensión a otros programadores. Dos tipos: // (comentan una línea) y /* */ (comentan varias líneas).
12
Datos que pueden variar a lo largo de la ejecución del programa.Hay diversos tipos de variables en C: enteras, caracteres, flotantes, booleanas, vectores, ...Son necesarias declararlas al principio (después de main () { ...). Esto tiene el objetivo de indicar al compilador que reserve un espacio determinado en memoria. La longitud en bytes de este espacio será función del tipo de variable.Formato ó sintaxis:
Especificador_de_tipo Lista_de_nombres ;
Especificador_de_tipo: indica el tipo de dato que se almacena en la variable (entero, flotante, carácter ASCII, ...).Lista_de_nombres: uno o más nombres de variables separados por comas.
Nombres de variables: pueden contener el carácter guión bajo (_), dígitos numéricos y letras del código ASCII estándar (no pueden contener eñes ni caracteres con tildes). No pueden comenzar por un dígito numérico. Se diferencian mayúsculas y minúsculas.Ejemplos:Nombre correctos: importe3, hora_comienzo, dia, Dia, DIANombres incorrectos: día, 3importe, año
Fundamentos de Informática
Dpto. de ATC, Universidad de Sevilla - Página 4 de 18
13
Números reales de doble precisión (64 bits)doubleNúmeros reales de simple precisión (32 bits)floatNúmero entero con signo de 32 bits. Rango entre -231 y 231 -1int
Número entero con signo de 8 bits (carácter ASCII). Rango entre -128 y 127.
charRANGOTIPOTipos de Tipos de
variables variables simples:simples:
Número real de precisión extendida (80 bits).long doubleNúmero entero entre -231 y 231 -1 (32 bits).long intNúmero entero entre -215 y 215 -1 (16 bits).short intNúmero entero entre 0 y 232 -1 (32 bits).unsigned intNúmero entero entre 0 y 255 (8 bits).unsigned char
RANGOTIPOModificadores Modificadores de tipos de de tipos de variables:variables:
char letra_dni;unsigned int dni;float nota_media, importeCompras;
Ejemplos:Ejemplos:
14
Datos que permanecen invariables a lo largo de la ejecución de un programa.Formato o sintaxis:
#define IDENTIFICADOR_CTE VALOR_CTE
Se definen al principio del programa, antes de la función main().No se dice explícitamente de qué tipo es la constante ya que el compilador lo reconoce por el aspecto de valor_cte.
#define DIAS_DE_LA_SEMANA 7
#define PTS_POR_EURO 166.386
#define SALUDO “¡Hola, amigo!”
15
Forma básica de almacenar un dato en una variable.Todas las sentencias de asignación acaban con el carácter (;)Formato ó sintaxis:
Nombre_de_variable = expresión ;nombre_de_variable: Nombre de variable declarada previamente en alguna sentencia de declaración.operador de asignación (=): Indica que el valor calculado en la expresión debe ser almacenado en Nombre_de_variable.expresión: Indica cómo se calcula el valor a almacenar.
float dolares, euros = 0.0 ;...euros = pesetas /166.386 ;dolares = 5.0 + euros ;
El operador de asignación se puede utilizar también en la inicialización de variables:
16
Ejemplo
#define PI 3.14
main() {double radio = 3e6;double perimetro;radio = perimetro;perimetro = 2 * PI * radio;30 = radio;PI = perimetro;area = PI * radio * radio ;
}
Declaración con inicialización.No es una sentencia de asignación propiamente dicha.
Declaración sin inicialización.
Asignamos a la variable perimetro el valor de la expresión
ERROR: la variable area no está declarada.
ERROR: se está intentando asignar un valor a una constante.
ERROR: El valor de la variable perimetro no está definido.
radioPI ⋅⋅2
Fundamentos de Informática
Dpto. de ATC, Universidad de Sevilla - Página 5 de 18
17
El resultado de la expresión es el valor devuelto por la funciónfunción(lista_parámetros)
Post-Incremento: Devuelve el valor de la variable; después suma 1 al valor de la variable.variable ++
Post-Decremento: Devuelve el valor de la variable; después resta 1 al valor de la variablevariable --
-- variable
Pre-Incremento: Suma 1 al valor de la variable; luego devuelve su valor (ya incrementado).++ variable
Pre-Decremento: Resta 1 al valor de la variable; luego devuelve su valor (ya decrementado).
Operador módulo: Devuelve el resto de la división entera Expresión1 entre Expresión2Expresión1 % Expresión2
El resultado es la Expresión cambiada de signo (operador unario)- Expresión
Divide Expresión1 entre Expresión2 Expresión1 / Expresión2
Multiplica Expresión1 por Expresión2Expresión1 * Expresión2
Resta Expresión2 a Expresión1Expresión1 – Expresión2
Suma Expresión1 y Expresión2, que son, a su vez, expresiones más pequeñasExpresión1 + Expresión2
El resultado de la expresión es el valor de la variableNombre_de_Variable
El resultado de la expresión es el valor de la constanteConstante
Resultado de la expresión EXPRESIÓN ARITMÉTICA
18
Ejemplos
++(3/radio) ERROR
sqrt(34)++ ERROR
--(2*area) ERROR
(area+3)-- ERROR
7%4 resultado: 3
-PI
3/2 resultado: 1
PI*radio*radio
‘A’-’a’+3
3+radio+34
sqrt(area+1)
area
PI
++area
area++
--perimetro
radio--
3%2 resultado: 1
-2
perimetro/PI
2*PI*radio
perimetro-PI
area+perimetro
sqrt(34)
perimetro
3.32
EJEMPLOS
pow(sqrt(3),5)función(lista_parámetros)
PI++ ERRORvariable ++
PI-- ERRORvariable --
-- variable
++3 ERROR++ variable
--3 ERROR
7.0%5 ERRORExpresión1 % Expresión2
-sqrt(radio)- Expresión
3.0/2.0 resultado: 1.5Expresión1 / Expresión2
PI*(radio+2)Expresión1 * Expresión2
3+4-5.6-3Expresión1 – Expresión2
‘A’+3Expresión1 + Expresión2
radioNombre_de_Variable
‘A’Constante
EXPRESIÓN ARITMÉTICA
#define PI 3.14double radio = 3e6;double perimetro;
Supongamos las siguientes declaraciones
19
Precedencia y orden de evaluación (1)
Cuando en una expresión aparecen varios operadores con el mismo tipo, se evalúan de izquierda a derechaSe pueden utilizar paréntesis para cambiar el orden de precedencia de las expresiones
La precedencia de los operadores nos indica en el orden en que se realizan las operaciones en una expresión compleja (con varios operadores de distinto tipo).La precedencia de los operadores aritméticos es la siguiente:
++ --- (unario)* / %+ -
Más alta
Más baja
Las operaciones con mayor precedencia se realizan antes
20
Precedencia y orden de evaluación (2)Ejemplos
-x + 2 * z + n + y / x - 7
-x + 2 * ( z + n + y ) / x - 7
Las operaciones marcadas se realizan antes que las sumas y restas
Se calcula la suma
Se calcula el producto
Se calcula la división
(-x) + (2*z) + n + (y/x) - 7
(-x) + ((2*( z + n + y ))/x) - 7
Expresión equivalente
Expresión equivalente
Ejemplo 1
Ejemplo 2
Fundamentos de Informática
Dpto. de ATC, Universidad de Sevilla - Página 6 de 18
21
Conversiones de tipos de datos (1)
Reglas de conversión en las expresiones aritméticas:1. Promoción a entero: todos los operandos de tipo char o short se
convierten a int. Los unsigned char o unsigned short se convierten a unsigned int.
2. Cuando un operador opera sobre dos operandos del mismo tipo, el resultado es un valor de dicho tipo.
3. Cuando un operador opera sobre dos tipos diferentes, el tipo de menor rango se convierte al de mayor rango.
Ejemplos sin conversiones:
int x;double y;3 + 5 int + int resultado intx * 3 int * int resultado inty + 3.5 double + double resultado double3 / 2 int / int resultado 1, int3.0 / 2.0 double / double resultado 1.5, double
long doubledoublefloatunsigned longlongunsigned intint
+ rango
- rango
22
Conversiones de tipos de datos (2)Ejemplo con conversiones
main() {char c;int i;float f;double d;float result;
result = 3 / 2;result = 3 / 2.0;result = 3.0 + 3/2;result = c / i + f * d – (f + i);
}
result = 3 / 2.0;
float: 3.0
float: 1.5
result = 3.0 + 3/2;
int: 1
float: 1.0
float: 4.0
result = 3 / 2;
int: 1
float: 1.0
23
Conversiones de tipos de datos (3)Ejemplo con conversiones
main() {char c;int i;float f;double d;double result;
...result = c / i + f * d – (f + i);
}
int
int
double
double
double
double
float
float
double
double
24
Conversiones de tipos de datos (4)Sentencia de asignación
Todos los valores que se asignan a una variable se convierten al tipo de dicha variable.Ejemplo:
main() {char c;int i;double d = 3.56;
i = 3 / 2.0;i = d + 4;c = i;
}
El resultado de la expresión es de tipo float y se convierte a int: 1.5 1
En las conversiones a entero no se redondea
El resultado de la expresión es de tipo doubley se convierte a int: 3.56 3
El resultado de la expresión es de tipo int y se convierte a char
Fundamentos de Informática
Dpto. de ATC, Universidad de Sevilla - Página 7 de 18
25
Los compiladores de C incluyen una serie de funciones estándar que facilitan ciertas tareas. Estas funciones se agrupan en librerías.La librería de entrada/salida estándar de C se llama stdioPara utilizarla hay que escribir la siguiente sentencia antes de la función main:
#include <stdio.h>
Estudiaremos dos funciones para la entrada/salida (incluidas en la librería stdio).
printf : imprime mensajes por pantallascanf : lee datos simples por teclado tales como números o caracteres.
26
printfFormato o sintáxis:
printf ( texto_de_formato, lista_argumentos );
texto_de_formato:Cadena de caracteres que contiene el texto que se va a escribir en pantallaPuede contener secuencias de escape y/o especificaciones de formato
lista_argumentos: Variables o expresiones, separadas por comas, que contienen los datos que se van a escribir en pantallaDebe existir un argumento por cada especificación de formato
Las especificaciones de formato se utilizan para insertar en el texto el valor de las expresiones o variables que aparecen en lalista de argumentos
27
Especificación de formatos y secuencias de escape:
float%f
double%lf
Cadena de caracteres%s
Carácter ASCII (char)%c
unsigned intSe escribe en pantalla en formato hexadecimal
%x
unsigned int%u
int%d
FORMATOCÓDIGO
Código ASCII en hexadecimal\xhhSigno de interrogación\?Barra invertida\\Comillas simples\’Dobles comillas\”Retorno de carro\rTabulador vertical\vTabulador horizontal\tNueva línea\nAvance de hoja\fRetroceso\bCarácter de alarma\a
SIGNIFICADOCÓDIGO
Especificación de formato: Secuencias de escape:
28
printf
printf ( “La variable x vale %d”, x ) ;
int x, y;x = 32;y = 100; La variable x vale 32
printf ( “mm\nLa variable y vale %d\n”, x+2 ) ;
printf ( “(x,y) = (%d,%d)\n”, x, y ) ;
printf ( “x=%d y+x = %d+%d = %d\n”, x, y, x, x+y ) ;
La variable x vale 32mmLa variable y vale 34
La variable x vale 32mmLa variable y vale 34(x,y) = (32,100)
La variable x vale 32mmLa variable y vale 34(x,y) = (32,100)x=32 y+x = 100+32 = 132
Fundamentos de Informática
Dpto. de ATC, Universidad de Sevilla - Página 8 de 18
29
scanf
Formato o sintáxis:
scanf ( texto_de_formato, &variable, &variable, ... );
texto_de_formato: Cadena de caracteres que contiene información sobre el tipo de dato que se va a leer del teclado Recomendamos utilizar solamente especificaciones de formato
variable: Variable en la que se guardará el valor leídoCada variable debe ir precedida del carácter &(Existen excepciones a esta regla, por ejemplo para variables tipo puntero o cadena de caracteres. Se estudiarán dichas excepciones en los temas correspondientes)
Deben aparecer tantas variables como especificaciones de formato
int peso;scanf ( “%d”, &peso) ;
&
Ejemplo:
30
Es verdadero si Operando1 ES DISTINTO QUE Operando2Operando1 != Operando2
Es verdadero si Operando1 ES IGUAL QUE Operando2Operando1 == Operando2
Es verdadero si Operando1 ES MENOR O IGUAL QUE Operando2Operando1 <= Operando2
Es verdadero si Operando1 ES MENOR QUE Operando2Operando1 < Operando2
Es verdadero si Operando1 ES MAYOR O IGUAL QUE Operando2Operando1 >= Operando2
Es verdadero si Operando1 ES MAYOR QUE Operando2Operando1 > Operando2
Resultado de la expresión Expresión RELACIONAL
Usadas en las condiciones de las estructuras selectivas e iterativas.Se modelan como variables y/o expresiones del álgebra de Boole una expresión de condición es cierta ó falsa.
31
Es verdadero si Operando1 NO es verdadero! Operando1
Es verdadero si Operando1 es verdadero O Operando2 es verdaderoOperando1 || Operando2
Es verdadero si Operando1 es verdadero Y Operando2 es verdaderoOperando1 && Operando2
Resultado de la expresiónExpresión LÓGICA
32
Precedencia de Precedencia de los operadores:los operadores:
&&
||
= += -=
== !=
< <= > >=
+ -
* / %
Alta
Baja
++ --
-(operador unario de signo)
~ !
PrioridadOperador
(Los paréntesis alteran el orden evaluación)
Fundamentos de Informática
Dpto. de ATC, Universidad de Sevilla - Página 9 de 18
33
if-elseEsta estructura permite elegir entre dos posibles grupos de sentencias en función de una condiciónEs equivalente a la estructura selectiva doble del pseudocódigo
SI condición ENTONCESgrupo sentencias1
SINOgrupo sentencias2
FINSI
Pseudocódigo
if (condición) {grupo_sentencias1
}else {grupo_sentencias2
}
Código C
Funcionamiento:
si la condición es verdadera,
se ejecuta el grupo de sentencias1
en otro caso (es decir, si es falsa),
se ejecuta el grupo de sentencias2
34
if-elseEl grupo de sentencias del else es opcional:
Las llaves no son necesarias si el grupo de sentencias esta formado por una sola sentencia:
La condición puede ser:Una expresión de condición (expresión lógica)Una expresión aritmética cuyo resultado se interpreta como un valor booleano:
Distinto de cero VERDADEROIgual a cero FALSO
if (condición) {grupo_sentencias1
}
if (condición)sentencia;
if (condición)sentencia1;
elsesentencia2;
35
Ejercicio 1: Enunciado
Escribir en código C el algoritmo correspondiente al ejercicio 2 de las Prácticas de Algorítmica:
Construya un algoritmo en pseudocódigo tal que, dados los valores enteros P y Q, que deben leerse del teclado, determine si los mismos satisfacen la siguiente expresión:
En caso afirmativo debe escribir por pantalla los valores de P y Q.
243 <−+ PQP
36
Ejercicio 1: Solución en pseudocódigo
ALGORITMO Problema2VARIABLES
p, q SON ENTEROSINICIO
LEE p
LEE q
SI p*p*p + q*q*q*q – 2*p*p < 680 ENTONCESESCRIBE “Los valores de P y Q son:”ESCRIBE “P = “, p, “Q = “, q
FINSIFIN
Fundamentos de Informática
Dpto. de ATC, Universidad de Sevilla - Página 10 de 18
37
Ejercicio 1: Solución en código C
main(){
int p, q;
scanf( “%d”, &p );scanf( “%d”, &q );if (p*p*p + q*q*q*q – 2*p*p > 680) {
printf( “Los valores de P y Q son:\n” );printf( “p = %d, q = %d\n”, p, q );
}}
ALGORITMO Problema2VARIABLES
p, q SON ENTEROSINICIO
LEE pLEE qSI p*p*p + q*q*q*q – 2*p*p < 680 ENTONCES
ESCRIBE “Los valores de P y Q son:”ESCRIBE “P = “, p, “Q = “, q
FINSIFIN
38
Ejercicio 2: Enunciado
Modificar el programa anterior para que los valores de P y Q se escriban en pantalla en orden creciente; es decir, primero aparece en pantalla la variable con el mayor valor. Además, en el caso de que los valores de P y Q no cumplan la expresión, se debe escribir el siguiente mensaje: “Los valores no satisfacen la expresión”
39
Ejercicio 2: Solución en código C
main(){
int p, q;
scanf( “%d”, &p );scanf( “%d”, &q );if (p*p*p + q*q*q*q – 2*p*p > 680) {
printf( “Los valores de P y Q son:\n” );if (p > q)
printf( “p = %d, q = %d\n”, p, q );else
printf( “q = %d, p = %d\n”, q, p );}else {
printf( “Los valores no satisfacen la expresion\n” );}
}
Las llaves en el if son obligatorias porque contiene varias sentencias
Las llaves en el else son opcionales porque contiene una sola sentencia
40
Ejercicio 3: EnunciadoEscribir en código C el algoritmo correspondiente al ejercicio 3 de las Prácticas de Algorítmica:
Elabore un algoritmo en pseudocódigo que lea del teclado una temperatura en grados Centígrados, calcule los grados Fahrenheit y escriba por pantalla el deporte que es apropiado practicar a esatemperatura, teniendo en cuenta la siguiente tabla:
Para convertir grados Centígrados (variable c) a Fahrenheit (variable f) se utiliza la siguiente ecuación:
DEPORTE TEMPERATURA en grados Fahrenheit
Natación > 85 Tenis 70 < TEMP <= 85 Golf 35 < TEMP <= 70 Esquí 32 < TEMP <= 35
Marcha <= 32
3259+⋅= cf
Fundamentos de Informática
Dpto. de ATC, Universidad de Sevilla - Página 11 de 18
41
Ejercicio 3: Solución en pseudocódigoALGORITMO Problema3VARIABLES
cent, fah SON REALESINICIO
LEER centfah ← (9 / 5) * cent + 32SI fah > 85 ENTONCES
ESCRIBE “Natacion”SINO
SI fah > 70 ENTONCESESCRIBE “Tenis”
SINOSI fah > 35 ENTONCES
ESCRIBE “Golf”SINO
SI fah > 32 ENTONCESESCRIBE “Esqui”
SINOESCRIBE “Marcha”
FINSIFINSI
FINSIFINSI
FIN
42
Ejercicio 3: Solución en código C (1)main(){
float cent, fah;scanf( “%f”, ¢ );fah = 9.0 / 5 * cent + 32;if (fah > 85)
printf( “Natacion” );else
if (fah > 70) printf( “Tenis” );
elseif (fah > 35)
printf( “Golf” );else
if (fah > 32)printf( “Esqui” );
elseprintf( “Marcha” );
}
Escribimos 9.0 para que la división sea con decimales.
La expresión anterior es equivalente a:
fah = (9.0/5) * cent + 32;
Puesto que los operadores de división (/) y producto (*) tienen la misma prioridad, se evalúan izquierda a derecha.
43
Ejercicio 3: Solución en código C (2)main(){
float cent, fah;scanf( “%f”, ¢ );fah = 9/5 * cent + 32;if (fah > 85)
printf( “Natacion” );else
if (fah > 70) printf( “Tenis” );
elseif (fah > 35)
printf( “Golf” );else
if (fah > 32)printf( “Esqui” );
elseprintf( “Marcha” );
}
Cada else contiene una única sentencia: la sentencia if
En estos casos se puede poner el if en la misma línea que el else para que el código quede más legible.
if (condición) {sentencias
}else if (condición) {sentencias
}else {sentencias
}
44
Ejercicio 3: Solución en código C (3)
main(){
float cent, fah;scanf( “%f”, ¢ );fah = 9/5 * cent + 32;if (fah > 85)
printf( “Natacion” );else if (fah > 70)
printf( “Tenis” );else if (fah > 35)
printf( “Golf” );else if (fah > 32)
printf( “Esqui” );else
printf( “Marcha” );}
Fundamentos de Informática
Dpto. de ATC, Universidad de Sevilla - Página 12 de 18
45
Permite repetir la ejecución de un grupo de sentencias (es decir, de una o varias sentencias) mientras se cumpla una condición.Es equivalente a la estructura repetitiva MIENTRAS del pseudocódigo.Las estructuras iterativas también se llaman bucles.
MIENTRAS condición HACERgrupo de sentencias
FIN MIENTRAS
Pseudocódigo
while (condición) {grupo_de_sentencias
}
Código C
Funcionamiento:
Mientras la condición es verdadera,
se ejecuta el grupo de sentencias
El grupo de sentencias está formado por las sentencias que se encuentran entre las llaves del bucle while
46
sentencia;
while (condición) {
grupo_de_sentencias
}
sentencia;
VERDADERAFALSA
...sentencia;while (condición) {
grupo_de_sentencias}sentencia;...
Flujo de ejecución de las sentencias
47
Si el grupo de sentencias esta formado por una sola sentencia, las llaves no son necesarias:
La condición sigue las mismas reglas que en la sentencia if
Cada ejecución de las sentencias de un bucle se llama iteración
El bucle while puede iterar de cero a N veces: si la condición nunca es verdadera, el grupo de sentencias del bucle no se ejecuta
while (condición)sentencia;
48
Ejercicio 1: Enunciado
Escriba en código C el algoritmo correspondiente al ejercicio 4 de las Prácticas de Algorítmica:
Escriba un algoritmo que lea del teclado un número entero y que compruebe si es menor que 5. Si no lo es, debe volver a leer un número, repitiendo la operación hasta que el usuario escriba un valor correcto. Finalmente debe escribir por pantalla el valor leído.
Fundamentos de Informática
Dpto. de ATC, Universidad de Sevilla - Página 13 de 18
49
Ejercicio 1: Solución en pseudocódigo
ALGORITMO problema4
VARIABLES
num ES ENTERO
INICIO
ESCRIBE “Teclee un número menor que 5”
LEE num
MIENTRAS num >= 5 HACER
ESCRIBE “Teclee un número menor que 5”
LEE num
FIN MIENTRAS
ESCRIBE “El número leído es “, num
FIN
50
Ejercicio 1: Solución en código Cmain() {
int num;printf( “Teclee un número menor que 5: “ );scanf( “%d”, &num );while (num >= 5) {
printf( “Teclee un número menor que 5: “ );scanf( “%d”, &num );
}printf( “El numero leído es %d\n”, num );
}
Las llaves son obligatorias porque el bucle while contiene más de una sentencia
Dentro del bucle debe cambiar el valor de alguna de las variables que aparecen en la condición para que pueda llegar a ser falsa alguna vez.
while (num >= 5) {printf( “Teclee ...: “ );
}
En el siguiente ejemplo, si num es mayor o igual que 5, el bucle while se convierte en un bucle sin fin
51
Ejercicios para hacer en casa
Escriba en código C los algoritmos correspondiente a los ejercicios 5, 6 y 7 de las Prácticas de Algorítmica:
52
Ejemplo 1 (versión 1)El siguiente programa calcula la potencia de un número real elevado a un exponente entero positivo. Los valores de la base y el exponente se leen del teclado.
main() {float base, potencia;int exponente, contador;
scanf( “%d”, &exponente );scanf( “%f”, &base );contador = 0;potencia = 1;while (contador < exponente) {
potencia = potencia * base;contador++;
}}
Se asigna un valor inicial a las variables de la condición del bucle.
Se modifica el valor de alguna de las variables de la condición.
El contador se incrementa en cada iteración
El número de iteraciones es igual al valor del exponente: el bucle se repite para los valores de contador desde 0 hasta exponente-1
Fundamentos de Informática
Dpto. de ATC, Universidad de Sevilla - Página 14 de 18
53
Ejemplo 1 (versión 2)
main() {float base, potencia;int exponente, contador;
scanf( “%d”, &exponente );scanf( “%f”, &base );contador = 1;potencia = 1;while (contador <= exponente) {
potencia = potencia * base;contador++;
}}
Esta transparencia muestra otra versión del código anterior.
En negrita aparecen los cambios realizados.
El número de iteraciones es el mismo que en la versión anterior.
Ahora el bucle se repite para los valores de contador desde 1hasta exponente
54
Ejemplo 1 (versión 3)
main() {float base, potencia;int exponente;
scanf( “%d”, &exponente );scanf( “%f”, &base );potencia = 1;while (exponente>0) {
potencia = potencia * base;exponente--;
}}
Esta transparencia muestra otra versión del código anterior.
En negrita aparecen los cambios realizados.
El número de iteraciones es el mismo que en la versión anterior.
Ahora el bucle se repite para los valores de exponente desde su valor inicial hasta 1
El exponente se decrementa en cada iteración.
55
Permite repetir la ejecución de un grupo de sentencias mientras se cumpla una condición.Es parecida, pero no igual, a la estructura repetitiva HASTA delpseudocódigo.
do {grupo_de_sentencias
}while (condición);
Funcionamiento:
Se ejecuta el grupo de sentenciasy se repiten mientras la condición es verdadera
El grupo de sentencias está formado por las sentencias que se encuentran entre las llaves del bucle do-while
El bucle do-while termina con un punto y coma (;)
56
sentencia;
do {
grupo_de_sentencias
}while (condición);
sentencia;
...sentencia;do {
grupo_de_sentencias}while (condición);sentencia;...
VERDADERAFALSA
Flujo de ejecución de las sentencias
Fundamentos de Informática
Dpto. de ATC, Universidad de Sevilla - Página 15 de 18
57
Las llaves no son necesarias si el grupo de sentencias esta formado por una sola sentencia:
La condición sigue las mismas reglas que en la sentencia if
El bucle do-while puede iterar de 1 a N veces: aunque la condición nunca sea verdadera, el grupo de sentencias del bucle se ejecutasiempre la primera vez
dosentencia;
while (condición);
58
Ejemplo 1: Enunciado
Escriba en código C el algoritmo correspondiente al ejercicio 4 de las Prácticas de Algorítmica utilizando un bucle do-while:
Escriba un algoritmo que lea del teclado un número entero y que compruebe si es menor que 5. Si no lo es, debe volver a leer un número, repitiendo la operación hasta que el usuario escriba un valor correcto. Finalmente debe escribir por pantalla el valor leído.
59
Ejemplo 1: Solución
main() {int num;do {
printf( “Teclee un número menor que 5: “ );scanf( “%d”, &num );
}while (num >= 5);printf( “El numero leído es %d\n”, num );
}
Solución con bucle while
Solución con bucle do-while
main() {int num;printf( “Teclee un número menor que 5: “ );scanf( “%d”, &num );while (num >= 5) {
printf( “Teclee un número menor que 5: “ );scanf( “%d”, &num );
}printf( “El numero leído es %d\n”, num );
}
60
Equivalencia entre bucles while y do-while
do {grupo_de_sentencias
}while (condición);
grupo_de_sentenciaswhile (condición) {
grupo_de_sentencias}
El grupo de sentencias del bucle do-while se duplica en el bucle while: debe aparecer delante y dentro del bucle
Fundamentos de Informática
Dpto. de ATC, Universidad de Sevilla - Página 16 de 18
61
Permite repetir la ejecución de un grupo de sentencias mientras se cumpla una condición.Su sintaxis es la siguiente:
La inicialización y la actualización son expresiones aritméticas.La condición es una expresión lógica o aritmética que sigue las mismas reglas que en la sentencia if
El bucle for se ejecuta mientras la condición sea verdadera La inicialización, la condición y la actualización son opcionales.
Los caracteres ‘;’ son obligatorios: deben aparecer siempre.
for (inicialización; condición; actualización) {grupo_de_sentencias
}
62
sentencia;
for (inicialización; condición; actualización){
grupo_de_sentencias
}
sentencia;
FALSA VERDADERA
Flujo de ejecución de las sentencias
63
Si el grupo de sentencias esta formado por una sola sentencia, las llaves no son necesarias:
El bucle for puede iterar de cero a N veces: si la condición nunca es verdadera, el grupo de sentencias del bucle no se ejecuta
Si un bucle for no tiene condición, se convierte en un bucle sin fin:
for (inicialización; condición; actualización)sentencia;
for (inicialización ;; actualización) {grupo_de_sentencias
}
64
Ejemplo 1: bucle for con llaves
Ejemplo 2: bucle for sin llaves
Ejemplos 1 y 2
for (i=0; i<N; i++) {printf( “%d\n”, i ); x = x + i;
}
for ( ; i<N; i++) printf( “%d\n”, i ); x = x + i;
Sentencias que forman parte del cuerpo del bucle for
inicialización condición actualización
Sólo una sentencia forma parte del cuerpo del bucle for
Bucle for sin inicialización
Fundamentos de Informática
Dpto. de ATC, Universidad de Sevilla - Página 17 de 18
65
Equivalencia entre bucles while y for
for (inicialización; condición; actualización) {grupo_de_sentencias
}
for (; condición;) {grupo_de_sentencias
}
while (condición) {grupo_de_sentencias
}
inicialización;while (condición) {
grupo_de_sentenciasactualización;
}
Un bucle for sin inicialización ni actualización es igual que un bucle while
66
Ejemplo 3
main() {float base, potencia;int exponente, contador;
scanf( “%d”, &exponente );scanf( “%f”, &base );contador = 0;potencia = 1;while (contador < exponente) {
potencia = potencia * base;contador++;
}}
main() {float base, potencia;int exponente, contador;
scanf( “%d”, &exponente );scanf( “%f”, &base );potencia = 1;for (contador = 0; contador < exponente; contador++) {
potencia = potencia * base;}
}
El siguiente programa calcula la potencia de un número real elevado a un exponente entero positivo utilizando un bucle for. Los valores de la base y el exponente se leen del teclado.
Solución con bucle for
Solución con bucle while
67
Se dice que dos bucles están anidados cuando uno de ellos se encuentra dentro del cuerpo del otro
En el siguiente ejemplo se muestran tres bucles anidados:
for (i=N; i>0; i--) {...while (contador*j<k) {
...do {
...}while (!encontrado);...
}...
}
68
Ejemplo 1: Enunciado
Escriba un programa que muestre en pantalla las tablas de multiplicar del 1 al 10 con el siguiente formato:
Tabla del 1:1 x 1 = 11 x 2 = 2...1 x 10 = 10
Tabla del 2:2 x 1 = 22 x 2 = 4...
Fundamentos de Informática
Dpto. de ATC, Universidad de Sevilla - Página 18 de 18
69
Ejemplo 1: Solución
main() {int ntabla, i;
for ( ntabla=1; ntabla<=10; ntabla++ ) {printf( “Tabla del %d:\n”, ntabla );for ( i=1; i<=10; i++ ) {
printf( “%d x %d = %d\n”, ntabla, i, i*ntabla );}printf(“\n”);
}}
El bucle externo se encarga de iterar desde la tabla del 1 hasta la del 10
El bucle interno se encarga de escribir la tabla del número ntabla
70
Ejemplo 2: EnunciadoEscriba un programa que muestre por pantalla las coordenadas de los elementos que pertenecen a la matriz triangular inferior de una matriz de orden NxN. Supongamos que las filas y las columnas de la matriz se numeran comenzando por cero; es decir, que los índices de la primera fila y columna son cero. N debe ser definida como una constante.Por ejemplo, para una matriz de orden 4x4 (N=4), el programa mostraría lo siguiente:
3
2
1
0
3210
(0,0)(1,0) (1,1)(2,0) (2,1) (2,2)(3,0) (3,1) (3,2) (3,3)
71
Ejemplo 2: Solución
#define N 10
main() {int f, c;
for ( f=0; f<N; f++ ) {for ( c=0; c<=f; c++ ) {
printf( “(%d, %d) ”, f, c );}printf(“\n”);
}} El bucle interno se encarga de
escribir las coordenadas de los elementos de la fila f
El bucle externo se encarga de iterar desde la fila 0 hasta la fila N-1