Vous êtes sur la page 1sur 66

Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010

Universidad de Castilla La Mancha

PROGRAMACIN EN C
PRCTICA 8:
Fundamentos del lenguaje C
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

Prctica 1: ndice
1.1. Introduccin
1.2. Datos, tipos de datos y expresiones
1.3. Estructuras de control
1.4. Vectores y matrices
1.5. Cadenas
1.6. Funciones
1.7. Ejercicios propuestos

2
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

Prctica 1: ndice
1.1. Introduccin
1.2. Datos, tipos de datos y expresiones
1.3. Estructuras de control
1.4. Vectores y matrices
1.5. Cadenas
1.6. Funciones
1.7. Ejercicios propuestos

3
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.1. Introduccin: La estructura bsica


de un programa en C (I)
 Cualquier programa en C debe incluir obligatoriamente una funcin
principal llamada main, que siempre ser la primera en ejecutarse.
 Dicha funcin principal (al igual que cualquier otra funcin) se compone
a su vez de una serie de sentencias, o acciones que deben realizarse. Por
ejemplo:
c = a + b;
printf (algo);
 El conjunto de sentencias que componen una funcin (llamado cuerpo
de la misma) se escribe entre llaves { } tras el nombre de la funcin.
Ejemplo 0 :
La estructura del programa es
void main() correcta, pero el cuerpo de la
{ funcin principal no contiene
ninguna sentencia, y por tanto
} no se realizar accin alguna
4
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.1. Introduccin: La estructura bsica


de un programa en C (II)
Cualquier programa en C debe incluir
obligatoriamente una funcin principal Inclusin de otro fichero (header)
llamada main, que siempre ser la
primera en ejecutarse.

#include <stdio.h> La funcin principal

void main()
Comienzo del cuerpo
{ de la funcin

printf(Hola, mundo);
}
Sentencia que invoca
a la funcin de escritura

Fin del cuerpo de la funcin


5
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.1. Introduccin: La estructura bsica


de un programa en C (III)
 La directiva #include sirve para indicar al compilador que incluya en
el programa el contenido de otros ficheros
En general, esta directiva se usa para incluir en un programa
prototipos de funciones o constantes definidas en otros ficheros. La
inclusin se har efectiva durante la etapa de preprocesado de la
compilacin.
Los ficheros a incluir suelen llamarse ficheros de cabeceras
(headers), y habitualmente tienen la extensin .h.
Si el nombre del fichero a incluir va entre < > el compilador buscar
el fichero en los directorios por defecto :
#include <stdio.h>
Si el nombre del fichero a incluir va entre comillas el compilador
buscar en el directorio actual. Tambin puede ponerse entre
comillas un camino completo hasta el fichero a incluir:
#include /home/headers/thisheader.h
6
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.1. Introduccin: La estructura bsica


de un programa en C (IV)
 Las variables son posiciones de memoria asociadas a un nombre, y se
usan para almacenar valores que pueden ser modificados por el
programa.
 En un programa en C las variables deben declararse antes de usarse.
 Las declaraciones de variable deben especificar un tipo y un
nombre para la variable. Por ejemplo:
int i;
char c;
 Suele ser conveniente insertar comentarios en el programa.
 Los comentarios se sitan entre /* y */ tras //. Por ejemplo:
/* Esto es un comentario */
// Esto tambin es un comentario
 Es la mejor forma de documentar un programa para que pueda
entenderlo y/o depurarlo otra persona, o el propio programador que
cre el programa. 7
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.1. Introduccin: La estructura bsica


de un programa en C (V)
 La directiva #define permite definir constantes simblicas:
Al definir una constante simblica se asocia su nombre a una
determinada cadena de caracteres.
Durante el preprocesado, se reemplazar cada aparicin del nombre
de la constante simblica por su cadena asociada.
 Cuidado !!! Las definiciones de constantes simblicas no deben
acabar en punto y coma.
Error !!
#define PI 3.1416;
void main() void main()
{ Preprocesado {
float dato; float dato;
dato=PI*2; dato=3.1416;*2;
} }
8
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.1. Introduccin: La estructura bsica


de un programa en C (VI)
Ejemplo :
Definicin de constante
#include <stdio.h> simblica
#define PI 3.1416
void main()
/* Calcula longitud circunferencia */ Sentencia de
declaracin mltiple
{ de variables
float radio,longitud;
Sentencia de asignacin
radio=3.5;
de valor a la variable
longitud=2*PI*radio; mediante expresin
printf(Longitud: %3.2f\n, longitud);
Sentencia de escritura
} con formato especfico
de dgitos para la
variable
9
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.1. Introduccin: La estructura bsica


de un programa en C (VII)
 Definicin de funciones:
 Una funcin se define mediante una seccin de cdigo
independiente y autocontenido (o sea, una serie de sentencias).
 Una funcin se invoca con una referencia a su nombre, lo que
provoca la ejecucin del cdigo que define a la funcin.
 C tiene tambin funciones de librera, proporcionadas por las
