Sunteți pe pagina 1din 60

Fundamentos Programacin

1


Lenguaje de programacin C/C++





Introduccin
Estructura de un programa
Tipos de datos
Identificadores
Variables
Constantes
Operadores y expresiones
Entrada y salida estndar
Comentarios
La funcin fflush
Tipos de errores

Instrucciones de control alternativas
Alternativa doble ( la instruccin if )
Alternativa simple ( de nuevo la instrucin if )
Alternativa mltiple ( la instruccin switch )
Anidamiento

Instrucciones de control repetitivas
Repetitiva mientras ( la instruccin while )
Repetitiva hacer...mientras ( la instruccin do..while )
Repetitiva para ( la instruccin for )
Anidamiento

Fundamentos Programacin



2
Introduccin

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/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/C++ se va a compilar con un compilador de C/C++, el
cdigo fuente debe ser guardado con extensin (.c) o (.cpp).
Preproceso. El preproceso 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/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/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".

Adems de las funciones de la biblioteca estndar de C/C++, el programador
tambin puede utilizar funciones que hayan sido desarrolladas por l mismo. stas
pueden agruparse en su propia biblioteca de funciones (no estndar). Por lo que,
tambin en esta fase, el cdigo objeto de dichas funciones deber ser enlazado al
cdigo objeto del programa que las utilice.

Grficamente, el proceso de puesta a punto de un programa escrito en C se puede
ver en la siguiente figura:
Fundamentos Programacin



3


Figura. Fases de la puesta a punto de un programa.

Finalmente, para que el cdigo ejecutable de un programa se ejecute en la
computadora, es necesario que un programa del sistema operativo, llamado
cargador, lo lleve a la memoria principal de la misma. A partir de ese momento, la
CPU empezar a ejecutarlo.


Estructura de un programa
Un programa escrito en C/C++ est compuesto por una o ms funciones. Como ya es
sabido, una funcin es un programa que sirve para realizar una tarea determinada,
por ejemplo, la funcin scanf sirve para leer datos desde el teclado.

Existe una funcin que est presente en todos los programas escritos en C/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>
}


La funcin main contiene al bloque de instrucciones principal de un programa,
dentro de los caracteres abrir llave ({) y cerrar llave (}).

Fundamentos Programacin



4
Los parntesis "()" escritos despus de main sirven para indicar que el
identificador main es una funcin.

Finalmente, no podemos pasar por alto que delante de main se ha escrito la palabra
reservada int; enseguida veremos el porqu.

Tipos de instrucciones

En C, las instrucciones, tambin llamadas sentencias, se pueden clasificar en:
De expresin.
De control.
Compuestas.
Una instruccin compuesta siempre alberga, entre llaves ({...}), a
un <bloque_de_instrucciones>:

{
<bloque_de_instrucciones>
}


Un bloque de instrucciones puede estar compuesto por una o ms instrucciones, que,
a su vez, pueden ser instrucciones de expresin, de control y/o compuestas
nuevamente.

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

Las instrucciones de expresin, tambin conocidas como instrucciones simples o
elementales, son aquellas que representan a las acciones ms pequeas
(elementales) que se pueden ejecutar en un programa, y siempre van seguidas de un
carcter punto y coma (;), el cual indica que la instruccin ha terminado:

<instruccin_de_expresin>;


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.


Fundamentos Programacin



5
Mi primer programa en C

Ejemplo: Se quiere escribir un programa que muestre por pantalla un mensaje de
saludo:
Hola mundo



Obsrvese que, el saludo se visualiza justo en la esquina superior izquierda de la
pantalla. Ms adelante se estudiar cmo se puede mostrar en otro lugar de la
pantalla.

En C, el cdigo fuente de dicho programa puede ser:
#include <stdio.h>

int main()
{
printf( "Hola mundo" );

return 0;
}


Todas las funciones de la biblioteca estndar de C son subprogramas que ya estn
compilados, es decir, junto a cualquier compilador de 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.

Del cdigo fuente preprocesado de un programa, el compilador generar un cdigo
objeto que se debe unir (enlazar) con los cdigos objeto de las funciones de la
biblioteca estndar de C que se llamen desde dicho programa. Por ejemplo, el cdigo
objeto de nuestro primer programa se debe enlazar con el cdigo objeto del
subprograma printf.

El enlazador sabe dnde encontrar el cdigo objeto de las funciones de la biblioteca
estndar de C que utilice un programa. Sin embargo, para poder utilizar una funcin
(sea de la biblioteca estndar de C o no) en un programa, la funcin debe ser
declarada previamente, al igual que se tienen que declarar las variables y las
constantes que usa un programa.

Para que el compilador conozca la declaracin de la funcin printf, hay que utilizar la
directiva del preprocesador #include:
Fundamentos Programacin



6

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

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

En general, la instruccin return suele ser la ltima del bloque de instruccines de la
funcin main. Al retornar el valor 0, indica (informa al sistema operativo) que el
programa finaliz correctamente, es decir, sin producirse ningn error en su
ejecucin. Cuando la funcin main devuelva un valor distinto de cero, esto
siginificar que se ha producido algn error en la ejecucin del programa, o que ha
ocurrido algo fuera de lo normal.

La instruccin return es una de las instrucciones de control que existen en C. Por
tanto, es una palabra reservada. Despus del valor de retorno (que es una expresin)
se debe escribir un punto y coma (;). La sintaxis de la instruccin return es:

return <expresin>;



Fundamentos Programacin



7
Por el momento, se ha visto que la sintaxis "bsica" de un programa escrito en C es:

[ <directivas_del_preprocesador> ]

int main()
{
<bloque_de_instrucciones>
}


Los caracteres abrir corchete ([) y cerrar corchete (]) se utilizan para indicar que lo
que contienen es opcional.


