Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
MICROPROCESADORES Y MICROCONTROLADORES
PROFESOR
MG. RAIMON SALAZAR SALINAS
2014
REFERENCIA:
HTTP://WWW.CARLOSPES.COM/C
URSO_DE_LENGUAJE_C/
I.- INTRODUCCIN.
1.2.3.4.5.-
2.-
3.4.-
5.6.-
7.-
TABLA DE CONTENIDOS
13
65
1.-
3.-
I.- INTRODUCCIN.
1.-
Los contenidos de este curso/tutorial pueden ser tiles a todos aquellos que quieran
iniciarse en la programacin utilizando lenguaje C. Aunque no es imprescindible, al lector le
resultar ms fcil seguir las explicaciones si ya posee conocimientos previos de programacin en
otro lenguaje y, en especial, es aconsejable que ya sepa disear algoritmos; vase el Curso de Diseo
de Algoritmos. En cualquier caso, para facilitar la comprensin del texto, se han aadido enlaces de
algunos conceptos al Diccionario de Informtica.
Para poder escribir programa en C, es imprescindible ser conocedor de sus reglas de
sintaxis y de las funciones de su biblioteca estndar.
2.-
Para convertir un algoritmo en un programa, se deben llevar a cabo las siguientes fases de
puesta a punto:
Edicin
En esta primera fase, el programador debe convertir el algoritmo que haya diseado en
instrucciones escritas en C. Para ello, se debe hacer uso de un editor de textos, con el cual
se obtendr el llamado cdigo fuente del programa. El programador deber guardar dicho
cdigo fuente en un archivo con extensin (.c) o (.cpp).
Si un programa escrito en C se va a compilar con un compilador de C, el cdigo fuente
debe ser guardado, obligatoriamente, en un archivo con extensin (.c). Ahora bien, si se
utiliza un compilador de C/C++, el archivo se puede guardar con extensin (.c) o (.cpp).
Pre-proceso.
El pre-proceso sirve para realizar modificaciones en el cdigo fuente obtenido en la fase de
edicin. Es el programador quien, mediante directivas del preprocesador, "dice" al
preprocesador las modificaciones que ste debe llevar a cabo.
El preprocesador es un programa caracterstico de C, es decir, en otros lenguajes de
programacin no existe, y siempre se ejecuta antes de llevarse a cabo la compilacin. Esto
es debido a que, es el propio compilador quien llama al preprocesador antes de realizar la
compilacin.
Compilacin.
Una vez que el cdigo fuente ha sido preprocesado, el compilador traducir ese cdigo
fuente (modificado) a cdigo mquina, tambin llamado cdigo objeto, siempre y cuando,
el propio compilador no detecte ningn error en dicho cdigo fuente ya preprocesado.
Como resultado de la compilacin, el compilador guardar el cdigo objeto del programa
en un archivo con otra extensin, que, dependiendo del sistema operativo puede variar.
Por ejemplo, en Windows, se guardar con la extensin (.obj), abreviatura de object.
Enlace.
(linkaje o montaje). Los programas pueden utilizar funciones de la biblioteca estndar de
C, tales como scanf o printf. De cada una de ellas existe un cdigo objeto que debe ser
enlazado (unido) al cdigo objeto del programa que las utilice. Esto se realiza mediante un
programa llamado enlazador, montador o linkador.
Como resultado del enlace, el enlazador guardar, en disco, un archivo ejecutable. En
Windows, dicho archivo tendr extensin (.exe), abreviatura de executable. Dicho archivo
ser "el ejecutable".
3.-
Existe una funcin que est presente en todos los programas escritos en lenguaje C, su
misin es marcar el inicio y fin de la ejecucin de cada uno de ellos; es la funcin principal, la
primera que se ejecuta; es la funcin main. Su sintaxis "bsica" es:
int main()
{
<bloque_de_instrucciones>
}
Los parntesis "()" escritos despus de main sirven para indicar que el identificador main es
una funcin. Es importante comprender que main no es una palabra reservada de C. Ningn
identificador de funcin lo es.
Finalmente, no podemos pasar por alto que delante de main se ha escrito la palabra
reservada int; enseguida veremos el porqu.
4.-
<bloque_de_instrucciones>
El cuerpo de toda funcin es una instruccin compuesta. Sirva como ejemplo el cuerpo de la
funcin main, el cual alberga al bloque de instrucciones principal de un programa escrito en
lenguaje C.
Una instruccin de expresin es, en s misma, una expresin. De modo que, la accin que se ejecuta
es la evaluacin de dicha expresin:
<expresin>
En cuanto a las instrucciones de control, existen de distintos tipos, y todas sirven para
modificar el flujo de control de un programa. Veremos que, algunas de ellas deben ir seguidas del
carcter punto y coma (;), pero otras no.
5.-
Ejemplo:
Se quiere escribir un programa que muestre por pantalla un mensaje de saludo:
Hola mundo
#include <stdio.h>
int main()
{
printf( "Hola mundo" );
return 0;
}
Todas las funciones de la biblioteca estndar de lenguaje C son subprogramas que ya estn
compilados, es decir, junto a cualquier compilador de lenguaje C se acompaan los cdigos objeto
de todas las funciones de su biblioteca estndar, pero no sus cdigos fuente. Por tanto, aunque no
sea posible modificar sus cdigos fuente, s se puede hacer uso de dichas funciones en cualquier
programa. Por ejemplo, se puede llamar a la funcin printf para que muestre por pantalla el saludo
"Hola mundo".
printf( "Hola mundo" );
Dentro de los parntesis "()" de la funcin printf, se debe escribir, entre comillas dobles ("),
el mensaje o cadena de caracteres que se desea mostrar por pantalla.
Obsrvese que, despus del carcter cerrar parntesis ")" se ha escrito un punto y coma (;),
esto implica que la llamada a la funcin printf es considerada como una instruccin de expresin.
10
Para que el compilador conozca la declaracin de la funcin printf, hay que utilizar la
directiva del preprocesador #include:
#include <stdio.h>
En este caso, la directiva #include indica, al preprocesador, que debe incluir, antes de la
compilacin, en el cdigo fuente del programa, el contenido del archivo <stdio.h> (stdio, Standard
Input/Output). En dicho archivo estn escritas las declaraciones de todas las funciones de entrada y
salida estndar de la biblioteca estndar de C, como printf. Si el compilador no sabe quien es printf,
no podr generar el cdigo objeto del programa.
Las funciones de la biblioteca estndar de C estn clasificadas en base a su funcionalidad, y
sus declaraciones se agrupan en archivos con extensin (.h), los cuales son llamados archivos de
cabecera. Adems de stdio.h, algunos de los archivos de cabecera ms utilizados en lenguaje C son:
math.h, string.h y stdlib.h. En ellos estn escritas, respectivamente, las declaraciones de las
funciones matemticas, funciones de cadena y funciones de utilidad de la biblioteca estndar de C.
Despus de #include, el nombre del archivo de cabecera se puede escribir entre los
caracteres menor y mayor (<stdio.h>), o entre comillas dobles ("stdio.h"). Cuando se escriba entre
comillas dobles, el preprocesador buscar dicho archivo en el directorio actual de trabajo, y de no
encontrarlo ah, entonces lo buscar en el directorio especificado por el compilador. En el caso de
escribirse entre los caracteres menor y mayor, el proceso de bsqueda ser al revs.
Adems de la directiva del preprocesador #include, existen otras, pero, ninguna de ellas es
una palabra reservada del lenguaje C.
El cdigo objeto generado por el compilador de C tendr "huecos" (espacios) en donde ms
tarde el enlazador escribir el cdigo objeto correspondiente a las llamadas de las funciones ya
compiladas (como printf) y, as, generar el archivo ejecutable.
Toda funcin retorna un valor. En nuestro primer programa se ha escrito:
return 0;
Esto quiere decir que la funcin main devuelve el valor 0. Precediendo a main se ha escrito la
palabra reservada int, indicando as, que la funcin retornar un valor de tipo int (entero).
int main()
11
return <expresin>;
Por el momento, se ha visto que la sintaxis "bsica" de un programa escrito en lenguaje C es:
[ <directivas_del_preprocesador> ]
int main()
{
<bloque_de_instrucciones>
}
Ahora es una buena ocasin para poner en prctica lo aprendido en el apartado Fases de la
Puesta a punto de un Programa. Para ello, puede consultar las Guas de Uso de algunos
compiladores de C/C++.
12
1.1.-
TIPOS DE DATOS.
En lenguaje C se dice que todos los datos que utilizan los programas son bsicos (simples
predefinidos o estndares) o derivados. Los tipos bsicos en lenguaje C se clasifican en:
Un dato de tipo entero (int en lenguaje C ) es aquel que puede tomar por valor un nmero
perteneciente al conjunto de los nmeros enteros (Z), el cual est formado por los nmeros
naturales, su opuestos (nmeros negativos) y el cero.
Z = { ..., -3, -2, -1, 0, 1, 2, 3, ... }
13
Ejemplo:
La edad de una persona y el ao en que naci, son dos datos de tipo entero:
Edad...: 29
Ao....: 1976
Un dato de tipo real (float o double en lenguaje C) es aquel que puede tomar por valor un
nmero perteneciente al conjunto de los nmeros reales (R), el cual est formado por los nmeros
racionales e irracionales.
Ejemplo:
El peso de una persona (en kilogramos) y su altura (en centmetros), son datos que pueden
considerarse de tipo real.
Peso.....: 75,3
Altura...: 172,7
Un dato de tipo carcter (char en lenguaje C) es aquel que puede tomar por valor un
carcter perteneciente al conjunto de los caracteres que puede representar el ordenador.
En lenguaje C, el valor de un dato de tipo carcter se debe representar entre comillas
simples (').
Ejemplo:
En un examen con preguntas en las que hay que seleccionar la respuesta correcta entre
varias opciones dadas (a, b, c, d, e), la respuesta correcta de cada una de las preguntas es un dato de
tipo carcter.
Respuesta correcta a la pregunta 3...: 'c'
14
1.5.-
1.6.-
Un dato sin valor (void en lenguaje C) es un dato que no puede tomar por valor nign valor,
es decir, es un dato vaco (nulo).
En programacin, un dato de tipo lgico es aquel que puede tomar por valor slo uno de los
dos siguientes:
{ verdadero, falso }
Los valores verdadero y falso son contrapuestos, de manera que, un dato de tipo lgico
siempre est asociado a que algo se cumpla o no se cumpla.
Ejemplo:
El estado de una barrera de paso de trenes es un dato que puede considerarse de tipo
lgico, por ejemplo, asociando verdadero a que est subida y falso a que est bajada.
Estado...: falso (indica que la barrera est bajada)
De todos los tipos de datos que no son bsicos se dice que son derivados, ya que, estn
basados en alguno que s lo es. Por ejemplo, los datos de tipo cadena son aquellos que pueden
tomar por valor una secuencia de caracteres.
(").
En lenguaje C, el valor de un dato de tipo cadena se debe representar entre comillas dobles
Ejemplo:
El ttulo de un libro y el nombre de su autor, son datos de tipo cadena.
Ttulo...: "La Odisea" (cadena de 9 caracteres)
Autor....: "Homero" (cadena de 6 caracteres)
Obsrvese que, en la cadena "La Odisea", el carcter espacio en blanco tambin se cuenta.
15
2.-
2.1.-
IDENTIFICADORES EN LENGUAJE C
Identificadores
Ejemplos de Identificadores vlidos y no vlidos
Palabras Reservadas
IDENTIFICADORES.
El primer carcter debe ser una letra o el carcter subrayado (_), mientras que, todos los
dems pueden ser letras, dgitos o el carcter subrayado (_). Las letras pueden ser minsculas o
maysculas del alfabeto ingls. As pues, no est permitido el uso de las letras '' y ''.
No pueden exitir dos identificadores iguales, es decir, dos elementos de un programa no
pueden nombrarse de la misma forma. Lo cual no quiere decir que un identificador no pueda
aparecer ms de una vez en un programa.
De la segunda regla se deduce que un identificador no puede contener caracteres especiales,
salvo el carcter subrayado (_). Es importante resaltar que las vocales no pueden llevar tilde ni
diresis.
2.2.-
16
Ejemplo 1:
Algunos identificadores vlidos que pueden ser definidos por el programador son:
numero
dia_del_mes
PINGUINO1
_ciudad
Z
Ejemplo 2:
Los siguientes identificadores no son vlidos por incumplir la segunda regla:
123
_DA
numero*
lugar de nacimiento
ao
Ejemplo 3:
Los siguientes identificadores no pueden ser definidos por el programador:
int
char
int y char son identificadores predefinidos (ya existen en lenguaje C), por tanto, no pueden
ser definidos por el programador, en cumplimiento de la tercera regla.
Los identificadores son sensibles a minsculas y maysculas.
Ejemplo 4:
Mes y mes son considerados identificadores distintos.
Por ltimo, hay que decir que, es aconsejable que los identificadores tengan un significado
afn a lo que representan.
2.3.-
En la sintaxis de ANSI C, puede consultar toda la lista de palabras reservadas que existen en
lenguaje C.
Tutorial Lenguaje de Programacin C.
17
3.-
3.1.-
VARIABLES EN LENGUAJE C
Variables en lenguaje.
Ejemplos de declaracin de Variables
VARIABLE DE LENGUAJE.
En lenguaje C hay que escribir un punto y coma (;) despus de la declaracin de una o ms
variables. As pues, la sintaxis para declarar una variable es:
<tipo_de_dato> <variable> [ = <expresin> ];
Ejemplo 1:
La declaracin de una variable para almacenar la edad de una persona se escribe:
int edad;
Ejemplo 2:
Para declarar varias variables del mismo tipo de dato se puede escribir:
int edad;
int numero_de_hijos;
18
Ejemplo 3:
O tambin, en la misma lnea separadas por el carcter coma (,):
int edad, numero_de_hijos;
Ejemplo 4:
Si se desea declarar una variable para almacenar un nmero entero y que, inicialmente,
contenga el valor 35, se debe escribir:
int numero = 35;
Ejemplo 5:
A continuacin, se muestra la declaracin de una variable para almacenar una letra del
alfabeto y que, inicialmente, contenga el valor 'Z':
char letra = 'Z';
Ejemplo 6:
Para declarar una variable que pueda almacenar el nombre de una persona y que,
inicialmente, contenga el valor "Isabel", escribiremos:
char nombre[7] = "Isabel";
Un dato de tipo cadena es un dato compuesto (estructurado), debido a que est formado
por una agrupacin de caracteres. Pues bien, dicha agrupacin se define por medio de un array. Un
array agrupa, bajo el mismo nombre de variable, a una coleccin de elementos (datos) del mismo
tipo.
Para declarar un array de caracteres, despus del identificador de la variable, se tiene que
escribir, entre corchetes "[]", el nmero de caracteres que se van a almacenar en el array, ms uno.
Por tanto, en este caso, puesto que "Isabel" tiene seis caracteres, hay que escribir un 7 entre los
corchetes.
Se tiene que escribir un nmero ms, porque en la memoria se va a reservar espacio para
los seis caracteres de la cadena "Isabel", ms uno, conocido ste como el carcter nulo, el cual se
representa mediante una barra invertida y un cero (\0). El sistema se encarga de "poner" dicho
carcter, que indica el fin de la cadena.
Tutorial Lenguaje de Programacin C.
19
Los caracteres del array pueden ser referenciados mediante el identificador del mismo,
seguido de un nmero entre corchetes. A dicho nmero, de manera formal, se le llama "ndice", y
puede oscilar entre el valor 0 y n-1, siendo n el nmero de caracteres que pueden ser almacenados
en memoria en el array, en este caso 7.
<nombre_de_la_variable>[<ndice>]
Por ejemplo, nombre[3] hace referencia al espacio de memoria donde est el carcter 'b'.
Ejemplo 7:
Si se declara la variable de tipo cadena:
char nombre[7] = "June";
En memoria tendremos:
Fjese que, en esta ocasin, el array de caracteres nombre ha sido inicializado con el valor
"June". De manera que, el fin de la cadena se encuentra en nombre[4], y no en el ltimo espacio de
memoria reservado para el array, ya que, "June" tiene, solamente, cuatro caracteres.
20
4.-
CONSTANTES EN LENGUAJE C.
Constantes de Tipo Entero
Constantes de Tipo Real
Constantes de Tipo Carcter
Constantes de Tipo Cadena
4.1.-
CONSTANTE EN LENGUAJE C.
En lenguaje C, una constante puede ser de tipo entero, real, carcter, de cadena o
enumerado. Las contantes de tipo enumerado se van a estudiar ms adelante. En cuanto a las
dems, se pueden expresar de dos formas diferentes:
1. Por su valor.
2. Con un nombre (identificador).
Ejemplo 1:
Las siguientes contantes de tipo entero estn expresadas por su valor:
-5
10
Para expresar una constante con un nombre, la constante debe ser declarada previamente.
Las constantes que se declaran en un programa escrito en lenguaje C reciben un tratamiento
diferente al de la mayora de los lenguajes de programacin. En C, para representar a las constantes,
se utilizan constantes simblicas. Una constante simblica representa (sustituye) a una secuencia
de caracteres, en vez de representar a un valor (dato almacenado en memoria).
Para declarar una constante simblica, en lenguaje C, se utiliza una nueva directiva del
preprocesador:
#define <constante> <secuencia_de_caracteres>
La directiva #define indica al preprocesador que debe sustituir, en el cdigo fuente del
programa, todas las ocurrencias del <nombre_de_la_constante> por la <secuencia_de_caracteres>,
antes de la compilacin.
Ejemplo 2:
Dos constantes muy habituales son:
#define PI 3.141592 #define
NUMERO_E 2.718281
21
Por otra parte, en C, es posible declarar una variable indicando que su valor es inalterable.
Para ello, se utiliza el cualificador const.
Ejemplo 4:
Uso de const:
Ya se sabe cmo escribir la declaracin de una constante y de las variables que utilice un
programa y, tambin, se conoce el lugar en que se tiene que escribir la directiva del preprocesador
#define para declarar la constante.
En cuanto a las variables que utiliza un programa, su declaracin puede escribirse en varios
lugares, pero, de momento las vamos a declarar inmediatemente despus del carcter abrir llave ({)
de la funcin main.
[ <directivas_del_preprocesador> ]
int main()
{
[ <declaraciones_de_variables> ]
<lista_de_instrucciones>
}
22
Ejemplo 5:
Si en un programa se quieren declarar dos variables (area y radio) y una constante (PI), se
puede escribir:
#define PI 3.141592
int main()
{
float area, radio;
...
}
4.2.-
Una constante de tipo entero es aquella que representa a un valor (dato) perteneciente al
subconjunto de Z representable por el ordenador.
Ejemplo 1:
Suponiendo que el ordenador (utilizando diecisis bits) pueda representar, en
Complemento a 2, el siguiente conjunto de valores enteros:
{ -32768, -32767, ..., 1, 0, -1, ..., 32766, 32767 }
Ejemplo 3:
Otros ejemplos incorrectos de constantes de tipo entero son:
++111
38000
23
4.3.-
Una constante de tipo real es aquella que representa a un valor (dato) perteneciente al
subconjunto de R representable por el ordenador.
Ejemplo 1:
Algunos ejemplos son:
8.12
000.333
+1111.809
-3200<
.56
Obsrvese que, adems de los caracteres numricos, dgitos del (0) al (9), tambin se puede
hacer uso de los caracteres especiales (+) y (-) para indicar el signo de un nmero real. Adems, en
lenguaje C, obligatoriamente debe aparecer el carcter punto (.), o el carcter (e) o (E) seguido del
exponente, del cual tambin puede indicarse su signo con los caracteres (+) y (-). Los signos del
exponente y del nmero en s, por omisin, son positivos
Ejemplo 2:
Las siguientes constantes de tipo real estn expresadas correctamente:
-77e-3
+1111e+2
2000E+2
3040e2
Una constante de tipo real tambin se puede expresar con el carcter punto (.) y el
exponente al mismo tiempo.
Ejemplo 3:
Algunos ejemplos son:
-50.50e-4
400.e-3
+65.65E+2
.7e2
El exponente tiene la funcin de desplazar la posicin del punto decimal hacia la derecha si
es positivo o, hacia la izquierda si es negativo.
24
Ejemplo 4:
As pues, las siguientes constantes de tipo real representan al mismo valor:
0.004E+3
4.
.4e1
+400.00e-2
4000E-3
Ejemplo 5:
Algunos ejemplos de constantes de tipo real incorrectas son:
-200
-20,0
--111-111..
-111.11.
+22e
+22ee6
+22e 6
38E-2.2
4.4.-
Una constante de tipo carcter es aquella que representa a un valor (dato) perteneciente al
conjunto de caracteres que puede representar el ordenador.
Ejemplo 1:
Las siguientes constantes de tipo carcter estn expresadas por su valor:
'a'
'T'
'5'
'+'
'.'
Ejemplo: 2
En lenguaje C, para representar el carcter comilla simple ('), se debe anteponer el carcter
barra invertida (\).
'\''
25
4.5.-
Una constante de tipo cadena es aquella que representa a un valor (dato) de tipo cadena, es
decir, representa a una secuencia de caracteres.
Ejemplo 1:
Las siguientes constantes de tipo cadena estn expresadas por su valor:
"Alejandro"
"Lucerna"
"Barcelona 2000"
Ejemplo 2:
En lenguaje C, para representar el carcter comilla doble (") dentro de una cadena, se debe
anteponer el carcter barra invertida (\).
#define FIESTA "7 de julio \"San Fermn\""
26
5.-
Expresiones Aritmticas
El Operador Divisin
Conversin de Tipo (Casting)
La Funcin pow
Expresiones Lgicas
Operadores Relacionales
Operadores Lgicos
La Funcin strcat
Operadores de Asignacin
La Funcin strcpy
Los Operadores Incremento (++) y Decremento (--)
Prioridad de Operadores en Lenguaje C
En un programa, el tipo de un dato determina las operaciones que se pueden realizar con l.
Por ejemplo, con los datos de tipo entero se pueden realizar operaciones aritmticas, tales como la
suma, la resta o la multiplicacin.
Ejemplo 1:
Algunos ejemplos son:
111 + 6
19 - 72
24 * 3
(operacin suma)
(operacin resta)
(operacin multiplicacin)
Todas las operaciones del ejemplo constan de dos operandos (constantes enteras) y un
operador. La mayora de las veces es as, pero, tambin es posible realizar operaciones con distinto
nmero de operadores y/u operandos.
Ejemplo 2:
Por ejemplo:
111 + 6 - 8
-( ( +19 ) + 72 )
-( -72 )
En las operaciones del ejemplo se puede observar que los caracteres ms (+) y menos (-)
tienen dos usos:
1. Operadores suma y resta.
2. Signos de un nmero (tambin son operadores).
Los operadores de signo ms (+) y menos (-) son operadores monarios, tambin llamados
unarios, ya que, actan, solamente, sobre un operando.
27
Los caracteres abrir parntesis "(" y cerrar parntesis ")" se utilizan para establecer la
prioridad de los operadores, es decir, para establecer el orden en el que los operadores actan
sobre los operandos.
Un operador indica el tipo de operacin a realizar sobre los operandos (datos) que acta.
Los operandos pueden ser:
Constantes (expresadas por su valor o con un nombre (identificador)).
Variables.
Llamadas a funciones.
Elementos de formaciones (arrays).
En este apartado se van a tratar operaciones en donde slo aparecen constantes y variables.
Cuando se combinan uno o ms operadores con uno o ms operandos se obtiene una
expresin. De modo que, una expresin es una secuencia de operandos y operadores escrita bajo
unas reglas de sintaxis.
Ejemplo 3:
Dadas las siguientes declaraciones de constantes y variables:
#define PI 3.141592
int numero = 2;
float radio_circulo = 3.2;
Algunos ejemplos de expresiones son:
2 * PI * radio_circulo
( PI * PI )
numero * 5
(valor real)
(valor real)
(valor entero)
( 2 * 3.141592 * 3.2 )
( 3.141592 * 3.141592 )
(2*5)
Un operador siempre forma parte de una expresin, en la cual, el operador siempre acta
sobre al menos un operando. Por el contrario, un operando s puede aparecer solo en una
expresin.
En programacin, de la evaluacin de una expresin siempre se obtiene un valor. Dicho
valor puede ser de tipo: entero, real, lgico, carcter o cadena.
Por consiguiente, una expresin puede ser:
28
6.-
6.1.-
EXPRESIONES ARITMTICAS.
Como se puede apreciar, existen tres diferencias importantes entre los operadores
aritmticos en pseudocdigo y en lenguaje C:
1.
2.
3.
Ejemplo:
A partir de las variables:
En pseudocdigo:
entero a = 4, b = 7, c = 2
En lenguaje C:
29
int a = 4, b = 7, c = 2;
podemos escribir, por ejemplo, la expresin:
En pseudocdigo:
-a * ( b mod c )
En lenguaje C:
-a * ( b % c )
De la evaluacin de esta expresin se obtiene el valor
-4
6.2.-
Puesto que, en lenguaje C, slo existe un operador de divisin, el resultado de una divisin
depender de los operandos. La regla a seguir es: "si ambos operandos son enteros, el resultado de
evaluar la expresin ser entero, en caso contrario, es decir, si al menos un operando es real, el
resultado ser real".
Ejemplo:
Declaradas las variables:
int h = 3, v = 6;
De las expresiones:
v/h
5/h
5.0 / 2
5 / 2.
5.4 / 2.0
30
6.3.-
En lenguaje C, cuando los dos operandos de una divisin (/) son enteros, pero aun as, de su
evaluacin se quiere obtener un valor real, hay que hacer un casting (o conversin de tipo). Su
sintaxis es:
( <tipo_de_dato> ) <expresin>;
De esta forma, se consigue cambiar el tipo de dato del valor resultante de evaluar la
<expresin> a un <tipo_de_dato> deseado.
Ejemplo:
Para cambiar el tipo de dato de los valores resultantes de las siguientes expresiones:
5
v
5.0
v/h
5/h
5.0 / 2
5 / 2.
5.4 / 2.0
(valor entero)
(valor entero)
(valor real)
se puede escribir:
( float ) 5
( float ) v
( int ) 5.0
( float ) v / h
( float ) 5 / h
( int ) 5.0 / 2
5 / ( int ) 2.
( int ) ( 5.4 / 2.0 )
de tal forma que, los resultados de evaluar las expresiones anteriores son:
5.000000
6.000000
5
2.000000
1.666667
2
2
2
(valor real)
(valor real)
(valor entero)
(actan en orden los operadores: "( <tipo> )" y (/))
(actan en orden los operadores: "( <tipo> )" y (/))
(actan en orden los operadores: "( <tipo> )" y (/))
(actan en orden los operadores: "( <tipo> )" y (/))
(actan en orden los operadores: (/) y "( <tipo> )")
31
6.4.-
En lenguaje C, para realizar operaciones con potencias se utiliza una funcin de su biblioteca
estndar, en concreto la funcin pow, a la que hay que "darle" (pasarle) dos operandos entre
parntesis. La sintaxis de su llamada es:
pow( <operando_nmero_base>, <operando_exponente> )
int numero = 9;
De la expresin:
En pseudocdigo:
1 + numero ** 2
En lenguaje C:
1 + pow
( numero, 2 )
32
6.5.-
Un operador relacional se utiliza para comparar los valores de dos expresiones. stas deben
ser del mismo tipo (aritmticas, lgicas o de carcter).
En la siguiente figura se comparan los operadores relacionales en pseudocdigo y en
lenguaje C:
1. En C, el operador igual que (=) se escribe con los caracteres igual-igual (==).
2. En C, el operador distinto que (<>) se escribe con los caracteres admiracin-igual (!=).
Ejemplo:
A partir de las variables:
En pseudocdigo:
33
En lenguaje C:
p != q
De su evaluacin se obtiene:
En pseudocdigo:
Verdadero
En lenguaje C:
1
( p es distinta de q )
En lenguaje C, los datos de tipo lgico se simulan con datos de tipo entero, considerndose
el valor 0 como falso, y cualquier otro valor entero como verdadero.
6.5.2.-
34
Ejemplo:
Habiendo declarado las variables:
En pseudocdigo:
entero r = 2, s = 9, t = 8
En lenguaje C:
int r = 2, s = 9, t = 8;
se puede escribir
En pseudocdigo:
No
( r = s o r <= t )
En lenguaje C:
( r == s || r <= t )
La expresin se evala a
En pseudocdigo:
falso
En lenguaje C:
0
6.6.-
En lenguaje C, no existe el operador concatenacin (+), que s existe en otros lenguajes. Sin
embargo, para concatenar cadenas, se puede utilizar la funcin strcat, que est disponible en la
biblioteca estndar de C. La sintaxis de una llamada a strcat es:
strcat( <cadena_destino>, <cadena_fuente> )
Ejemplo:
Dadas las siguientes declaraciones de arrays de caracteres:
En pseudocdigo:
35
( nombre, apellido )
6.7.-
36
1. En vez del smbolo reservado flecha izquierda (), se utiliza el carcter igual (=).
2. Se debe escribir un punto y coma (;) al final.
Ejemplo 1:
Partiendo de la constante simblica
#define PI 3.141592
y de las variables
Tcnicamente, en lenguaje C, una asignacin (=) es una operacin, al igual que lo es una
suma (+) o una resta (-). En consecuencia, radio = 5.78 es una expresin de asignacin, que entra
dentro de la categora de las instrucciones de expresin.
<instruccin_de_expresin>;
area = PI * pow
( radio, 2 );
longitud = 2 * PI * radio;
De la evaluacin de estas instrucciones de expresin se obtienen los valores 57.046290 y
36.316804, los cuales coinciden con los valores asignados a las variables area y longitud,
respectivamente.
37
Ejemplo 2:
Dada la siguiente declaracin de variables:
int m = 4, n = 1;
38
6.8.-
char ciudad[6];
es posible escribir
En pseudocdigo:
39
6.9.-
En lenguaje C, tanto el operador incremento (++) como el operador decremento (--) actan
siempre sobre un solo operando, normalmente una variable. Por tanto, son operadores monarios, y
sirven para incrementar o decrementar en una unidad el valor de dicho operando.
Ejemplo 1:
Declaradas las variables:
int r = 8, s = 3;
j = i++;
m = ++k;
40
Obsrvese que, los valores de j y m son diferentes. Esto es debido a que, cuando se evala la
expresin j = i++, en primer lugar, se le asigna a j el valor de i (es decir, un 5) y, a continuacin, se
incrementa el valor de la variable i. Por el contrario, cuando se evala la expresin m = ++k,
primero, se incrementa el valor de k (de 5 pasa a ser 6) y, despus, este nuevo valor de k se le
asigna a m.
En resumen, cuando en una expresin el operador incremento (++) o decremento (--)
precede al operando sobre el que acta (por ejemplo ++k), antes de utilizar el valor de dicho
operando para otro propsito, este se incrementa. De ser al revs, es decir, si es el operando quien
precede al operador (por ejemplo i++), el valor de dicho operando se incrementa despus de ser
utilizado para otro fin.
6.10.-
La prioridad de todos los operadores del lenguaje C estudiados hasta el momento en este
curso/tutorial es:
Figura - Prioridad de los operadores aritmticos, de ndice de un array, de llamada a una funcin,
relacionales, lgicos, de asignacin y de conversin de tipo en C.
41
Obsrvese que, en lenguaje C, tanto los parntesis "( )" que se utilizan para llamar a una
funcin, como los corchetes "[ ]" que albergan el ndice de un array, tambin son considerados
operadores. Adems, son los operadores ms prioritarios y, en una expresin, se evalan de
izquierda a derecha.
Por otra parte, los operadores incremento (++), decremento (--) y conversin de tipo "(
<tipo> )" entran dentro de la categora de operadores monarios. De manera que, al igual que los
operadores signo ms (+), signo menos (-), negacin (!) y de asignacin, todos ellos se evalan de
derecha a izquierda en una expresin, al revs que todos los dems.
42
7.-
La Funcin printf
Texto Ordinario en la Funcin printf
Especificadores de Formato en la Funcin printf
Secuencias de Escape en la Funcin printf
La Funcin scanf
Especificadores de Formato en la Funcin scanf
Ejercicios de Entrada y Salida Estndar (scanf y printf)
En lenguaje C no existen palabras reservadas para realizar entradas y salidas. Para ello, el
programador puede hacer uso de las funciones de entrada y salida estndar proporcionadas por la
biblioteca estndar de lenguaje C, como son printf y scanf, entre otras que estudiaremos ms
adelante en este curso/tutorial.
7.1.-
La funcin printf permite llevar hacia la salida estndar (la pantalla) los valores (datos)
obtenidos de la evaluacin de una lista de argumentos. La sintaxis de su llamada es:
printf( <cadena_de_control> [, <lista_de_argumentos> ] )
Cuando desde un programa llamante se invoca a la funcin printf, a sta se le pasa una lista
de argumentos (expresiones). Los valores (datos) obtenidos de la evaluacin de esa lista de
expresiones son los que se van a mostrar por la pantalla. Tambin la <cadena_de_control> es un
argumento.
En la <cadena_de_control>, el programador debe indicar el formato de salida de los datos
que se van a mostrar por la pantalla. Para ello, se puede hacer uso de:
Texto ordinario (texto normal).
Especificadores de formato.
Secuencias de escape.
43
7.2.-
En la funcin printf de la biblioteca estndar del lenguaje C, el texto ordinario que se puede
utilizar es texto normal y corriente, a diferencia de los especificadores de formato y de las
secuencias de escape, que se les considera texto especial.
Ejemplo:
En la llamada a la funcin printf de nuestro primer programa de este curso/tutorial, la
cadena de control slo contena texto ordinario:
#include <stdio.h>
int main()
{
printf( "Hola mundo" );
return 0;
}
Ntese que, en este ejemplo, a la funcin printf no se le pasa ningn argumento, aparte de la
cadena de control.
Por pantalla aparecer:
Hola mundo
7.3.-
Cuando a la funcin printf de la biblioteca estndar del lenguaje C se le pase una lista de
argumentos (expresiones), se debe escribir un especificador de formato por cada argumento. En la
funcin printf, los especificadores de formato establecen el formato de salida por pantalla de los
argumentos. La forma ms sencilla de escribir un especificador de formato es con el carcter tanto
por ciento (%) seguido de un carcter de conversin que indique el tipo de dato del argumento. De
momento, en este curso/tutorial no es necesario conocer todos los especificadores de formato que
se pueden usar en la funcin printf, pero s, los ms utilizados:
44
Ejemplo 1:
Dada la constante simblica
#define NOMBRE "Raquel"
si escribimos
printf( "Hola %s", NOMBRE );
por pantalla se ver:
Hola Raquel
El especificador de formato (%s) escrito en la cadena de control, indica que, por pantalla, se
va a mostrar un dato de tipo cadena en ese lugar, en este caso, "Raquel".
Ejemplo 2:
Si se ejecuta el programa
#include <stdio.h>
int main()
{
char nombre[8] = "Timoteo";
int hermanos = 2, sobrinos = 4;
printf( "%s tiene %d hermanos y %d sobrinos.",
nombre, hermanos, sobrinos );
return 0;
}
por pantalla se ver:
45
7.4.-
Una secuencia de escape siempre representa a un carcter del ASCII. Dichos caracteres se
pueden clasificar en:
Grficos (se corresponden con los smbolos ms usados para escribir por los humanos).
No grficos (representan a acciones, como por ejemplo, mover el cursor de la pantalla al
principio de la lnea siguiente).
La forma ms sencilla de escribir una secuencia de escape es con el carcter barra invertida
(\), seguido de un carcter especial. Por tanto, cuando en la cadena de control de la funcin printf
se escriba una secuencia de escape, o bien se mostrar un carcter grfico por pantalla, o bien se
realizar una accin. Por ahora, no es necesario conocer todas las secuencias de escape que existen
en lenguaje C, pero s, algunas de las ms utilizadas:
46
Ejemplo 1:
Si se escribe
#include <stdio.h>
int main()
{
printf( "uno dos tres" );
return 0;
}
Tal cual est escrita la funcin printf, por pantalla se ver el texto "uno dos tres" pegado a la
esquina superior izquierda de la misma.
uno dos tres
Hasta ahora, no nos hemos preocupado del lugar exacto de la pantalla donde queremos que
se muestren los datos de salida. Sin embargo, si deseamos visualizar dicho texto en otro lugar de la
pantalla, por ejemplo, en la segunda lnea:
uno dos tres
Esto se puede conseguir haciendo uso de la secuencia de escape nueva lnea (\n).
printf( "\nuno dos tres" );
Ejemplo 2:
Si por pantalla se quiere ver
uno
dos
tres
printf( "uno\ndos\ntres" );
47
Ejemplo 3:
Para visualizar
uno dos tres
se puede escribir
48
Ejemplo 5:
De la instruccin
printf( "diez\tveinte\ttreinta" );
diez
veinte treinta
Obsrvese que, la d (de diez), la v (de veinte) y la primera t (de treinta) estn en las
posiciones del tabulador horizontal 1, 9 y 17, respectivamente. Grficamente, representando los
espacios en blanco mediante guiones (-), en pantalla se muestra:
diez----veinte--treinta
Entre el carcter d (de diez) y la v (de veinte) hay exactamente ocho caracteres (la v no se
cuenta), al igual que entre la v (de veinte) y la primera t (de treinta).
Las secuencias de escape comilla doble (\") y barra invertida (\\) sirven para mostrar por
la pantalla los caracteres comilla doble (") y barra invertida (\), respectivamente.
Ejemplo 6:
Al escribir
7.5.-
Cuando a la funcin printf de la biblioteca estndar del lenguaje C se le pase una lista de
argumentos (expresiones), se debe escribir un especificador de formato por cada argumento. En la
funcin printf, los especificadores de formato establecen el formato de salida por pantalla de los
argumentos. La forma ms sencilla de escribir un especificador de formato es con el carcter tanto
por ciento (%) seguido de un carcter de conversin que indique el tipo de dato del argumento. De
momento, en este curso/tutorial no es necesario conocer todos los especificadores de formato que
se pueden usar en la funcin printf, pero s, los ms utilizados:
49
Ejemplo 1:
Dada la constante simblica
#define NOMBRE "Raquel"
si escribimos
El especificador de formato (%s) escrito en la cadena de control, indica que, por pantalla, se
va a mostrar un dato de tipo cadena en ese lugar, en este caso, "Raquel".
Ejemplo 2:
Si se ejecuta el programa
#include <stdio.h>
int main()
{
char nombre[8] = "Timoteo";
int hermanos = 2, sobrinos = 4;
printf( "%s tiene %d hermanos y %d sobrinos.",
nombre, hermanos, sobrinos );
return 0;
}
por pantalla se ver:
50
En la cadena de control del ejemplo, los especificadores de formato (%s), (%d) y (%d)
indican que, en esos lugares, y en dicho orden, va a aparecer un dato de tipo cadena, un dato de tipo
entero y otro dato de tipo entero, respectivamente. En este caso, se muestran los valores "Timoteo",
2 y 4.
Por ahora, en este curso/tutorial, slo vamos a estudiar algunos de los especificadores de
formato ms utilizados en la funcin scanf.
7.7.-
En la funcin scanf, por cada argumento (variable) que se le pase, se debe escribir un
especificador de formato, que establecer el formato de entrada por teclado del argumento. La
forma ms sencilla de escribir un especificador de formato en la funcin scanf es con el carcter
tanto por ciento (%) seguido de un carcter de conversin que indique el tipo de dato del
argumento. De momento, no es necesario conocer todos los especificadores de formato que se
pueden usar en la funcin scanf, pero s, los ms usados, que son los mismos que en la funcin
printf:
51
Ejemplo 1:
Dado el programa:
#include <stdio.h>
int main()
{
int numero;
printf( "\n Introduzca un numero entero: " );
scanf( "%d", &numero );
return 0;
}
En la memoria se reservar espacio para la variable numero. Y si el usuario teclea, por
ejemplo, un 5, en pantalla se ver:
Introduzca un numero entero: 5
Puesto que la variable numero es de tipo entero, en la cadena de control se tiene que
escribir el especificador de formato asociado a la entrada de un nmero entero (%d). Por otro lado,
la variable numero se ha escrito precedida del carcter ampersand (&). Se trata de un nuevo
operador, el operador direccin. El operador direccin (&) siempre acta sobre un operando
(normalmente una variable) y, de su evaluacin, se obtiene la direccin de memoria de dicha
variable.
Es sabido que, una variable representa a un espacio de memoria en el cual se puede
almacenar un dato. Pues bien, en realidad, a la funcin scanf no se le pasa una lista de variables,
sino, las direcciones de memoria de los espacios de memoria a los que representan dichas variables.
52
se obtiene el valor 0012FF88, que es la direccin de memoria de la variable numero. Esa direccin
la necesita conocer la funcin scanf para localizar la primera celda del espacio de memoria en
donde se va a almacenar el 5 introducido por el usuario.
La direccin de memoria de la variable numero se puede visualizar en pantalla escribiendo
Obsrvese que, en la cadena de control de printf, se ha eludido escribir con tilde la palabra
numero, ya que, de haberlo hecho, por pantalla hubiesemos visto algo parecido a:
Introduzca un nmero entero: 5
Para visualizar el carcter '', podemos escribir:
Fjese que, 163 es el nmero decimal que corresponde al carcter '' en ASCII.
53
Ejemplo 2:
Ahora, estudiemos el siguiente programa:
#include <math.h>
#include <stdio.h>
#define PI 3.141592
int main()
{
float area, radio;
printf( "\n Introduzca radio: " );
scanf( "%f", &radio );
area = PI * pow( radio, 2 );
printf( "\n El area de la circunferencia es: %f", area );
return 0;
}
Inicialmente, en la memoria se reservar espacio para las dos variables del programa.
Si el usuario teclea, por ejemplo, el valor 3.8 para el radio, en pantalla se visualizar:
La variable radio es de tipo real y, por tanto, en la cadena de control de la funcin scanf se
tiene que escribir el especificador de formato asociado a la entrada de un nmero real, (%f). Y,
puesto que, en la funcin printf, el resultado de evaluar la expresin area tambin es de tipo real, en
su cadena de control hay que escribir, de igual forma, el especificador de formato asociado a la
salida de un nmero real, (%f).
Para que el rea se muestre slo con dos cifras decimales, es decir, 45.36 en vez de
45.364588, en la cadena de control de la funcin printf se debe escribir %.2f en vez de %f.
printf( "\n El area de la circunferencia es: %.2f", area );
En pantalla se ver
54
Aunque slo se muestren dos cifras decimales, en memoria el area seguir valiendo
45.364588.
Por otra parte, hemos dicho que, para conocer la direccin de memoria de una variable, se
puede utilizar el operador direccin (&). Pero, esta regla no es general. Por ejemplo, no es aplicable
a las variables (arrays) de tipo cadena.
Ejemplo 3:
Si se desea desarrollar un programa para leer un nombre de persona:
Introduzca nombre: Elsa
se puede escribir:
#include <stdio.h>
int main()
{
char nombre[5];
printf( "\n Introduzca nombre: " );
scanf( "%s", nombre );
return 0;
}
Obsrvese que, a la funcin scanf se le "pasa" nombre en vez de &nombre. Esto es as, ya
que, para las variables de tipo cadena (arrays de caracteres), su propio identificador (nombre, en
este caso) ya hace referencia a la direccin de memoria donde se va a almacenar el dato. Ms
concretamente, hace referencia al espacio reservado en memoria para guardar el primer carcter
de la cadena. Para el resto de caracteres de la cadena, el sistema habr reservado, en memoria,
espacios contiguos al primero.
Ntese que, la variable nombre ha sido declarada con un tamao de cinco caracteres. Por
consiguiente, con este programa slo se podr almacenar en memoria un nombre de persona de
hasta cuatro caracteres, ya que, en el quinto debe guardarse el carcter nulo (\0).
55
7.8.7.8.1.-
#include <stdio.h>
int main()
{
float altura, base;
printf( "Introduzca base: " );
scanf( "%f", &base );
printf( "Introduzca altura: " );
scanf( "%f", &altura );
printf( "El area del triangulo es: %f", base * altura / 2 );
return 0;
}
56
7.8.2.-
#include <stdio.h>
int main()
{
int dividendo, divisor, cociente, resto;
printf( "Introduzca dividendo (entero): " );
scanf( "%d", ÷ndo );
printf( "Introduzca divisor (entero): " );
scanf( "%d", &divisor );
cociente = dividendo / divisor;
resto = dividendo % divisor;
printf( "%d div %d = %d ( Resto = %d )",
dividendo, divisor, cociente, resto );
return 0;
}
Una segunda solucin es:
#include <stdio.h>
int main()
{
int dividendo, divisor;
printf( "Introduzca dividendo (entero): " );
scanf( "%d", ÷ndo );
printf( "Introduzca divisor (entero): " );
scanf( "%d", &divisor );
printf( "%d div %d = %d ( Resto = %d )", dividendo, divisor,
dividendo / divisor, dividendo % divisor );
return 0;
}
57
8.-
8.1.-
COMENTARIOS.
COMENTARIOS EN LENGUAJE C
58
9.-
9.1.-
FUNCIN FFLUSH.
Ejemplo 1:
Si ejecutamos el siguiente programa:
#include <stdio.h>
int main()
{
int a, b;
printf( "Introduzca el primer numero: " );
scanf( "%d", &a );
printf( "Introduzca el segundo numero: " );
scanf( "%d", &b );
printf( "Los valores son: %d, %d ", a, b );
return 0;
}
por pantalla veremos algo parecido a:
el programa se detiene a la espera de que el usuario teclee el dato de entrada requerido, el cual es
almacenado, temporalmente, en el buffer (memoria intermedia) de la entrada estndar. Y cuando
se pulsa la tecla INTRO, es, en ese momento, cuando a la variable a se le asigna el valor introducido.
Pero, adems, se produce un salto de lnea automtico, de forma que, despus de introducir el
nmero 76, la siguiente instruccin se muestra una lnea ms abajo. De igual forma, despus de la
instruccin
scanf( "%d", &b );
tambin se produce un salto de lnea automtico. En este ejemplo todo ha ido muy bien, sin
embargo, se tiene que tener especial cuidado si utilizados scanf para leer caracteres.
59
Ejemplo 2:
En el siguiente programa:
#include <stdio.h>
int main()
{
char a, b, c;
printf( "Introduzca primer caracter: " );
scanf( "%c", &a );
printf( "Introduzca segundo caracter: " );
scanf( "%c", &b );
printf( "Introduzca tercer caracter: " );
scanf( "%c", &c );
printf( "Los valores son: %c, %c, %c ", a, b, c );
return 0;
}
por pantalla se ver algo similar a:
despus de asignar el carcter 'f' a la variable a, se produce un salto de lnea automtico, pero, en el
buffer del teclado tambin se ha quedado almacenada la secuencia de escape (\n), que es,
precisamente, un carcter. En consecuencia, cuando se ejecuta la instruccin
scanf( "%c", &b );
60
En pantalla veremos:
Para resolver este problema, antes de leer un carcter con scanf, hay que vaciar (limpiar) el
buffer del teclado. Para ello, se utiliza la funcin fflush.
Ejemplo 3:
De forma que, el cdigo quedara de la siguiente manera:
#include <stdio.h>
int main()
{
char a, b, c;
printf( "Introduzca primer caracter: " );
scanf( "%c", &a );
printf( "Introduzca segundo caracter: " );
fflush( stdin );
scanf( "%c", &b );
printf( "Introduzca tercer caracter: " );
fflush( stdin );
scanf( "%c", &c );
printf( "Los valores son: %c, %c, %c ", a, b, c );
return 0;
}
La primera vez que se ejecuta scanf, el buffer del teclado est vaco, por tanto, no es preciso
utilizar fflush, pero s, en los dos casos posteriores. Obsrvese que, a fflush hay que indicarle el
buffer a limpiar, Standar Input (stdin) en este caso.
61
10.-
10.1.-
TIPOS DE ERRORES.
Una vez escrito el cdigo fuente de un programa, siempre se debe comprobar si se han
cometido errores. Estos pueden ser de tres tipos:
De sintaxis (sintcticos).
De ejecucin.
De lgica (lgicos).
10.2.-
Los errores de sintaxis son los ms fciles de detectar en el cdigo fuente de un programa.
Un error de sintaxis se produce al escribir, incorrectamente, alguna parte del cdigo.
Ejemplo:
Estdiese el siguiente cdigo fuente de un programa escrito en lenguaje C:
include <stdio.h>
imt main()
{
int a, b;
a = 4;
b = a * 6;
printf( "%d", b )
retunr 0;
}
10.3.-
Una vez corregidos los errores de sintaxis en el cdigo fuente de un programa, se debe
revisar que no se puede producir ningn error en la ejecucin del mismo. Un error de ejecucin se
produce cuando el ordenador no puede ejecutar alguna instruccin de forma correcta.
Tutorial Lenguaje de Programacin C.
62
Ejemplo:
En el programa:
#include <stdio.h>
int main()
{
int a;
float b;
a = 0;
b = 6.4 / a;
printf( "%f", b );
return 0;
}
6.4 / a
Los errores de lgica son los ms difciles de detectar. Cuando un programa no tiene errores
de sintaxis ni de ejecucin, pero, an as, no funciona bien, esto es debido a la existencia de algn
error lgico. De manera que, un error de lgica se produce cuando los resultados obtenidos no son
los esperados.
Ejemplo:
Estdiese el siguiente cdigo:
#include <stdio.h>
int main()
{
float base, altura;
base = 6.3;
altura = 4.;
printf( "El area es: %f", base * altura / 3 );
return 0;
}
Su salida por pantalla es:
63
Por consiguiente, existe algn error lgico que hay que corregir. El error est en la
expresin:
base * altura / 3
que, aunque no es incorrecta, no sirve para calcular el rea de un tringulo. En su lugar se debe
escribir:
base * altura / 2
64
1.-
En lenguaje C, para escribir una instruccin alternativa doble (if else) se utiliza la sintaxis:
if ( <expresin_lgica> )
{
<bloque_de_instrucciones_1>
}
else
{
<bloque_de_instrucciones_2>
}
65
Cuando en el cdigo fuente de un programa existe una condicin de la cual depende que a
continuacin se ejecuten unas instrucciones u otras, se dice que existe una bifurcacin. Ejercicios
de la Instruccin Alternativa Doble (if else) en Lenguaje C
1.1.2.-
66
#include <stdio.h>
int main()
{
int a, b, suma;
printf( "Introduzca primer numero (entero): " );
scanf( "%d", &a );
printf( "Introduzca segundo numero (entero): " );
scanf( "%d", &b );
suma = a + b;
if ( suma > 0 )
printf( "LA SUMA SI ES MAYOR QUE CERO." );
else
printf( "LA SUMA NO ES MAYOR QUE CERO." );
return 0;
}
Una segunda solucin es:
#include <stdio.h>
int main()
{
int a, b;
printf( "Introduzca primer numero (entero): " );
scanf( "%d", &a );
printf( "Introduzca segundo numero (entero): " );
scanf( "%d", &b );
if ( a + b > 0 )
printf( "LA SUMA SI ES MAYOR QUE CERO." );
else
printf( "LA SUMA NO ES MAYOR QUE CERO." );
return 0;
}
EJERCICIO - Nmero Intermedio
Resolver con la Instruccin if else
67
#include <stdio.h>
int main()
{
int n1, n2, n3;
printf( "Introduzca primer numero (entero): " );
scanf( "%d", &n1 );
printf( "Introduzca segundo numero (entero): " );
scanf( "%d", &n2 );
printf( "Introduzca tercer numero (entero): " );
scanf( "%d", &n3 );
if ( n2 < n3 && n2 > n1 )
printf( "%d SI ES MENOR QUE %d Y MAYOR QUE %d", n2, n3, n1 );
else
printf( "%d NO ES MENOR QUE %d Y MAYOR QUE %d", n2, n3, n1 );
return 0;
}
Otra solucin es:
#include <stdio.h>
int main()
{
int n1, n2, n3;
printf( "Introduzca primer numero (entero): " );
68
1.2.-
1.2.1.-
Una instruccin alternativa simple (if) es una variante (ms sencilla) de una instruccin
alternativa doble (if else). En lenguaje C, para escribir una instruccin if se utiliza la sintaxis:
if ( <expresin_lgica> )
{
<bloque_de_instrucciones>
}
Ejemplo:
Se quiere escribir un programa que:
69
abrir llave ({) y cerrar llave (}) tambin son opcionales. De modo que, para resolver el problema del
ejemplo se puede escribir:
#include <stdio.h>
int main()
{
float nota;
printf( "\n Introduzca nota (real): " );
scanf( "%f", ¬a );
if ( nota >= 5 )
printf( "\n APROBADO" );
return 0;
}
1.2.2.-
#include <stdio.h>
int main()
{
float numero;
printf( "Introduzca numero (real): " );
scanf( "%f", &numero );
if ( numero < 0 )
printf( "%f", -numero );
return 0;
70
}
Ejercicio - Media Aritmtica (en C)
#include <stdio.h>
int main()
{
int a, b;
printf( "Introduzca primer numero (entero): " );
scanf( "%d", &a );
printf( "Introduzca segundo numero (entero): " );
scanf( "%d", &b );
if ( a > 0 && b > 0 )
printf( "%f", ( float ) ( a + b ) / 2 );
return 0;
}
71
1.3.1.3.1.-
Una instruccin switch (alternativa mltiple) permite seleccionar, por medio de una
expresin, el siguiente bloque de instrucciones a ejecutar de entre varios posibles. En lenguaje C,
para escribir una instruccin alternativa mltiple (switch) se utiliza la sintaxis:
switch ( <expresin> )
{
case <expresin_1> : [ <bloque_de_instrucciones_1> ]
[ break; ]
case <expresin_2> : [ <bloque_de_instrucciones_2> ]
[ break; ]
...
case <expresin_n> : [ <bloque_de_instrucciones_n> ]
[ break; ]
[ default : <bloque_de_instrucciones_n+1> ]
}
El resultado de evaluar la <expresin> debe ser un valor perteneciente a un tipo de dato
finito y ordenado, es decir, entero, lgico, carcter, enumerado o subrango.
72
Martes
O tambin:
#include <stdio.h>
int main()
{
int dia;
printf( "\n Introduzca dia de la semana: " );
scanf( "%d", &dia );
switch ( dia )
{
case 1 : printf( "\n Lunes" );
break;
case 2 : printf( "\n Martes" );
break;
case 3 : printf( "\n Miercoles" );
break;
case 4 : printf( "\n Jueves" );
break;
case 5 : printf( "\n Viernes" );
break;
case 6 : printf( "\n Sabado" );
break;
case 7 : printf( "\n Domingo" );
break;
default : printf( "\n ERROR: Dia incorrecto." );
}
return 0;
}
En la sintaxis de una instruccin alternativa mltiple, obsrvese que, despus de cada
bloque de instrucciones se puede escribir, opcionalmente, la instruccin break. Dicha instruccin
no se va a estudiar con detenimiento en este apartado, ya que, de momento, basta con saber que en
una instruccin switch, la escribiremos, casi siempre, despus de cada bloque de instrucciones, a
excepcin del ltimo. Para comprender su funcionamiento, pruebe a ver que ocurre si omite algn
break en el cdigo del programa del ejemplo 1.
Estdiese tambin el siguiente ejemplo.
Ejemplo 2:
En la siguiente tabla se muestran las categoras a las que pertenecen los signos del zodaco:
Tutorial Lenguaje de Programacin C.
73
1) Muestre el listado de los signos del zodaco, con sus nmeros asociados.
2) Pida por teclado un nmero (dato entero) asociado a un signo del zodaco.
3) Muestre la categora a la que pertenece el signo del zodaco seleccionado.
Nota: Si el nmero introducido por el usuario, no est asociado a ningn signo del zodaco,
se mostrar el mensaje: "ERROR: <nmero> no est asociado a ningn signo.".
En pantalla veremos:
74
O tambin:
#include <stdio.h>
int main()
{
int numero;
printf( "\n Listado de signos del zodiaco:" );
printf( "\n\n 1. Aries" );
printf( "\n 2. Tauro" );
printf( "\n 3. Geminis" );
printf( "\n 4. Cancer" );
printf( "\n 5. Leo" );
printf( "\n 6. Virgo" );
printf( "\n 7. Libra" );
printf( "\n 8. Escorpio" );
printf( "\n 9. Sagitario" );
printf( "\n 10. Capricornio" );
printf( "\n 11. Acuario" );
printf( "\n 12. Piscis" );
printf( "\n\n Introduzca numero de signo: " );
scanf( "%d", &numero );
switch ( numero )
{
case 1 :
75
case 5 :
case 9 : printf( "\n Es un signo de Fuego." );
break;
case 2 :
case 6 :
case 10 : printf( "\n Es un signo de Tierra." );
break;
case 3 :
case 7 :
case 11 : printf( "\n Es un signo de Aire." );
break;
case 4 :
case 8 :
case 12 : printf( "\n Es un signo de Agua." );
break;
default : printf( "\n ERROR: %d no esta asociado a ningun signo.", numero );
}
return 0;
#include <stdio.h>
#include <string.h>
int main()
{
int numero;
char categoria[7];
printf( "\n Listado de signos del zodiaco:" );
printf( "\n\n 1. Aries" );
printf( "\n 2. Tauro" );
printf( "\n 3. Geminis" );
printf( "\n 4. Cancer" );
printf( "\n 5. Leo" );
printf( "\n 6. Virgo" );
printf( "\n 7. Libra" );
printf( "\n 8. Escorpio" );
printf( "\n 9. Sagitario" );
printf( "\n 10. Capricornio" );
printf( "\n 11. Acuario" );
printf( "\n 12. Piscis" );
printf( "\n\n Introduzca numero de signo: " );
scanf( "%d", &numero );
switch ( numero % 4 )
76
case 1 : strcpy(
break;
case 2 : strcpy(
break;
case 3 : strcpy(
break;
case 0 : strcpy(
categoria, "Fuego" );
categoria, "Tierra" );
categoria, "Aire" );
categoria, "Agua" );
En esta segunda solucin existen las siguientes diferencias importantes con respecto a la
solucin anterior:
En el cdigo se utiliza una alternativa doble (if else), adems de una alternativa mltiple
(switch).
En la alternativa mltiple no se escribe el <bloque_de_instrucciones_n+1>.
La <expresin> de la alternativa mltiple es diferente.
La expresin "\n Es un signo de " slo se escribe una vez.
Se ha utilizado una variable ms (un array de caracteres): categoria.
Se ha empleado la funcin strcpy, que, como ya vimos en el apartado de Operadores y
expresiones, est disponible en la biblioteca estndar de C.
1.4.-
1.4.1.-
1) Pida por teclado el resultado (dato entero) obtenido al lanzar un dado de seis caras.
2) Muestre por pantalla el nmero en letras (dato cadena) de la cara opuesta al resultado
obtenido.
Nota 1: En las caras opuestas de un dado de seis caras estn los nmeros: 1-6, 2-5 y 3-4.
77
Nota 2: Si el nmero del dado introducido es menor que 1 mayor que 6, se mostrar el
mensaje: "ERROR: Nmero incorrecto.".
En pantalla:
#include <stdio.h>
int main()
{
int numero;
switch ( numero )
{
case 1 : printf( "En la cara opuesta esta el \"seis\"." );
break;
case 2 : printf( "En la cara opuesta esta el \"cinco\"." );
break;
case 3 : printf( "En la cara opuesta esta el \"cuatro\"." );
break;
case 4 : printf( "En la cara opuesta esta el \"tres\"." );
break;
case 5 : printf( "En la cara opuesta esta el \"dos\"." );
break;
case 6 : printf( "En la cara opuesta esta el \"uno\"." );
break;
default : printf( "ERROR: Numero incorrecto." );
}
return 0;
78
#include <stdio.h>
#include <string.h>
int main()
{
char letras[7];
int numero;
printf( "Introduzca numero del dado: " );
scanf( "%d", &numero );
switch ( numero )
{
case 1 : strcpy( letras, "seis" );
break;
case 2 : strcpy( letras, "cinco" );
break;
case 3 : strcpy( letras, "cuatro" );
break;
case 4 : strcpy( letras, "tres" );
break;
case 5 : strcpy( letras, "dos" );
break;
case 6 : strcpy( letras, "uno" );
}
if ( numero >= 1 && numero <= 6 )
printf( "En la cara opuesta esta el \"%s\".", letras );
else
printf( "ERROR: Numero incorrecto." );
return 0;
}
1.4.2.-
En la siguiente tabla se muestra el nmero de camas de las habitaciones de una casa rural,
adems de la planta donde est ubicada cada una de ellas:
79
Listado de habitaciones:
1. Azul
2. Roja
3. Verde
4. Rosa
5. Gris
Introduzca nmero de habitacin: 3
La Verde tiene 3 cama/s y est en la segunda planta.
Listado de habitaciones:
1. Azul
2. Roja
3. Verde
4. Rosa
5. Gris
Introduzca nmero de habitacin: 7
ERROR: 7 no est asociado a ninguna habitacin.
Solucin del Ejercicio - Habitaciones de una Casa Rural (en C)
Resuelto con la Instruccin switch
Cdigo fuente del programa:
#include <stdio.h>
int main()
{
int numero;
printf( "Listado de habitaciones:" );
printf( "\n\n1. Azul" );
printf( "\n2. Roja" );
printf( "\n3. Verde" );
printf( "\n4. Rosa" );
printf( "\n5. Gris" );
printf( "\n\nIntroduzca numero de habitacion: " );
80
#include <string.h>
#include <stdio.h>
int main()
{
char nombre[6], planta[8];
int numero, camas;
printf( "Listado de habitaciones:" );
printf( "\n\n1. Azul" );
printf( "\n2. Roja" );
printf( "\n3. Verde" );
printf( "\n4. Rosa" );
printf( "\n5. Gris" );
printf( "\n\nIntroduzca numero de habitacion: " );
scanf( "%d", &numero );
switch ( numero )
{
case 1 : strcpy( nombre, "Azul" );
camas = 2;
strcpy( planta, "primera" );
break;
case 2 : strcpy( nombre, "Roja" );
camas = 1;
strcpy( planta, "primera" );
break;
81
}
if ( numero >= 1 && numero <= 5 )
printf( "La %s tiene %d cama/s y esta en la %s planta.",
nombre, camas, planta );
else
printf( "ERROR: %d no esta asociado a ninguna habitacion.",
numero );
return 0;
1.5.1.5.1.-
82
1.5.2.-
En lenguaje C, para anidar una instruccin if else en otra (tambin if else), se utiliza la sintaxis:
if ( <expresin_lgica_1> )
{
/* Inicio del anidamiento */
if ( <expresin_lgica_2> )
{
<bloque_de_instrucciones_1>
}
else
{
<bloque_de_instrucciones_2>
}
/* Fin del anidamiento */
}
else
{
<bloque_de_instrucciones_3>
}
O tambin:
if ( <expresin_lgica_1> )
{
<bloque_de_instrucciones_1>
{
else
{
/* Inicio del anidamiento */
if ( <expresin_lgica_2> )
{
<bloque_de_instrucciones_2>
}
else
{
<bloque_de_instrucciones_3>
}
/* Fin del anidamiento */
}
83
Ejemplo:
Se quiere escribir un programa que:
"APTO", en el caso de que la nota sea mayor o igual que 5 y menor o igual que 10.
"NO APTO", en el caso de que la nota sea mayor o igual que 0 y menor que 5.
"ERROR: Nota incorrecta.", en el caso de que la nota sea menor que 0 o mayor que 10.
#include <stdio.h>
int main()
{
float nota;
Fjese que, en este caso, se puede prescindir de los caracteres abrir llave ({) y cerrar llave
(}) de la sintaxis, ya que, los bloques de instrucciones slo contienen una instruccin.
Tutorial Lenguaje de Programacin C.
84
if ( <expresin_lgica> )
{
/* Inicio del anidamiento */
switch ( <expresin> )
{
case <expresin_1> : [ <bloque_de_instrucciones_1> ]
[ break; ]
case <expresin_2> : [ <bloque_de_instrucciones_2> ]
[ break; ]
...
case <expresin_n> : [ <bloque_de_instrucciones_n> ]
[ break; ]
[ default : <bloque_de_instrucciones_n+1> ]
}
/* Fin del anidamiento */
}
else
{
<bloque_de_instrucciones_n+2>
}
Ejemplo:
As por ejemplo, el primer ejemplo del apartado Instruccin switch en C, tambin se puede
resolver anidando una instruccin switch (alternativa mltiple) en una instruccin if else
(alternativa doble), como se muestra a continuacin:
#include <stdio.h>
int main()
{
int dia;
printf( "\n Introduzca dia de la semana: " );
scanf( "%d", &dia );
if ( dia >= 1 && dia <= 7 )
/* Slo si el da es vlido, se ejecuta la
instruccin alternativa mltiple */
/* Inicio del anidamiento */
switch ( dia )
{
85
case 1 : printf(
break;
case 2 : printf(
break;
case 3 : printf(
break;
case 4 : printf(
break;
case 5 : printf(
break;
case 6 : printf(
break;
case 7 : printf(
"\n Lunes" );
"\n Martes" );
"\n Miercoles" );
"\n Jueves" );
"\n Viernes" );
"\n Sabado" );
"\n Domingo" );
}
/* Fin del anidamiento */
else
printf( "\n ERROR: Dia incorrecto." );
return 0;
1.5.4.-
"La suma es mayor.", en caso de que sea mayor que la multiplicacin de ambos nmeros.
"La multpilicacin es mayor.", en caso de que sea mayor que la suma de ambos nmeros.
"La suma y multiplicacin son iguales.", en caso de que as sea.
En pantalla:
86
#include <stdio.h>
int main()
{
int a, b;
printf( "Introduzca primer numero (entero): " );
scanf( "%d", &a );
printf( "Introduzca segundo numero (entero): " );
scanf( "%d", &b );
if ( a + b > a * b )
printf( "La suma es mayor." );
else
/* Inicio del anidamiento */
if ( a * b > a + b )
printf( "La multplicacion es mayor." );
else
printf( "La suma y multiplicacion son iguales." );
/* Fin del anidamiento */
return 0;
}
87
Escribir un programa, en lenguaje C, que resuelva el problema del ejercicio Nmero del
Dado con switch, anidando una alternativa mltiple (switch) en una alternativa doble (if).
Solucin del Ejercicio - Nmero del Dado (en C)
#include <stdio.h>
int main()
{
int numero;
printf( "Introduzca numero del dado: " );
scanf( "%d", &numero );
if ( numero >= 1 && numero <= 6 )
/* Slo si el nmero es vlido, se ejecuta la instruccin alternativa mltiple */
/* Inicio del anidamiento */
switch ( numero )
{
case 1 : printf( "En la cara opuesta esta el \"seis\"." );
break;
case 2 : printf( "En la cara opuesta esta el \"cinco\"." );
break;
case 3 : printf( "En la cara opuesta esta el \"cuatro\"." );
break;
case 4 : printf( "En la cara opuesta esta el \"tres\"." );
break;
case 5 : printf( "En la cara opuesta esta el \"dos\"." );
break;
case 6 : printf( "En la cara opuesta esta el \"uno\"." );
}
/* Fin del anidamiento */
else
printf( "ERROR: Numero incorrecto." );
return 0;
}
88
89
2.-
En lenguaje C, para escribir una instruccin while (repetitiva mientras) se utiliza la sintaxis:
while ( <expresin_lgica> )
{
<bloque_de_instrucciones>
}
Por otra parte, al igual que en las instrucciones alternativas doble y simple, a la
<expresin_lgica> de una instruccin repetitiva while, tambin se le llama condicin.
Para que se ejecute el <bloque_de_instrucciones>, la condicin tiene que ser verdadera. Por
el contrario, si la condicin es falsa, el <bloque_de_instrucciones> no se ejecuta.
Por tanto, cuando el flujo de un programa llega a un bucle while, existen dos posibilidades:
90
Ejemplo 1:
Se quiere escribir un programa que muestre por pantalla los primeros diez nmeros
naturales:
1 2 3 4 5 6 7 8 9 10
#include <stdio.h>
int main()
{
int contador;
printf( "\n " );
contador = 1; /* Inicializacin del contador */
while ( contador <= 10 )
/* Condicin */
{
printf( "%d ", contador ); /* Salida */
contador++; /* Incremento del contador */
}
return 0;
}
Se quiere escribir un programa que:
En pantalla:
91
#include <stdio.h>
int main()
{
float nota;
printf( "\n Introduzca nota (real): " );
scanf( "%f", ¬a );
/* Si la primera nota introducida por el usuario es correcta, el bucle no itera ninguna vez. */
while ( nota < 0 || nota > 10 )
{
printf( "\n ERROR: Nota incorrecta, debe ser >= 0 y <= 10\n" );
printf( "\n Introduzca nota (real): " );
scanf( "%f", ¬a );
}
/* Mientras que el usuario introduzca una nota incorrecta, el bucle iterar. Y cuando
introduzca una nota correcta, el bucle finalizar. */
if ( nota >= 5 )
printf( "\n APROBADO" );
else
printf( "\n SUSPENDIDO" );
return 0;
}
En el programa, el bucle while se ha usado para validar la nota introducida por el usuario.
En programacin, es muy frecuente usar el bucle while para validar (filtrar) datos. Al bucle que se
utiliza para validar uno o ms datos, tambin se le conoce como filtro.
2.2.2.2.1.-
92
#include <math.h>
#include <stdio.h>
int main()
{
float radio;
printf( "Introduzca radio: " );
scanf( "%f", &radio );
/* Filtramos el radio */
93
2.2.2.-
3) Repita los pasos 1 y 2, mientras que, la arista introducida sea mayor que cero.
4) Muestre por pantalla cuantos volmenes de cubos han sido calculados.
Nota 1: Volumen de un cubo = arista3
Nota 2: Utilice un bucle mientras (while).
En pantalla:
#include <math.h>
#include <stdio.h>
int main()
{
int contador;
float arista;
printf( "Introduzca arista: " );
scanf( "%f", &arista );
contador = 0; /* Inicializacin del contador */
while ( arista > 0 )
{
printf( "El volumen de un cubo de arista %f es: %f\n",
arista, pow( arista, 3 ) );
94
contador++; /* Incremento*/
printf( "Introduzca arista :" );
scanf( "%f", &arista );
}
printf( "Ha calculado el volumen de %d cubo(s).", contador );
return 0;
2.3.2.3.1.-
En lenguaje C, para escribir una instruccin do while (repetitiva hacer mientras) se utiliza la
sintaxis:
do
{
<bloque_de_instrucciones>
} while ( <expresin_lgica> );
95
Ejemplo 1:
De modo que, utilizando un bucle do while, el problema del ejemplo 1 del apartado anterior,
Instruccin while en C, se puede resolver con el cdigo:
#include <stdio.h>
int main()
{
int contador;
printf( "\n " );
contador = 1; /* Inicializacin del contador */
do
{
printf( "%d ", contador ); /* Salida */
contador++;
/* Incremento */
} while ( contador <= 10 );
/* Condicin */
return 0;
}
Como ya se ha dicho, el bucle do while puede iterar una o ms veces, por tanto, cuando un
bloque de instrucciones debe iterar al menos una vez, generalmente, es mejor utilizar un bucle do
while que un bucle while, como por ejemplo, en el siguiente problema.
Ejemplo 2:
Se quiere escribir un programa que:
96
#include <stdio.h>
int main()
{
char seguir;
int acumulador, numero;
/* En acumulador se va a guardar la suma de los nmeros introducidos por el usuario. */
acumulador = 0;
do
{
printf( "\n Introduzca un numero entero: " );
scanf( "%d", &numero);
acumulador += numero;
printf( "\n Desea introducir otro numero (s/n)?: " );
fflush( stdin );
scanf( "%c", &seguir);
} while ( seguir != 'n' );
/* Mientras que el usuario desee introducir ms nmeros, el bucle iterar. */
2.3.2.-
97
En pantalla:
#include <stdio.h>
int main()
{
char seguir;
int acumulador, contador, numero;
acumulador = 0;
contador = 0;
do
{
98
acumulador += numero;
contador++;
printf( "Ha introducido %d numero(s).", contador );
printf( "\nLa suma es %d", acumulador );
printf( "\n\nDesea introducir otro numero (s/n)?: " );
fflush( stdin );
scanf( "%c", &seguir );
} while ( seguir != 'n' );
printf( "La media aritmetica es %f",
( float ) acumulador / contador );
return 0;
99
#include <stdio.h>
int main()
{
char seguir;
int acumulador, n1, n2;
acumulador = 0;
do
{
printf( "Introduzca primer numero: " );
scanf( "%d", &n1 );
printf( "Introduzca segundo numero: " );
scanf( "%d", &n2 );
printf( "La suma es %d", n1 + n2 );
acumulador += n1 + n2;
printf( "\n\nDesea realizar otra suma (s/n)?: " );
fflush( stdin );
scanf( "%c", &seguir );
} while ( seguir != 'n' );
printf( "La suma total es %d", acumulador );
return 0;
}
2.4.-
2.4.1.-
En lenguaje C, para escribir una instruccin for (repetitiva para) se utiliza la sintaxis:
100
101
2.4.2.-
Escribir un programa, en lenguaje C, que muestre por pantalla los cinco primeros nmeros
naturales pares elevados al cubo.
Nota 1: Cubo de un nmero = nmero3
Nota 2: Utilice un bucle para (for).
En pantalla:
#include <math.h>
#include <stdio.h>
int main()
{
int numero;
for ( numero = 2 ; numero <= 10 ; numero += 2 )
{
printf( "%.f ", pow( numero, 3 ) );
}
return 0;
}
102
Escribir un programa, en lenguaje C, que muestre por pantalla todos los nmeros mltiplos
de 3 que hay entre el -15 y el -3, ambos inclusive.
Nota: Utilice un bucle para (for).
En pantalla:
-15 -12 -9 -6 -3
#include <stdio.h>
int main()
{
int numero;
for ( numero = -15 ; numero <= -3 ; numero += 3 )
{
printf( "%d ", numero );
}
return 0;
}
2.5.-
Al igual que las instrucciones alternativas, las instrucciones repetitivas tambin se pueden
anidar, permitiendo las siguientes combinaciones de anidamiento:
while en while
while en do while
while en for
do while en do while
do while en for
do while en while
for en for
for en while
for en do while
103
2.5.1.-
Por otro lado, las instrucciones alternativas y repetitivas tambin se pueden anidar entre s,
permitiendo realizar 18 combinaciones ms de anidamiento:
while en if else
while en if
while en switch
do while en if else
do while en if
do while en switch
for en if else
for en if
for en switch
if else en while
if else en do while
if else en for
if en while
if en do while
if en for
switch en while
switch en do while
switch en for
2.5.2.-
104
Ejemplo:
Se quiere escribir un programa que muestre por pantalla todos los nmeros enteros del 1 al
100 (ambos inclusive) que sean divisibles entre 17 21:
17 21 34 42 51 63 68 84 85
Anidando una instruccin if en un bucle for, el problema se puede resolver con el cdigo:
#include <stdio.h>
int main()
{
int numero;
printf( "\n " );
for ( numero = 1 ; numero <= 100 ; numero++ )
{
/* Inicio del anidamiento */
if ( numero % 17 == 0 || numero % 21 == 0 )
printf( "%d ", numero );
/* Fin del anidamiento */
}
return 0;
}
2.5.3.-
105
En caso contrario, muestre por pantalla los nmeros que hay entre los dos nmeros
introducidos por el usuario, ambos inclusive, as como, la suma de todos ellos.
106
En pantalla:
107
3.-
#include <stdio.h>
int main()
{
int n, a;
a = 0;
do
{
printf( "Introduzca un numero entero: " );
scanf( "%d", &n );
if ( n == 0 )
{
printf( "ERROR: El cero no tiene opuesto.\n" );
break;
/* En el caso de que n sea un cero,
el bucle se interrumpe. */
}
printf( "El opuesto es: %d\n", -n );
a += n;
} while ( n >= -10 && n <= 10 );
printf( "Suma: %d", a );
return 0;
}
108
3) Repita los pasos 1 y 2, mientras que, el usuario introduzca un nmero mayor o igual
que -10 y menor o igual que 10.
Pero, si el usuario introduce un cero, el bucle tambin finaliza, mostrndose por pantalla el
mensaje:
"ERROR: El cero no tiene opuesto.".
109
El bucle ha finalizado porque la condicin ( n >= -10 && n <= 10 ) es falsa, ya que, 15 no es
mayor o igual que -10 y menor o igual que 10.
Sin embargo, el bucle tambin puede finalizar, no porque sea falsa la condicin ( n >= -10
&& n <= 10 ), sino, porque se ejecute la instruccin break. Esto ocurrir cuando el usuario
introduzca un cero. Por ejemplo:
Introduzca un nmero entero: 8
El opuesto es: -8
Introduzca un nmero entero: -7
El opuesto es: 7
Introduzca un nmero entero: 0
ERROR: El cero no tiene opuesto.
Suma: 1
La traza en este caso es:
110
Ejemplo 2:
No obstante, el problema tambin se puede resolver sin hacer uso de la instruccin break:
#include <stdio.h>
int main()
{
int numero, acumulador;
acumulador = 0;
do
{
printf( "Introduzca un numero entero: " );
scanf( "%d", &numero );
if ( numero == 0 )
{
printf( "ERROR: El cero no tiene opuesto.\n" );
}
else
{
printf( "El opuesto es: %d\n", -numero );
acumulador += numero;
}
} while ( numero >= -10 && numero <= 10 && numero != 0 );
printf( "Suma: %d", acumulador );
return 0;
}
111
int main()
{
int n, a;
a = 0;
do
{
printf( "Introduzca un numero entero: " );
scanf( "%d", &n );
if ( n == 0 )
{
printf( "ERROR: El cero no tiene opuesto.\n" );
continue;
/* En el caso de que n sea un cero,
la iteracin en curso del bucle
se interrumpe aqu. */
}
printf( "El opuesto es: %d\n", -n );
a += n;
} while ( n >= -10 && n <= 10 );
printf( "Suma: %d", a );
return 0;
}
El cdigo del programa es el mismo que el del ejemplo 1 del apartado anterior, Instruccin
break en C, excepto por la instruccin break, que ha sido sustituida por la instruccin continue. El
programa puede ser la solucin para el problema siguiente, el cual se diferencia del ejemplo 1 del
apartado anterior en que si el usuario introduce un cero, el bucle no deja de iterar.
Disee el algoritmo de un programa que:
112
En pantalla:
113
Normalmente, al igual que ocurre con la instruccin break, cuando en un bucle se utiliza una
instruccin continue, la ejecucin de sta tambin se condiciona.
n = 0 ).
Ejemplo 2:
No obstante, el problema tambin se puede resolver sin hacer uso de la instruccin
continue:
#include <stdio.h>
int main()
{
114
3.3.-
En lenguaje C, para escribir una instruccin de salto goto (ir a), se utiliza la sintaxis:
goto <nombre_de_la_etiqueta>
a = 0;
do
{
printf( "Introduzca un numero entero: " );
scanf( "%d", &n );
if ( n == 0 )
{
printf( "ERROR: El cero no tiene opuesto.\n" );
goto etiqueta_1;
/* En el caso de que n sea un cero,
el control de programa salta a la
primera instruccin despus de
etiqueta_1. */
}
printf( "El opuesto es: %d\n", -n );
a += n;
} while ( n >= -10 && n <= 10 );
etiqueta_1:
printf( "Suma: %d", a );
return 0;
Los resultados por pantalla de este programa son idnticos a los de los programas de los
ejemplos 1 y 2 del apartado Instruccin break en C.
Tutorial Lenguaje de Programacin C.
115
En pantalla:
Normalmente, al igual que ocurre con las instrucciones break y continue, cuando en un
algoritmo se utiliza una instruccin goto, la ejecucin de sta tambin se condiciona.
116
3.4.-
En lenguaje C, para escribir una instruccin de salto return (volver), se utiliza la sintaxis:
return <expresin>;
La instruccin de salto return es utilizada en lenguaje C para indicar el valor de retorno de
una funcin. Por tanto, vamos a hacer uso de la instruccin return cuando definamos subprogramas
de tipo funcin, que estudiaremos ms adelante en el apartado Llamadas a subprogramas.
Por otra parte, recurdese que, en el apartado Mi primer programa en C de este
curso/tutorial, ya estudiamos la utilidad de la instruccin return en la funcin main.
3.5.-
117