libreras del compilador
 Ejemplos: printf () y scanf ()
 Prototipos de funciones:
 Indican al compilador las caractersticas bsicas de una funcin (su
nombre, qu tipo de datos devuelve, qu parmetros usa, etc.) pero
no la definen.
 El prototipo de la funcin debe aparecer previamente a su uso.
10
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.1. Introduccin: La estructura bsica


de un programa en C (VIII)
Ejemplo 4: Definicin de funcin
Prototipo de funcin
#include <stdio.h>
int sumup(int n);
int main() int sumup(int n)
{ {
int i;
int n; int sum;
int i; sum=0;
printf(Dame un numero: "); for(i=1;i<=n;i++)
{
scanf("%d",&n); sum=sum+i;
printf("Resultado = %d\n", }
sumup(n)); return sum;
}
return 0;
}
11
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.1. Introduccin: Compilacin


Fuente .c

 La compilacin traduce el cdigo Preprocesado


fuente de C en cdigo objeto
(instrucciones que dependen de la
mquina donde se produce la Fuente .c
compilacin).
 Del enlazado (o linkado) de varios Compilado
objetos se obtendr un fichero Otros
ejecutable. Objeto .obj Objetos

Enlazado (link)

Ejecutable .exe Libreras


12
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.1. Introduccin: Componentes de C (I)


 Podemos distinguir los siguientes componentes en C:
Palabras clave.
Identificadores.
Operadores.
Constantes.
Separadores, comentarios.
Palabras Clave:
 Indican una determinada tarea y tienen un especial significado para el
compilador.
 No se pueden utilizar como identificadores.
 Las 32 palabras clave del ANSI C son:
auto break case char const continue default do
double else enum extern float for goto if
int long register return short signed sizeof static
struct switch typedef union unsigned void volatile while
13
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.1. Introduccin: Componentes de C (II)


Identificadores:
 Un nombre con el que se hace referencia a una funcin, variable,
etiquetas y otros objetos definidos por el usuario.
 Reglas:
Secuencia de letras: a..z, A..Z, 0..9
El carcter _ se considera una letra ms.
No puede contener blancos ni *,;.:-+ ni ninguna palabra reservada.
El primer carcter no puede ser dgito.
Se distingue entre minsculas y MAYSCULAS
Hasta 31 caracteres de longitud
 Es conveniente usar nombres que sean descriptivos.
 Un identificador no puede ser igual a una palabra clave de C.
 Un identificador no debe tener el mismo nombre que una funcin ya
escrita o que se encuentre en la biblioteca de C.
14
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.1. Introduccin: Componentes de C (III)


Operadores:
 Son signos especiales, que indican determinadas operaciones a realizar
con las variables y/o constantes.
Operadores aritmticos: Operadores de asignacin:
+ suma = m=1
- resta ++ m++ equivale a m=m+1
* producto -- m-- equivale a m=m-1
/ cociente += m+=a equivale a m=m+a
% resto -= m-=a equivale a m=m-a
Operadores relacionales: *= m*=a equivale a m=m*a
== igual que /= m/=a equivale a m=m/a
!= distinto de %= m%=a equivale a m=m%a
> mayor que Operadores lgicos:
< menor que ! not (no lgico)
>= mayor o igual que && and (y lgico)
<= menor o igual que || or ( lgico)
15
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.1. Introduccin: Componentes de C (IV)


Constantes:
 Son expresiones de significado (valor) invariable. Pueden ser:
Constantes numricas.
Constantes carcter (ASCII).
Cadenas de caracteres.
Constantes simblicas.
Separadores y comentarios:
 Son separadores los espacios en blanco, tabuladores, nueva lnea.
Tambin pueden considerarse separadores el punto y coma que debe
escribirse al final de cada sentencia o las llaves que delimitan el cuerpo
de las funciones.
 Comentarios: como ya hemos visto, muy importantes para la posterior
depuracin del programa.

16
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

Prctica 1: ndice
1.1. Introduccin
1.2. Datos, tipos de datos y expresiones
1.3. Estructuras de control
1.4. Vectores y matrices
1.5. Cadenas
1.6. Funciones
1.7. Ejercicios propuestos

17
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.2. Datos, tipos y expresiones: Tipos de


datos (I)
 En general, los programas necesitan manipular cierta informacin para
obtener los resultados deseados. Esta informacin aparecer en forma de
variables o constantes, que en conjunto se consideran datos del programa.
 Los datos pueden ser de diferentes tipos. El tipo de un dato determina:
Qu valores puede tomar el dato.
Qu operaciones pueden realizarse con ese dato.
El tamao del dato (cantidad de memoria necesaria para almacenarlo).
 Los tipos de datos bsicos disponibles en C son:
char: carcter.
int: entero.
float: punto (o coma) flotante.
double: punto flotante de doble precisin.
void: sin valor (tipo nulo).
18
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.2. Datos, tipos y expresiones: Tipos de


datos (II)
 Existen modificadores que pueden aplicarse a los tipos bsicos:
Respecto al tamao:
 short
 long
Respecto al signo:
 unsigned
 signed
 El rango de valores de un tipo de datos viene determinado por su tamao
y la representacin interna empleada.
 El tamao de cada tipo de datos depende del compilador utilizado y la
arquitectura del computador. Para conocer exactamente este tamao
puede usarse la proposicin sizeof.
#include <stdio.h>
void main()
{
printf(Tamao del tipo int : %d\n,sizeof(int));
}
19
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.2. Datos, tipos y expresiones: Tipos de


datos (III)
 Tamao en bytes y rango de valores de los distintos tipos de datos para
una mquina tpica de 32 bits:

Tipo Nombre Bytes Rango _


character char 1 -128...127
integer int 4 -2,147,483,648...2,147,483,647
short integer short 2 -32768...32767
long integer long 4 -2,147,483,648...2,147,483,647
unsigned character unsigned char 1 0...255
unsigned integer unsigned int 4 0...4,294,967,295
unsigned short integer unsigned short 2 0...65535
unsigned long integer unsigned long 4 0...4,294,967,295
single-precision float 4 1.2E-38...3.4E38
double-precision double 8 2.2E-308...1.8E308

20
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.2. Datos, tipos y expresiones: Tipos de


datos (IV)
 Representacin externa de nmeros enteros :
int i;
Decimal i=65;
Hexadecimal i=0x41; (adecuada para nmeros binarios)
i=0X41;
Octal i=0171;
 Representacin externa de nmeros reales:
float f; double f;
Convencional f=3.0;
Cientfica f=0.2E-2;
f=0.2e-2;
 Representacin externa de un carcter :
char c;
Carcter visible c=a;
Carcter no visible (secuencia de escape) c=\n;
21
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.2. Datos, tipos y expresiones:


Expresiones (I)
 Una expresin es una combinacin de variables y/o constantes, y
operadores que da lugar a un valor. Pueden distinguirse:
Expresiones aritmticas: formadas por operandos variables y/o
constantes y distintos operadores aritmticos. Por ejemplo:
(-b+sqrt((b*b)-(4*a*c)))/(2*a)
Expresiones lgicas: se basan en operadores relacionales y/o lgicos y
dan como resultado un valor verdadero o falso. Por ejemplo:
(b<=a)&&(c!=0)
 Realmente, el valor de una expresin lgica es tambin numrico, ya que:
Un valor verdadero equivale a 1
Un valor falso equivale a 0
 Anlogamente, cualquier expresin aritmtica toma valor cierto o falso ya
que:
Cualquier valor distinto de 0 significa verdadero.
Un valor igual a 0 significa falso. 22
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.2. Datos, tipos y expresiones:


Expresiones (II)
 Una expresin que devuelve un resultado de cierto tipo puede situarse en
cualquier lugar donde pueda situarse una variable del mismo tipo. Por
ejemplo:
printf(Resultado: %f\n,(-b+sqrt((b*b)-(4*a*c)))/(2*a))
 En todas las expresiones es fundamental tener en cuenta las reglas de
precedencia (o prioridad) de los operadores. Ordenando los operadores
bsicos de mayor a menor precedencia resulta:
Mayor () []
! ++ -- -(signo)(conversin de tipo)sizeof
* / %
+ -
< > <= >=
== !=
&&
||
Menor = += -= *= /= 23
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.2. Datos, tipos y expresiones: Conversin


de tipos (I)
Conversiones implcitas :
 Se producen automticamente cuando en una expresin se mezclan
operandos de distintos tipos. Se rigen por ciertas reglas:
Los caracteres se convierten a enteros automticamente, tomando
habitualmente su valor correspondiente en cdigo ASCII.
Los operandos de tipo inferior (menor tamao) se convierten al tipo
del operando de tipo superior (mayor tamao). Por ejemplo:
int i; float f; double d;
 i+f el valor del entero i se convierte a float
 f+d el valor de f se convierte a doble precisin
En las asignaciones, el dato de la parte derecha se convierte al tipo del
dato de la izquierda. Por ejemplo:
int i; char c; float f;
 c=i deja en c los 8 bits menos significativos de i
 i=f i recibe la parte no fraccionaria de f
 f=i convierte el valor del entero i a formato coma flotante

24
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.2. Datos, tipos y expresiones: Conversin


de tipos (II)
Conversiones explcitas :
 Realizada por el programador. En este caso se fuerza la conversin de
tipos por conveniencia en el programa.
 Para ello, se precede la constante, variable o expresin que se desea
convertir por el tipo al que se desea convertir encerrado entre parntesis.
Por ejemplo:
z = (int)1.56 + (int)a

25
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

Prctica 1: ndice
1.1. Introduccin
1.2. Datos, tipos de datos y expresiones
1.3. Estructuras de control
1.4. Vectores y matrices
1.5. Cadenas
1.6. Funciones
1.7. Ejercicios propuestos

26
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.3 - Estructuras de control


 Una sentencia simple consiste en cualquier expresin terminada en punto
y coma (;).
 Varias sentencias simples entre llaves ({ y }) constituyen una
sentencia compuesta.
 Las estructuras de control (o de control de flujo) de un lenguaje permiten
especificar el orden en que se ejecutan las sentencias (simples y/
compuestas) de un programa.
 Podemos distinguir dos tipos de estructuras de control:
Estructuras de seleccin
Estructuras de repeticin

27
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.3 - Estructuras de seleccin: if-else


 La proposicin if-else sirve para tomar decisiones.
 La sintaxis formal es:
if (expresin)
sentencia-1
else
sentencia-2
 La clusula else es opcional.
 Si la expresin asociada al if es cierta (o sea, cualquier valor distinto de
cero) se ejecuta la sentencia objetivo del if (sentencia-1), y si es falsa se
ejecuta la sentencia objetivo del else (sentencia-2).

28
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.3 - Estructuras de seleccin: if-else (III)


 Se llama if anidado a un if que es a su vez la sentencia objetivo de otro
if else.
if (expresin-1)
if (expresin-2)
sentencia-1
else
sentencia-2
else if (expresin-3)
sentencia-3
else
sentencia-4
 Puesto que la clusula else es opcional, la existencia de if anidados puede
dar lugar a ambigedades si se omite algn else. Para deshacerlas se
establece que cualquier else est asociado al if previo ms prximo que
no est ya asociado a otro else.
if (expresin-1) if (expresin-1){
if (expresin-2) if (expresin-2)
sentencia-1 Parejas If-Else sentencia-1
else }
sentencia-2 else
sentencia-2 29
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.3 - Estructuras de seleccin: if-else (IV)


 La estructuras basadas en mltiples if-ilse-if se usan comnmente para
selecciones (decisiones) mltiples.
if (expresin-1)
sentencia-1
else if (expresin-2)
sentencia-2
else if (expresin-3)
sentencia-3
else if (expresin-4)
sentencia-4
else
sentencia-5
 Ejemplo:
if ((hora>=8)&&(hora<9))
printf(Despierta dormiln);
else if ((hora>=9)&&(hora<10))
printf(Despierta de una vez);
else if ((hora>=10)&&(hora<11))
printf(DESPIERTAAAAAA);
else
printf(Eres un vago);
30
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.3 - Estructuras de seleccin: switch


 La proposicin switch permite tomar decisiones mltiples comprobando
si el valor de una expresin es uno entre varios valores constantes.
 La sintaxis formal es:  Ejemplo:
switch (expresin){ #include <stdio.h>
case constante-1: void main()
secuencia-de-sentencias-1 {int i;
break; //opcional printf(Dame n 1,2,3\n);
case constante-2: scanf(%d,&i);
secuencia-de-sentencias-2 switch (i){
break; //opcional case 1: printf(uno\n);
. break;
.
default: //opcional case 2: printf(dos\n);
secuencia-de-sentencias-n break;
} case 3: printf(tres\n);
break;
}
}
31
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.3 - Estructuras de seleccin: switch (II)


 En un switch se compara el valor de la expresin con el de las constantes
que aparecen en cada etiqueta case, y en caso de coincidencia se ejecuta
la secuencia de sentencias correspondiente.
 Tras ejecutar una secuencia de sentencias, se siguen ejecutando las
sentencias asociadas a los siguientes case, hasta que tras alguna
secuencia ejecutada aparezca la proposicin break.
 En caso de no encontrarse ninguna coincidencia, se ejecuta la secuencia
de sentencias asociada a default.
 Existen ciertas limitaciones:
switch slo comprueba la igualdad (a diferencia de if)
No pueden existir 2 constantes iguales.
No pueden usarse variables como etiquetas.
 Se pueden usar etiquetas sin sentencias cuando deseemos que varias
etiquetas den el mismo resultado:
case f: Hace que en caso de f F se
case F: ejecute la sentencia-1
sentencia-1
32
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.3 - Estructuras de seleccin: switch (III)


 Ejemplo:
#include <stdio.h>
void main()
{
int a,b,opcion,resultado;
printf(Dame dato a:\n);
scanf(%d,&a);
printf(Dame dato b:\n);
scanf(%d,&b);
printf(1 sumar \n);
printf(2 restar \n);
printf(3 multiplicar \n);
printf(introducir opcin\n);
scanf(%d,&opcion);
switch (opcion){
case 1: resultado=a+b;
break;
case 2: resultado=a-b;
break;
case 3: resultado=a*b;
break;
default: printf(opcin incorrecta %d\n,opcion);
}
printf(El resultado es: %d\n,resultado);
}
33
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.3 - Estructuras de repeticin: for


 La proposicin for sirve para realizar iteraciones, repitiendo una
sentencia (simple o compuesta) hasta que se den ciertas condiciones.
 La sintaxis formal es:
for (expresin-inicializacin ; expresin-test ; expresin-actualizacin)
sentencia
 Donde cada expresin es:
La expresin-inicializacin normalmente es una asignacin, para dar
el valor inicial a la variable de control del bucle.
La expresin-test normalmente ser un expresin lgica para
determinar cundo termina el bucle. Se evala antes de cada
iteracin, que slo se llevar a cabo si el resultado de la evaluacin
es cierto (o sea, distinto de cero); en caso contrario concluir el
bucle. Ntese que puesto que la expresin-test se evala antes de
ejecutar la sentencia, puede que sta no llegue a ejecutarse nunca.
La expresin-actualizacin se utiliza normalmente para cambiar el
valor de la variable de control. Se evala tras cada iteracin. 34
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.3 - Estructuras de repeticin: for (II)


 Ejemplos:
 #include <stdio.h>
void main()
{
int x; La variable de control del
for (x=1;x<=10;x++) bucle se actualiza de forma
printf( %d ,x); creciente.
}
 #include <stdio.h>
void main()
{
int x,y; La variable de control del
for (x=50;x!=25;x-=5) bucle se actualiza de forma
{ decreciente.
y=x*x;
printf(El cuadrado de %d es: %d\n,x,y);
}
}
35
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.3 - Estructuras de repeticin: for (III)


 Est permitido emplear ms de una expresin de inicializacin
actualizacin en un mismo for. Para ello es necesario separar las
expresiones mltiples con comas (,). Por ejemplo:
for (x=10,y=0;x+y>=8;x-=2,y++)

 No es imprescindible que aparezcan todas las expresiones establecidas en


la sintaxis, aunque s los punto y coma correspondientes. Por ejemplo:
No hay expresin de inicializacin.
for (;x!=20;x++)
printf( %d,x);
Se supone que x se ha inicializado
anteriormente.
 Un caso particularmente interesante se produce cuando no aparece la
expresin de test. En ese caso se supone que siempre es cierta, con lo que
el bucle no acabara nunca (bucle infinito). Por ejemplo:
for (x=0;;x++) Imprime nmeros de uno en uno
printf( %d ,x); desde el cero hasta el infinito.

36
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.3 - Estructuras de repeticin: while


 La proposicin while tambin sirve para realizar iteraciones mientras se
cumplan ciertas condiciones.
 La sintaxis formal es:
while (expresin)
sentencia
 La expresin suele ser una expresin lgica. Si sta es cierta, se ejecutar
la sentencia (que puede ser simple o compuesta) y se volver a evaluar la
expresin. Si la expresin es falsa, el bucle termina. Ntese que la
expresin se evala antes de cada iteracin, por lo que es posible que la
sentencia no llegue a ejecutarse nunca.

37
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.3 - Estructuras de repeticin: while (II)


 Ejemplos:
 #include <stdio.h>  #include <stdio.h>
void main() void main()
{ {
int digito=0; char ch;
while (digito<=9) ch=getchar();
{ while (ch!=.)
printf(%d\n,digito); {
++digito; putchar(ch);
} ch=getchar();
} }
}

La funcin getchar() La funcin putchar()


toma un carcter del enva un carcter a la
teclado pantalla
38
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.3 - Estructuras de repeticin: do-while


 Los bucles do-while son similares a los bucles for y while pero, a
diferencia de stos, en este caso se comprueba la condicin de
terminacin del bucle tras cada iteracin.
 La sintaxis formal es:
do
sentencia
while (expresin);
 La sentencia (que puede ser simple o compuesta) se ejecuta al menos una
vez.
 La expresin se evala tras cada ejecucin de la sentencia. Si el resultado
de la evaluacin es cierto (distinto de cero), se ejecutar de nuevo la
sentencia y se volver a evaluar la expresin. Si la expresin es falsa, el
bucle termina.

39
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.3 - Estructuras de repeticin: do-while (II)


 Ejemplo:
 #include <stdio.h>
void main()
{/*lee num hasta que este sea 0*/
int num;
do
{
printf(Dame un nmero:\n);
scanf(%d,&num);
}
while (num!=0);
}

40
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

Prctica 1: ndice
1.1 Introduccin
1.2 Datos, tipos de datos y expresiones
1.3 Estructuras de control
1.4 Vectores y matrices
1.5 Cadenas
1.6. Funciones
1.7. Ejercicios propuestos

41
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.4 - Vectores y matrices: vectores (I)


 Un array ( arreglo) es un conjunto de variables del mismo tipo,
almacenadas en memoria de forma contigua y accesibles mediante
ndices. Si el array tiene una sola dimensin suele llamarse vector.
 La forma genrica para la declaracin de un vector es:
tipo_de_dato nombre_de_vector [tamao]
 Respecto a cada parte de la declaracin de un vector:
El nombre del vector es un identificador que debe ajustarse a las
reglas de C.
El tipo de dato es el tipo de todos los elementos del vector.
El tamao es el nmero de elementos del vector.
 Ejemplos:
int a[10];
char nombre[30];
float pago_mensual[12];
42
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.4 - Vectores y matrices: vectores (II)


 Para acceder a cada elemento del vector, se emplea el nombre del vector
seguido del ndice del elemento entre corchetes. Por ejemplo:
a[5]=857;
x=a[2];
 Los ndices de los elementos de un vector comienzan a contarse desde el
cero. Por tanto, el ndice del ltimo elemento de un vector de tamao n
ser n-1.
 La declaracin de un vector implica una reserva de memoria para todos
sus elementos. Es decir, un vector de tipo t y tamao n tendr
reservados n*sizeof(t) bytes
 Ejemplo:
int a[10];
a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]