Tipos de datos


En C/C++ se dice que todos los datos que utilizan los programas son bsicos (simples
predefinidos o estndares) o derivados. Los tipos bsicos en C/C++ se clasifican en:





La diferencia principal entre float y double est en el hecho de que un dato de
tipo double puede tomar por valor un nmero perteneciente a un subconjunto de R
mayor que un dato de tipo float.
En C no existen datos de tipo lgico. Ahora bien, se pueden simular con datos de tipo
entero, considerndose el valor cero (0) como falso, y cualquier otro valor entero
como verdadero (para ello, generalmente, se emplea el valor uno (1)).

Identificadores

La mayora de los elementos de un programa se diferencian entre s por su nombre.
Por ejemplo, los tipos de datos bsicos en C/C++ se nombran como:
char, int, boolean, float, double y void

Cada uno de ellos es un identificador. Un identificador es el nombre que se le da a
un elemento de un algoritmo (o programa). Por ejemplo, el tipo de dato int hace
referencia a un tipo de dato que es distinto a todos los dems tipos de datos, es
decir, los valores que puede tomar un dato de tipo entero, no son los mismos que los
que puede tomar un dato de otro tipo.

Numricos
Entero (int)
Real(float y double)
Carcter (char)
Lgicos (boolean)
Sin valor (void)

Fundamentos Programacin



8
Los identificadores char, int, boolean,float, double y void estn predefinidos,
forman parte del lenguaje C/C++. No obstante, en el cdigo de un programa tambin
pueden existir identificadores definidos por el programador. Por ejemplo, un
programa puede utilizar variables y constantes definidas por el programador.

En C/C++, a la hora de asignar un nombre a un elemento de un programa, se debe
tener en cuenta que todo identificador debe cumplir las siguientes reglas de sintaxis:
1. Consta de uno o ms caracteres.
2. 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 ''.
3. No pueden existir 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.

Los identificadores son sensibles a minsculas y maysculas.

Palabras reservadas

Las palabras reservadas son identificadores predefinidos (tienen un significado
especial). En todos los lenguajes de programacin existe un conjunto de palabras
reservadas. Por el momento, en lenguaje C/C++, se han estudiado las siguientes:
char, int,boolean float, double y void


Variables

En C/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:

<nombre_del_tipo_de_dato> <nombre_de_la_variable> [ = <expresin> ];


Y para ms de una variable del mismo tipo se utiliza la sintaxis:

<nombre_del_tipo_de_dato> <nombre_de_la_variable_1> [= <expresin_1>],
<nombre_de_la_variable_2> [= <expresin_2>],
...,
<nombre_de_la_variable_n> [= <expresin_n>];


Una expresin representa a un valor de un tipo de dato.


Fundamentos Programacin



9
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;

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.

Por consiguiente, en la memoria se almacenarn siete caracteres consecutivos:
Fundamentos Programacin



10


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.



Fundamentos Programacin



11
Constantes

En C/C++, una constante puede ser de tipo entero, real, carcter, de cadena o
enumerado.

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 C/C++
reciben un tratamiento diferente al de la mayora de los lenguajes de programacin.
En C/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 C/C++, se utiliza una nueva directiva del
preprocesador:

#define <nombre_de_la_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

En programacin es una buena prctica escribir los identificadores de las constantes
en maysculas, de esta forma es ms fcil localizarlos en el cdigo de un programa.
Ntese que, despus de la declaracin de una constante simblica no se escribe un
carcter punto y coma (;), cosa que s se debe hacer al declarar una variable.

Por otra parte, no se puede declarar ms de una constante simblica en una misma
lnea de cdigo.

Ejemplo 3: Para declarar las constantes simblicas PI y NUMERO_E, no se puede
escribir:

#define PI 3.141592, NUMERO_E 2.718281

Por otra parte, en C/C++, es posible declarar una variable indicando que su valor es
inalterable. Para ello, se utiliza el cualificador const.


Fundamentos Programacin



12
Ejemplo 4: Uso de const:

const int temperatura = -5;

En el ejemplo, se ha declarado la variable entera temperatura inicializada al valor -5
y, por medio de const, que es una palabra reservada, se ha indicado que su valor no
puede cambiar durante la ejecucin del programa. En cierta manera, la
variable temperatura est simulando a una constante.
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>
}


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;

...
}
Ejemplo 6: En C/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\""

Fundamentos Programacin



13

Operadores y expresiones









Como se puede apreciar, existen tres diferencias importantes entre los operadores
aritmticos en pseudocdigo y en C:
1. El operador potencia (**) no existe en C/C++.
2. En C/C++, slo existe un operador de divisin (/).
3. En C/C++, el operador mdulo (mod) se escribe con el carcter porcentaje (%).

Ejemplo 1: A partir de las variables:
En pseudocdigo:

entero a = 4, b = 7, c = 2

En C:

int a = 4, b = 7, c = 2;

podemos escribir, por ejemplo, la expresin:
En pseudocdigo:

-a * ( b mod c )

En C:

-a * ( b % c )

De la evaluacin de esta expresin se obtiene el valor

-4 (actan en orden los operadores: (%), menos (-) y (*))

El operador divisin

Puesto que, en C/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".




Operadores Aritmticos

+ Suma
- Resta
* Multiplicacin
/ Division
% Modulo
+ signo mas
- signo menos

Fundamentos Programacin



14
Ejemplo 2: Declaradas las variables:

int h = 3, v = 6;

De las expresiones:

v / h
Tiposdedatos
5 / h

5.0 / 2

5 / 2.

5.4 / 2.0

se obtienen los valores:

2 (valor entero, ambos operandos son enteros)

1 (valor entero, ambos operandos son enteros)

2.5 (valor real, el primer operando es real)

