Ejercicios de Aplicación1
Ejercicios de Aplicación1
Ejercicios de Aplicación1
8
Resumen-Teora.............................................................................................................. 8
Ejercicios ......................................................................................................................... 8
Ejercicio 1: Primer programa (Hola Mundo) ............................................................... 8
ARRAYS ....................................................................................... 33
Resumen-Teora: .......................................................................................................... 33
Declaracin e inicializacin........................................................................................ 33
Acceso a una posicin concreta .................................................................................. 33
Bucles para recorrer arrays ......................................................................................... 33
Cadenas de caracteres. Un array especial ................................................................... 34
Matrices, arrays multidimensionales. ......................................................................... 34
Ejercicios: ...................................................................................................................... 34
Ejercicio 1: Qu imprime?. ....................................................................................... 34
Ejercicio 2: Qu imprime?. ....................................................................................... 35
Ejercicio 3: Qu imprime?. ....................................................................................... 35
Ejercicio 4: Qu imprime?. ....................................................................................... 35
Ejercicio 5: Media, mayor y menor de un conjunto fijo............................................. 35
Ejercicio 6: Media, mayor y menor de un conjunto prefijado. ................................... 35
Ejercicio 7: Media, mayor y menor. De un conjunto variable. .................................. 36
Ejercicio 8: Arrays multidimensionales. Edificio1..................................................... 36
Ejercicio 9: Arrays multidimensionales. Edificio2..................................................... 36
Ejercicio 10: Arrays multidimensionales. Edificio3................................................... 36
Ejercicio 11: Arrays multidimensionales. Edificio3................................................... 36
Ejercicio 12: Arrays multidimensionales. Rectas en el plano. ................................... 36
FUNCIONES ................................................................................. 37
Resumen-Teora: .......................................................................................................... 37
Declaracin, definicin y llamada .............................................................................. 37
mbito de las variables .............................................................................................. 38
Ejercicios: ...................................................................................................................... 38
Ejercicio 1: Qu imprime?. ....................................................................................... 38
Ejercicio 2: Qu imprime?. ....................................................................................... 38
Ejercicio 3: Qu imprime?. ....................................................................................... 39
Ejercicio 4: Qu imprime?. ....................................................................................... 39
Ejercicio 5: Qu imprime?. ....................................................................................... 39
Ejercicio 6: Qu imprime?. ....................................................................................... 40
Ejercicio 7: Qu imprime?. ....................................................................................... 40
Ejercicio 8: Funcin cuadrado. ................................................................................... 40
Ejercicio 9: Funcin factorial. .................................................................................... 41
Ejercicio 10: Funcin elmayor. .................................................................................. 41
4
PUNTEROS .................................................................................. 42
Resumen-Teora: .......................................................................................................... 42
Concepto de puntero ................................................................................................... 42
La relacin entre punteros y arrays............................................................................. 43
Operaciones con punteros........................................................................................... 43
Paso de parmetros por referencia a funciones .......................................................... 44
Ejercicios: ...................................................................................................................... 44
Ejercicio 1: Punteros Qu imprime?. ........................................................................ 44
Ejercicio 2: Punteros Qu imprime?. ........................................................................ 44
Ejercicio 3: Punteros Qu imprime?. ........................................................................ 45
Ejercicio 4: Punteros Qu imprime?. ........................................................................ 45
Ejercicio 5: Punteros Qu imprime?. ........................................................................ 45
Ejercicio 6: Punteros Qu imprime?. ........................................................................ 45
Ejercicio 7: Punteros Qu imprime?. ........................................................................ 45
Ejercicio 8: Punteros y arrays Qu imprime?. .......................................................... 46
Ejercicio 9: Punteros y arrays Qu imprime?. .......................................................... 46
Ejercicio 10: Punteros y arrays Qu imprime?. ........................................................ 46
Ejercicio 11: Punteros y arrays Qu imprime?. ........................................................ 46
Ejercicio 12: Punteros y arrays Qu imprime?. ........................................................ 46
Ejercicio 13: Punteros y arrays Qu imprime?. ........................................................ 46
Ejercicio 14: Punteros y funciones Qu imprime?. .................................................. 47
Ejercicio 15: Punteros y funciones Qu imprime?. .................................................. 47
Ejercicio 16: Punteros y funciones Qu imprime?. .................................................. 47
Ejercicio 17: Punteros y funciones Qu imprime?. .................................................. 48
Ejercicio 18: Punteros y funciones Qu imprime?. .................................................. 48
Ejercicio 19: Punteros y funciones Qu imprime?. .................................................. 48
Resumen-Teora: .......................................................................................................... 51
Ejercicios: ...................................................................................................................... 51
Ejercicio 1: Reserva Dinmica (malloc, free). ........................................................... 51
Ejercicio 2: Reserva Dinmica (malloc, free). ........................................................... 52
Ejercicio 3: Reserva Dinmica (malloc, free). ........................................................... 52
Ejercicio 4: Reserva Dinmica (malloc, free). ........................................................... 52
Ejercicio 5: Reserva Dinmica (malloc, free). ........................................................... 52
Ejercicio 6: Reserva Dinmica (malloc, free). ........................................................... 52
Ejercicio 7: Reserva Dinmica (realloc, free). ........................................................... 52
Ejercicio 8: Reserva Dinmica (realloc, free). ........................................................... 52
Ejercicio 9: Reserva Dinmica (realloc, free). ........................................................... 52
Ejercicio 10: Reserva Dinmica (realloc, free). ......................................................... 52
Ejercicio 11: Reserva Dinmica (realloc, free). ......................................................... 52
Resumen-Teora
Para realizar un programa en C necesitamos un compilador de lenguaje C
instalado en nuestro ordenador. Llamamos compilador al programa capaz de traducir
nuestras rdenes en rdenes comprensibles por el PC, es decir, un programa que nos
permite crear programas.
Nuestras rdenes estarn escritas en lo que conocemos como lenguaje de
programacin (C, en este caso), las rdenes comprensibles por el PC se llaman cdigo
mquina, son ceros y unos, y se guardan en ficheros con extensin .exe, que es lo que
llamamos ficheros ejecutables o programas.
Los compiladores suelen incorporar un entorno de desarrollo con ventanas, en el
que podremos escribir nuestro programa, adems de otra serie de herramientas y
facilidades para el programador (nosotros). Un compilador que recomendamos a
nuestros estudiantes es el Dev-C++, que se puede descargar gratuitamente en:
www.bloodshed.net/devcpp.html.
Ejercicios
Ejercicio 1: Primer programa (Hola Mundo)
Para realizar tu primer programa, instala en tu PC este compilador, o cualquier
otro que tengas, y crea un proyecto de consola (son los que no tienen interfaz grfico, se
ejecutan en una ventana de fondo negro). Al crear el proyecto normalmente se te crear
con un fichero en blanco por defecto, si no es as, tendrs que crear un nuevo fichero:
Ponle el nombre que quieras, slvalo con la extensin .c, y adelo al proyecto.
En este punto ya estamos preparados para escribir el primer programa. Teclea en
el fichero lo siguiente:
#include<stdio.h>
int main()
{
printf(Hola mundo!!);
system("PAUSE");
return 0;
}
Compila y ejecuta este programa. Al ejecutarse, se abrir una ventana negra (la
consola de MS-DOS) con el texto: Hola mundo!!
Resumen-Teora
Si nos fijamos en el primer programa, el programa del ejercicio del punto anterior,
veremos que pone: printf(Hola mundo !! );
Esta lnea del programa es la que se encarga de presentar la frase por pantalla. De
ah se deduce que la instruccin printf sirve para presentar texto por pantalla, y que el
texto que se presenta es lo que est en comillas.
Por ejemplo:
printf(Frase de prueba.);
printf( Otra frase...);
Es idntico a:
printf(Frase de prueba.);
E idntico a:
printf(Frase de prueba.);
printf( Otra frase...);
Adems, hay algunas cosas que conviene saber, como cmo hacer saltos de lnea,
tabulaciones, etc. Para esto se utilizan unos caracteres especiales, que son caracteres
normales precedidos del carcter de diagonal invertida \(generalmente se obtiene
pulsando AltGr + tecla de arriba a la izquierda). Estos caracteres especiales se llaman
secuencias de escape, se pueden incluir en cualquier parte de la frase, y son los
siguientes:
\a
\b
\n
\r
\t
\\
\'
\"
carcter de alarma
retroceso
nueva lnea
regreso de carro
tabulador horizontal
diagonal invertida
apstrofe
comillas
Otro aspecto de C que se puede probar en este apartado son los comentarios. A menudo
sucede que nos interesa incluir comentarios en el programa que escribimos. Esto es de
gran utilidad para poder entender de un vistazo aquello que hemos escrito nosotros
mismos, u otro programador. Para esto disponemos de comentarios de lnea y
comentarios de bloque.
Comentario de lnea: Se marcan con dos barras // y van de las dos barras hasta el final
de la lnea.
printf(hola \a); //imprime hola y hace sonar la alarma.
Comentario de bloque: Se marcan con barra y asterisco el inicio del comentario /* y con
asterisco barra el fin del comentario */.
Esto no es comentario /*este texto s es un comentario */ esto ya no es comentario
Ejercicios
Ejercicio 1: Con saltos de lnea
Escribe un programa que presente por pantalla:
Hola
Mundo
comillas()
diagonal invertida(/)
10
Resumen-Teora
Tipos de Datos:
Los tipos de datos de un lenguaje son, como su propio nombre indica, los tipos de
datos con los que se puede trabajar en un lenguaje de programacin. El lenguaje C
ofrece una coleccin de tipos de datos bastante limitada, aunque no por ello poco
funcional. Dicha coleccin se compone de los siguientes tipos:
char:
11
o Contenido:
int:
float:
en
d ou b l e :
o Contenido:
12
Variables:
Para trabajar con datos de estos tipos, es necesario poder guardar dichos datos en
variables. Qu es una variable? Una variable se define como Espacio de memoria,
referenciado por un identificador, en el que el programador puede almacenar datos de
un determinado tipo. o lo que es lo mismo: Un sitio donde guardar un dato de un tipo
determinado. Al identificador de la variable se le suele llamar nombre de dicha
variable.
Para usar una variable hay que declararla. Declarar una variable es indicar al
compilador que debe reservar espacio para almacenar valores de un tipo determinado,
que sern referenciados por un identificador determinado. En C debemos declarar todas
las variables antes de usarlas, establecer el tipo que tienen y, en los casos que sea
necesario, darles un valor inicial.
A la hora de declarar una variable debemos tener en cuenta diversas restricciones :
13
de
Significado
El dato es un carcter.
El dato es un entero decimal.
El dato es un valor en coma flotante.
14
%f
%g
%i
%s
scanf(%f, &a);
lee un nmero con decimales introducido por el teclado y guarda el valor ledo,
en la variable a.
Ejemplo:
scanf(%c, &a);
15
Ejercicios:
Ejercicio 1: Leyendo nmeros enteros
1.a) Escribe un programa que pida un nmero entero, y conteste al usuario: Has
introducido el numero (x), gracias.
1.b) Escribe un programa que pregunte al usuario cuntos aos tiene, y conteste al
usuario: Ahora se que tienes (x) aos, gracias.
16
1.c) Escribe un programa que pregunte la hora, y conteste con un mensaje: Hora
introducida ok. Son las 18:30:00 (por ejemplo).
OPERACIONES SIMPLES
Resumen-Teora:
Sentencias:
Como habris observado en los ejemplos anteriores, cada lnea est terminada
con un punto y coma. Esto es as porque cada sentencia en C debe terminar con
punto y coma.
Una sentencia o instruccin hace que el ordenador lleve a cabo alguna accin. En
C hay tres tipos de sentencias: de expresin, de control y compuestas.
Una sentencia de expresin consiste en una expresin seguida de un punto y
coma. Su ejecucin hace que se evale la expresin.
La sentencia ms importante es la de asignacin. El operador que se utiliza es
el de la igualdad =, pero su significado es distinto que en las matemticas. Este
operador en un programa indica que la variable de la izquierda del =, se escribe con el
valor de la expresin de su derecha..
Ejemplos:
a = 3;
17
Operadores aritmticos.
Operadores relacionales.
Operadores lgicos.
Operadores a nivel de bit (bitwise operators).
Operadores especiales.
Operadores aritmticos:
Los operadores aritmticos nos permiten, bsicamente, hacer cualquier operacin
aritmtica, que necesitemos (ejemplo: suma, resta, multiplicacin, etc). En la siguiente
tabla se muestran los
Tabla: Operadores aritmticos
operadores de
los que disponemos
en C y su funcin
asociada.
Operador
Accin
Ejemplo
Nota: Todos
ellos aceptan
operandos de cualquier
tipo excepto el
Mdulo,Incremento y
Decremento, que slo
acepta operadores
enteros.
Resta
x = 5 - 3; // x vale 2
Suma
x = 2 +3; // x vale 5
Multiplicacin
x = 2 *3; // x vale 6
Divisin
x = 6 /2; // x vale 3
Mdulo
x = 5 % 2; // x vale 1
--
Decremento
x = 1; x--; // x vale 0
++
Incremento
x = 1; x++; // x vale 2
18
Operadores de Asignacin:
Se utilizan para formar expresiones de asignacin en las que se asigna el valor
de una expresin a un identificador.
El ms usado es el operador =. Una expresin de asignacin recibe el nombre
de sentencia de asignacin y es de la forma:
identificador = expresin
Donde identificador representa generalmente una variable y expresin una
constante, una variable o una expresin ms compleja.
Si los dos operandos de una sentencia de asignacin son de diferente tipo, el
valor de la expresin de la derecha se convierte automticamente al tipo del
identificador de la izquierda. Hay casos en que esta conversin conlleva una alteracin:
Un valor en coma flotante se trunca si se asigna a un identificador
entero. Un valor en doble precisin se redondea si se asigna a un identificador de coma
flotante.
19
Operadores relacionales
Al igual que en matemticas, estos operadores nos permitirn evaluar las relaciones
(igualdad, mayor, menor, etc) entre un par de operandos (en principio, pensemos en nmeros).
Los operadores relacionales de los que disponemos en C son:
Operador
Accin
>
Mayor que
>=
Mayor o igual
que
<
Menor que
<=
Menor o igual
que
==
Igual
!=
Distinto
El que devuelven los operadores relacionales, es un valor ``cierto'' (true) o ``falso'' (false).
La mayora de lenguajes tienen algn tipo predefinido para representar estos valores (boolean,
bool, etc); sin embargo en C, se utilizan valores enteros para representar esto:
20
falso (false)
cierto (true)
Para utilizar los operadores relacionales es necesario conocer un operador del tema
siguiente, el operador if-else, de control de flujo. As pues, se adelanta su presentacin en este
apartado:
Este fragmento de cdigo imprimira: es menor que diez. En el siguiente captulo se ver
con ms detenimiento el operador if-else.
Operadores lgicos
Como operadores lgicos designamos a aquellos operadores que nos permiten conectar
un par de propiedades (al igual que en lgica):
Los operadores lgicos de los que disponemos en C son los siguientes:
Tabla: Operadores lgicos.
Operador
Accin
&&
Conjuncin (Y)
||
Disyuncin (O)
Negacin
21
Accin
&
22
Ejercicios:
Ejercicio 1: Clculo de precios con descuento
Escribe un programa que pregunte el precio, el tanto por ciento de descuento, y te
diga el precio con descuento. Por ejemplo, si el precio que introduce el usuario es 300 y
el descuento 20, el programa dir que el precio final con descuento es de 240.
23
24
CONTROL DE FLUJO
Resumen-Teora:
Para el control del programa existen las sentencias de control siguientes: if-else,
else-if, switch, while, for y do-while. Estas sentencias sirven para hacer que una varias
sentencias se ejecuten repetidamente, as como para decidir si una parte del programa
debe o no ejecutarse.
Las llaves '{', '}' se emplean para encapsular sentencias. Todas las sentencias
encerradas entre llaves son como una nica sentencia.
if-else
La proposicin if-else se usa para expresar decisiones. La sintxis es:
if(expresin)
proposicin1;
else
proposicin2;
25
total = precio_unidad * x;
printf("El precio de %d unidades es : %d", x, total);
}
else
{
printf("Pedidos inferiores a 5 unidades no son posibles.");
}
Expresin condicional (
)?
Que es similar a:
if( expresin1 )
expresin2;
else
expresin3;
else-if
Con esta expresin se complementa la expresin vista en el punto anterior. Su
sintxis es:
if( expresin )
proposicin;
else if( expresin )
proposicin;
else if( expresin )
proposicin;
else if( expresin )
proposicin;
else
proposicin;
Mediante esta expresin se puede seleccionar una condicin muy especfica dentro
de un programa, es decir, que para llegar a ella se haya tenido la necesidad del
cumplimiento de otras condiciones.
26
switch
La proposicin switch, permite la decisin mltiple que prueba si una expresin
coincide con uno de los valores constantes enteros que se hayan definido previamente.
Su sintxis es:
switch( expresin ) {
case exp-const: proposiciones
break;
case exp-const:
proposiciones break;
case exp-const:
case exp-const: proposiciones
break;
default: proposiciones
}
while
La proposicin "while" permite la ejecucin de una proposicin simple o
compuesta, mientras la "expresin" sea verdadera. Su sintxis es:
while( expresin )
proposicin
Por ejemplo,
while( (c = getchar()) == 's' || c == 'S' )
printf("\nDesea salir del programa?");
while( (c = getchar()) == 's' || c == 'S' )
{
printf("\nDesea salir del programa?");
++i;
27
for
La proposicin "for" requiere tres expresiones como argumento. Las expresin1 y
la expresin3 comnmente se emplean para asignaciones, mientras que la expresin2 es
la condicin que se debe cumplir para que el ciclo "for" se siga ejecutando.
La sintxis es:
for(expresin1; expresin2; expresin3)
proposicin
Ejemplo:
for(i=0; i <= 500; ++i)
printf("\nEl nmero par
do-while
La proposicin "do-while" es similar a la proposicin "while", se ejecuta el ciclo
mientras se cumpla la condicin dada en "expresin".
La diferencia estriba en que en el "do-while" siempre se evala al menos una vez
su "proposicin", mientras que en el "while" si no se cumple la "expresin" no entra al
ciclo.
Sintxis:
do
proposicin
while( expresin );
Ejemplo:
i=0;
do
{
printf("\nEl nmero par
++i;
}
while( i < 500 );
28
break y continue
Cuando se quiere abandonar un ciclo en forma prematura debido a que ciertas
condiciones ya se cumplieron, se puede usar la proposicin "break". sta sirve par las
proposiciones "for", "while" y "do-while".
Tambin se tiene otra proposicin relacionada, y esta es el "continue"; su funcin
es la de ocasionar la prxima iteracin del ciclo.
Ejemplos:
for(h=1; h <= 1000; ++h)
{
if( h%5 == 0 )
continue;
printf("%i no es mltiplo de 5.\n", h);
}
while(1)
{
if( getchar() == '$' )
break;
printf("\nNo puedo parar, hasta que presione \'$\'");
}
Ejercicios:
Ejercicio 1: Qu imprime?.
Qu imprime el siguiente fragmento de cdigo? Comprubalo.
int i;
for(i=0; i<4; i++){
printf(>>> %d: %d\n,i,i*i*2);
}
Ejercicio 2: Qu imprime?.
Qu imprime el siguiente fragmento de cdigo? Comprubalo.
int i=4, x=5;
for(i=0; i<4; i++){
printf(>>> %d: %d\n,i,i*x);
}
29
Ejercicio 3: Qu imprime?.
Qu imprime el siguiente fragmento de cdigo? Comprubalo.
int i=4, x=5;
for(i=x; i<10; i++){
printf(%d, ,i);
}
Ejercicio 4: Qu imprime?.
Qu imprime el siguiente fragmento de cdigo? Comprubalo.
int i=4, x=5;
if(x<(2*i))
printf(verdadero);
else
printf(falso);
Ejercicio 5: Qu imprime?.
Qu imprime el siguiente fragmento de cdigo? Comprubalo.
int i=4, x=5;
for(i=0; i<10; i++){
if(i<x) printf(%d ,i);
else printf(%d ,i-x);
}
Ejercicio 6: Bucles 1.
Realizar un programa que imprima los nmeros del 1 al 57. Repetir este ejercicio con
todos los tipos de bucles (for, while, y do-while).
Ejercicio 7: Bucles 2.
Realizar un programa que pida al usuario un nmero y presente los nmeros del 1 al
nmero que introdujo el usuario. Repetir este ejercicio con todos los tipos de bucles
(for, while, y do-while).
Ejercicio 8: Bucles 3.
Realizar un programa que pida al usuario dos nmeros y presente los nmeros del
primero nmero al segundo que introdujo el usuario. Repetir este ejercicio con todos los
tipos de bucles (for, while, y do-while).
30
Ejercicio 9: Bucles4.
Realizar un programa que imprima por pantalla tntos asteriscos como diga el usuario.
Al ejecutarse debe preguntar Cuantos asteriscos desea imprimir?, leer el nmero que
introduce el usuario e imprimir los asteriscos.
Ejercicio 9: Condicin if 1.
Realizar un programa que pida al usuario dos nmeros y diga cul es el mayor y cul el
menor.
31
32
ARRAYS
Resumen-Teora:
Un array es un conjunto ordenado de datos del mismo tipo. Si queremos un
programa que almacene y haga operaciones con un conjunto de mil nmeros (por
ejemplo las alturas de mil personas, etc.), no creamos mil variables distintas sino que
creamos un array de mil elementos.
Los arrays tambin se llaman: arreglos, vectores, matrices de una dimensin... y
ms incorrectamente listas y tablas.
Declaracin e inicializacin
int edades[200];
del
array.
33
int arraydematrices[7][5][3];//array
Ejercicios:
Ejercicio 1: Qu imprime?.
Qu imprime el siguiente fragmento de cdigo? Comprubalo.
int array[10]={1,3,5,7,9,2,3,4,6,8,10},i;
for(i=0; i<10; i++){
34
Ejercicio 2: Qu imprime?.
Qu imprime el siguiente fragmento de cdigo? Comprubalo.
int array[10]={1,3,5,7,9,2,3,4,6,8,10},i;
for(i=1; i<10; i++){
printf(>>> %d\n, array[i]);
}
Ejercicio 3: Qu imprime?.
Qu imprime el siguiente fragmento de cdigo? Comprubalo.
int array[10],i;
for(i=0; i<10; i++){
array[i]=i*i;
}
for(i=0; i<10; i++){
printf(%d,array[i]);
}
Ejercicio 4: Qu imprime?.
Qu imprime el siguiente fragmento de cdigo? Comprubalo.
int array[10],i=0;
while(i<10){
array[i]=i*i;
i++;
}
do{
printf(%d,array[--i]);
} while(i>=0);
35
36
FUNCIONES
Resumen-Teora:
Los programas sencillos, como los ejemplo planteados hasta ahora, normalmente no
necesitan un nivel de estructuracin elevado, es decir, pueden escribirse todo seguido
como una lista de rdenes sencilla (a pesar de los bucles). Pero cuando los programas
crecen un poco, es necesario estructurarlos adecuadamente para mantenerlos legibles,
facilitar su mantenimiento y para poder reutilizar ciertas porciones de cdigo. El
mecanismo de C que nos permite esto son las funciones. Con los compiladores, los
fabricantes nos proporcionan un conjunto importante de funciones de librera.
La definicin de la funcin puede estar antes o despus que el main. Cuando se pone
antes que el main hace las veces de declaracin.
Imprimir: 7,8,9.
Ejercicios:
Ejercicio 1: Qu imprime?.
Qu imprime el siguiente fragmento de cdigo? Comprubalo.
int mi_funcion(void)
{
return 3+2;
}
void main(void){
printf(La function devuelde %d,mi_funcion());
}
Ejercicio 2: Qu imprime?.
Qu imprime el siguiente fragmento de cdigo? Comprubalo.
int mi_funcion(int x)
{
return x*x;
38
}
void main(void){
printf(La function devuelde %d,mi_funcion(5));
}
Ejercicio 3: Qu imprime?.
Qu imprime el siguiente fragmento de cdigo? Comprubalo.
int mi_funcion(int x)
{
int y;
y=2+x*3;
return y;
}
void main(void){
printf(La function devuelde %d,mi_funcion(5+2));
}
Ejercicio 4: Qu imprime?.
Qu imprime el siguiente fragmento de cdigo? Comprubalo.
int mi_funcion(int x)
{
return x*x;
}
void main(void){
int x=3;
mi_funcion(x);
printf(La function devuelde %d, mi_funcion(x));
printf(La variable vale %d, x);
}
Ejercicio 5: Qu imprime?.
Qu imprime el siguiente fragmento de cdigo? Comprubalo.
int mi_funcion(int x)
{
x=x*5;
return x;
}
void main(void){
int x=3;
mi_funcion(x);
printf(La function devuelde %d, mi_funcion(x));
printf(La variable vale %d, x);
}
39
Ejercicio 6: Qu imprime?.
Qu imprime el siguiente fragmento de cdigo? Comprubalo.
int mi_funcion(int x)
{
x=x*5;
return x;
}
void main(void){
int x=3;
x=mi_funcion(x);
printf(La function devuelde %d, mi_funcion(x));
printf(La variable vale %d, x);
}
Ejercicio 7: Qu imprime?.
Qu imprime el siguiente fragmento de cdigo? Comprubalo.
int mi_funcion(int x)
{
x=x*5;
return x;
}
void main(void){
int y=3, x=4;
printf(La function devuelde %d, mi_funcion(y));
printf(La variable vale %d, x);
}
40
41
PUNTEROS
Resumen-Teora:
Concepto de puntero
Un puntero es una variable que contiene la direccin de otra variable. Por ejemplo,
un puntero a entero es una variable que se utiliza para guardar la direccin de una
variable tipo int.
Declaracin:
int *punt; // declaracin de un puntero a entero llamado punt
char *punt1; // declaracin de un puntero a char llamado punt1
float *punt2; // declaracin de un puntero a float llamado punt2
...
Estas declaraciones reservan espacio para un puntero, pero no inicializan el
puntero, es decir, estn apuntando a cualquier parte.
42
Operadores implicados:
Operador de indireccin: * Situado a la izquierda de una variable (puntero)
devuelve la variable a la que apunta, o lo que es lo mismo, el contenido de la direccin
que contiene.
Operador de direccin-de: & Situado a la izquierda de una variable devuelve su
direccin.
Ejemplos:
int *punt; //puntero a entero sin inicializar llamado punt
int x; // variable entera llamada x
int y; // variable entera llamada y
punt=&x; // Escribimos en punt la direccin de x, es decir, punt apunta a x.
*punt=4; //Escribimos un 4 en donde apunta punt, es decir, escribimos un 4 en x.
punt=&y;// Escribimos en punt la direccin de y, es decir, punt apunta a y.
*punt=8; //Escribimos un 8 en donde apunta punt, es decir, escribimos un 8 en y.
printf(%d, %d,x,y); // qu imprime este printf?
X [i]
*( X i)
punt=miarray;
*(punt +1)=3; // idem que punt[1]=3 ;
punt=punt+3;//Ahora punt apunta al cuarto elemento del array.
*punt=5; // idem que miarray[3]=5;
miarray[6]=*(punt-2);// idem que miarray[6]= miarray[1];
Ejercicios:
Ejercicio 1: Punteros Qu imprime?.
int *punt;
int x=7;
int y=5;
punt=&x;
*punt=4;
printf(%d, %d,x,y); // qu imprime este printf?
44
45
46
punt--;
*(punt)=7 ;
punt[1]=11 ;
punt=x;
for(i=0;i<5;i++)
printf(%d,,punt[i])); // qu imprime?
47
48
REGISTROS O ESTRUCTURAS
Resumen-Teora:
Un registro o estructura es una variable que sirve para guardar un grupo de datos de
distintos tipos. Los arrays sirven para guardar grupos de datos del mismo tipo, por
ejemplo 5 nmeros reales, pero si queremos guardar en una misma variable, un nmero
real, un nmero entero, y un carcter, entonces tendremos que crear una estructura, es
decir, un nuevo tipo de variable capaz de guardar estos tres datos.
Ejemplo: Estructura para guardar un nmero entero (edad), un float (altura) y una
cadena de caracteres (nombre):
Definicin de la estructura:
struct jugador{
char nombre[50]; //campo nombre, estructura jugador.
int edad; //campo edad, estructura jugador.
float altura; //campo altura, estructura jugador.
};
Ejercicios:
Ejercicio 1: Estructuras Qu imprime?.
struct jugador{
char nombre[50]; //campo nombre, estructura jugador.
49
Ejercicio 3: Estructuras.
Crear un programa que pida al usuario los nombres, edades, y alturas, de 10 jugadores.
Posteriormente le presentar un men que le permita: 1. Listar los nombres de los
jugadores; 2. Listar las alturas de los jugadores; 3. Listar las edades de los jugadores.
Ejercicio 4: Estructuras.
Crear un programa que pida al usuario los nombres, edades, y alturas, de 10 jugadores.
Posteriormente le presentar un men que le permita: 1. Listar los nombres de los
jugadores; 2. Listar las alturas de los jugadores; 3. Listar las edades de los jugadores; 4.
Buscar un jugador por su nombre y presentar su altura y su edad; 5. Indicar la edad y el
nombre del jugador ms alto de la lista.
50
Ejercicio 5: Estructuras.
Crear una estructura que contenga las coordenadas de un punto del plano (dos
coordenadas (x,y), nmeros reales). Realizar un programa que pida las coordenadas de
tres puntos del plano, y calcule el permetro del tringulo que forman (Nota: la distancia
entre dos puntos de coordenadas (a,b) y (c,d) se calcula por el teorema de pitgoras
como sqrt((c-a)*(c-a) + (d-b)*(d-b)), para usar la funcion sqrt debe incluir la librera
math.h.).
La funcion malloc reserve espacio para n enteros y devuelve un puntero a int que se
asigna al puntero mi_array.
Una vez terminado de utilizar el espacio reservado debemos liberarlo utilizando la
funcin free(); En el ejemplo anterior haramos:
free(mi_array);
Por ltimo, es tambin importante mencionar la funcin realloc()
encargada de ampliar y reubicar cuando sea necesario el array.
Ejemplo:
numPtr = (int *)realloc( numPtr, 256 );
//El nuevo tamao del array apuntato por numPtr es 256
Ejercicios:
Ejercicio 1: Reserva Dinmica (malloc, free).
Crear un programa que pregunte al usuario cuntos caracteres desea introducir, reserve
espacio para dicho nmero de caracteres, le permita al usuario introducirlos desde
teclado, y por ltimo se los muestre todos seguidos.
51
52
Funcin fopen:
Sintaxis:
FILE *fopen(char *nombre, char *modo);
sta funcin sirve para abrir y crear ficheros en disco. El valor de retorno es un puntero
a una estructura FILE. Los parmetros de entrada son:
nombre: una cadena que contiene un nombre de fichero vlido, esto depende del sistema
operativo que estemos usando. El nombre puede incluir el camino completo.
modo: especifica en tipo de fichero que se abrir o se crear y el tipo de datos que puede
contener, de texto o binarios:
r: slo lectura. El fichero debe existir.
w: se abre para escritura, se crea un fichero nuevo o se sobreescribe si ya existe.
a: aadir, se abre para escritura, el cursor se situa al final del fichero. Si el fichero no
existe, se crea.
r+: lectura y escritura. El fichero debe existir.
w+: lectura y escritura, se crea un fichero nuevo o se sobreescribe si ya existe.
a+: aadir, lectura y escritura, el cursor se situa al final del fichero. Si el fichero no
existe, se crea.
t: tipo texto, si no se especifica "t" ni "b", se asume por defecto que es "t"
b: tipo binario.
53
Funcin fclose:
Sintaxis:
int fclose(FILE *fichero);
Es importante cerrar los ficheros abiertos antes de abandonar la aplicacin. Esta funcin
sirve para eso. Cerrar un fichero almacena los datos que an estn en el buffer de
memoria, y actualiza algunos datos de la cabecera del fichero que mantiene el sistema
operativo. Adems permite que otros programas puedan abrir el fichero para su uso.
Muy a menudo, los ficheros no pueden ser compartidos por varios programas.
Un valor de retorno cero indica que el fichero ha sido correctamente cerrado, si ha
habido algn error, el valor de retorno es la constante EOF. El parmetro es un puntero
a la estructura FILE del fichero que queremos cerrar.
Funcin fgetc:
Sintaxis:
int fgetc(FILE *fichero);
Esta funcin lee un carcter desde un fichero.
El valor de retorno es el carcter ledo como un unsigned char convertido a int. Si no
hay ningn carcter disponible, el valor de retorno es EOF. El parmetro es un puntero a
una estructura FILE del fichero del que se har la lectura.
Funcin fputc:
Sintaxis:
int fputc(int caracter, FILE *fichero);
Esta funcin escribe un carcter a un fichero.
El valor de retorno es el carcter escrito, si la operacin fue completada con xito, en
caso contrario ser EOF. Los parmetros de entrada son el carcter a escribir,
convertido a int y un puntero a una estructura FILE del fichero en el que se har la
escritura.
Funcin feof:
Sintaxis:
int feof(FILE *fichero);
Esta funcin sirve para comprobar si se ha alcanzado el final del fichero. Muy
frecuentemente deberemos trabajar con todos los valores almacenados en un archivo de
forma secuencial, la forma que suelen tener los bucles para leer todos los datos de un
archivo es permanecer leyendo mientras no se detecte el fin de fichero. Esta funcin
suele usarse como prueba para verificar si se ha alcanzado o no ese punto.
El valor de retorno es distinto de cero slo si no se ha alcanzado el fin de fichero. El
parmetro es un puntero a la estructura FILE del fichero que queremos verificar.
54
Funcin rewind:
Sintaxis:
void rewind(FILE *fichero)
Es una funcin heredada de los tiempos de las cintas magnticas. Literalmente significa
"rebobinar", y hace referencia a que para volver al principio de un archivo almacenado
en cinta, haba que rebobinarla. Eso es lo que hace sta funcin, sita el cursor de
lectura/escritura al principio del archivo.
El parmetro es un puntero a la estructura FILE del fichero que queremos rebobinar.
Ejemplos:
// ejemplo1.c: Muestra un fichero dos veces.
#include <stdio.h>
int main()
{
FILE *fichero;
fichero = fopen("ejemplo1.c", "r"); while(!
feof(fichero)) fputc(fgetc(fichero), stdout);
rewind(fichero);
while(!feof(fichero)) fputc(fgetc(fichero), stdout);
fclose(fichero);
getchar();
return 0;
}
Funcin fgets:
Sintaxis:
char *fgets(char *cadena, int n, FILE *fichero);
Esta funcin est diseada para leer cadenas de caracteres. Leer hasta n-1 caracteres o
hasta que lea un retorno de lnea. En este ltimo caso, el carcter de retorno de lnea
tambin es ledo.
El parmetro n nos permite limitar la lectura para evitar derbordar el espacio disponible
en la cadena.
El valor de retorno es un puntero a la cadena leda, si se ley con xito, y es NULL si se
detecta el final del fichero o si hay un error. Los parmetros son: la cadena a leer, el
nmero de caracteres mximo a leer y un puntero a una estructura FILE del fichero del
que se leer.
Funcin fputs:
Sintaxis:
int fputs(const char *cadena, FILE *stream);
La funcin fputs escribe una cadena en un fichero. No se aade el carcter de retorno de
lnea ni el carcter nulo final.
55
Funcin fread:
Sintaxis:
size_t fread(void *puntero, size_t tamao, size_t nregistros, FILE *fichero);
Esta funcin est pensada para trabajar con registros de longitud constante. Es capaz de
leer desde un fichero uno o varios registros de la misma longitud y a partir de una
direccin de memoria determinada. El usuario es responsable de asegurarse de que hay
espacio suficiente para contener la informacin leda.
El valor de retorno es el nmero de registros ledos, no el nmero de bytes. Los
parmetros son: un puntero a la zona de memoria donde se almacenarn los datos
ledos, el tamao de cada registro, el nmero de registros a leer y un puntero a la
estructura FILE del fichero del que se har la lectura.
Funcin fwrite:
Sintaxis:
size_t fwrite(void *puntero, size_t tamao, size_t nregistros, FILE *fichero);
Esta funcin tambin est pensada para trabajar con registros de longitud constante y
forma pareja con fread. Es capaz de escribir hacia un fichero uno o varios registros de la
misma longitud almacenados a partir de una direccin de memoria determinada.
El valor de retorno es el nmero de registros escritos, no el nmero de bytes. Los
parmetros son: un puntero a la zona de memoria donde se almacenarn los datos
ledos, el tamao de cada registro, el nmero de registros a leer y un puntero a la
estructura FILE del fichero del que se har la lectura.
Ejemplo:
// copia.c: Copia de ficheros
// Uso: copia <fichero_origen> <fichero_destino>
#include <stdio.h>
int main(int argc, char **argv) {
FILE *fe, *fs;
unsigned char buffer[2048]; // Buffer de 2 Kbytes
int bytesLeidos;
if(argc != 3) {
printf("Usar: copia <fichero_origen> <fichero_destino>\n");
return 1;
}
// Abrir el fichero de entrada en lectura y binario
fe = fopen(argv[1], "rb");
if(!fe) {
56
Funcin fprintf:
Sintaxis:
int fprintf(FILE *fichero, const char *formato, ...);
La funcin fprintf funciona igual que printf en cuanto a parmetros, pero la salida se
dirige a un fichero en lugar de a la pantalla.
Funcin fscanf:
Sintaxis:
int fscanf(FILE *fichero, const char *formato, ...);
La funcin fscanf funciona igual que scanf en cuanto a parmetros, pero la entrada se
toma de un fichero en lugar del teclado.
Funcin fflush:
Sintaxis:
int fflush(FILE *fichero);
Esta funcin fuerza la salida de los datos acumulados en el buffer de salida del fichero.
Para mejorar las prestaciones del manejo de ficheros se utilizan buffers, almacenes
temporales de datos en memoria, las operaciones de salida se hacen a travs del buffer,
y slo cuando el buffer se llena se realiza la escritura en el disco y se vaca el buffer. En
ocasiones nos hace falta vaciar ese buffer de un modo manual, para eso sirve sta
funcin.
El valor de retorno es cero si la funcin se ejecut con xito, y EOF si hubo algn error.
El parmetro de entrada es un puntero a la estructura FILE del fichero del que se quiere
vaciar el buffer. Si es NULL se har el vaciado de todos los ficheros abiertos.
57
Funcin fseek:
Sintaxis:
int fseek(FILE *fichero, long int desplazamiento, int origen);
Esta funcin sirve para situar el cursor del fichero para leer o escribir en el lugar
deseado.
El valor de retorno es cero si la funcin tuvo xito, y un valor distinto de cero si hubo
algn error.
Los parmetros de entrada son: un puntero a una estructura FILE del fichero en el que
queremos cambiar el cursor de lectura/escritura, el valor del desplazamiento y el punto
de origen desde el que se calcular el desplazamiento.
El parmetro origen puede tener tres posibles valores:
SEEK_SET el desplazamiento se cuenta desde el principio del fichero. El primer byte
del fichero tiene un desplazamiento cero.
SEEK_CUR el desplazamiento se cuenta desde la posicin actual del cursor.
SEEK_END el desplazamiento se cuenta desde el final del fichero.
Funcin ftell:
Sintaxis:
long int ftell(FILE *fichero);
La funcin ftell sirve para averiguar la posicin actual del cursor de lectura/excritura de
un fichero.
El valor de retorno ser esa posicin, o -1 si hay algn error.
El parmetro de entrada es un puntero a una estructura FILE del fichero del que
queremos leer la posicin del cursor de lectura/escritura
Ejercicios:
Ejercicio 1: Lector de ficheros de texto.
Crear un programa que abra un fichero llamado prueba.txt (previamente creado con el
block de notas y guardado en la misma carpeta donde este el programa) y que muestre el
contenido del mismo por pantalla carcter a carcter.
58
59
60
61
struct nodo {
int dato; // clave del nodo
struct nodo *sigiente_nodo;
}
La idea consiste bsicamente en ir guardando en cada nodo la direccin del ltimo nodo
que se guard, y un puntero llamado lista apuntando al ltimo elemento guardado. La
representacin sera la siguiente:
Pilas y colas
La estructura de pilas y colas es la misma que una lista simplemente enlazada. La
diferencia est en la forma de recorrer la estructura.
Le llamamos Pila (como una pila de platos) cuando el ltimo elemento que apilamos
(guardamos) es el primero que extraemos. LIFO (Last In First Out)
Le llamamos Cola (como una cola para entrar al cine) cuando el primer elemento en
llegar a la cola es el primero en salir. FIFO (First In First Out).
rboles binarios
62
Los rboles binarios son una estructura pensada para poder encontrar fcilmente la
informacin guardada sin tener necesariamente que buscar en todos los nodos. Los
rboles binarios consisten en estructuras donde la informacin se guarda siguiendo un
cierto orden elemental.
Este orden es siempre el mismo. Cada estructura del rbol tiene dos punteros (igual que
la lista doblemente enlazada, pero en vez de llamarles siguiente y anterior, les
llamamos, izquierda y derecha, que es ms intuitivo). El orden consiste en que, segn
van llegando los elementos se van almacenando as: El primero en el nico sitio que hay
(ser la raz del rbol); el siguiente, si es mayor a la derecha, si es menor a la izquierda,
y as sucesivamente.
Ejemplo: Guardar los siguientes nodos en un rbol: 8, 3, 6, 1, 10, 14, 4 , 7, 13.
El resultado es el siguiente:
Ejercicios:
Ejercicio 1: Lista simple 1.
Realizar un programa que permita guardar nmeros en una lista. Debe tener un menu
con las opciones, aadir elemento e imprimir todos.
63