4 bytes 4 bytes 4 bytes 4 bytes 4 bytes 4 bytes 4 bytes 4 bytes 4 bytes 4 bytes

40 bytes
43
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.4 - Vectores y matrices: vectores (III)


 Cuidado !!! C no comprueba que se sobrepase el tamao asignado a
un vector. Se declara el vector con
tamao 10
int indice,a[10];
for (indice=0;indice<20;indice++)
a[indice]=indice; Se rellena el vector hasta
el ndice 19 (20 elementos)

 Si esto llega a darse, pueden producirse errores debido a:


Lectura de datos indefinidos.
Escritura de datos en posiciones de memoria reservadas a otros
datos.
 En definitiva, para garantizar la estabilidad y consistencia de los datos,
es el programador quien debe asegurarse de que no habr
desbordamiento de los lmites del vector, ya que el compilador no lo
comprobar.
44
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.4 - Vectores y matrices: Inicializacin y


asignacin de vectores
 Un vector puede inicializarse en su declaracin mediante una lista de
valores entre llaves separados por comas. Para ello, la forma genrica es:
tipo_de_dato nombre_vector [tamao]={valor_elemento_0,.., valor_elemento_n-1};
 Ejemplo:
int a[4]={100,200,300,400};

 Cuando se inicializa un vector en su declaracin, es legal no indicar su