2.5 (valor real, el segundo operando es real)

2.7 (valor real, ambos operandos son reales)

En C/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 3: Para cambiar el tipo de dato de los valores resultantes de las siguientes
expresiones:

5 (valor entero)

v (valor entero)

5.0 (valor real)

v / h

5 / h

5.0 / 2

5 / 2.

Fundamentos Programacin



15
5.4 / 2.0

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 (valor real)

6.000000 (valor real)

5 (valor entero)

2.000000 (actan en orden los operadores: "( <tipo> )" y (/))

1.666667 (actan en orden los operadores: "( <tipo> )" y (/))

2 (actan en orden los operadores: "( <tipo> )" y (/))

2 (actan en orden los operadores: "( <tipo> )" y (/))

2 (actan en orden los operadores: (/) y "( <tipo> )")


La funcin pow

En C/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> )


La funcin pow devuelve, sobre el propio identificador de la funcin, el resultado que se
obtiene de elevar el <operando_nmero_base> al <operando_exponente>. El valor de
retorno de la funcin es de tipo double, con independencia de que los operandos sean
reales o enteros.


Fundamentos Programacin



16
Ejemplo 4: Partiendo de la variable:
En pseudocdigo:

entero numero = 9

En C:

int numero = 9;

De la expresin:
En pseudocdigo:

1 + numero ** 2

En C:

1 + pow( numero, 2 )

La funcin pow devuelve el resultado de elevar el valor de la variable numero a 2. De
manera que, el resultado de evaluar la expresin anterior es:
82.000000 (se obtiene de 1 + 81. 000000)

La declaracin de la funcin pow se encuentra en el archivo de cabecera math.h. Por
tanto, si en un programa se utiliza dicha funcin, habr que escribir tambin:

#include <math.h>

Expresiones lgicas

De la evaluacin de una expresin lgica siempre se obtiene un valor de tipo lgico
(verdadero o falso). En las expresiones lgicas se pueden utilizar dos tipos de
operadores:
Relacionales.
Lgicos.
Operadores relacionales

Un operador relacional se utiliza para comparar los valores de dos expresiones. stas
deben ser del mismo tipo (aritmticas, lgicas o de carcter).












Operadores Relacionales

< Menor que
<= Menor o igual que
> Mayor
>= Mayor o igual que
== Igual que
!= Distinto que


Fundamentos Programacin



17


Las diferencias son dos:
1. En C/C++, el operador igual que (=) se escribe con los caracteres igual-igual (==).
2. En C/c++, el operador distinto que (<>) se escribe con los caracteres admiracin-
igual (!=).

Ejemplo 1: A partir de las variables:
En pseudocdigo:

entero p = 45, q = 186

En C:

int p = 45, q = 186;

podemos escribir la expresin:
En pseudocdigo:

p <> q

En C:

p != q

De su evaluacin se obtiene:
En pseudocdigo:

verdadero ( p es distinta de q )

En C/C++:

1 (C simula el valor lgico verdadero con el valor entero 1)

En C/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.

Operadores lgicos

Un operador lgico acta, exclusivamente, sobre valores de expresiones lgicas.











Operadores Lgicos

&& Conjuncin
|| Disyuncin
! Negacin
Fundamentos Programacin



18
Ejemplo 1: Habiendo declarado las variables:
En pseudocdigo:

entero r = 2, s = 9, t = 8

En C/C++:

int r = 2, s = 9, t = 8;

se puede escribir
En pseudocdigo:

no( r = s o r <= t )

En C:

!( r == s || r <= t )

La expresin se evala a
En pseudocdigo:

falso (actan en orden los operadores: (<=), (==), (||) y (!))

En C/C++:

0 (C simula el valor lgico falso con el valor entero 0)


Operadores de asignacin

En C existen expresiones de asignacin y, para escribirlas, se utilizan los siguientes
operadores de asignacin:



De ellos, el ms utilizado es el operador de asignacin (=). Su funcionalidad es
equiparable a la de una instruccin de asignacin en pseudocdigo, y su sintaxis es muy
similar.

<nombre_de_la_variable> = <expresin>;



Fundamentos Programacin



19
Existen dos diferencias:
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

float area, longitud, radio;

una instruccin de asignacin puede ser:

radio = 5.78;

Tcnicamente, en C/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>;


De la evaluacin de una expresin de asignacin siempre se obtiene el mismo valor que
el asignado a la variable, en este caso, 5.78.

Si ahora escribimos:

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.

Cuando el operador de asignacin (=) se escribe precedido de un operador aritmtico:
suma (+), resta (-), multiplicacin (*), divisin (/) o mdulo (%), la unin de ambos
se convierte en un nuevo operador de asignacin que opera de la siguiente manera:
"A la variable se le asigna el valor que se obtiene de evaluar
<variable> <operador_aritmtico> <expresin>."


Ejemplo 12: Dada la siguiente declaracin de variables:

int m = 4, n = 1;

se puede escribir la instruccin de expresin

m += 3;


Fundamentos Programacin



20
que es equivalente a la instruccin

m = m + 3;

En la memoria, cambiar el valor almacenado en el espacio representado por la
variable m.


Si, a continuacin, se ejecuta la instruccin

m *= n += 2;

ahora, los valores de las variables m y n son:


Primero, se evala la expresin n += 2 (equivalente a n = n + 2). Esto produce que a
la variable n se le asigne un 3. En segundo lugar, se evala la expresin m *=
3 (equivalente a m = m * 3), asignndosele a la variable m el valor 21.

Los operadores incremento (++) y decremento (--)

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;


Fundamentos Programacin



21
se pueden escribr las instrucciones de expresin:

r++;
s--;

Dichas instrucciones son equivalentes a:

r = r + 1;
s = s - 1;

