INSTRUCCIÓN DE ASIGNACIÓN Y COMPOSICIÓN Capítulo 3:...

18
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 Constantes La Sentencia de Asignación Expresiones aritméticas Conversiones de tipos de datos 3 Funciones estándar de E/S: scanf y printf Especificación de formatos Secuencias de escape Expresiones de condición Expresiones relacionales Expresiones lógicas Precedencia de operadores ESTRUCTURAS CONDICIONALES Estructura if-else ESTRUCTURAS ITERATIVAS bucle while bucle do … while bucle for 4 FUNCIONES Ámbito de variables: variables locales y globales PUNTEROS VECTORES Cadenas de caracteres MATRICES FICHEROS ESTRUCTURAS

Transcript of INSTRUCCIÓN DE ASIGNACIÓN Y COMPOSICIÓN Capítulo 3:...

Page 1: INSTRUCCIÓN DE ASIGNACIÓN Y COMPOSICIÓN Capítulo 3: …icaro.eii.us.es/descargas/Cap3_FundamentosDeProgramacion_hasta_bucles.pdfFundamentos de Informática Dpto. de ATC, Universidad

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

Page 2: INSTRUCCIÓN DE ASIGNACIÓN Y COMPOSICIÓN Capítulo 3: …icaro.eii.us.es/descargas/Cap3_FundamentosDeProgramacion_hasta_bucles.pdfFundamentos de Informática Dpto. de ATC, Universidad

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.)

Page 3: INSTRUCCIÓN DE ASIGNACIÓN Y COMPOSICIÓN Capítulo 3: …icaro.eii.us.es/descargas/Cap3_FundamentosDeProgramacion_hasta_bucles.pdfFundamentos de Informática Dpto. de ATC, Universidad

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

Page 4: INSTRUCCIÓN DE ASIGNACIÓN Y COMPOSICIÓN Capítulo 3: …icaro.eii.us.es/descargas/Cap3_FundamentosDeProgramacion_hasta_bucles.pdfFundamentos de Informática Dpto. de ATC, Universidad

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

Page 5: INSTRUCCIÓN DE ASIGNACIÓN Y COMPOSICIÓN Capítulo 3: …icaro.eii.us.es/descargas/Cap3_FundamentosDeProgramacion_hasta_bucles.pdfFundamentos de Informática Dpto. de ATC, Universidad

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

Page 6: INSTRUCCIÓN DE ASIGNACIÓN Y COMPOSICIÓN Capítulo 3: …icaro.eii.us.es/descargas/Cap3_FundamentosDeProgramacion_hasta_bucles.pdfFundamentos de Informática Dpto. de ATC, Universidad

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

Page 7: INSTRUCCIÓN DE ASIGNACIÓN Y COMPOSICIÓN Capítulo 3: …icaro.eii.us.es/descargas/Cap3_FundamentosDeProgramacion_hasta_bucles.pdfFundamentos de Informática Dpto. de ATC, Universidad

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

Page 8: INSTRUCCIÓN DE ASIGNACIÓN Y COMPOSICIÓN Capítulo 3: …icaro.eii.us.es/descargas/Cap3_FundamentosDeProgramacion_hasta_bucles.pdfFundamentos de Informática Dpto. de ATC, Universidad

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)

Page 9: INSTRUCCIÓN DE ASIGNACIÓN Y COMPOSICIÓN Capítulo 3: …icaro.eii.us.es/descargas/Cap3_FundamentosDeProgramacion_hasta_bucles.pdfFundamentos de Informática Dpto. de ATC, Universidad

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

Page 10: INSTRUCCIÓN DE ASIGNACIÓN Y COMPOSICIÓN Capítulo 3: …icaro.eii.us.es/descargas/Cap3_FundamentosDeProgramacion_hasta_bucles.pdfFundamentos de Informática Dpto. de ATC, Universidad

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

Page 11: INSTRUCCIÓN DE ASIGNACIÓN Y COMPOSICIÓN Capítulo 3: …icaro.eii.us.es/descargas/Cap3_FundamentosDeProgramacion_hasta_bucles.pdfFundamentos de Informática Dpto. de ATC, Universidad

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”, &cent );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”, &cent );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”, &cent );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” );}

Page 12: INSTRUCCIÓN DE ASIGNACIÓN Y COMPOSICIÓN Capítulo 3: …icaro.eii.us.es/descargas/Cap3_FundamentosDeProgramacion_hasta_bucles.pdfFundamentos de Informática Dpto. de ATC, Universidad

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.

Page 13: INSTRUCCIÓN DE ASIGNACIÓN Y COMPOSICIÓN Capítulo 3: …icaro.eii.us.es/descargas/Cap3_FundamentosDeProgramacion_hasta_bucles.pdfFundamentos de Informática Dpto. de ATC, Universidad

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

Page 14: INSTRUCCIÓN DE ASIGNACIÓN Y COMPOSICIÓN Capítulo 3: …icaro.eii.us.es/descargas/Cap3_FundamentosDeProgramacion_hasta_bucles.pdfFundamentos de Informática Dpto. de ATC, Universidad

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

Page 15: INSTRUCCIÓN DE ASIGNACIÓN Y COMPOSICIÓN Capítulo 3: …icaro.eii.us.es/descargas/Cap3_FundamentosDeProgramacion_hasta_bucles.pdfFundamentos de Informática Dpto. de ATC, Universidad

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

Page 16: INSTRUCCIÓN DE ASIGNACIÓN Y COMPOSICIÓN Capítulo 3: …icaro.eii.us.es/descargas/Cap3_FundamentosDeProgramacion_hasta_bucles.pdfFundamentos de Informática Dpto. de ATC, Universidad

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

Page 17: INSTRUCCIÓN DE ASIGNACIÓN Y COMPOSICIÓN Capítulo 3: …icaro.eii.us.es/descargas/Cap3_FundamentosDeProgramacion_hasta_bucles.pdfFundamentos de Informática Dpto. de ATC, Universidad

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...

Page 18: INSTRUCCIÓN DE ASIGNACIÓN Y COMPOSICIÓN Capítulo 3: …icaro.eii.us.es/descargas/Cap3_FundamentosDeProgramacion_hasta_bucles.pdfFundamentos de Informática Dpto. de ATC, Universidad

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