tamao entre los corchetes. En ese caso el compilador cuenta el nmero
de valores en la lista y asume que ese es el nmero de elementos del
vector. Por ejemplo:
int vector[ ]={100,200,300,400};
equivale a:
int vector[4]={100,200,300,400};

45
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.4 - Vectores y matrices: Inicializacin y


asignacin de vectores (II)

 En C no se permite asignar directamente un vector a otro. Debe operarse


con cada elemento del vector por separado. Por ejemplo, la siguiente
secuencia no es correcta:
int datos[5]={10,20,30,40,50};
int copia[5]; Error !!! El compilador
copia=datos; no lo admitir. Para copiar
los datos ser precisa una
estructura de repeticin que
copie elemento a elemento.

46
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.4 - Vectores y matrices: matrices


 Un array puede tener ms de una dimensin. En estos casos el array suele
denominarse matriz.
 La forma genrica para la declaracin de una matriz de n dimensiones es
del tipo:
tipo_de_dato nombre_de_matriz [tamao_dim_1][tamao_dim_2]..[tamao_dim_n]
 Por lo dems, las matrices presentan ciertas caractersticas idnticas a los
vectores:
Acceso indexado a los elementos, comenzando el ndice de cada
dimensin en cero .
Reserva de memoria para todos los elementos tras la declaracin.
No se comprueba el desbordamiento de los lmites de ninguna
dimensin de la matriz.
 Ejemplo:
int a[4][3];

a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] a[2][0] a[2][1] a[2][2] a[3][0] a[3][1] a[3][2]

47
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.4 - Vectores y matrices: Inicializacin y


asignacin de matrices
 Una matriz tambin puede inicializarse en su declaracin, en este caso
mediante una serie de listas de valores entre llaves. Por ejemplo:
int a[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};
 Tambin es posible la siguiente forma:
int a[4][3]={1,2,3,4,5,6,7,8,9,10,11,12};

 En cualquier caso, el resultado es el mismo que se obtendra haciendo:


a[0][0]=1;
a[0][1]=2;
Ntese que estos tres elementos constituyen
a[0][2]=3;
un vector cuyo nombre es a[0]
a[1][0]=4;
.
.
a[3][2]=12;
 Al igual que en el caso de los vectores, no es posible asignar una matriz
a otra directamente. 48
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

Prctica 1: Indice
1.1 Introduccin
1.2 Datos, tipos de datos y expresiones
1.3 Estructuras de control
1.4 Vectores y matrices
1.5 Cadenas
1.6. Funciones
1.7. Ejercicios propuestos

49
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.5 - Cadenas
 En C, una cadena (o string) es un vector de caracteres terminado en el
carcter nulo (\0). Algunas posibles declaraciones de cadenas son:
char a[10];
char *nombre=Pepito;

 El carcter de terminacin debe ser tenido en cuenta a la hora de