Y tambin se pueden escribir como:

++r;
--s;

Tras su ejecucin, el aspecto de la memoria ser:


En estas instrucciones, ambos operadores se pueden escribir, indistintamente, antes o
despus de los operandos sobre los que actan. Pero, cuando en una expresin,
adems del operador incremento o decremento, tambin aparecen otros operadores,
entonces s que hay que tener en cuenta la diferencia que supone el escribirlos antes o
despus.

Ejemplo 2: A partir de las variables:

int i = 5, j, k = 5, m;


Si se ejecutan las instrucciones:

j = i++;
m = ++k;




Fundamentos Programacin



22
Los valores de las variables en memoria sern:


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.
Prioridad de operadores

La prioridad de todos los operadores de C/C++ estudiados hasta el momento es:














Fundamentos Programacin



23
Obsrvese que, en C/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.

En 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 C, como son printf y scanf, entre
otras que estudiaremos ms adelante.

La funcin printf

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


En programacin, los argumentos (tambin llamados parmetros) se emplean
para transferir datos de un programa (o subprograma) llamante a otro llamado, y
viceversa (del llamado al llamante).

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.
La <cadena_de_control> es, en s misma, una cadena de caracteres, que se debe
escribir entre comillas dobles (").

Texto ordinario

El texto ordinario 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 1 en la llamada a la funcin printf de nuestro primer programa, la
cadena de control slo contena texto ordinario:
Fundamentos Programacin



24
#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



Especificadores de formato

Cuando a la funcin printf se le pase una lista de argumentos (expresiones), se
debe escribir un especificador de formato por cada argumento. En la 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, no es necesario conocer todos los
especificadores de formato que se pueden usar en la funcin printf, pero s, los
ms utilizados:


Figura. Especificadores de formato ms utilizados en la funcin printf.

Ejemplo 2 : Dada la constante simblica

#define NOMBRE "Raquel"

si escribimos

printf( "Hola %s", NOMBRE );

por pantalla se ver:
Fundamentos Programacin



25
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 3 : 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:
Timoteo tiene 2 hermanos y 4 sobrinos.



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.

Cada especificador de formato de la cadena de control se hace corresponder con un
argumento (expresin), en el mismo orden de aparicin, de izquierda a derecha. En
el caso de que existan ms argumentos que especificadores de formato, los
"sobrantes" son ignorados. Por el contrario, si existen menos argumentos que
especificadores de formato, en pantalla se mostrarn datos inverosmiles.

Secuencias de escape

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
Fundamentos Programacin



26
necesario conocer todas las secuencias de escape que existen en C/C++, pero s,
algunas de las ms utilizadas:


Figura. Secuencias de escape ms utilizadas.

En general, cuando se disea el algoritmo de un programa, el programador no se
preocupa del lugar exacto de la pantalla en donde van a aparecer los datos de
salida del programa, ya que, este aspecto suele concretarse en la codificacin.

En Windows, la patanlla (de la consola) est compuesta por 25 filas (lneas) y 80
columnas, es decir, en pantalla se pueden visualizar 2000 caracteres a la vez
(25*80).

Normalmente, al ejecutar un programa escrito en C, el cursor se posiciona (por
defecto) en la primera columna de la primera fila.
_ (cursor)



A partir de esa posicin, se mostrarn por pantalla los datos de salida de dicho
programa.

Ejemplo 4 : 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.
Fundamentos Programacin



27
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" );

Partiendo de que, inicialmente, el cursor se encuentre en la primera columna de la
primera fila, es decir, en la esquina superior izquierda de la pantalla, la secuencia
de escape nueva lnea (\n) lo mover al principio de la segunda fila y, a
continuacin, se escribir el texto "uno dos tres". Obsrvese que, los caracteres
que forman la secuencia de escape, (\) y (n), no aparecen en pantalla.

La instruccin anterior hace lo mismo que las dos siguientes

printf( "\n" );
printf( "uno dos tres" );

Ejemplo 5: Si por pantalla se quiere ver
uno
dos
tres



hay que escribir

printf( "uno\ndos\ntres" );

El proceso de ejecucin de esta instruccin es el siguiente: justo en la esquina
superior izquierda de la pantalla (primera lnea) se muestra el texto "uno".
Despus, una secuencia de escape nueva lnea (\n) mueve el cursor al principio de
la lnea siguiente (segunda lnea), en donde se visualiza el texto "dos".
Posteriormente, otra secuencia de escape nueva lnea (\n) vuelve a mover el
cursor al principio de la lnea siguiente (tercera lnea) y, finalmente, se muestra el
texto "tres".

La instruccin anterior es equivalente a:

printf( "uno" );
printf( "\ndos" );
printf( "\ntres" );
Fundamentos Programacin



28

Igualmente, se podra escribir

printf( "uno\n" );
printf( "dos\n" );
printf( "tres" );

Ejemplo 6: Para visualizar

uno dos tres



se puede escribir

printf( "\n uno dos tres" );

Ejemplo 7: Y para mostrar

uno
dos
tres



escribiremos, por ejemplo,

printf( "\n uno\n dos\n tres" );

La secuencia de escape tabulador horizontal (\t) mueve el cursor a la posicin
siguiente del tabulador horizontal de la pantalla. Entre cada posicin hay ocho
caracteres, por tanto, dichas posiciones estn en las columnas 1, 9, 17, 25, 33, 41,
49, 57, 65 y 73.

Ejemplo 8: De la instruccin

printf( "diez\tveinte\ttreinta" );

se obtiene por pantalla
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:
1 9 17 25 ...
diez----veinte--treinta

Fundamentos Programacin



29


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 9 : Al escribir

printf( "\n\t\t7 de julio \"San Fermin\"" );

en la segunda lnea de la pantalla se mostrar, a partir de la tercera posicin del
tabulador horizontal (columna 17), el mensaje: "7 de julio "San Fermin""
1 9 17 25 ...

7 de julio "San Fermin"




La funcin scanf

La funcin scanf permite asignar a una o ms variables, uno o ms valores (datos)
recibidos desde la entrada estndar (el teclado). La sintaxis de su llamada es:

scanf( <cadena_de_control> [, <lista_de_argumentos> ] )


En la <cadena_de_control>, el programador debe indicar el formato de entrada de
los datos que se van a recoger por teclado. Para ello, se puede hacer uso de:
Especificadores de formato.
Otros caracteres
En este apartado de introduccin a C, slo se van a estudiar algunos de los
especificadores de formato ms utilizados en la funcin scanf.

Especificadores de formato

En la fucin 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:
Fundamentos Programacin



30


Figura. Especificadores de formato ms utilizados en la funcin scanf.

Ejemplo 10: 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.


Fundamentos Programacin



31

El operador direccin (&) entra dentro de la categora de operadores monarios y,
siguiendo con el ejemplo, de la evaluacin de la expresin

&numero

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

printf ( "%p", &numero );

Puesto que, de la expresin &numero se obtiene una direccin de memoria, en la
cadena de control de la funcin printf se tiene que escribir el especificador de
formato asociado a la salida de una direccin de memoria, (%p).

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:

printf( "\n Introduzca un n%cmero entero: ", 163 );

Fjese que, 163 es el nmero decimal que corresponde al carcter '' en ASCII.

Ejemplo 11: 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.
Fundamentos Programacin



32

Si el usuario teclea, por ejemplo, el valor 3.8 para el radio, en pantalla se
visualizar:

Introduzca radio: 3.8

El area de la circunferencia es: 45.364588



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

Introduzca radio: 3.8

El area de la circunferencia es: 45.36



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 12: Si se desea desarrollar un programa para leer un nombre de persona

Introduzca nombre: Elsa



se puede escribir
Fundamentos Programacin



33

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

Actividad 1 - rea de un tringulo

Escribir un programa (en lenguaje C) que:
1) Pida por teclado la base (dato real) de un tringulo.
2) Pida por teclado la altura (dato real) de un tringulo.
3) Calcule el rea del tringulo.
4) Muestre por pantalla el resultado (dato real).

En pantalla:
Introduzca base: 1.2
Introduzca altura: 4.5
El rea del tringulo es: 2.7



Nota: rea de un tringulo = base * altura / 2
Fundamentos Programacin



34

Solucin
#include <stdio.h>

int main()
{
float altura, area, base;

printf( "Introduzca base: " );
scanf( "%f", &base );
printf( "Introduzca altura: " );
scanf( "%f", &altura );

area = base * altura / 2;

printf( "El area del triangulo es: %f", area );

return 0;
}

Una segunda solucin es:
#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;
}

Fundamentos Programacin



35
Actividad 2 - Divisin entera

Escribir un programa (en lenguaje C) que:
1) Pida por teclado dos nmeros (datos enteros).
2) Muestre por pantalla el resultado de realizar la divisin entera del primer
nmero introducido por el usuario entre el segundo, y el resto.

En pantalla:
Introduzca dividendo (entero): 39
Introduzca divisor (entero): 5
39 div 5 = 7 ( Resto = 4 )



Nota: Se entiende que el usuario no introducir un divisor igual a cero.
#include <stdio.h>

int main()
{
int dividendo, divisor, cociente, resto;

printf( "Introduzca dividendo (entero): " );
scanf( "%d", &dividendo );
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;
}
La segunda solucin es:
#include <stdio.h>

int main()
{
int dividendo, divisor;

printf( "Introduzca dividendo (entero): " );
scanf( "%d", &dividendo );
printf( "Introduzca divisor (entero): " );
scanf( "%d", &divisor );

printf( "%d div %d = %d ( Resto = %d )", dividendo, divisor,
dividendo / divisor, dividendo % divisor );

return 0;
}
Fundamentos Programacin



36
Comentarios

En C/C++, los comentarios se escriben entre los caracteres barra-asterisco (/*) y
asterisco-barra (*/) o //.

Ejemplo :
/***************************************************/
/* Programa: Area_de_una_circunferencia */
/* */
/* Descripcin: Recibe por teclado el radio de una */
/* circunferencia, mostrando su rea por pantalla. */
/* Fecha: 18/09/2007 */
/***************************************************/

#include <math.h>
#include <stdio.h>

#define PI 3.141592 /* Definicin de una constante */

int main()
{
//Variables del programa

float area, radio;

printf( "\n Introduzca radio: " );
scanf( "%f", &radio ); /* Entrada de dato */

/* Clculo del rea de la circunferencia */

area = PI * pow( radio, 2 );

/* Salida por pantalla del resultado */

printf( "\n El area de la circunferencia es: %f", area );

return 0;
}

Los comentarios sern ignorados por el compilador y, por tanto, su presencia en el
cdigo fuente es, meramente, informativa.

Fundamentos Programacin



37
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:
Introduzca el primer numero: 76
Introduzca el segundo numero: 45
Los valores son: 76, 45



Obsrvese que, cuando se ejecuta scanf, por ejemplo, en la primera vez