dimensionar el vector (si se emplea la declaracin que establece
explcitamente el tamao). As, para almacenar n caracteres en una
cadena har falta un vector de tamao n+1.

50
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.5 - Cadenas: Inicializacin


 Una cadena puede inicializarse en su declaracin como cualquier otro
vector, recordando que sus elementos son caracteres y que debe aadirse
al final el carcter de terminacin.
 Ejemplo:
char a[]={h, o, l, a, \0};

 Tambin es posible inicializar una cadena asignndole directamente en


su declaracin una constante cadena. Esta forma es mucho ms cmoda
que la anterior, y adems incluye implcitamente el carcter de
terminacin al ser parte de la constante cadena.
 Ejemplo:
char a[]=hola;

51
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.5 - Cadenas: Lectura y Escritura


 Tanto printf como scanf pueden emplear el formato %s para imprimir
por pantalla o leer del teclado una cadena.
 Ejemplo:
#include <stdio.h>
void main()
{
char nombre[10];
printf("Dime tu nombre\n");
scanf("%s",nombre);
printf("Hola, %s",nombre);
}
 scanf leer caracteres hasta encontrar un carcter blanco, un tabulador
el carcter nueva lnea (\n), pero slo devolver el control de la ejecucin
al encontrar el carcter nueva lnea.
 La lectura de caracteres con scanf comienza realmente con el primer