scanf( "%d", &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.

Fundamentos Programacin



38

Ejemplo 1: 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:
Introduzca primer caracter: f
Introduzca segundo caracter: Introduzca tercer caracter: h
Los valores son: f,
, h



En esta ocasin, por qu no se ejecuta, correctamente, la siguiente instruccin?

scanf( "%c", &b );

La razn es la siguiente: cuando se ejecuta la primera instruccin de entrada

scanf( "%c", &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 );

a la variable b se le asigna el salto de lnea almacenado en el buffer de la entrada
estndar, y la ejecucin del programa continua con la siguiente instruccin. Ahora,
el buffer vuelve a estar vaco y, por tanto, la entrada de la variable c s que se
ejecuta de forma correcta.

Para comprobar que esto es as, podemos sustituir la instruccin

printf( "Los valores son: %c, %c, %c ", a, b, c );

por esta otra:

printf( "Los valores son: %d, %d, %d ", a, b, c );
Fundamentos Programacin



39

En pantalla veremos:
Introduzca primer caracter: f
Introduzca segundo caracter: Introduzca tercer caracter: h
Los valores son: 102, 10, 104



y como se puede comprobar en las tablas del ASCII, los nmeros 102, 10 y 104
corresponden a los caracteres 'f', LF (Salto de Lnea) y 'h', respectivamente.

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


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).
Errores de sintaxis

Los errores de sintaxis son los ms fciles de detectar. Un error de sintaxis se
produce al escribir, incorrectamente, alguna parte del cdigo.

Fundamentos Programacin



40
Ejemplo 1 : Estdiese el siguiente cdigo fuente:
include <stdio.h>

imt main()
{
int a, b;

a = 4;
b = a * 6;

printf( "%d", b )

retunr 0;
}

Existen cuatro errores de sintaxis:
1. Se ha escrito include en vez de #include.
2. Se ha escrito imt en vez de int.
3. Falta un punto y coma (;) despus de la llamada a printf.
4. Se ha escrito retunr en vez de return.

Errores de ejecucin

Una vez corregidos los errores de sintaxis, se debe revisar que no se puede
producir ningn error en la ejecucin del programa. Un error de ejecucin se
produce cuando el ordenador no puede ejecutar alguna instruccin de forma
correcta.

Ejemplo 2 : En el programa:
#include <stdio.h>

int main()
{
int a;
float b;

a = 0;
b = 6.4 / a;

printf( "%f", b );

return 0;
}

se produce un error de ejecucin, ya que, al intentar evaluar la expresin

6.4 / a

a vale 0, y no se puede dividir entre cero.

Fundamentos Programacin



41

Errores de lgica

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 3: 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:
El area es: 8.4



No existen errores de sintaxis ni de ejecucin, sin embargo, la salida esperada es:
El area es: 12.6



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









Fundamentos Programacin



42
Alternativa doble ( la instruccin if )

En lenguaje C/C++, para escribir una instruccin alternativa doble se utiliza la
sintaxis:

if ( <expresin_lgica> )
{
<bloque_de_instrucciones_1>
}
else
{
<bloque_de_instrucciones_2>
}


A la <expresin_lgica> de una instruccin alternativa doble tambin se le
denomina condicin.

Para que se ejecute el <bloque_de_instrucciones_1>, la condicin tiene que ser
verdadera. Por el contrario, si la condicin es falsa, se ejecutar el
<bloque_de_instrucciones_2>.

En resumen, una instruccin alternativa doble (o simplemente alternativa
doble) permite seleccionar, por medio de una condicin, el siguiente bloque de
instrucciones a ejecutar, de entre dos posibles.

Ejemplo: Se quiere escribir un programa que:
1) Pida por teclado la nota (dato real) de una asignatura.
2) Muestre por pantalla:
"APROBADO", en el caso de que la nota sea mayor o igual que 5.
"SUSPENDIDO", en el caso de que la nota sea menor que 5.
De modo que, por pantalla se ver, por ejemplo:

Introduzca nota (real): 7.5

APROBADO



Otra posibilidad es:

Introduzca nota (real): 3.5

SUSPENDIDO



Fundamentos Programacin



43

Cuando un bloque de instrucciones slo contiene una instruccin, los caracteres
abrir llave ({) y cerrar llave (}) son opcionales. Por tanto, en lenguaje C, para
resolver el problema del ejemplo se puede escribir:
#include <stdio.h>

int main()
{
float nota;

printf( "\n Introduzca nota (real): " );
scanf( "%f", &nota );

if ( nota >= 5 )
printf( "\n APROBADO" );
else
printf( "\n SUSPENDIDO" );

return 0;
}

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.

Ejercicio 1 - Suma de dos nmeros

Escribir un programa (en lenguaje C) que:
1) Pida por teclado dos nmeros (datos enteros).
2) Calcule la suma de los nmeros introducidos por el usuario.
3) Muestre por pantalla:
"LA SUMA S ES MAYOR QUE CERO.", en el caso de que s lo sea.
"LA SUMA NO ES MAYOR QUE CERO.", en el caso de que no lo sea.
En pantalla:
Introduzca primer nmero (entero): 14
Introduzca segundo nmero (entero): -17
LA SUMA NO ES MAYOR QUE CERO.



Fundamentos Programacin



44

Solucin

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, suma;

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;
}










Fundamentos Programacin



45
Alternativa simple ( de nuevo la instruccin if )

Una instruccin alternativa simple (o simplemente alternativa simple) es
una variante (ms sencilla) de una instruccin alternativa doble. En lenguaje C,
para escribir una alternativa simple se utiliza la sintaxis:

if ( <expresin_lgica> )
{
<bloque_de_instrucciones>
}


Ejemplo: Se quiere escribir un programa que:
1) Pida por teclado la nota (dato real) de una asignatura.
2) Muestre por pantalla:
"APROBADO", en el caso de que la nota sea mayor o igual que 5.

Introduzca nota (real): 7.5

APROBADO



Obsrvese que, en este problema, no se va a mostrar por pantalla "SUSPENDIDO"
en el caso de que la nota sea menor que 5, como s se haca en el problema del
apartado anterior.

Introduzca nota (real): 3.5



Al igual que ocurre con una instruccin alternativa doble, cuando
el <bloque_de_instrucciones> de una alternativa simple slo contiene una
instruccin, los caracteres abrir llave ({) y cerrar llave (}) tambin son
opcionales. De modo que, para resolver el problema del ejemplo se puede
escribir:





Fundamentos Programacin



46
#include <stdio.h>

int main()
{
float nota;

printf( "\n Introduzca nota (real): " );
scanf( "%f", &nota );

if ( nota >= 5 )
printf( "\n APROBADO" );

return 0;
}


Alternativa mltiple ( la instruccin switch )

Una instruccin alternativa mltiple (o simplemente 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
alternativa mltiple 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.

Dependiendo del valor obtenido al evaluar la <expresin>, se ejecutar un bloque
de instrucciones u otro.

Opcionalmente, se puede escribir un <bloque_de_instrucciones_n+1> despus
de default :. Este bloque de instrucciones se ejecutar en el caso de que el valor
obtenido al evaluar la <expresin>, no se encuentre en ninguna de las
expresiones despus de cada case.



Fundamentos Programacin



47
Ejemplo 1: Se quiere escribir un programa que:
1) Pida por teclado el nmero (dato entero) de un da de la semana.
2) Muestre por pantalla el nombre (dato cadena) correspondiente a dicho da.
Nota: Si el nmero de da introducido es menor que 1 mayor que 7, se mostrar
el mensaje: "ERROR: Da incorrecto.".
En pantalla:

Introduzca dia de la semana: 2

Martes




Introduzca dia de la semana: 9

ERROR: Dia incorrecto.



Solucin propuesta:
#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;
}
Fundamentos Programacin



48
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, prueba a ver que ocurre si omite
algn break en el cdigo del programa del ejemplo


Ejemplo 2: En la siguiente tabla se muestran las categoras a las que pertenecen
los signos del zodaco:


Se quiere escribir un programa que:
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.".


Fundamentos Programacin



49
En pantalla:

Listado de signos del zodiaco:

1. Aries
2. Tauro
3. Geminis
4. Cancer
5. Leo
6. Virgo
7. Libra
8. Escorpio
9. Sagitario
10. Capricornio
12. Acuario
13. Piscis

Introduzca numero de signo: 7

Es un signo de Aire.




Listado de signos del zodiaco:

1. Aries
2. Tauro
3. Geminis
4. Cancer
5. Leo
6. Virgo
7. Libra
8. Escorpio
9. Sagitario
10. Capricornio
12. Acuario
13. Piscis

Introduzca numero de signo: 15

ERROR: 15 no esta asociado a ningun signo.







Fundamentos Programacin



50

Una posible solucin es:
#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 :
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;
}





Fundamentos Programacin



51

Anidamiento

Las instrucciones alternativas y repetitivas pueden escribirse una dentro de otra. A
este hecho se le conoce como anidamiento.

Las instrucciones alternativas permiten realizar las siguientes combinaciones de
anidamiento:
Doble en doble.
Doble en simple.
Doble en mltiple.
Simple en simple.
Simple en doble.
Simple en mltiple.
Mltiple en mltiple.
Mltiple en doble.
Mltiple en simple.
De ellas, vamos a estudiar, como ejemplo, las siguientes combinaciones:
Doble en doble.
Mltiple en doble.


Alternativa doble en doble

En lenguaje C/C++, para anidar una alternativa doble en otra, 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>
}


Fundamentos Programacin



52
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 */

}


Ejemplo 1: Se quiere escribir un programa que:
1) Pida por teclado la nota (real) de una asignatura.
2) Muestre por pantalla:
"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.
En pantalla:

Introduzca nota (real): 7.5

APTO




Introduzca nota (real): 12.2

ERROR: Nota incorrecta.




Fundamentos Programacin



53


Una solucin al problema es:
#include <stdio.h>

int main()
{
float nota;

printf( "\n Introduzca nota (real): " );
scanf( "%f", &nota );

if ( nota >= 5 && nota <= 10 )
printf( "\n APTO" );
else

/* Inicio del anidamiento */
if ( nota >= 0 && nota < 5 )
printf( "\n NO APTO" );
else
printf( "\n ERROR: Nota incorrecta." );
/* Fin del anidamiento */

return 0;
}
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.

Como se puede observar, el anidamiento de instrucciones alternativas permite ir
descartando valores hasta llegar al bloque de instrucciones que se debe ejecutar.

Alternativa mltiple en doble

En lenguaje C, para anidar una alternativa mltiple en una alternativa doble, se
utiliza la sintaxis:
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> ]
}
Fundamentos Programacin



54
/* Fin del anidamiento */
}
else
{
<bloque_de_instrucciones_n+2>
}


Ejemplo 2: As por ejemplo, el primer ejemplo del apartado anterior, Alternativa
mltiple, tambin se puede resolver anidando una alternativa mltiple en una
alternativa doble.
#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 )
{
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" );
}
/* Fin del anidamiento */

else
printf( "\n ERROR: Dia incorrecto." );

return 0;
}





Fundamentos Programacin



55


Repetitiva mientras ( la instruccin while )

En lenguaje C, para escribir una instruccin repetitiva mientras se utiliza la
sintaxis:

while ( <expresin_lgica> )
{
<bloque_de_instrucciones>
}


Cuando el <bloque_de_instrucciones> slo contiene una instruccin, los
caracteres abrir llave ({) y cerrar llave (}) son opcionales.

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:
1. Si la condicin se evala a falsa, el bloque de instrucciones no se ejecuta,
y el bucle while finaliza sin realizar ninguna iteracion.
2. Si la condicin se evala a verdadera, el bloque de instrucciones s que se
ejecuta y, despus, se vuelve a evaluar la condicin, para decidir, de
nuevo, si el bloque de instrucciones se vuelve a ejecutar o no. Y as
sucesivamente, hasta que, la condicin sea falsa.
El <bloque_de_instrucciones> de un bucle while puede ejecutarse cero o ms
veces (iteraciones). Si el <bloque_de_instrucciones> se ejecuta al menos una
vez, seguir ejecutndose repetidamente, mientras que, la condicin sea
verdadera. Pero, hay que tener cuidado de que el bucle no sea infinito.