carcter distinto del carcter blanco (espacio).
52
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.5 - Cadenas: Lectura y Escritura (II)


 Tambin es posible usar las funciones puts (para imprimir una cadena) y
gets (para leer una cadena). Los prototipos de estas funciones estn en
<stdio.h>, y son:
int *puts(char *cad);
char *gets(char *cad);
 gets lee caracteres hasta encontrar el carcter de nueva lnea, y los
guarda en la cadena que se le pasa como argumento aadiendo el
carcter de terminacin.
 puts imprime la cadena que se le pasa como argumento, transformando
el carcter de terminacin en un salto de lnea. Devuelve un valor no
negativo si la operacin se realiza con xito.

53
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.5 - Cadenas: Funciones especficas


 Existen una serie de funciones definidas en <string.h> que sirven para
realizar operaciones especficas sobre cadenas. Las ms importantes son:
 strlen : devuelve la longitud de una cadena. Su prototipo es:
int strlen(const char *cad);
 strcmp : compara dos cadenas dadas. Su prototipo es:
int strcmp(const char *cad1,const char *cad2);
strcmp devuelve 0 si las cadenas son iguales, un nmero negativo si
(cad1<cad2) y un nmero positivo si (cad1>cad2).
 strcpy copia el contenido de una cadena en otra. Su prototipo es:
char strcpy(const char *cad1,const char *cad2);
Cuidado!! strcpy no comprueba los lmites de las cadenas.
 strcat concatena dos cadenas dadas. Su prototipo es:
char strcat(const char *cad1,const char *cad2);
Para concatenarlas se aade una copia de cad2 al final de cad1.
El carcter de terminacin de cad1 es sobreescrito.
Cuidado!! strcat no comprueba los lmites de las cadenas.
54
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

Prctica 1: Indice
1.1 Introduccin
1.2 Datos, tipos de datos y expresiones
1.3 Estructuras de control
1.4 Vectores y matrices
1.5 Cadenas
1.6. Funciones
1.7. Ejercicios propuestos

55
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.6. Funciones
 Un programa en C puede definirse como un conjunto de una o ms
funciones, de las cuales una es la principal (la funcin main).
 Todas las funciones de un programa son fragmentos independientes: una
funcin no puede contener a otras.
 Por tanto, una funcin es un segmento de cdigo completamente
autocontenido, encargado de realizar una tarea bien definida. Dicha tarea
se llevar a cabo cada vez que la funcin es invocada.
 Cualquier funcin puede invocar a otras funciones o a s misma.
 Una llamada a funcin supone el establecimiento de cierta
comunicacin entre funciones:
La funcin invocadora puede pasar cierta informacin a la funcin
invocada mediante argumentos.
 A su vez la funcin invocada puede devolver ciertos valores a la
funcin invocadora. 56
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.6. Funciones
 La forma general de una definicin de funcin es:
tipo_dato_devuelto nombre_funcin(lista_parmetros_formales)
{
cuerpo_de_la_funcin
}

 Ejemplo: Encabezado de la
double media(double a, double b) funcin
{
double v;
v=(a+b)/2.0;
return(v);
Cuerpo de la funcin
}

 En el cuerpo de la funcin se detalla qu sentencias se ejecutarn al


invocar a la funcin. En definitiva, es donde se establece cmo realiza la
funcin su(s) tarea(s).
57
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.6. Funciones
 Respecto a cada una de las partes del encabezado:
El tipo de dato devuelto es el tipo del valor que devuelve la funcin
(a la funcin invocadora) mediante la proposicin return.
 Puede ser cualquiera de los tipos definidos en C.
 Por defecto, una funcin devuelve un entero.
 Si la funcin no devuelve ningn valor, el tipo de dato devuelto debe
ser void.
El nombre de la funcin es un identificador (por tanto debe ser
nico), y se emplea para invocarla.
La lista de parmetros formales es la lista con los nombres de las
variables que tomarn los valores de los argumentos cuando se llame
a la funcin.
 Cada variable debe aparecer en la lista precedida por su tipo de datos, y
separada por comas del resto.
 Una funcin puede no tener parmetros, en cuyo caso la lista de
parmetros estar vaca; sin embargo los parntesis son necesarios.
58
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.6. Funciones

 El prototipo de una funcin indica simplemente el nombre de dicha


funcin, su lista de argumentos y el tipo del valor que devuelve, y debe
acabar en punto y coma. O sea, tiene el mismo formato que el
encabezado de la funcin ms un punto y coma:
tipo_dato_devuelto nombre_funcin(lista_parmetros_formales);

 Ejemplo:
double media(double a, double b);

 Una funcin slo puede invocarse si:


Su definicin est escrita en el programa antes que la funcin que la
invoca.
Su prototipo aparece en el programa antes que la funcin
invocadora.
59
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.6. Funciones
Ejemplos:
#include <stdio.h> #include <stdio.h>
double media(double a,double b);
double media(double a,double b)
{ void main()
{
double v;
double a,b,res;
v=(a+b)/2.0;
a=3.75;
return(v);
b=9.27;
}
res=media(a,b)+media(3.5,a);
void main() printf(Resultado: %f\n,res);
{ }
double a,b,res;
a=3.75; double media(double a,double b)
b=9.27; {
res=media(a,b)+media(3.5,a); double v;
printf(Resultado: %f\n,res); v=(a+b)/2.0;
} return(v);
}
60
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.6. Funciones: Paso de parmetros por


valor
 Paso por valor:
Si uno de los argumentos de una llamada a funcin es una variable
A, se pasar a la funcin invocada el valor de dicha variable en el
momento de la llamada.
El parmetro formal correspondiente a dicho argumento ser una
variable local B que tomar el valor pasado.
A y B son variables independientes, de modo que cualquier cambio
en el valor de B durante la ejecucin de la funcin no afecta al valor
de A.
Debe pasarse por valor todo aquello que una funcin necesite usar,
pero no modificar.

61
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.6. Funciones: Paso de parmetros por


referencia
 Paso por referencia:
 Es posible usar como argumento de una llamada a funcin la
direccin de memoria asignada a una variable A.
En ese caso la direccin de A se copiar en el parmetro formal
correspondiente, que se habr definido como una variable local de
tipo puntero P.
En consecuencia, P apunta a la variable A, de tal modo que el valor
de dicha variable es modificable desde dentro de la funcin
invocada.
 Los array se pasan siempre por referencia, ya que, tanto el parmetro
actual como el formal es una direccin (la direccin de comienzo del
array)

62
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

Prctica 1: Indice
1.1 Introduccin
1.2 Datos, tipos de datos y expresiones
1.3 Estructuras de control
1.4 Vectores y matrices
1.5 Cadenas
1.6. Funciones
1.7. Ejercicios propuestos

63
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.7 - Ejercicios propuestos (III)


1. Dado el siguiente programa:
#include <stdio.h>
void main()
{
float f,g;
int a,b;
g=5.5;
a=b=2;
f=(int)g*b++/++a;
printf(Resultado %f\n,f);
}
Qu resultado piensas que mostrar el programa?. Una vez analizado,
comprubalo.

2.Crea un programa tal que, dado un carcter, lo imprima en pantalla


en minscula si el carcter est en mayscula, y viceversa.

64
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.7 - Ejercicios propuestos (II)


3. Realizar un programa que permite obtener xn para x real y n entero y no
negativo.
4. Realizar un programa que realice la divisin entera de dos nmeros
enteros y positivos X e Y, pero teniendo en cuenta que las nicas
operaciones aritmticas permitidas en el programa sern la suma y la
resta.
5. Realizar un programa que declare e inicialice una matriz cuadrada y
que calcule e imprima su traspuesta. Imprimir la matriz original y la
traspuesta
6. Dada una cadena cualquiera, realizar un programa que extraiga los
nmeros que aparecen en dicha secuencia, que los transforme en
nmeros enteros y los imprima por pantalla.

65
Departamento de Sistemas Informticos Escuela de Ingenieros Industriales de Albacete- Informtica Industrial 2009-2010
Universidad de Castilla La Mancha

1.7 - Ejercicios propuestos (III)


7. Realizar un programa que indique si una cadena de caracteres
introducida por teclado es un palndromo (un palndromo es una cadena
que se lee igual de izquierda a derecha que de derecha a izquierda,
como por ejemplo dabalearrozalazorraelabad
alolocolocolocolola).
8. Realizar un programa que tenga:
 Una funcin para calcular el permetro de una circunferencia a
partir del radio (2*PI*r).
 Una funcin para calcular el rea de un crculo (PI*r2).
 Una funcin para calcular el volumen de un cilindro
(area_circulo*altura), que puede usar las funciones anteriores.
 Un funcin principal que pida el radio y la altura de un cilindro y,
usando las funciones anteriores, informe del permetro de la parte
circular del cilindro, del rea del crculo y del volumen del cilindro.

66

Vous aimerez peut-être aussi