Cuando la condicin de un bucle while se evala siempre a verdadera, se dice
que se ha producido un bucle infinito, ya que, el programa nunca termina. Un
bucle infinito es un error lgico.

Es importante hacer hincapi en el hecho de que, en un bucle while, primero se
evala la condicin y, en el caso de que sta sea verdadera, entonces se ejecuta
el bloque de instrucciones. Veremos que, en el bucle do...while, el procedimiento
es al revs. En l, primero se ejecuta el bloque de instrucciones y, despus, se
evala la condicin.

Para que un bucle while no sea infinito, en el bloque de instrucciones debe ocurrir
algo para que la condicin deje de ser verdadera. En la mayora de los casos, la
condicin se hace falsa al cambiar el valor de una variable.

En resumen, una instruccin repetitiva while permite ejecutar, repetidamente,
Fundamentos Programacin



56
(cero o ms veces) un bloque de instrucciones, mientras que, una determinada
condicin sea verdadera.

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



En lenguaje C, para resolver el problema de este ejemplo se puede escribir:
#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;
}






Repetitiva hacer...mientras ( la instruccin do...while )

En lenguaje C/C++, para escribir una instruccin repetitiva hacer...mientras se
utiliza la sintaxis:

do
{
<bloque_de_instrucciones>
} while ( <expresin_lgica> );


Cuando el <bloque_de_instrucciones> slo contiene una instruccin, los
caracteres abrir llave ({) y cerrar llave (}) son opcionales.

Adems, como se puede apreciar, la instruccin repetitiva do...while, tambin
hace uso de una condicin.
Fundamentos Programacin



57

En un bucle do...while, primero se ejecuta el bloque de instrucciones y, despus,
se evala la condicin. En el caso de que sta sea verdadera, se vuelve a
ejecutar el bloque de instrucciones. Y as sucesivamente, hasta que, la condicin
sea falsa.

Por consiguiente, cuando el flujo de un programa llega a un bucle do...while,
existen dos posibilidades:
1. Se ejecuta el bloque de instrucciones y, despus, si la condicin se evala
a falsa, el bloque de instrucciones no se vuelve a ejecutar, de manera que,
el bucle do...while finaliza, habiendo realizado una sola iteracin.
2. Se ejecuta el bloque de instrucciones y, a continuacin, si la condicin se
evala a verdadera, el bloque de instrucciones se vuelve a ejecutar. Y as
sucesivamente, hasta que la condicin sea falsa.
El <bloque_de_instrucciones> de un bucle do...while puede ejecutarse una o
ms veces (iteraciones). Tambin hay que prevenir que el bucle no sea infinito.

En resumen, una instruccin repetitiva do...while permite ejecutar
repetidamente (una o ms veces) un bloque de instrucciones, mientras que, una
determinada condicin sea verdadera.

Ejemplo 1: De modo que, utilizando un bucle do...while, el problema del
ejemplo 1 del apartado anterior, Repetitiva mientras, 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:
1) Pida por teclado un nmero (dato entero).
2) Pregunte al usuario si desea introducir otro o no.
Fundamentos Programacin



58
3) Repita los pasos 1 y 2, mientras que, el usuario no responda 'n' de (no).
4) Muestre por pantalla la suma de los nmeros introducidos por el usuario.

En pantalla:

Introduzca un numero entero: 7

Desea introducir otro (s/n)?: s

Introduzca un numero entero: 16

Desea introducir otro (s/n)?: s

Introduzca un numero entero: -3

Desea introducir otro (s/n)?: n

La suma de los numeros introducidos es: 20



El cdigo propuesto es:
#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. */

printf( "\n La suma de los numeros introducidos es: %d",
acumulador );

return 0;
}
Fundamentos Programacin



59


Repetitiva para ( la instruccin for )

En lenguaje C/C++, para escribir una instruccin repetitiva para se utiliza la
sintaxis:

for ( <expresin_1> ; <expresin_2> ; <expresin_3> )
{
<bloque_de_instrucciones>
}


Cuando el <bloque_de_instrucciones> slo contiene una instruccin, los
caracteres abrir llave ({) y cerrar llave (}) son opcionales.

Por otro lado, el bucle for es ideal usarlo cuando, de antemano, ya se sabe el
nmero de veces (iteraciones) que tiene que ejecutarse un determinado bloque de
instrucciones.

El bucle para es una variante del bucle mientras y, al igual que ste, puede
iterar cero o ms veces. Sin embargo, el bucle for slo se suele usar cuando se
conoce el nmero exacto de veces que tiene que iterar el bucle. ste es el caso del
problema planteado en el ejemplo 1 del apartado Repetitiva mientras, en el cual,
se sabe de antemano que el bucle tiene que iterar, exactamente, diez veces.

Ejemplo: Por tanto, dicho problema, se puede resolver con una instruccin
repetitiva for de la siguiente forma:
#include <stdio.h>

int main()
{
int contador;

printf( "\n " );

for ( contador = 1 ; contador <= 10 ; contador++ )
printf( "%d ", contador );

return 0;
}


En este caso, <expresin_1>, <expresin_2> y <expresin_3>, se corresponden,
respectivamente, con:
la inicializacin de la variable contador,
la condicin de salida del bucle y
el incremento de la variable contador
de una instruccin repetitiva mientras.

Fundamentos Programacin



60

S-ar putea să vă placă și