Sei sulla pagina 1di 46

LABORATORIOS FUNDAMENTOS DE INFORMTICA

INDICE

Laboratorio 1. Operaciones de entrada y salida 1

Laboratorio 2. Estructuras condicionales ifelse 9

Laboratorio 3. Estructuras repetitivas while/dowhile 17

Laboratorios de Laboratorio 4. Estructuras repetitivas - for 23

Fundamentos de Laboratorio 5. Funciones parte I 29

Informtica (FI) Laboratorio 6. Funciones parte II 37

Laboratorio 7. Tablas numricas arrays unidimensionales 49

Ejercicios de Programacin en C Laboratorio 8. Tablas numricas arrays en funciones 55

para las clases de ordenador


Laboratorio 9. Cadenas de caracteres - strings 61

Conchi Presedo Garca.


Laboratorio 10. Ficheros 67

Anexo. Manual de MS Visual Studio para C/C++ 73

Anexo. Manual de Dev-C++ 83

2015/16

Conchi Presedo Garca EUITI Bilbao 2015 ii


LABORATORIO 1 FUNDAMENTOS DE INFORMTICA LABORATORIO 1 FUNDAMENTOS DE INFORMTICA

Los operadores aritmticos bsicos son: + (suma), - (resta), * (multiplicacin), /


LABORATORIO 1 (divisin) y % (resto de la divisin entera). Hay que tener en cuenta que el operador / en C
realiza la divisin entera cuando ambos operandos son nmeros enteros y la divisin normal
OPERACIONES DE ENTRADA Y SALIDA cuando alguno de ellos es un nmero real.

4 EJERCICIOS
1 OBJETIVOS
4.1 Ejercicio 1 Aprendizaje del IDE para el lenguaje C/C++
Al finalizar esta actividad, sers capaz de:
Entender el funcionamiento del compilador.
4.1.1 Objetivo 1
Definir variables y efectuar asignaciones de valores con operaciones aritmticas
bsicas.
Familiarizarse con el manejo bsico del compilador.
Escribir un programa sencillo con entrada y salida de datos.
Crear un sistema de almacenamiento de datos para tus trabajos.
4.1.2 Enunciado 1

2 MOTIVACIN En este ejercicio el alumno debe abrir el IDE (de MS Visual Studio o Dev-C++) y
familiarizarse con los botones y reas de mayor uso de la pantalla principal. Para ello, leer
Para escribir cualquier programa vamos a tener que utilizar el compilador, conviene, por el manual e introducir los ejemplos que contiene.
tanto, conocer adecuadamente su funcionamiento.
4.1.3 Ayuda para el enunciado 1
En la resolucin de la mayora de los problemas tendremos que pedir datos al usuario para
realizar clculos u operaciones con ellos y mostrar resultados. La entrada y salida de datos Ver la imagen que aparece a continuacin y leer el anexo "Manual de Visual Studio para
ser, por tanto, una parte bsica de todos los programas que es imprescindible dominar. C/C++". La imagen muestra la pantalla principal del compilador y en el manual se resaltan
los objetos de mayor inters.
Conviene conocer adecuadamente los sistemas de almacenamiento del ordenador si
queremos poder recuperar nuestros programas o llevarlos a otro ordenador.

3 LAS VARIABLES, ENTRADAS, SALIDAS Y OPERACIONES EN C

Todos los datos de entrada, salida e intermedios de un programa tendrn que estar
almacenados en variables o constantes.
Recordamos que una variable no es ms que una parte reservada de la memoria a la cual
ponemos un nombre para poder utilizarla y que cambia su valor a lo largo del programa. La
manera de definirla es indicando el tipo y nombre seguido de punto y coma.
Ejemplo:
int num;
float altura;

Las constantes son objetos cuyo valor no cambia a lo largo del programa y se indican en la
parte de las directivas del preprocesador.
Ejemplo:
#define PI 3.1416

Para la salida de datos utilizaremos la sentencia printf con todos los argumentos necesarios.
Ejemplo:
printf("\nel valor de num es: %d y el de altura es: %.2f", num, altura);

Para la entrada de datos utilizaremos la sentencia scanf con sus argumentos necesarios.
Ejemplos:
scanf("%d", &num);
Figura 1. El entorno integrado de desarrollo MS Visual Studio 2010
scanf("%f", &altura);

Conchi Presedo Garca EUITI Bilbao 2015 1 Conchi Presedo Garca EUITI Bilbao 2015 2
LABORATORIO 1 FUNDAMENTOS DE INFORMTICA LABORATORIO 1 FUNDAMENTOS DE INFORMTICA

Ver la imagen que aparece a continuacin y leer el anexo "Manual de Dev-C++ para 4.2 Ejercicio 2 Clculo de la longitud y el rea dado un radio
C/C++". La imagen muestra la pantalla principal del compilador y en el manual se resaltan
los objetos de mayor inters. 4.2.1 Objetivo 2

Poner en prctica lo visto acerca del compilador as como la utilizacin de las


instrucciones de entrada/salida de datos utilizando una nica variable en cada
operacin.

4.2.2 Enunciado 2

Leer el radio de un crculo y calcular y mostrar su longitud y su rea.

Ejemplo de ejecucin:
CALCULO LONGITUD Y AREA DADO UN RADIO
(los datos tecleados por
el usuario estn en Introduce el radio: 3.1
cursiva y subrayados ) Longitud: 19.48
Area: 30.19
Presione una tecla para continuar . . .

4.2.3 Ayuda para el enunciado 2

En este caso y por ser el primer ejercicio se ofrece la solucin completa del enunciado. Se
tratar por tanto de copiarla utilizando el editor del compilador, compilar, ver que no da
errores, guardar y ejecutar el cdigo.

1 #include <stdlib.h>
2 #include <stdio.h> system("orden");
3 Pasa la orden indicada para que
4 #define PI 3.1416 sea ejecutada por el intrprete de
Figura 2. El entorno integrado de desarrollo Dev-C++ 5.7.1 5 comandos del entorno local, que en
el caso de Windows es MS-DOS.
6 int main(void)
7 {
Por ejemplo:
8 float radio,area,longitud;
system("PAUSE");
9 printf("Introduce el radio: ");
Se ejecuta la orden PAUSE de MS-
10 scanf("%f",&radio);
DOS, que deja en pausa la consola
11 longitud=2*PI*radio; hasta que pulsemos cualquier tecla
12 printf("Longitud: %.2f",longitud); y nos lo indica con el mensaje
13 area=PI*radio*radio; correspondiente "Presione una
tecla para continuar".
14 printf("\nArea: %.2f\n",area);
15 system("PAUSE");
16 }

Conchi Presedo Garca EUITI Bilbao 2015 3 Conchi Presedo Garca EUITI Bilbao 2015 4
LABORATORIO 1 FUNDAMENTOS DE INFORMTICA LABORATORIO 1 FUNDAMENTOS DE INFORMTICA

4.3 Ejercicio 3 Conversor de euros a pesetas 4.4 Ejercicio 4 Intercambio del contenido de dos variables

4.3.1 Objetivo 3 4.4.1 Objetivo 4

Realizar un programa con definiciones de variables y la entrada y salida de datos y


Realizar nuestro primer programa utilizando definiciones de variables, la entrada y utilizar las asignaciones de variables para resolver un problema concreto que implica
salida de datos y asignaciones de variables de modo correcto para realizar una la comprensin del funcionamiento de las variables e introduce el concepto de
conversin. variable auxiliar.
4.3.2 Enunciado 3
4.4.2 Enunciado 4
Escribir un programa que implemente una euro-calculadora. El programa pide un nmero en
euros y lo convierte a pesetas. Leer dos nmeros por teclado e intercambiar sus valores.
Utiliza el modelo anterior para solicitar euros en lugar de grados centgrados y asignar a una
variable llamada pesetas el valor correspondiente a la conversin utilizando la frmula NOTA: Es importante entender que cuando de dice intercambiar hay que MODIFICAR su
pesetas = euros*166.386 valor, y no solamente mostrar el mensaje indicando una variable y visualizando la otra.

Ejemplo de ejecucin: Ejemplo de


CONVERSOR DE EUROS A PESETAS INTERCAMBIO DEL CONTENIDO DE DOS VARIABLES.
ejecucin:
Introduce la cantidad en euros: 6 Introduce el valor de a: 7
La cantidad en pesetas equivalente es: 998 Introduce el valor de b: 3
Presione una tecla para continuar... Tras intercambiar los valores, a vale 3 y b vale 7.
Presione una tecla para continuar...

4.3.3 Ayuda para el enunciado 3


4.4.3 Ayuda para el enunciado 4
En el siguiente ejemplo se realiza la conversin de grados Centgrados a Fahrenheit
utilizando la frmula Fahrenheit = (9/5*Celsius)+32. Cuando cambiamos de valor una variable el valor anterior se pierde, es decir, que si yo
hago la asignacin a=b; la variable a pasa a valer lo que vala b pero si no he guardado el
valor de a antes sobre otra tercera variable auxiliar, perder su valor inicial.
1 #include <stdio.h>
2 #include <stdlib.h>
Si quiero intercambiar los valores de dos variables a y b los pasos sern por tanto:
3 /*Conversion de grados Centigrados a Fahrenheit*/
1. Pasar el valor de a a una variable auxiliar aux para guardar su contenido.
4 int main(void) 2. Machacar el contenido de a con lo que tiene b.
5 { 3. Modificar b con lo que tiene aux (que ser lo que tena a antes de cambiar su valor).
6 float gradosc, gradosf;
7 printf("Conversion de grados Centigrados a grados Fahrenheit\n"); 1 2
8 printf("Dame los grados Centigrados: ");
9 scanf("%f",&gradosc); aux a b
10 gradosf=(9.0/5.0*gradosc)+32.0;
11 printf("\nLos grados Fahrenheit son: %f",gradosf);
12 system("PAUSE"); 3
13 }

Conchi Presedo Garca EUITI Bilbao 2015 5 Conchi Presedo Garca EUITI Bilbao 2015 6
LABORATORIO 1 FUNDAMENTOS DE INFORMTICA LABORATORIO 1 FUNDAMENTOS DE INFORMTICA

4.5 Ejercicio 5 Clculo del sueldo en funcin del tipo de horas 4.6.2 Enunciado 6

Una empresa se encarga de la produccin de tres tipos de piezas P1, P2 y P3 y los tiempos
4.5.1 Objetivo 5
de produccin por pieza son de 3 horas para P1, 4 horas para P2 y 5 horas para P3.
Solicitar al usuario la cantidad de piezas de cada clase (x de P1, y de P2 y z de P3) y
Utilizar varios datos de entrada as como las constantes simblicas para efectuar un calcular cunto se tardar en la produccin, es decir, cuntas semanas, das y para qu
clculo. hora de la jornada laboral estar el pedido sabiendo que se trabaja de lunes a viernes y que
el horario de produccin de la empresa es continuo de 8:00 a 16:00.

4.5.2 Enunciado 5
NOTA: Utiliza la idea en el ejemplo de la ayuda para obtener las semanas, das, y horas
Realizar un programa que solicite dos datos: el nmero de horas extras y ordinarias restantes en el total de horas de produccin implicadas.
trabajadas por un empleado (sern enteros) y calcule cul es su sueldo total utilizando el
precio por hora de 40 y 20 euros la hora respectivamente.
Ejemplo de
CALCULO DESGLOSADO DEL TIEMPO DE PRODUCCION
ejecucin : Introduce el numero de piezas P1: 10
NOTA: Utiliza los defines de la ayuda.
Introduce el numero de piezas P2: 11
Introduce el numero de piezas P3: 12
Ejemplo de
El total de horas necesarias es: 134
ejecucin: CALCULO DEL SUELDO EN FUNCION DEL TIPO DE HORAS.
Introduce numero de horas ordinarias: 10 Teniendo en cuenta el horario de la empresa, si empezaran
Introduce numero de horas extra: 20 maniana a fabricar las piezas, acabarian despues de
3 semanas y 1 dias completos de trabajo,
De acuerdo con los datos introducidos el sueldo es: 1000 a las 14 horas del dia siguiente.
Presione una tecla para continuar...
Presione una tecla para continuar

4.5.3 Ayuda para el enunciado 5 4.6.3 Ayuda para el enunciado 6

Una constante simblica se define como un nombre que cuando es utilizado en el programa El siguiente ejemplo solicita un nmero de das e indica cuntas semanas completas y das
tiene un valor fijo. Podemos utilizarlo por ejemplo, para especificar lo que se pagar por restantes son. Por ejemplo, en 15 das hay 2 semanas completas y 1 da sobrante.
hora extra o por hora extraordinaria y luego en nuestro programa utilizamos el nombre para
calcular sueldos en base a las horas trabajadas y a estos precios por hora constantes para
todos los trabajadores: 1 #include <stdio.h>
2 #include <stdlib.h> dias
15 7 Das en
#define EXTRA 40 3 una
#define ORDINARIA 20 4 int main(void) 1 2 semana
5 {
6 int semanas,dias,rdias;
dias / 7
4.6 Ejercicio 6 Clculo desglosado del tiempo de produccin 7 printf("Numero de dias: ");
dias % 7
8 scanf("%d",&dias);
4.6.1 Objetivo 6 9 semanas = dias/7;
10 rdias = dias%7;
Realizar unos clculos ms complejos que en los casos anteriores que utilicen varias
variables e impliquen varias operaciones. 11 printf("\n %d dias son:\n %d semanas y %d dias \n",dias, semanas, rdias);
12 system("PAUSE");
13 }

Conchi Presedo Garca EUITI Bilbao 2015 7 Conchi Presedo Garca EUITI Bilbao 2015 8
LABORATORIO 2 FUNDAMENTOS DE INFORMTICA LABORATORIO 2 FUNDAMENTOS DE INFORMTICA

Las llaves { } en C sirven para delimitar un bloque de instrucciones y se pueden omitir


cuando un bloque consta de una nica lnea de cdigo fuente. As, seran igualmente vlidas
las dos expresiones siguientes:
LABORATORIO 2 if(a>5){ if(a>5)
b=a; b=a;
ESTRUCTURAS CONDICIONALES IF...ELSE }

Para expresar condiciones simples disponemos de los tpicos operadores de


1 OBJETIVOS comparacin, que en C son: >, >=, <, <=, == (igualdad) y != (desigualdad).

Al finalizar esta actividad, sers capaz de:


Para expresar condiciones de cierta complejidad, disponemos de los operadores lgicos,
Construir expresiones lgicas (condiciones) en lenguaje C.
los que utilizaremos en C son: && (Y lgico), || (O lgico) y ! (Negacin).
Identificar las distintas condiciones que aparecen en un programa, reconociendo si
son dependientes, y qu tipo de dependencia existe entre ellas.
Conocer las estructuras condicionales, distinguir entre sus distintas utilidades. 4 EJERCICIOS
Aplicar cada tipo de estructura condicional segn las necesidades del programa.
Disear la estructura lgica del programa en base a las expresiones construidas. 4.1 Ejercicio 1 Ejemplo de condiciones anidadas

2 MOTIVACION 4.1.1 Objetivo 1

La ejecucin secuencial de las instrucciones no es suficiente para poder informatizar Especificar condiciones simples y condiciones anidadas.
cualquier tipo de problema, sino que es necesario disponer de otras estructuras que nos
permitan canalizar el flujo de la informacin en el programa permitiendo que se puedan 4.1.2 Enunciado 1
realizar unas acciones u otras dependiendo del cumplimiento o no de una condicin.
Construir un programa que solicite por pantalla un nmero entero positivo y realice de
3 LA ESTRUCTURA CONDICIONAL EN C manera independiente los siguientes apartados:
a) Informe si es par o impar.
El ifelse en C b) Informe si es mltiplo de 3 no.
c) Si es par, informe adems si es mltiplo de 3 o no, y si es impar muestre si es
if (condicin){ mltiplo de 5 o no.
AccionesV
} else {
AccionesF Ejemplo de ejecucin:
}
(los datos tecleados por Introduce un numero entero (>0): 45
el usuario estn en
Si se cumple la condicin se realizan las AccionesV y sino se realizan las AccionesF.
cursiva y subrayados ) ********* Apartado a *****
La parte else siempre va unida a un if y se puede omitir si no hay que realizar ninguna 45 es impar
accin cuando no se cumpla la condicin.
********* Apartado b *****
Si tenemos varias condiciones excluyentes entre s podemos utilizar una variante de esta
instruccin: los bloques anidados else if. 45 es multiplo de 3

if (condicin1){ ********* Apartado c *****


Acciones a realizar si se cumple la condicin1
45 es impar y es multiplo de 5
} else if (condicin2){
Acciones a realizar si no se cumple la condicin1
pero s se cumple la condicin2
} else if (condicin3){
4.1.3 Ayuda para el enunciado 1
Acciones a realizar si no se cumple la condicin1 ni la condicin2
pero s se cumple la condicin3
Para saber si un nmero es mltiplo de otro se utiliza la operacin aritmtica %, que nos
}
calcula el resto de una divisin. As, dados dos nmeros enteros a y b si el resto de la
else {
Acciones a realizar si no se cumple ninguna de las condiciones divisin a%b es 0, podremos decir que a es mltiplo de b y que b es divisor de a.
anteriores
}
Conchi Presedo Garca EUITI Bilbao 2015 9 Conchi Presedo Garca EUITI Bilbao 2015 10
LABORATORIO 2 FUNDAMENTOS DE INFORMTICA LABORATORIO 2 FUNDAMENTOS DE INFORMTICA

4.2 Ejercicio 2 Validacin de la frmula NxOy


4.3.1 Objetivo 3
4.2.1 Objetivo 2
Aprender a especificar condiciones excluyentes entre s de manera eficiente.
Aprender a especificar de manera secuencial condiciones independientes entre s.
Aprender a identificar si se ha cumplido alguna de las condiciones. 4.3.2 Enunciado 3

4.2.2 Enunciado 2 Construir un programa que informe sobre las caractersticas de un tringulo. Para ello
pedir por pantalla las longitudes de los lados e indicar si el tringulo es equiltero,
Sabiendo que la valencia qumica del oxgeno es 2, y que la del nitrgeno es 1,3 y 5 para issceles o escaleno.
segn qu compuestos, se pide construir un programa que solicite los coeficientes x e y de
NxOy y compruebe si la frmula sera correcta o no especificando en qu coeficiente/s est Ejemplo de ejecucin:
el error. En la frmula, x son las posibles valencias del Oxgeno e y son las del Nitrgeno. Primer lado: 3.1
Segundo lado: 5.76
Pedir datos separados por comas: scanf(%d,%d,&x,&y); Tercer lado: 3.1
Triangulo ISOSCELES.
Ejemplos de
ejecucin: Dime los valores de x e y separados por una coma: 3 , 8 4.3.3 Ayuda para el enunciado 3
ERROR en coeficiente x. ERROR en coeficiente y.
Dime los valores de x e y separados por una coma: 2 , 5 Un tringulo es equiltero si todos sus lados son iguales, es issceles si dos lados son
iguales y el tercero distinto y es escaleno si sus tres lados son distintos.
La formula N2O5 es CORRECTA.
4.4 Ejercicio 4 Ordenacin de tres nmeros en descendente
4.2.3 Ayuda para el enunciado 2
4.4.1 Objetivo 4
Para poder mostrar un mensaje que especifique cada tipo de error debemos evaluar
sucesivamente (y de manera independiente) cada una de las condiciones de error. Aprender a especificar todos los casos posibles de manera eficiente.
Como mtodo general, se puede utilizar una variable (en el ejemplo hay_errores) que nos
indique si ha habido errores o no. Antes de empezar a evaluar las condiciones la variable 4.4.2 Enunciado 4
valdr 0 y en el momento que se produzca algn error su valor cambiar a 1.
Construir un programa que pida tres nmeros enteros y los escriba en orden descendente.
hay_errores=0; // 1. En principio NO HAY ERRORES
// 2. COMPROBAMOS SUCESIVAMENTE los distintos tipos de error Ejemplo de ejecucin:
// modificando el valor de hay_errores en cuanto se produzca alguno Dime el primer numero: 3
// Comprobamos primera condicin de error(condicin1) Dime el segundo numero: 5
if (condicin1){ Dime el tercer numero: 3
printf("Mensaje de ERROR en condicin1"); Los numeros en orden descendente son: 5, 3, 3
hay_errores=1;
} 4.4.3 Ayuda para el enunciado 4
// Comprobamos siguiente condicin de error(condicin2)
Los casos posibles suponiendo que n1, n2 y n3 son los tres nmeros introducidos son:
if (condicin2){
printf("Mensaje de ERROR en condicin2"); Nmeros pedidos n1 (primero) n2 (segundo) n3 (tercero)
hay_errores=1; Caso 1 mayor mediano menor
Caso 2 mayor menor mediano
}
Caso 3 mediano mayor menor
**** Y as hasta que no queden ms **** Caso 4 menor mayor mediano
// 3. SI NO HUBO ERRORES visualizamos mensaje que lo indique Caso 5 mediano menor mayor
Caso 6 menor mediano mayor
if(hay_errores= =0){
printf("Mensaje de TODO es CORRECTO"); } Tener en cuenta que los nmeros pueden ser iguales.

4.3 Ejercicio 3 Determinacin del tipo de un tringulo


Conchi Presedo Garca EUITI Bilbao 2015 11 Conchi Presedo Garca EUITI Bilbao 2015 12
LABORATORIO 2 FUNDAMENTOS DE INFORMTICA LABORATORIO 2 FUNDAMENTOS DE INFORMTICA

4.5 Ejercicio 5 Cuadrante al que pertenece un punto P(x,y) 4.6.3 Ayuda para el enunciado 6

4.5.1 Objetivo 5 Como ayuda, se da la solucin del caso en el que NO ESPECIFICAMOS qu TIPO DE ERROR
hay en la fecha, solamente indicamos "Error en la fecha" con lo cual, EN CUANTO
Seguir practicando con condiciones. ENCONTREMOS EL PRIMER ERROR el programa no sigue comprobando y TERMINA.
Mostrar la necesidad de alguna estructura que nos permita repetir instrucciones.
1 #include <stdlib.h>
4.5.2 Enunciado 5 2 #include <stdio.h>
3 2
3
Dada la funcin f(x)= x - 4x + x - 9 se pide construir un programa que pida DOS valores
4 /* Comprueba la validez de una fecha SIN ESPECIFICAR donde hay errores */
de x e indique para cada uno en qu cuadrante (primero, segundo, tercero o cuarto) se
encuentra el punto P(x,y), siendo y=f(x). 5 int main(void)
6 {
Ejemplo de 7 int dia,mes,anio; //Datos que se piden por teclado
ejecucin: Introducir primer valor para x: 3
8
El punto P(3.00,-15.00) se encuentra en el CUARTO cuadrante
9 printf("Introduce una fecha en formato dd/mm/aaaa: ");
Introducir segundo valor para x: -1.5
10 scanf("%d/%d/%d",&dia,&mes,&anio);
El punto P(-1.50,-22.88) se encuentra en el TERCER cuadrante
11
12 // Comprobamos ao, mes y da (entre 1 y 31)
4.5.3 Ayuda para el enunciado 5
13 if (error en ao || (error en mes) || (error en dia)){
Representar el clculo de f(x) a partir de x. Se puede usar la funcin pow(a,b) que 14 printf("\n\t\tERROR en la fecha.\n\n"); }
calcula ab donde a, b y el resultado son de tipo real (double) . Est en la librera 15 else{
math.h (por tanto deberemos poner al principio #include <math.h>).
16 // Aqu el ao y el mes son correctos y el da est entre 1 y 31
Primer cuadrante: Tanto x como y son positivos. Segundo: x negativo e y positivo.
Tercero: x e y negativos. Cuarto: x positivo e y negativo. 17 // Comprobamos el da segn el mes
Tener en cuenta que el punto resultante tambin puede estar en alguno de los ejes. 18 if(dia>30 && (el mes tiene 30 das)){
19 printf("\n\t\tERROR en la fecha.\n\n"); }
20 else{
4.6 Ejercicio 6 Validacin de una fecha 21 if(el mes es febrero){
22 if(dia>29){
4.6.1 Objetivo 6
23 printf("\n\t\tERROR en la fecha.\n\n"); }
Seguir practicando con condiciones dependientes ms complejas. 24 else {
Aprender la diferencia entre indicar que existe alguna condicin que no se cumple y 25 if(dia>28 && (el ao no es bisiesto)){
especificar exactamente qu condiciones se cumplen o no.
26 printf("\n\t\tERROR en la fecha.\n\n"); }
4.6.2 Enunciado 6 27 else {
28 printf("\n\t\tFecha CORRECTA.\n\n"); }}
Construir un programa que solicite una fecha (da, mes y ao) y compruebe si es una fecha 29 }else{
vlida, en cuyo caso mostrar el mensaje correspondiente. En caso contrario, presentar
30 // Es un mes de 31 das
textos indicativos de los errores.
NOTA: El programa deber indicar TODOS los errores que haya, en da, mes, ao o en el da 31 printf("\n\t\tFecha CORRECTA.\n\n");
respecto al mes. 32 } // Fin del else (lnea 29)
33 } // Fin del segundo else (lnea 20)
Ejemplos de Introduce una fecha en formato dd/mm/aaaa: 35/3/-2010 34 } // Fin del primer else (lnea 15)
ejecucin: ERROR en el anio. ERROR en el dia. 35 system("PAUSE");
Presione una tecla para continuar 36 }
Introduce una fecha en formato dd/mm/aaaa: 31/12/2000
Fecha CORRECTA. SIGUE LA AYUDA
Presione una tecla para continuar
Condiciones a considerar para comprobar si una fecha es correcta.

Conchi Presedo Garca EUITI Bilbao 2015 13 Conchi Presedo Garca EUITI Bilbao 2015 14
LABORATORIO 2 FUNDAMENTOS DE INFORMTICA LABORATORIO 2 FUNDAMENTOS DE INFORMTICA

El ao deber ser positivo. Si no lo es: "Error en el ao".


El nmero de mes deber ser vlido. Si no lo es: "Error en el mes". 4.8.1 Objetivo 8
El da deber estar comprendido entre 1 y 31. Si no lo es: "Error en el da".
Tambin habr que comprobar el da en funcin del mes. Si falla algo: "Error en el Construir secuencias de condiciones y condiciones anidadas ms complejas.
da respecto al mes".
o Meses de 30 das: 4, 6, 9 y 11. Resto excepto febrero: 31 das. 4.8.2 Enunciado 8
o Febrero: 28 29 dependiendo de si el ao es bisiesto o no. Un ao es bisiesto
si es mltiplo de 4 pero no de 100 bien si es mltiplo de 400. Construir un programa que pida dos duraciones (en formato hh:mm:ss) y muestre la
duracin total.
Se sugiere rellenar el programa poniendo las condiciones que aparecen subrayadas y Ejemplos:
despus de probar y entender el programa, modificarlo siguiendo la ayuda del enunciado 2
para que nos indique todos los errores. Entrada1 Entrada2 Duracin total
20:50:10 11:10:2 Suma 1 da y 08:00:12
10:50:30 13:9:30 Suma 1 da y 00:00:00
4.7 Ejercicio 7 Clculo del instante siguiente
10:30:30 10:30:30 Suma 21:01:00
4.7.1 Objetivo 7 10:40:30 10:30:30 Suma 21:11:00

Construir secuencias de condiciones y condiciones anidadas ms complejas.


As, si la primera duracin es de 20 horas, 50 minutos y 10 segundos y la segunda es de 11
4.7.2 Enunciado 7 horas, 10 minutos y 2 segundos la duracin total ser de un da (24 horas), 8 horas y 12
segundos.
Se ha de construir una aplicacin que acte como un reloj. Para ello se necesita un
programa que pida al usuario la hora en formato digital. Si la hora no es vlida deber
visualizarse un mensaje de error. Si la hora es vlida deber visualizarse la hora que sera Ejemplos de
en el segundo siguiente al tecleado. Ejemplos: ejecucin: Introduce una duracion en formato hh:mm:ss --> 20:50:10
Introduce otra duracion en formato hh:mm:ss --> 11:10:2
Entrada Salida
1. Pedir hora, minuto y segundo en La duracion total es 1 dia y 08:00:12
10:30:40 10:30:41 formato hh:mm:ss
10:59:10 10:59:11
10:30:59 10:31:00 scanf(%d:%d:%d,&hora,&min,&seg);
Introduce una duracion en formato hh:mm:ss --> 10:30:30
10:59:59 11:00:00
2. Visualizar rellenando con dos ceros Introduce otra duracion en formato hh:mm:ss --> 10:30:30
23:59:11 23:59:12 aunque las horas resultantes dn 0 5 La duracion total es 21:01:00
23:30:59 23:31:00 por ejemplo
23:59:59 00:00:00
printf(%02d,hora);
4.8.3 Ayuda para el enunciado 8

Ejemplos de Se debe realizar por separado la suma de cada componente de la duracin teniendo en
ejecucin: Introduce la hora en formato hh:mm:ss --> 10:65:00 cuenta que 60 segundos son un minuto, 60 minutos son una hora y 24 horas son un da.
ERROR!! La hora 10:65:00 no es correcta. Por ejemplo, si las dos duraciones introducidas son 20:50:10 y 11:10:2 haramos las
siguientes sumas 10+2=12 segundos, 50+10=60 minutos = 1 hora, 1+20+11=32 horas =
Introduce la hora en formato hh:mm:ss --> 10:35:00 un da completo ms 8 horas.
10:35:01
Determinar las reglas generales para la suma de las duraciones.
4.7.3 Ayuda para el enunciado 7 Determinar las excepciones. A partir de las excepciones, y tenindolas en cuenta,
plantear el esquema o lgica del programa.
Determinar las reglas generales para el instante siguiente (teniendo en cuenta que
60 segundos son un minuto y 60 minutos son una hora)
Determinar las excepciones. A partir de las excepciones, y tenindolas en cuenta,
plantear el esquema o lgica del programa.

4.8 Ejercicio 8 Clculo de la duracin total


Conchi Presedo Garca EUITI Bilbao 2015 15 Conchi Presedo Garca EUITI Bilbao 2015 16
LABORATORIO 3 FUNDAMENTOS DE INFORMTICA LABORATORIO 3 FUNDAMENTOS DE INFORMTICA

3.1.2 Enunciado

LABORATORIO 3 Realizar un programa en C que presente en pantalla los primeros n nmeros naturales. El
programa pide al usuario un nmero n las veces que sea necesario hasta que sea n1 y
ESTRUCTURAS REPETITIVAS - WHILE / DOWHILE n10. Cuando n sea correcto el programa visualiza los nmeros desde 1 hasta n.

3.1.3 Ayuda para el enunciado


1 OBJETIVOS
#include <stdio.h>
#include <stdlib.h>
Al finalizar esta actividad, sers capaz de:
Entender el funcionamiento de las estructuras iterativas en general; la(s) int main(void)
condicin(es) para finalizar, qu ha de ejecutarse en cada vuelta, la(s)
actualizacin(es) de las variables para que en alguna de las iteraciones se produzca {
la salida de la estructura iterativa, etc. int n, num;
Entender la diferencia existente entre utilizar un while o un dowhile.
do{
2 MOTIVACIN printf("\nIntroduce un numero entre 1 y 10: ");
scanf("%d", &n);
La iteracin es una estructura bsica de casi todos los lenguajes de programacin. Nos if (n < 1 || n > 10){
permite resolver programas complejos a travs de la repeticin de acciones ms sencillas. printf("\nERROR. El numero no es adecuado.\n");
}
3 LA ITERACIN EN C UTILIZANDO WHILE DOWHILE }while(n < 1 || n > 10);

num = 1; /* p.q. en la primera vuelta del while


El while en C
queremos visualizar el 1 */
while (num <= n){
inicializacin de las variables que forman parte de la condicin printf("\n%d", num);
while (condicin) num = num + 1; /* incrementamos el valor de num
{ para que en la siguiente
Conjunto de instrucciones que han de repetirse incluyendo la vuelta del while valga uno ms */
actualizacin de las variables de la condicin } /* fin del while,
} es decir final de las acciones a repetir*/

system("PAUSE");
Mientras la condicin sea cierta ejecuta una y otra vez las instrucciones que }
aparecen entre llaves

El dowhile en C 4 EJERCICIOS
Si es necesario, inicializacin de las variables de la condicin
4.1 Ejercicio 1 Clculo de todos los divisores de un nmero
do {
Conjunto de instrucciones que han de repetirse incluyendo la
actualizacin de las variables de la condicin 4.1.1 Objetivo 1
}while (condicin);
Experimentar con soluciones de fuerza bruta.

Ejecuta una vez las instrucciones que aparecen entre llaves y luego mientras la 4.1.2 Enunciado 1
condicin sea cierta las ejecuta una y otra vez.
Pedir un nmero entero al usuario y determinar cules son sus divisores.

3.1 Ejercicio Ejemplo de while y dowhile Ejemplo de ejecucin:


(los datos tecleados por Dime un numero: 14
3.1.1 Objetivo el usuario estn en Los divisores de 14 son: 14 7 2 1
cursiva y subrayados )
Entender el funcionamiento de las estructuras while y dowhile.

Conchi Presedo Garca EUITI Bilbao 2015 17 Conchi Presedo Garca EUITI Bilbao 2015 18
LABORATORIO 3 FUNDAMENTOS DE INFORMTICA LABORATORIO 3 FUNDAMENTOS DE INFORMTICA

4.1.3 Ayuda para el enunciado 1 4.3.2 Enunciado 3

Resolver un problema mediante fuerza bruta consiste en generar todas las posibilidades Hacer un programa que pida un nmero entero al usuario, determine si el nmero es primo
(en este ejercicio consiste en presuponer que todo numero <= n es en principio un posible o no, y despus le pregunte si quiere seguir introduciendo ms nmeros de forma que se le
divisor), filtrando (o visualizando en este caso) las que nos interesan (es decir los que sean vayan pidiendo nmeros mientras el usuario responda afirmativamente (s S).
divisores).
Para descubrir los divisores de un nmero n generaremos todos los enteros de 1 a n y por Ejemplo de ejecucin:
cada uno comprobaremos si es divisor del nmero que nos dan. Introduce un numero: 5
Utilizar el ejemplo inicial para ir obteniendo los nmeros. La diferencia consistir en que por El numero 5 es PRIMO.
cada nmero que se genere (en cada vuelta del while se generar uno), tendremos que Quieres probar un nuevo numero (s/n): S
decidir si es divisor o no. Para saber si un nmero es divisor de otro se utiliza la operacin Introduce un numero: 6
El numero 6 NO es PRIMO.
aritmtica %, que nos calcula el resto de una divisin. As, si a%b==0, entonces podremos
Quieres probar un nuevo numero (s/n): n
decir que b es divisor de a.

NOTA: Una versin ms eficiente del ejercicio comprobara slo los nmeros de 1 a n/2. 4.3.3 Ayuda para el enunciado 3

Para pedir un carcter (declarado como char car): fflush(stdin);


4.2 Ejercicio 2 Validacin de un posible nmero primo scanf(%c,&car);

4.2.1 Objetivo 2 Para el lenguaje C una s es una variable. Si queremos referirnos a la letra s deberemos
escribirla entre comillas simples s.
Introducir el concepto de flag (bandera o chivato). No es lo mismo s que S. Hay que considerar las dos posibilidades, o bien pasar la letra
tecleada a minsculas utilizando la funcin tolower(car) que est en la librera ctype.h.
4.2.2 Enunciado 2 Utilizar el ejemplo anterior para decidir si el nmero es primo.

Hacer un programa en el que el usuario introduzca un nmero y determine si es primo o no.


4.4 Ejercicio 4 Validacin de un posible nmero capica
Ejemplos de ejecucin:
Introduce un numero: 5 Introduce un numero: 6
El numero 5 es PRIMO. El numero 6 NO es PRIMO. 4.4.1 Objetivo 4

Aprender a desglosar un nmero entero en sus distintas cifras (a travs de la


iteracin).
4.2.3 Ayuda para el enunciado 2
4.4.2 Enunciado 4
Un nmero es primo cuando slo es divisible por s mismo y por la unidad.
Para descubrir si un nmero es primo generamos todos los nmeros desde el 2 a n-1 y por Pedir un nmero entero num al usuario y determinar si es capica.
cada nmero generado comprobamos si es divisor del nmero que nos dan. Si en ese rango
[2,n-1] existe algn divisor, entonces el nmero no es primo.
Ejemplos de
Una manera de detectar si existe algn divisor es utilizar una variable que solo toma dos ejecucin: Introduce un numero: 1221 Introduce un numero: 1327
valores (flag) y que podemos llamar es_primo, de manera que ANTES de empezar a evaluar El numero 1221 es CAPICUA. El numero 1327 NO es CAPICUA.
los divisores valga 1 y CUANDO ENCONTREMOS algn divisor le cambiamos el valor a 0.
Se puede utilizar el ejercicio anterior para ir generando los posibles divisores.
4.4.3 Ayuda para el enunciado 4
NOTA: Existen versiones ms eficientes para solucionar este ejercicio, por ejemplo, dejar de
generar y comprobar posibles divisores en cuanto encontremos el primer divisor. Pasos para decidir si un nmero num es capica:
Ir consiguiendo las cifras que forman el nmero - num - para al mismo tiempo construir el
4.3 Ejercicio 3 Validacin de varios nmeros primos nmero dado la vuelta - num_vuelto -. As finalmente sabremos si el nmero inicial es
capica comparando si el nmero inicial y num_vuelto SON IGUALES.
4.3.1 Objetivo 3

Aprender a diferenciar las estructuras while y dowhile.

Conchi Presedo Garca EUITI Bilbao 2015 19 Conchi Presedo Garca EUITI Bilbao 2015 20
LABORATORIO 3 FUNDAMENTOS DE INFORMTICA LABORATORIO 3 FUNDAMENTOS DE INFORMTICA

Para conseguir las distintas cifras del nmero num (1327 en este ejemplo) se realizan 4.5.3 Ayuda para el enunciado 5
divisiones sucesivas entre 10:
El mayor (menor) valor de una secuencia de nmeros se puede ir obteniendo a medida que
Valor INICIAL se van leyendo los nmeros, aplazando el resultado hasta que se hayan ledo todos los
PASO de una divisin a la valores.
dividendo 1327 10 siguiente: Para ello, utilizaremos una variable que almacene el mximo (mnimo) valor que se haya
7 132 10 El cociente de cada divisin es encontrado HASTA EL MOMENTO. Una variable que podramos llamar max (min). El valor
el dividendo de la siguiente. inicial para esta variable ser el primer nmero ledo.
2 13 10
Utilizando el ejemplo del enunciado:
3 1 10 Num introducido num>max max
5 5
1 0 valor FINAL dividendo 10 V 10
2 F
Fijarse que en cada divisin la cifra se obtiene en el resto de la divisin. -15 F
2000 V 2000
Por otra parte, num_vuelto se forma cogiendo los restos de cada divisin y acumulndolos: 8 F
0 * 10 + 7 = 7 9 F
7 * 10 + 2 = 72 0 Fin
72 * 10 + 3 = 723
723 * 10 + 1 = 7231
con la ltima divisin obtenemos el nmero dado la vuelta y es 7231.

Como 13277231 el nmero 1327 no es capica.

Recordar que la operacin n/10 no modifica la variable n a no ser que explcitamente as lo


decidamos (comparar a=n/10 con n=n/10).

4.5 Ejercicio 5 Clculo del mayor valor introducido

4.5.1 Objetivo 5

Aprender a calcular el mximo o mnimo de una secuencia de valores.

4.5.2 Enunciado 5

Hacer un programa que permita que el usuario vaya introduciendo nmeros (cuando el
usuario introduzca un 0 el programa acabar). Nuestro programa deber mostrar el nmero
mximo de entre los nmeros distintos de 0 tecleados por el usuario.

Ejemplo de ejecucin:
Introduce un numero entero (0 para finalizar): 5
Introduce un numero entero (0 para finalizar): 10
Introduce un numero entero (0 para finalizar): 2
Introduce un numero entero (0 para finalizar): -15
Introduce un numero entero (0 para finalizar): 2000
Introduce un numero entero (0 para finalizar): 8
Introduce un numero entero (0 para finalizar): 9
Introduce un numero entero (0 para finalizar): 0

El MAYOR NUMERO introducido ha sido 2000.

Conchi Presedo Garca EUITI Bilbao 2015 21 Conchi Presedo Garca EUITI Bilbao 2015 22
LABORATORIO 4 FUNDAMENTOS DE INFORMTICA LABORATORIO 4 FUNDAMENTOS DE INFORMTICA

El programa debe comprobar que el nmero introducido est entre 1 y 10, es decir, debe
pedir nmeros al usuario mientras no lo est. Adems, cada vez que el nmero no sea
adecuado debe mostrar un mensaje de error que lo indique.
LABORATORIO 4
Ejemplo de ejecucin:
ESTRUCTURAS REPETITIVAS - FOR (los datos tecleados por Introduce un numero entre 1 y 10: 14
el usuario estn en ERROR. El numero no es adecuado.
cursiva y subrayados ) Introduce un numero entre 1 y 10: 0
ERROR. El numero no es adecuado.
1 OBJETIVOS Introduce un numero entre 1 y 10: 3

Al finalizar esta actividad, sers capaz de: *


Entender los bucles anidados; Apreciars las ventajas de utilizar un for para aquellos *
casos en los que sabemos el nmero de vueltas que vamos a dar. * (tantas filas como n)
Entender la diferencia existente entre utilizar un while, un dowhile, y un for.
Presione una tecla para continuar
2 MOTIVACIN

La sintaxis del for nos resulta mucho ms cmoda en algunos casos ya que se escriben la
3.1.3 Ayuda para el enunciado
inicializacin, la condicin de final y las actualizaciones en una misma lnea de cdigo.
Vamos a mostrar 2 soluciones. La primera con un while y la segunda con un for.
3 LA ITERACIN EN C UTILIZANDO FOR

/* ----------------------- SOLUCION CON while ------------------- */


El for en C
for (inicializacin; condicin; actualizacin) #include <stdio.h>
{ #include <stdlib.h>
Conjunto de instrucciones que han de repetirse
} int main(void)
{
Equivale al siguiente while int n, fila;

inicializacin ; /* Pedimos n hasta que est entre 1 y 10 */


while (condicin) do{
{ printf("\nIntroduce un numero entre 1 y 10: ");
scanf("%d", &n);
Conjunto de instrucciones que han de repetirse
if((n < 1)||(n > 10)){
printf("\nERROR. El numero no es adecuado.\n"); }
actualizacin; } while((n < 1)||(n > 10));
}
/* Visualizamos los asteriscos */
fila = 1; /* p.q. en la primera vuelta del while
queremos imprimir la fila 1 */
3.1 Ejercicio Ejemplo de for while (fila <= n){
printf("*");
3.1.1 Objetivo printf("\n");
fila = fila + 1; /* incrementamos el valor de fila
Entender el funcionamiento de la estructura for. para que en la siguiente
vuelta del while valga uno ms */
} /* fin del while, es decir final de las acciones a repetir*/
3.1.2 Enunciado
system("PAUSE");
Realizar un programa en C que pida al usuario un nmero entero n perteneciente al rango }
[1,10] hasta que sea correcto y visualice en pantalla n asteriscos exactamente como
aparecen en el ejemplo de ejecucin.

Conchi Presedo Garca EUITI Bilbao 2015 23 Conchi Presedo Garca EUITI Bilbao 2015 24
LABORATORIO 4 FUNDAMENTOS DE INFORMTICA LABORATORIO 4 FUNDAMENTOS DE INFORMTICA

/* ------------------------ SOLUCION CON for -----------------------*/ 4.1.3 Ayuda para el enunciado 1

#include <stdio.h>
#include <stdlib.h> Podemos tomar como base el ejercicio ejemplo, pero esta vez como por cada fila no
deberemos dibujar slo un asterisco sino varios, deberemos utilizar OTRO bucle adicional
int main(void) para escribir POR CADA LNEA tantos asteriscos como sea necesario.
{
int n, fila; #include <stdio.h>
#include <stdlib.h>
/* Pedimos n hasta que est entre 1 y 10 */
do{ int main(void)
printf("\nIntroduce un numero entre 1 y 10: "); {
scanf("%d", &n); int n, fila;
if((n < 1)||(n > 10)){
printf("\nERROR. El numero no es adecuado.\n"); } do{
} while((n < 1)||(n > 10)); printf("\nIntroduce un numero entre 1 y 10: ");
scanf("%d", &n);
/* Visualizamos los asteriscos */ if((n < 1)||(n > 10)){
for(fila = 1; fila <= n; fila = fila + 1){
printf("\nERROR. El numero no es adecuado."); }
printf("*"); } while((n < 1)||(n > 10));
printf("\n");
}/* final del for*/
for(fila = 1; fila <= n; fila = fila + 1){

system("PAUSE"); for (?????){


} printf("*");
.
}/* el final del for */
......
4 EJERCICIOS }/* el final del for de fila */

4.1 Ejercicio 1 Visualizacin de asteriscos en tringulo


system("PAUSE");
4.1.1 Objetivo 1 }

Aprender a utilizar estructuras for anidadas.

4.1.2 Enunciado 1 4.2 Ejercicio 2 Visualizacin de nmeros en tringulo

Pedir al usuario un nmero entero n perteneciente al rango [1,10] hasta que sea correcto y 4.2.1 Objetivo 2
visualizar en pantalla el dibujo del ejemplo.
Seguir practicando con las estructuras for anidadas.
Ejemplo de ejecucin:
4.2.2 Enunciado 2
(los datos tecleados por Introduce un numero entre 1 y 10: 14
el usuario estn en ERROR. El numero no es adecuado.
Introduce un numero entre 1 y 10: 0 Pedir al usuario un nmero entero n perteneciente al rango [1,10] hasta que sea correcto y
cursiva y subrayados )
ERROR. El numero no es adecuado. visualizar en pantalla el dibujo del ejemplo.
Introduce un numero entre 1 y 10: 3
Ejemplo de ejecucin:
* Introduce un numero entre 1 y 10: 14
** ERROR. El numero no es adecuado.
*** (tantas filas como n) Introduce un numero entre 1 y 10: 3

Presione una tecla para continuar 1


1 2
1 2 3 (tantas filas como n)

Conchi Presedo Garca EUITI Bilbao 2015 25 Conchi Presedo Garca EUITI Bilbao 2015 26
LABORATORIO 4 FUNDAMENTOS DE INFORMTICA LABORATORIO 4 FUNDAMENTOS DE INFORMTICA

4.2.3 Ayuda para el enunciado 2

En este caso queremos escribir nmeros as que Usaremos printf("*"); ?

4.3 Ejercicio 3 Visualizacin de factoriales

4.3.1 Objetivo 3

Aprender a distinguir en qu casos la instruccin for no es la ms adecuada.

4.3.2 Enunciado 3

Mostrar los factoriales de los nmeros que se van introduciendo por pantalla. Pedir cada
dato hasta que sea correcto, es decir, nmero 0 y respuesta s n.

Ejemplo de ejecucin:
Introduce un numero entero: 0
0!=1
Deseas calcular mas factoriales (s/n)? s
Introduce un numero entero: 5
5!=120
Deseas calcular mas factoriales (s/n)? n

4.3.3 Ayuda para el enunciado 3

El factorial n! de un entero no negativo n viene dado por el producto 1*2*3*(n-1)*n.


Caso especial: El factorial de 0 es 1.
Nos harn falta dos bucles anidados, pero podrn ser 2 for?

4.4 Ejercicio 4 Visualizacin de trminos y suma de una serie

4.4.1 Objetivo 4

Aprender a utilizar estructuras for para programar sumatorios.

4.4.2 Enunciado 4
n
Calcular la suma de los 10 primeros trminos de la serie i / 2
i 1
i
, mostrando en pantalla

tanto los trminos a sumar como el resultado de la misma.

Ejemplo de
ejecucin: La suma a realizar es: 1/2 + 2/4 + 3/8 + 4/16 + 5/32
+ 6/64 + 7/128 + 8/256 + 9/512 + 10/1024
Resultado: 1.988281

4.4.3 Ayuda para el enunciado 4

En este caso no se debe pedir ningn dato al usuario.

Conchi Presedo Garca EUITI Bilbao 2015 27 Conchi Presedo Garca EUITI Bilbao 2015 28
LABORATORIO 5 FUNDAMENTOS DE INFORMTICA LABORATORIO 5 FUNDAMENTOS DE INFORMTICA

3.1 Ejercicio Ejemplo de funciones

LABORATORIO 5 3.1.1 Objetivo

FUNCIONES PARTE I Mostrar cmo se utilizan las funciones predefinidas.


Mostrar cmo se definen funciones nuevas y cmo se utilizan en la funcin main.

1 OBJETIVOS
3.1.2 Enunciado
Al finalizar esta actividad, sers capaz de:
Programa que pide al usuario dos nmeros enteros mayores o iguales que 0 y calcula el
Utilizar funciones predefinidas en la funcin main.
factorial de cada uno de ellos, los muestra y, a continuacin, si la raz cuadrada del primer
Entender que es posible aislar subtareas dentro de un programa y que es posible
factorial partido por el segundo es mayor o igual que 1, calcula y muestra el primer factorial
definir funciones nuevas que realizan esas subtareas.
elevado al segundo y si no, el segundo elevado al primero. Al pedir los datos iniciales, se ha
Definir nuevas funciones y utilizarlas dentro de la funcin main.
de repetir el proceso de peticin de cada nmero hasta que sea >=0.

2 MOTIVACIN Funciones propias a definir y utilizar:

Muchas veces una misma subtarea es realizada varias veces dentro de un programa o pedir_numero_mayor: funcin que, dado un nmero entero z, pide al usuario que
aparece en distintos programas. Aislar esa subtarea y definir una funcin que la resuelve teclee un nmero mayor que z. El proceso se ha de repetir hasta obtener un nmero
hace posible que no haya que escribir todas sus instrucciones cada vez que se que vaya a que cumpla dicha condicin, en este momento devolver el nmero tecleado.
realizarla, ya que bastar con escribir la funcin una vez y llamarla todas las veces que sea
necesario. calcular_factorial: funcin que, a partir de un nmero entero x mayor o igual que
Aislar subproblemas y resolverlos de manera independiente, definiendo funciones, posibilita cero, calcula y devuelve el factorial de x.
estructurar los programas haciendo que stos sean ms claros y fciles de seguir.
mostrar_factorial: funcin que, dados un nmero entero x ( 0) y su factorial f,
3 LAS FUNCIONES EN C muestra un mensaje por pantalla indicando que el factorial de x es f.

Por una parte C dispone de FUNCIONES PREDEFINIDAS. Por ejemplo, en la librera


math.h hay funciones matemticas que sirven para calcular la potencia, pow(x, y), la raz 3.1.3 Solucin ejemplo
cuadrada, sqrt(x) y el valor absoluto, fabs(x).
#include <stdlib.h>
Por otra parte, el programador puede definir FUNCIONES PROPIAS y utilizarlas. Para #include <stdio.h>
definir una funcin hay que indicar adems de sus instrucciones cul es el tipo del #include <math.h> // Para las funciones predefinidas sqrt y pow
resultado, el nombre de la funcin y el tipo y nombre de los argumentos.
Si la funcin no devuelve ningn resultado habr que poner la palabra void en /** PROTOTIPOS de las FUNCIONES que utiliza el programa **/
el lugar correspondiente al tipo del resultado. int pedir_numero_mayor(int z);
Para definir nuestras funciones en el programa, una opcin es poner el prototipo de long calcular_factorial(int x);
cada funcin antes del main y las definiciones de las funciones despus de la void mostrar_factorial(int x, long f);
funcin main.
/** FUNCION principal o MAIN **/
/* Datos externos: Pide dos enteros n1 y n2 que sean >= 0. */
Por tanto, los programas podrn constar de varias funciones. La funcin main /* Proceso: Calcula y muestra por pantalla los factoriales de n1
estar siempre y adems estarn las funciones que definamos. y n2. Si la raz cuadrada del primer factorial partido por el segundo
factorial es mayor o igual que 1, calcula y muestra el primero de esos
El ordenador ejecuta siempre la funcin main y si desde la funcin main se llama a factoriales elevado al segundo y en caso contrario, el segundo elevado
otra funcin entonces se ejecutan las instrucciones correspondientes a esa funcin pero al primero. */
teniendo en cuenta los argumentos que se le han pasado en la llamada. /* Variables: - n1, n2: Guarda los dos enteros que da el usuario.
- f1, f2: Guarda los factoriales de n1 y n2. */
Una funcin puede realizar todo tipo de tareas, por ejemplo:
Realizar clculos y devolver un resultado. int main(void)
Realizar clculos y mostrar resultados por pantalla. {
Pedir datos al usuario. int n1, n2;
Mostrar resultados. long f1, f2;
Llamar a otras funciones para que stas a su vez realicen subclculos. n1 = pedir_numero_mayor(-1);/* se pide un nmero >= 0 */
n2 = pedir_numero_mayor(-1);

Conchi Presedo Garca EUITI Bilbao 2015 29 Conchi Presedo Garca EUITI Bilbao 2015 30
LABORATORIO 5 FUNDAMENTOS DE INFORMTICA LABORATORIO 5 FUNDAMENTOS DE INFORMTICA

f1 = calcular_factorial(n1); 4 EJERCICIOS
f2 = calcular_factorial(n2);
mostrar_factorial(n1, f1);
mostrar_factorial(n2, f2); 4.1 Ejercicio 1 Elevar un nmero a otro hasta que alguno sea negativo
if ( sqrt(f1/f2) >= 1)
{ 4.1.1 Objetivo 1
printf("\nPrimer factorial elevado al segundo: %.0f", pow(f1,f2));
} Aprender a utilizar funciones predefinidas.
else
{
4.1.2 Enunciado 1
printf("\nSegundo factorial elevado al primero: %.0f", pow(f2,f1));
}
printf("\n\n"); Escribir un programa que vaya pidiendo nmeros enteros de dos en dos y calculando y
system("PAUSE"); /* Espera hasta que pulsemos una tecla */ mostrando el resultado que se obtiene al elevar el primero por el segundo en cada caso. El
} /* Fin de la funcin main */ proceso terminar cuando alguno de los nmeros introducidos sea menor o igual que 0.

Para realizar este ejercicio no crearemos ninguna funcin propia, nos limitaremos a
/** DEFINICIONES de las FUNCIONES utilizadas **/ utilizar la funcin pow explicada en la ayuda.

int pedir_numero_mayor(int z)
{ Ejemplo de
/* Pide al usuario un nmero entero mayor que z repitiendo el ejecucin: Introduce dos enteros (> 0) separados por una coma: 3, 2
proceso hasta obtener uno que lo sea. Cuando obtenga un nmero que (los datos tecleados 3 elevado a 2 es 9
cumpla esa condicin lo devolver como resultado. */ Introduce dos enteros (> 0) separados por una coma: 2, 10
por el usuario estn
int num; /* para guardar el nmero tecleado por el usuario. */ 2 elevado a 10 es 1024
en cursiva y
do Introduce dos enteros (> 0) separados por una coma: -5, 30
{ subrayados )
printf("\nIntroduce un numero entero mayor que %d: ", z);
scanf("%d", &num);
if (num <= z) 4.1.3 Ayuda para el enunciado 1
{
printf("\nEl numero introducido no es adecuado."); La funcin matemtica predefinida pow(x, y) calcula xy. La funcin pow est definida de
} forma general, por lo que tanto x como y pueden ser nmeros reales (tipo double) con lo
} while (num <= z); que el resultado tambin puede ser un nmero real y est definido como tal (tipo double).
return(num); Se encuentra en la librera math.h de C.
} /* Fin de la funcin pedir_numero_mayor */

long calcular_factorial(int x)
{
/* Dado un entero x >= 0, calcula y devuelve su factorial. */ 4.2 Ejercicio 2 Clculo de los nmeros perfectos menores que n

long f; 4.2.1 Objetivo 2


int num;
f =1; Aprender a definir funciones propias y utilizarlas en la funcin main:
for (num = 2; num <= x; num = num + 1) La primera pedir al usuario un dato teniendo en cuenta el argumento que se le
{
pasa.
f =f * num;
La segunda realizar un clculo a partir del argumento que se le pasa y devolver
}
return(f); un resultado para que sea utilizado en la funcin main.
} /* Fin de la funcin calcular_factorial */ La tercera mostrar un mensaje por pantalla teniendo en cuenta los argumentos
que se le pasarn.
void mostrar_factorial(int x, long f)
{ 4.2.2 Enunciado 2
/* Muestra un mensaje indicando que f es el factorial de x. */
printf("\nEl factorial de %d es %ld.", x, f); Escribir un programa que pida al usuario un nmero entero y positivo n (> 0) y calcule los
} /* Fin de la funcin mostrar_factorial*/ nmeros perfectos menores que n. A la hora de obtener el valor n habr que repetir el
proceso de peticin hasta obtener un nmero que cumpla el requisito mencionado.

Conchi Presedo Garca EUITI Bilbao 2015 31 Conchi Presedo Garca EUITI Bilbao 2015 32
LABORATORIO 5 FUNDAMENTOS DE INFORMTICA LABORATORIO 5 FUNDAMENTOS DE INFORMTICA

Un nmero entero x mayor que 0 es perfecto si la suma de sus divisores (sin tener en Hay que definir y utilizar las mismas funciones que en el ejercicio anterior.
cuenta el propio x) es x. Como ejemplos, 6 es perfecto y 12 no lo es.

Hay que definir y utilizar las siguientes funciones: Ejemplo de ejecucin:


Introduce un numero entero > 0: -4
pedir_numero_mayor: funcin que, dado un nmero entero z, pide al usuario que El dato introducido no es correcto.
teclee un nmero mayor que z. El proceso se ha de repetir hasta obtener un nmero Introduce un numero entero > 0: 2
que cumpla dicha condicin, en este momento devolver el nmero tecleado. 6 es perfecto.
28 es perfecto.
es_perfecto: funcin que, dado un nmero entero x (> 0), decide si es perfecto o
no. Si x es perfecto, la funcin devolver un 1 y si no devolver un 0.
4.3.3 Ayuda para el enunciado 3
mostrar_perfecto: funcin que, dados un nmero entero x (> 0) y el valor p (que
ha de ser 1 0), si p es 1 muestra un mensaje por pantalla indicando que x es Para localizar los primeros n nmeros perfectos habr que empezar a pasar los nmeros de
perfecto y si p es 0, muestra un mensaje por pantalla indicando que x no es
uno en uno a partir del 1 e ir comprobando en cada caso si es perfecto o no, llamando para
perfecto.
ello a la funcin es_perfecto. Se continuar hasta haber encontrado n nmeros perfectos.

Ejemplo de ejecucin:
Introduce un numero entero > 0: -4
El dato introducido no es correcto. 4.4 Ejercicio 4 Clculo de nmeros medios consecutivos
Introduce un numero entero > 0: 40
6 es perfecto. 4.4.1 Objetivo 4
28 es perfecto.
Definir dos funciones nuevas y utilizarlas en la funcin main.

4.2.3 Ayuda para el enunciado 2 4.4.2 Enunciado 4

Para decidir si un nmero es perfecto habr que partir desde 1 e ir pasando los nmeros de Escribir un programa que muestre al usuario el primer nmero medio y a continuacin le
uno en uno e ir calculando la suma de los que sean divisores. Si al final la suma es igual al pregunte si quiere el siguiente. Si el usuario responde que s ('s'), el programa ha de
nmero dado, el nmero es perfecto y si no, no es perfecto. Ejemplos de nmeros perfectos calcular y mostrar el siguiente nmero medio y ha de volver a preguntar al usuario si quiere
y no perfectos: el siguiente. El proceso se repetir hasta que el usuario responda que no ('n'). Cada vez que
6 es perfecto porque 1 + 2 + 3 = 6 el usuario tenga que responder con una 's' o una 'n', no se admitir ninguna otra respuesta,
28 es perfecto porque 1 + 2 + 4 + 7 + 14 = 28 repitiendo la pregunta hasta obtener uno de esos dos caracteres.
12 no es perfecto porque 1 + 2 + 3 + 4 + 6 12
Un nmero entero x mayor o igual que 1 es un nmero medio si la suma de sus
Para localizar los nmeros perfectos menores que n habr que empezar a pasar los nmeros predecesores (1 + 2 + 3 + + x-1) se puede obtener tambin sumando algunos
de uno en uno a partir del 1 e ir comprobando en cada caso si es perfecto o no, llamando nmeros contiguos que le siguen. Ejemplos de nmeros medios y no medios:
para ello a la funcin es_perfecto. Se continuar hasta llegar al nmero n. 6 es medio porque 1 + 2 + 3 + 4 + 5 = 15 y 7 + 8 = 15. Es decir, la suma de los
predecesores de 6 es obtenible sumando algunos sucesores contiguos de 6.
35 es medio porque 1 + 2 +...+ 34 = 595 y 36 + 37 ++ 49 = 595 Es decir, la
suma de los predecesores de 35 es obtenible sumando algunos sucesores contiguos
4.3 Ejercicio 3 Clculo de los primeros n nmeros perfectos de 35.
7 no es medio porque 1 + 2 + 3 + 4 + 5 + 6 = 21 y no se puede obtener 21
4.3.1 Objetivo 3 sumando nmeros contiguos a partir de 8: 8 21, 8 + 9 21, 8 + 9 + 10 21,
etc. Adems 8 + 9 + 10 es mayor que 21 y por tanto ya se sabe que ninguna otra
Reutilizar funciones definidas con anterioridad para resolver un problema distinto suma superior dar 21.
pero que comparte algunos subproblemas con otro que ya se resolvi.
Hay que definir y utilizar las siguientes funciones:
4.3.2 Enunciado 3
es_medio: funcin que, dado un nmero entero x ( 1), decide si es medio o no. Si
Escribir un programa que pida al usuario un nmero entero y positivo n (> 0) y calcule los x es medio, la funcin devolver un 1 y si no devolver un 0.
primeros n nmeros perfectos. A la hora de pedir el valor n habr que repetir el proceso
de peticin hasta obtener un nmero que cumpla el requisito mencionado.

Conchi Presedo Garca EUITI Bilbao 2015 33 Conchi Presedo Garca EUITI Bilbao 2015 34
LABORATORIO 5 FUNDAMENTOS DE INFORMTICA LABORATORIO 5 FUNDAMENTOS DE INFORMTICA

preguntar_otro_medio: funcin que pregunta al usuario si desea otro nmero Hay que definir y utilizar las siguientes funciones:
medio o no. El proceso se ha de repetir hasta obtener una 's' o una 'n'; en ese
momento la funcin devolver la 's' o la 'n' tecleada. pedir_numero_mayor: funcin que, dado un nmero entero z, pide al usuario que
teclee un nmero mayor que z. El proceso se ha de repetir hasta obtener un nmero
que cumpla dicha condicin, en este momento devolver el nmero tecleado.

Ejemplo de ejecucin: calcular_fibonacci: funcin que, dado un nmero entero x (0), calcula y devuelve
El primer numero medio es: 6
el Fibonacci de x.
Quieres el siguiente numero medio?(s/n): q
El dato introducido no es adecuado.
Quieres el siguiente numero medio?(s/n): s
El siguiente numero medio es: 35 Ejemplo de ejecucin:
Quieres el siguiente numero medio?(s/n): n Introduce un numero entero > 0: -4
El dato introducido no es correcto.
Introduce un numero entero > 0: 4
Fibonacci(0) = 0
4.4.3 Ayuda para el enunciado 4 Fibonacci(1) = 1
Fibonacci(2) = 1
Para decidir si un nmero es medio o no, primero se ha de calcular la suma de sus Fibonacci(3) = 2
predecesores (a partir de 1) y a continuacin se ha de ir probando con las sumas de sus
sucesores contiguos, hasta encontrar una suma que coincide con la de los predecesores o
hasta obtener una suma que es mayor que la suma de los predecesores. Si se da este 4.5.3 Ayuda para el enunciado 5
ltimo caso, se sabe que ninguna otra suma coincidir con la suma de los predecesores
(porque las sumas de los sucesores son cada vez mayores). En la funcin main para obtener los primeros n trminos de la serie de Fibonacci habr que
ir pasando los nmeros de uno en uno a partir del 0 y calcular el Fibonacci de cada uno de
ellos llamando a la funcin calcular_fibonacci.
4.5 Ejercicio 5 Clculo de los primeros n nmeros de Fibonacci
Al definir la funcin calcular_fibonacci, como para obtener el Fibonacci de un nmero es
necesario sumar los Fibonaccis de los dos anteriores, para calcular el Fibonacci de x hay que
4.5.1 Objetivo 5
partir de los Fibonaccis de 0 y 1 (que se consideran bsicos) e ir calculando los Fibonaccis
Definir una funcin nueva y reutilizar otra ya definida con anterioridad. Esto sirve de todos los nmeros hasta llegar a tener el Fibonacci de x. Por tanto, aunque al final esta
para ver que las funciones son muy tiles para aislar subprogramas y luego usarlos funcin slo devolver el Fibonacci de x, en el proceso se habrn tenido que calcular los
en distintos ejercicios sin necesidad de retocar las funciones. Fibonaccis de todos los nmeros menores que x.

4.5.2 Enunciado 5

Escribir un programa que pida al usuario un nmero entero y positivo n (>0) y calcule los
primeros n trminos de la serie de Fibonacci. Como el primer trmino de la serie es el
Fibonacci de 0, el ltimo Fibonacci a mostrar ser el de n1. A la hora de pedir el valor n
habr que repetir el proceso hasta obtener un nmero que cumpla la condicin requerida.

El Fibonacci de un nmero entero x ( 0) se define de la siguiente forma:

Fibonacci(0) = 0
Fibonacci(1) = 1
Fibonacci(x) = Fibonacci(x 2) + Fibonacci(x 1) x>1

Ejemplos de Fibonaccis:

x 0 1 2 3 4 5 6 7 8 9 10 11
Fibonacci(x) 0 1 1 2 3 5 8 13 21 34 55 89

Conchi Presedo Garca EUITI Bilbao 2015 35 Conchi Presedo Garca EUITI Bilbao 2015 36
LABORATORIO 6 FUNDAMENTOS DE INFORMTICA LABORATORIO 6 FUNDAMENTOS DE INFORMTICA

Funciones propias a definir y utilizar:


LABORATORIO 6
pedir_numero_mayor: funcin que, dado un nmero entero z, pide al usuario que
FUNCIONES PARTE II teclee un nmero mayor que z. El proceso se ha de repetir hasta obtener un nmero
que cumpla dicha condicin. (Ya resuelta en el laboratorio anterior).

primeros_factoriales_con_raices: funcin que, dado un nmero entero z mayor


1 OBJETIVOS que cero, calcula y muestra por pantalla los factoriales de los nmeros que van
desde el 0 hasta el z 1 y las races cuadradas de esos factoriales.
Al finalizar esta actividad, sers capaz de:
Utilizar funciones predefinidas dentro de cualquier funcin (no slo en el main). calcular_factorial: funcin que, dado un nmero entero x mayor o igual que cero,
Entender que de la misma forma en que dentro de un problema se pueden identificar calcula y devuelve el factorial de x. (Ya resuelta en el laboratorio anterior).
y aislar subtareas definiendo funciones que los resuelven, dentro de las subtareas se
pueden tambin identificar y aislar subtareas ms pequeas y se pueden definir primeros_primos: funcin que, dado un nmero entero z mayor que cero, calcula
funciones que las resuelven. y muestra por pantalla los primeros z nmeros primos.
Definir nuevas funciones que a su vez llaman a otras funciones (es decir, utilizan
otras funciones). es_primo: funcin que, dado un nmero entero x (> 0), decide si es primo o no. Si
x es primo, la funcin devolver un 1 y si no devolver un 0.
2 MOTIVACIN
Funciones predefinidas:
Cuando un problema se ha dividido en subtareas, surge a veces la conveniencia de dividir a Tambin se utiliza la funcin predefinida sqrt(x) que calcula x y que se encuentra en la
su vez esas subtareas en subproblemas ms pequeos y van surgiendo distintos niveles de librera math.h .
profundidad. Pero puede que un mismo clculo aparezca en distintos niveles y dentro de
distintos subproblemas. Si se dispone de una funcin independiente que realiza ese clculo, #include <stdlib.h>
se puede utilizar en cualquier sitio, sin importar el subnivel en el que se est. Por tanto en #include <stdio.h>
vez de limitarse a utilizar funciones slo en la funcin main, conviene utilizar funciones #include <math.h> // Para la funcin predefinida sqrt
dentro de cualquier funcin.
Generalizando el uso de funciones, en el sentido de que desde cualquier funcin se puede
llamar a otras funciones, se consigue estructurar an ms los programas y hacerlos ms /** PROTOTIPOS de las funciones que se utilizan en el programa. **/
entendibles y claros. int pedir_numero_mayor(int z);
void primeros_factoriales_con_raices(int z);
long calcular_factorial(int x);
3 LLAMANDO A FUNCIONES DESDE OTRAS FUNCIONES void primeros_primos(int z);
int es_primo(int x);
No hay lmites a la hora de que una funcin pueda llamar a otras.
Aunque unas funciones se llamen a otras, todas las funciones se definen de manera /** FUNCION principal o MAIN **/
independiente: se pondr el prototipo de todas las funciones antes del main y todas
las definiciones de las funciones se colocarn seguidas despus de la funcin main. /* Datos externos Pide al usuario un entero n > 0. */
El orden en el que se coloquen las funciones no importa. /* Proceso Calcula y muestra por pantalla los primeros n
factoriales y sus races cuadradas y los primeros n
3.1 Ejercicio Ejemplo de llamadas a funciones desde otras funciones nmeros primos. */
/* Variables n: Guarda el nmero entero que da el usuario. */

3.1.1 Objetivo int main(void)


{
Mostrar cmo utilizar funciones predefinidas en funciones que no son la funcin
int n;
main.
Mostrar cmo se definen y utilizan las funciones cuando unas llaman a otras. n = pedir_numero_mayor(0); /* se pide un nmero > 0 */

3.1.2 Enunciado primeros_factoriales_con_raices(n);


primeros_primos(n);
Programa que pide al usuario un nmero entero n mayor que 0 y calcula por una parte los
printf("\n\n");
primeros n factoriales y sus races cuadradas y por otra parte los primeros n nmeros system("PAUSE");
primos. Al pedir n, se ha de repetir el proceso de peticin hasta obtener un nmero >0. } /* Fin del main */ /* sigue */

Conchi Presedo Garca EUITI Bilbao 2015 37 Conchi Presedo Garca EUITI Bilbao 2015 38
LABORATORIO 6 FUNDAMENTOS DE INFORMTICA LABORATORIO 6 FUNDAMENTOS DE INFORMTICA

/** DEFINICIONES de las funciones utilizadas **/


void primeros_primos(int z)
int pedir_numero_mayor(int z) {
/* Esta funcin halla y muestra los primeros z nmeros primos. */
{
/* Pide al usuario un nmero entero mayor que z repitiendo el
proceso hasta obtener uno que lo sea. Cuando obtenga un nmero int num, cont;
que cumpla esa condicin lo devolver como resultado. */
num = 1; /* Se utilizar para ir pasando los nmeros de uno en uno
a partir de 1. En cada vuelta del while se analizar si
int num; /* para guardar el nmero tecleado por el usuario. */
el nmero que est en num es primo o no. */
do
cont = 0; /* Esta variable indica en cada momento cuntos nmeros
{ printf("\nIntroduce un numero entero mayor que %d: ", z);
primos se han encontrado hasta ese momento. */
scanf("%d", &num);
if (num <= z)
printf("\nLos primeros %d numeros primos son los siguientes: ", z);
{
printf("\nEl numero introducido no es adecuado.");
while (cont < z)
}
{
} while (num <= z);
if ( es_primo(num) == 1)
{
return(num);
} /* Fin de pedir_numero_mayor */ printf("%d ",num);
cont = cont + 1;
}
void primeros_factoriales_con_raices(int z)
num = num + 1;
{ }
/* Calcula y muestra los primeros z factoriales y sus races } /* Fin de numeros_primos */
cuadradas (z >= 1). */

int num; int es_primo (int x)


long facto; {
float r; /* Esta funcin devuelve un 1 si x (que ha de ser >= 1) es primo y
devuelve 0 si no es primo. */
printf("\nPrimeros %d factoriales con sus raices cuadradas: ",z);
int num, hay_divisores;
for (num = 0; num < z; num = num + 1)
{ hay_divisores = 0; /* En principio no hay divisores de x */
facto = calcular_factorial(num); /* num se utilizar para pasar de uno en uno los nmeros que
r = sqrt(facto); van de 2 a x-1 mientras no haya divisores */
printf("\nEl factorial de %d es %ld y la raiz cuadrada de ese " num=2;
"factorial es %f", num, facto, r); while ( num < x && hay_divisores==0)
} {
} /* Fin de primeros_factoriales_con_raices */ if (x % num == 0)
{
hay_divisores = 1; // Hemos encontrado un divisor
long calcular_factorial(int x) }
num = num + 1;
{
}
/* Esta funcin, dado un nmero entero x >= 0, calcula y devuelve
su factorial. */
if (hay_divisores == 0){
long f = 1;
return (1);
int num;
}else {
return (0);
for (num = 2; num <= x; num = num + 1)
}
{
} /* Fin de es_primo */
f = f * num;
}
return(f);
} /* Fin de calcular_factorial */
/* sigue */

Conchi Presedo Garca EUITI Bilbao 2015 39 Conchi Presedo Garca EUITI Bilbao 2015 40
LABORATORIO 6 FUNDAMENTOS DE INFORMTICA LABORATORIO 6 FUNDAMENTOS DE INFORMTICA

4 EJERCICIOS Ejemplo de ejecucin: (los datos tecleados por el usuario estn en cursiva y subrayados)

4.1 Ejercicio 1 Clculo de las races reales de una ecuacin de 2 grado Introduce los coeficientes de una ecuacion de segundo grado: 2, 1, 2
La ecuacion no tiene raices.
4.1.1 Objetivo 1 Introduce los coeficientes de una ecuacion de segundo grado: 2, 4, 2
La ecuacion tiene una unica raiz: -1
Utilizar una funcin predefinida en C dentro de otra que no es la funcin main. Introduce los coeficientes de una ecuacion de segundo grado: 2, 5, 2
La ecuacion tiene dos raices: -0.5 y -2
Introduce los coeficientes de una ecuacion de segundo grado: 0, 3, 5
4.1.2 Enunciado 1

Escribir un programa que pida al usuario los tres coeficientes de una ecuacin de segundo
4.1.3 Ayuda para el enunciado 1
grado, calcule y muestre sus races reales (si las tiene) y repita el proceso hasta que el
usuario introduzca como primer coeficiente (valor del coeficiente a) el 0.
La raz cuadrada se calcula utilizando la funcin matemtica predefinida sqrt, es decir,
sqrt(x) calcula x . La funcin est en la librera math.h.
Una ecuacin de segundo grado tiene la siguiente forma: ax2 + bx + c = 0, donde a, b y
c son los coeficientes.
La funcin sqrt se utilizar dentro de las funciones calcular_raiz_positiva y
b b 2 4ac calcular_raiz_negativa.
La frmula general para calcular las races es la siguiente: x
2a
Una ecuacin de segundo grado puede no tener races reales, tener una nica raz o tener Las funciones calcular_raiz_positiva y calcular_raiz_negativa se utilizarn dentro de la
dos races: funcin calcular_raices.
Si b 2 4 ac es menor que 0, no tiene raz real.
Cuando la ecuacin tenga una nica raz, para calcular esa raz se puede utilizar
Si b 4 ac es 0, tiene una nica raz.
2
calcular_raiz_positiva o calcular_raiz_negativa, es decir, cualquiera de las dos.
Si b 4 ac es mayor que 0, tiene dos races.
2

Ejemplos de ecuaciones de segundo grado:


La ecuacin 2x2 + 1x + 2 = 0 no tiene raz. 4.2 Ejercicio 2 Clculo de la raz n-sima aproximada
La ecuacin 2x2 + 4x + 2 = 0 tiene una nica raz: -1
La ecuacin 2x2 + 5x + 2 = 0 tiene dos races: -0.5 y -2 4.2.1 Objetivo 2

Definir dos funciones y utilizar una de ellas dentro de la otra. Las dos calcularn un
Hay que definir y utilizar las siguientes funciones: resultado y lo devolvern.

calcular_raices: funcin que, dados los coeficientes a, b y c de una ecuacin de 4.2.2 Enunciado 2
segundo grado, procede de la siguiente forma:
o Si la ecuacin no tiene races, muestra un mensaje indicndolo. Escribir un programa que pida al usuario dos nmeros enteros m ( 1) y n ( 1), calcule
o Si la ecuacin tiene una nica raz, la calcula y la muestra e indica que slo
hay una raz.
m
n
(aproximacin entera por defecto de la raz n-sima de m) y a continuacin le
pregunte al usuario si quiere calcular otra raz. Si el usuario responde que s ('s'), el
o Si la ecuacin tiene dos races, las calcula y las muestra.
programa ha de volver a pedir dos enteros m ( 1) y n ( 1) al usuario y calcular la raz
correspondiente. El proceso se repetir hasta que el usuario responda que no ('n') quiere
calcular_raiz_positiva: funcin que, dados los coeficientes a, b y c de una
calcular ms races. Cada vez que el usuario tenga que responder con una 's' o una n', no
b b 2 4ac se admitir ninguna otra respuesta, repitiendo la pregunta hasta obtener uno de esos dos
ecuacin de segundo grado tal que b2 4ac 0, calcula y devuelve
2a caracteres. Tambin al pedir m y n habr que comprobar que son 1. No se pueden
utilizar las funciones matemticas predefinidas.
calcular_raiz_negativa: funcin que, dados los coeficientes a, b y c de una
Ejemplos de aproximaciones enteras por defecto de races:
b b 2 4ac
ecuacin de segundo grado tal que b2 4ac 0, calcula y devuelve
2a
8 2
3
10 2
3

3

29 3

Conchi Presedo Garca EUITI Bilbao 2015 41 Conchi Presedo Garca EUITI Bilbao 2015 42
LABORATORIO 6 FUNDAMENTOS DE INFORMTICA LABORATORIO 6 FUNDAMENTOS DE INFORMTICA

Hay que definir y utilizar las siguientes funciones: El tringulo de Tartaglia para un valor n = 4 tiene 5 filas y 5 columnas y sera el
siguiente:
calcular_raiz: funcin que, dados dos nmeros enteros x ( 1) e y ( 1), calcula y 1
devuelve x .
y
1 1
1 2 1
mi_pow: funcin que, dados dos nmeros enteros x ( 1) e y ( 1), calcula (sin
utilizar pow) y devuelve xy. 1 3 3 1
1 4 6 4 1
preguntar_raiz: funcin que pregunta al usuario si desea calcular otra raz o no. El
proceso se ha de repetir hasta obtener una 's' o una 'n'. Si nos fijamos en las filas y las columnas tenemos lo siguiente:

Ejemplo de c=0 c=1 c=2 c=3 c=4


ejecucin: Introduce dos enteros >= 1: 5, -2 f = 0 1
Los datos introducidos no son correctos. f = 1 1 1
Introduce dos enteros >= 1: 10, 3 f = 2 1 2 1
La raiz 3-esima de 10 es 2 f = 3 1 3 3 1
Quieres calcular otra raiz? (s/n): q f = 4 1 4 6 4 1
El dato tecleado no es adecuado.
Quieres calcular otra raiz? (s/n): s
Introduce dos enteros >= 1: 29, 3 El elemento de la fila f y columna c se calcula con la siguiente frmula (nmero
La raiz 3-esima de 29 es 3 f f!
Quieres calcular otra raiz? (s/n): n combinatorio):
c c!( f c)!

4.2.3 Ayuda para el enunciado 2 Hay que definir y utilizar las siguientes funciones:
y
Para definir la funcin mi_pow, es decir, para indicar cmo se calcula x hay que tener en mostrar_triangulo_tartaglia: funcin que, dado un nmero entero x ( 1),
cuenta que xy = x * x * x * ... (multiplicando x y veces). Esta funcin slo servir para muestra por pantalla el tringulo de Tartaglia de x filas y x columnas.
enteros positivos y por tanto no es tan general como la funcin predefinida pow que sirve
incluso para los reales. calcular_combinatorio: funcin que, dados dos nmeros enteros x e y (tal que x
x
La funcin mi_pow se utilizar dentro de la funcin calcular_raiz. 0, y 0, x y), calcula y devuelve .
y
Al definir la funcin calcular_raiz, para aproximar x , habr que ir calculando 0y, 1y, 2y, 3y,
y

etc. hasta obtener una potencia que es mayor que x. El resultado ser el nmero utilizado calcular_factorial: funcin que, dado un nmero entero x mayor o igual que cero,
calcula y devuelve el factorial de x. Esta funcin ya ha sido definida en otros
en el caso anterior al que es mayor x. Por ejemplo para calcular 85 se calcularan 0 , 1 ,
3 3 3
ejercicios por lo que se puede reutilizar.
23, 33, 43 y 53. Como 53 es mayor que 85 el resultado es 4.
Ejemplo de ejecucin:
Introduce un numero entero >= 1: 2
Triangulo de Tartaglia correspondiente:
4.3 Ejercicio 3 Visualizacin del tringulo de Tartaglia 1
1 1
1 2 1
4.3.1 Objetivo 3 Introduce un numero entero >= 1: 4
Triangulo de Tartaglia correspondiente:
Definir tres funciones y utilizar una de ellas dentro de otra. Unas funciones sern 1
llamadas desde main y otras desde funciones que no son la funcin main. 1 1
1 2 1
4.3.2 Enunciado 3 1 3 3 1
1 4 6 4 1
Escribir un programa que pida al usuario un nmero entero y positivo n ( 1), muestre por Introduce un numero entero >= 1: -9
pantalla el tringulo de Tartaglia correspondiente, vuelva a pedir otro valor n, vuelva a
mostrar el tringulo correspondiente y repita el proceso hasta que el usuario teclee un
nmero negativo.

Conchi Presedo Garca EUITI Bilbao 2015 43 Conchi Presedo Garca EUITI Bilbao 2015 44
LABORATORIO 6 FUNDAMENTOS DE INFORMTICA LABORATORIO 6 FUNDAMENTOS DE INFORMTICA

4.3.3 Ayuda para el enunciado 3 calcular_logaritmo: funcin que, dados dos nmeros enteros x e y (tal que x > 1 e
y x), calcula y devuelve log x y .
Al definir la funcin mostrar_triangulo_tartaglia habr que ir generando todos los pares
posibles de filas y columnas desde la posicin (0,0) hasta la (x,x) y llamar a la funcin
preguntar_logaritmo: funcin que pregunta al usuario si desea calcular otra
calcular_combinatorio con cada par generado.
secuencia de logaritmos o no. El proceso de recoger la respuesta se ha de repetir
hasta obtener una 's' o una 'n'.
La funcin calcular_combinatorio utilizar la funcin calcular_factorial.

Ejemplo de ejecucin:
Introduce dos enteros >= 1: 5, -2
4.4 Ejercicio 4 Clculo del logaritmo aproximado Los datos introducidos no son correctos.
Introduce dos enteros >= 1: 4, 20
log(2)20 = 4 log(3)20 = 2 log(4)20 = 2
4.4.1 Objetivo 4 La suma es 8.
Quieres calcular otros logaritmos? (s/n): q
Definir y utilizar dos funciones nuevas y utilizar una de ellas dentro de otra, El dato tecleado no es adecuado.
aprendiendo a estructurar programas. Quieres calcular otros logaritmos? (s/n): s
Introduce dos enteros >= 1: 3, 50
4.4.2 Enunciado 4 log(2)50 = 5 log(3)50 = 3
La suma es 8.
Quieres calcular otros logaritmos? (s/n): n
Escribir un programa que pida al usuario dos nmeros enteros m y n (tales que m>1 y
nm) calcule y muestre los elementos log 2 n , log 3 n , log 4 n , ..., log m n
(aproximaciones enteras por defecto de los correspondientes logaritmos) y la suma de
4.4.3 Ayuda para el enunciado 4
todos ellos y a continuacin le pregunte al usuario si quiere repetir el clculo para otros dos
valores. Si el usuario responde que s ('s'), el programa ha de volver a pedir dos enteros m
Al definir la funcin mostrar_logaritmos con respecto a los parmetros x e y, habr que
y n al usuario y calcular los logaritmos y la suma correspondientes. El proceso se repetir
pasar las bases de los logaritmos de uno en uno a partir de 2 y hasta llegar a x. Para cada
hasta que el usuario responda que no ('n') quiere calcular ms logaritmos. Cada vez que el
base habr que llamar a la funcin calcular_logaritmo pasndole como argumentos la base
usuario tenga que responder con una 's' o una 'n', no se admitir ninguna otra respuesta,
e y.
repitiendo la pregunta hasta obtener uno de esos dos caracteres. Tambin al pedir m y n
habr que comprobar que son correctos. No se pueden utilizar las funciones
Al definir la funcin calcular_logaritmo con respecto a los parmetros x e y, habr que ir
matemticas predefinidas.
multiplicando x por s mismo (x * x * x * ...) hasta obtener un valor mayor que y. El
nmero de veces que se haya multiplicado menos 1 ser el resultado que ha de devolver la
Para calcular la aproximacin entera por defecto de un logaritmo, log m n , hay que funcin.
calcular cuntas veces es necesario multiplicar m por s mismo (m * m * m * ) para
obtener un valor mayor que n. Ese nmero de veces menos 1 ser el resultado.

Ejemplos de aproximaciones enteras por defecto de logaritmos: 4.5 Ejercicio 5 Validacin de un posible nmero de Fibonacci
log 2 8 3 porque para obtener un valor mayor que 8 hay que multiplicar 2 por s 4.5.1 Objetivo 5
mismo 4 veces (2 * 2 * 2 * 2) y por tanto el resultado es 4 1, es decir, 3.
log 2 12 3 porque para obtener un valor mayor que 12 hay que multiplicar 2 por s Definir una funcin nueva y reutilizar otra definida con anterioridad utilizndola
mismo 4 veces (2 * 2 * 2 * 2) y por tanto el resultado es 4 1, es decir, 3. adems dentro de la primera.
log 4 20 2 porque para obtener un valor mayor que 20 hay que multiplicar 4 por
s mismo 3 veces (4 * 4 * 4) y por tanto el resultado es 3 1, es decir, 2. 4.5.2 Enunciado 5

Escribir un programa que pida al usuario un nmero entero n ( 0) y decida si existe algn
Hay que definir y utilizar las siguientes funciones: nmero tal que su Fibonacci sea n. El programa debe repetir el mismo proceso hasta que el
usuario introduzca un nmero negativo.
mostrar_logaritmos: funcin que, dados dos nmeros enteros x e y (tal que x > 1
e y x), calcula y muestra log 2 y , log 3 y , log 4 y , ..., log x y y la suma de
todos ellos.

Conchi Presedo Garca EUITI Bilbao 2015 45 Conchi Presedo Garca EUITI Bilbao 2015 46
LABORATORIO 6 FUNDAMENTOS DE INFORMTICA LABORATORIO 6 FUNDAMENTOS DE INFORMTICA

El Fibonacci de un nmero entero ( 0) se define de la siguiente forma:

Fibonacci(0) = 0
Fibonacci(1) = 1
Fibonacci(x) = Fibonacci(x 2) + Fibonacci(x 1)

Ejemplos de Fibonaccis:

x 0 1 2 3 4 5 6 7 8 9 10 11
Fibonacci(x) 0 1 1 2 3 5 8 13 21 34 55 89

Hay que definir y utilizar las siguientes funciones:

decidir_fibonacci: funcin que, dado un nmero entero x ( 0), decide si x es


Fibonacci de algn nmero. En caso de que no lo sea, ha de devolver un -1 y en caso
de que s sea Fibonacci de algn nmero ha de devolver ese nmero.

calcular_fibonacci: funcin que, dado un nmero entero x ( 0), calcula y devuelve


el Fibonacci de x.

Ejemplo de ejecucin:
Introduce un numero entero >= 1: 4
4 no es Fibonacci de ningun numero.
Introduce un numero entero >= 1: 8
8 es el Fibonacci de 6.
Introduce un numero entero >= 1: -5

4.5.3 Ayuda para el enunciado 5

En la funcin main se pedir un nmero n y se le pasar a la funcin decidir_fibonacci y se


mostrar un mensaje teniendo en cuenta lo que devuelva esa funcin. A continuacin desde
main se pedir otro nmero, se le pasar a esa funcin etc hasta que el usuario d un
nmero negativo.

En la funcin decidir_fibonacci, se irn calculando los Fibonaccis de 0, de 1, de 2, etc hasta


dar con un nmero cuyo Fibonacci sea x o hasta encontrar un nmero cuyo Fibonacci sea
mayor que x. En el primer caso existe un nmero cuyo Fibonacci es x, en el segundo caso
no. Para calcular los Fibonaccis habr que llamar a la funcin calcular_fibonacci.

Conchi Presedo Garca EUITI Bilbao 2015 47 Conchi Presedo Garca EUITI Bilbao 2015 48
LABORATORIO 7 FUNDAMENTOS DE INFORMTICA LABORATORIO 7 FUNDAMENTOS DE INFORMTICA

8 /* ndice para recorrer la tabla */


9 int i;
10
LABORATORIO 7 11 /* En vez de usar el define anterior, se puede declarar aqu la
12 cantidad de elementos de la tabla como constante con:
TABLAS NUMRICAS ARRAYS UNIDIMENSIONALES 13 int const NELE=12; */
14
15 /* Declaracin o definicin de una tabla de nmeros reales */
16 float notas_alum[NELE];
17
1 OBJETIVOS 18 /* Carga de TODOS los elementos de una tabla */
19 for (i=0;i<=NELE-1;i++)
20 {
Al finalizar esta actividad, sers capaz de:
21 printf(Introduce la nota del alumno %d: ,i);
Entender el funcionamiento de las tablas numricas.
22 scanf(%f,&notas_alum[i]);
Realizar las operaciones bsicas: declarar una tabla, lectura y escritura de un 23 }
elemento de la tabla, recorrer una tabla, ordenar una tabla etc ... sin usar funciones. 24
25 /* Visualizacin de TODOS los elementos de la tabla */
2 MOTIVACIN 26 for (i=0;i<=NELE-1;i++)
27 {
Supongamos que dada una lista de nmeros terminada en 0, la queremos mostrar 28 printf(\nla nota del alumno %d es %.2f,i,notas_alum[i]);
en orden invertido. 29 }
Supongamos que queremos mostrar los nmeros que se repiten en dos conjuntos 30
31
que contienen nmeros. printf(\n\n);
32
Los problemas anteriores y ms no se pueden resolver sin usar estas tablas system(PAUSE);
33
numricas. }

3 LAS TABLAS NUMRICAS EN C


3.1 Ejercicio Desplazamiento a la izquierda de los valores de un array
Para usar tablas nmericas hay que declararlas o definirlas. Se debe especificar el
tipo de datos que va a almacenar, el nombre para la tabla y la cantidad mxima de 3.1.1 Objetivo
elementos que contendr. Ejemplo: float notas_alum[12];
Aprender a recorrer una tabla tratando sus elementos y a utilizar el ndice para
Para leer o visualizar un dato de la tabla hay que indicarle el ndice del elemento a desplazar todos sus elementos una posicin hacia la izquierda.
leer o escribir. Ejemplo para el primer elemento (su posicin es 0) de la tabla
notas_alum: 3.1.2 Enunciado
Lectura scanf(%f,&notas_alum[0]); Hacer un programa que pida al usuario los elementos de una tabla de tamao N y a
Escritura printf(%f,notas_alum[0]); continuacin desplace todos sus elementos una posicin hacia la izquierda, ubicando el
primero de ellos en la ltima posicin.
Para recorrer los elementos de una tabla utilizaremos un ndice que ir desde el 0
(primer elemento) hasta el nmero de elementos 1 (ltimo elemento). Ejemplo de
ejecucin: (para N = 10)
EJEMPLO de declaracin, carga y visualizacin de todos los elementos de la tabla (los datos
notas_alum que tiene capacidad para guardar 12 (NELE) nmeros reales: tecleados por el Introduce 10 enteros: 3 24 7 -25 0 3 21 19 3 895
usuario estn El array desplazado hacia la IZQUIERDA queda asi:
en cursiva y 24 7 -25 0 3 21 19 3 895 3
i 0 1 2 3 4 5 6 7 8 9 10 11 (NELE-1) Presione una tecla para continuar
notas_alum[i] 3 2.4 7 2.5 0 3 10 9 3 8.95 7.25 1.8 subrayados )

1 #include <stdio.h> 3.1.3. Ayuda para el enunciado 1


2 #include <stdlib.h>
3 #define NELE 12 // Capacidad de la tabla Para una cantidad de elementos constante N=10 utilizando los datos del ejemplo de
4 ejecucin:
5 /* Inicio del programa principal o main*/ 1. Pedir los 10 nmeros enteros y llenar la tabla t. (lneas cdigo 11 a 23)
6 int main(void) Una vez que la llenemos, tendramos:
7 {

Conchi Presedo Garca EUITI Bilbao 2015 49 Conchi Presedo Garca EUITI Bilbao 2015 50
LABORATORIO 7 FUNDAMENTOS DE INFORMTICA LABORATORIO 7 FUNDAMENTOS DE INFORMTICA

ind 0 1 2 3 4 5 6 7 8 9 (N-1) 28
29 /* Bucle para desplazar el resto, CUIDADO, darnos cuenta de dos
t[ind] 3 24 7 -25 0 3 21 19 3 895 cosas:
30 empezamos en ind=1 y acabamos en ind=nelem-1.
31 Para desplazar hacia la izda tomamos cada nmero y lo asignamos a la
2. Desplazar esos 10 elementos hacia la izquierda: (lneas cdigo 25 a 42)
32 posicin que est a su izquierda. Empezamos en la segunda posicin
Para N=10 tendremos en principio 33 para asignrselo a la primera, por eso comenzamos con ind 1 */
34
ind 0 1 2 3 4 5 6 7 8 9 35 ind=1;
t[ind] 3 24 7 -25 0 3 21 19 3 895 36 while(ind<nelem){
37 t[ind-1]=t[ind];
38 ind=ind+1;
Y deber quedar: 39 }
40
ind 0 1 2 3 4 5 6 7 8 9 41 /* En la ltima posicin guardamos lo que haba en la primera */
42 t[nelem-1]=aux;
t[ind] 24 7 -25 0 3 21 19 3 895 3 43
44 /* 3. VISUALIZAMOS la tabla resultante
45 No olvidar poner el indice a 0 al implementar el bucle para
3. Visualizar la tabla t (lneas cdigo 49 a 51) 46 recorrer y visualizar la tabla*/
47 printf("\nEl array desplazado hacia la IZQUIERDA queda asi:\n");
ind 0 1 2 3 4 5 6 7 8 9 48
t[ind] 24 7 -25 0 3 21 19 3 895 3 49 for(ind =0;ind<nelem;ind++){
50 printf("%d ",t[ind]);
51 }
52 printf("\n\n");
3.1.4. Solucin del enunciado 1 53 system("PAUSE");
54 }
Se da resuelto el ejercicio con comentarios para tomarlo de gua para el enunciado 1:

1 #include <stdio.h> 4 EJERCICIOS


2 #include <stdlib.h>
3 4.1 Ejercicio 1 - Desplazamiento a la derecha de los valores de un array
4 #define N 10
5
4.1.1 Objetivo 1
6 int main(void)
7 {
8 int t[N],ind ,nelem,num,aux; Poner en prctica los conocimientos adquiridos en el ejercicio anterior.
9
10 // 1. PEDIMOS por teclado los elementos 4.1.2 Enunciado 1
11 printf("\nIntroduce %d enteros: ", N);
12 ind=0; Igual que el ejercicio anterior, slo que esta vez desplazando los elementos hacia la derecha
13 do{ y dejando el ltimo elemento en la primera posicin del array.
14 scanf("%d",&num);
15 t[ind]=num; Ejemplo de (para N = 10)
16 ind=ind+1; ejecucin: Introduce 10 enteros: 3 24 7 -25 0 3 21 19 3 895
17 }while(ind<N); El array desplazado hacia la DERECHA queda asi:
18 895 3 24 7 -25 0 3 21 19 3
19 /* Al salir del while, ind est apuntando a N, es decir, al nmero Presione una tecla para continuar
de elementos que tiene el array. */
20
21 nelem=ind ;// En nelem tendremos la cantidad de elementos metidos 4.1.3 Ayuda para el enunciado 1
22 // en la tabla t. En este caso siempre es N, es decir, 10
23
24 // 2. DESPLAZAMOS los elementos hacia la IZQUIERDA Utilizar el ejercicio resuelto.
25 /* Guardamos el primer elemento en aux antes de empezar a desplazar
el resto a la izquierda. */
26
27 aux=t[0];

Conchi Presedo Garca EUITI Bilbao 2015 51 Conchi Presedo Garca EUITI Bilbao 2015 52
LABORATORIO 7 FUNDAMENTOS DE INFORMTICA LABORATORIO 7 FUNDAMENTOS DE INFORMTICA

4.2 Ejercicio 2 Intercambio del elemento menor con el primero


i 0 1 2 3 4 5 6 7 8 9
4.2.1 Objetivo 2 t[i] 15 23 23 5 7 4 4 4 23 23

Aprender a usar condiciones a la hora de cargar tablas y recorrer las tablas, ya que
no siempre tenemos un nmero fijo de elementos. 4.4 Ejercicio 4 Ordenacin mediante el mtodo de la burbuja

4.2.2 Enunciado 2 4.4.1 Objetivo 4

Pedir al usuario una serie de nmeros y almacenarla en un array de tamao N. El programa Aprender a utilizar el algoritmo de la burbuja para ordenar los elementos de una
deber pedir nmeros hasta que se hayan introducido N elementos en la tabla o el usuario tabla.
teclee un nmero negativo. Una vez se dispone del array con como mucho N nmeros
positivos, se pide intercambiar el menor de ellos con el que est en la primera posicin. 4.4.2 Enunciado 4

Ejemplo de (para N = 10) Hacer un programa que ordene de menor a mayor los elementos de un vector de como
ejecucin: INTERCAMBIO DEL ELEMENTO MENOR mucho N nmeros. Igual que en el ejercicio anterior, el vector puede no llenarse, dado que
Introduce HASTA 10 enteros (negativo para terminar): si el usuario teclea un nmero negativo no se seguirn pidiendo ms valores.
45 67 13 29 3 28 32 51 -1
El array, una vez realizado el intercambio, queda asi:
Ejemplo de (para N = 10)
3 67 13 29 45 28 32 51
ejecucin: ORDENO UNA TABLA POR EL METODO DE LA BURBUJA
Introduce HASTA 10 numeros reales (negativo para terminar):
4.2 1.3 777 4.75 4.2 0.555 3.25 0 10
4.2.3 Ayuda para el enunciado 2 La tabla, ORDENADA en ASCENDENTE, queda asi:
0 0.555 1.3 3.25 4.2 4.2 4.75 777
Recorremos la tabla desde el principio hasta el final buscando el mnimo y guardando tanto
su valor como su posicin.
4.4.3 Ayuda para el enunciado 4

4.3 Ejercicio 3 Mayor nmero de iguales consecutivos y posicin El mtodo de la burbuja bsico recorre la tabla entera comparando cada elemento con el
anterior, de manera que intercambiamos sus valores si estn desordenados respecto del
4.3.1 Objetivo 3 orden que se quiere conseguir. Este proceso se debe repetir tantas veces como nmero de
elementos tenga la tabla (por ejemplo, para una tabla con 8 elementos habr que recorrer
Aprender a utilizar contadores e ndices que guarden los estados por los que pasa el la tabla 8 veces o lo que es lo mismo, habr que dar 8 vueltas).
programa al recorrer la tabla. Tomando como estado en este caso la cantidad
mxima de elementos iguales y su posicin de inicio y final. inicializar el nmero de vueltas a 0
hacer
4.3.2 Enunciado 3 para cada posicin i de la tabla desde la 1 hasta la ltima
si (el valor de la posicin i est desordenado respecto del de la posicin i-1)
Dada una tabla de N elementos, calcular la cantidad mxima de elementos iguales Intercambiar sus valores
consecutivos que hay, as como las posiciones de comienzo y final en las que se encuentran. fin si
fin para
Ejemplo de (para N = 10) aumentar en 1 el nmero de vueltas
ejecucin: mientras el nmero de vueltas no alcance a la cantidad de elementos de la tabla
MAYOR NUMERO DE IGUALES CONSECUTIVOS Y POSICION
Introduce 10 enteros: 15 23 23 5 7 4 4 4 23 23 NOTA: Este mtodo se puede optimizar utilizando un flag que detecte si en una
El mayor numero de elementos consecutivos iguales aparece 3 determinada vuelta no ha habido intercambios (significar que ya est ordenado) y
veces y lo hace entre las posiciones 5 y 7. haciendo que termine cuando esto ocurra. Se puede optimizar an ms, recorriendo un
elemento menos en cada vuelta, ya que cada vez que realizamos un recorrido a la tabla se
ordena un elemento que ir a la ltima posicin que quedara sin ordenar.
4.3.3 Ayuda para el enunciado 3

Al recorrer los elementos de la tabla cuando el siguiente elemento es distinto al actual es


que hemos terminado con una secuencia y si procede actualizo el mximo de posiciones
repetidas y los ndices. Al simularlo con la tabla t correspondiente al ejemplo de ejecucin,
el nmero que ms se repite seguido es el 4 (aux), lo hace 3 veces (cont_veces_max) a
partir de la posicin 5 (pos_inicio_max) y hasta la posicin 7 (5+3-1).

Conchi Presedo Garca EUITI Bilbao 2015 53 Conchi Presedo Garca EUITI Bilbao 2015 54
LABORATORIO 8 FUNDAMENTOS DE INFORMTICA LABORATORIO 8 FUNDAMENTOS DE INFORMTICA

3.1 Ejercicio Primera posicin que ocupa un valor dentro de una tabla
LABORATORIO 8
3.1.1 Objetivo
TABLAS NUMRICAS ARRAYS EN FUNCIONES El objetivo del ejercicio es probar funciones con tablas y poder identificar los
diferentes elementos (declaracin, definicin y funcin) y comprobar su
1 OBJETIVOS funcionamiento.

Con esta prctica, se pretende: 3.1.2 Enunciado


Perfeccionar el uso de tablas numricas.
Utilizar funciones con tablas numricas: paso de parmetros, llamadas a funcin Hacer un programa que pida por teclado los elementos de una tabla (no necesariamente
etc... ordenada) de tamao N. Despus pedir al usuario un nmero y visualizar la primera
posicin de dicho nmero dentro de la tabla. En caso de que el nmero no se encuentre en
2 MOTIVACIN el vector, se visualizar un 1.
Se utilizar una funcin llamada buscar_posicion_en_tabla que, dados un nmero y una
Supongamos que queremos cargar diferentes tablas numricas del mismo tamao y tabla de enteros, nos devuelva la primera posicin de ese nmero dentro de la tabla y, si el
condicin, no hace falta repetir el cdigo tantas veces como tablas a cargar, sino que nmero no est en la tabla nos devuelva un 1.
se llamar a la funcin correspondiente pasndole como parmetro la tabla que
queremos cargar. Ejemplo de ejecucin:
Lo mismo a la hora de visualizar, o en todas aquellas tareas repetitivas que (los datos tecleados por el (para N = 10)
realizamos con las tablas, y que posteriormente se pueden utilizar en el mismo usuario estn en cursiva y
programa u otros. subrayados ) Dame 10 numeros para almacenar en una tabla.
Valor para la posicin 0: 17
Valor para la posicin 1: 4
3 EL USO DE TABLAS NUMRICAS EN FUNCIONES EN C
Valor para la posicin 9: 4
A la hora de usar una tabla numrica como parmetro en una funcin hay que tener en Dame un numero y te dire la primera posicion
cuenta que en el prototipo y la definicin NO se pone nada entre los corchetes y en la de dicho numero dentro de la tabla: 4
El numero 4 esta en la posicion 1.
llamada a la funcin solamente se pone el nombre de la tabla que vayamos a utilizar como
Presione una tecla para continuar
argumento real.
Ejemplo: Funcin denominada inicializar_matriz que, dado un array de enteros (tabla)
y su tamao (nelems) nos lo inicializa a 0.
3.1.3 Ayuda para el enunciado

Prototipo: void inicializar_matriz (int tabla[],int nelems); Se da resuelto el enunciado para tomarlo de gua para el resto de ejercicios.
Definicin: void inicializar_matriz (int tabla[], int nelems)
{ #include <stdio.h>
int i; #include <stdlib.h>
for (i=0;i<nelems;i++){ #define N 10
tabla[i]=0;
} // PROTOTIPOS funciones
} // Funcin que calcula la posicin de num dentro de tabla
Llamada: int main(void) // Si num no est en la tabla devuelve -1
{ int buscar_posicion_en_tabla(int num, int tabla[]);
/* Nmero de elementos de la tabla */
int const N=200; // Programa PRINCIPAL
/* Declaracin de la tabla de enteros */ int main(void)
int asistencia_alumno[N]; {
... int tabla [N],i,posicion,num;
inicializar_matriz (asistencia_alumno, N);
... // Pedimos los N nmeros de la tabla
} printf("\nDame %d numeros para almacenar en una tabla.\n",N);

Conchi Presedo Garca EUITI Bilbao 2015 55 Conchi Presedo Garca EUITI Bilbao 2015 56
LABORATORIO 8 FUNDAMENTOS DE INFORMTICA LABORATORIO 8 FUNDAMENTOS DE INFORMTICA

for (i=0;i<N;i++) 4.1.3 Ayuda para el enunciado 1


{
printf("\nValor para la posicion %d: ",i); Utilizar el ejercicio resuelto. Qu cambia en la funcin de bsqueda si sabemos que los
scanf("%d",&num); nmeros estn en orden? Antes haba que mirar todos los nmeros, pero ahora si
tabla[i]=num; encontramos un nmero mayor que el que buscamos ya sabemos que no est. Por ejemplo,
}
si buscamos el 30 y hemos llegado a leer el 50 es que el 30 no est en la tabla al estar
// Pedimos el nmero a buscar dentro de la tabla
ordenados de menor a mayor.
printf("\nDame un numero y te dire la primera posicion");
printf(" de dicho numero dentro de la tabla:");
scanf("%d",&num);
// Calculamos y visualizamos su posicin 4.2 Ejercicio 2 Insercin del menor encontrado a partir de una posicin
posicion=buscar_posicion_en_tabla(num,tabla);
printf("\nEl numero %d esta en la posicion %d.\n\n",num,posicion);
4.2.1 Objetivo 2
system("PAUSE");
} // Fin del main Dado el prototipo de una funcin que utiliza una tabla como uno de sus parmetros,
realizar un programa que la implemente y use.
// DEFINICIONES funciones
int buscar_posicion_en_tabla(int num, int tabla[]) 4.2.2 Enunciado 2
{
int encontrado=0; Realizar un programa que solicite nmeros enteros para una tabla de dimensin N. La
int i=0; entrada de elementos finaliza cuando el usuario teclea 1 la tabla se llena (CUIDADO!!
while(i<N && encontrado==0) nunca se dejar que se llene entera, de forma que siempre haya al menos un hueco libre
{ para la insercin). El programa deber contar la cantidad de nmeros introducidos
if (tabla[i]==num) (excluyendo el 1) y modificar la posicin x de la tabla (indicada por el usuario), colocando
encontrado=1;
i++; en ella el menor elemento encontrado en la tabla a partir de la posicin x hasta el final.
} Antes de introducir el menor en la posicin x desplazar el resto de elementos a la derecha.
if (encontrado==1){
return (i-1); }
else { Ejemplo de (para N = 10)
return (-1); } ejecucin:
} // Fin de buscar_posicion_en_tabla Introduce HASTA 10 numeros (-1 para finalizar):
12 14 3 100 11 7 17 -1
Introduce la posicin en la que quieres la insercion: 4
El contenido de la tabla tras la insercion es:
4 EJERCICIOS 12 14 3 7 100 11 7 17

4.1 Ejercicio 1 Variacin sobre el ejercicio anterior

4.1.1 Objetivo 1 4.2.3 Ayuda para el enunciado 2

Poner en prctica los conocimientos adquiridos en el ejercicio anterior. Para realizar este programa se utilizar una funcin llamada insertar_menor_en_tabla que
se encargar de buscar el elemento menor desde la posicin indicada hasta el final y
despus de desplazar todos los elementos a la derecha, insertar el elemento menor en esa
4.1.2 Enunciado 1 posicin. El prototipo de esta funcin ser:

Igual que el ejercicio anterior, pero con dos notables diferencias: void insertar_menor_en_tabla(int posicion, int tabla[],int dimension);
La tabla podr no llenarse, dado que ahora si el usuario teclea un nmero negativo
no se seguirn pidiendo ms valores. Esto significa que en la funcin necesitaremos donde:
un argumento ms: el tamao real de la tabla, es decir, la cantidad de nmeros que Posicion: Es la posicin a partir del cual se buscar el elemento menor y una vez
nos han dado. encontrado se colocar en dicha posicin despus de haber desplazado todos los
El usuario introducir los elementos de la tabla ordenados de menor a mayor (no es elementos a la derecha.
necesario comprobarlo, suponemos que siempre es as por lo que los nmeros Tabla: Es la tabla a modificar.
siempre estarn ordenados dentro de la tabla) y esto influir a la hora de buscar el
Dimension: Es el nmero de elementos introducidos en la tabla.
nmero.

Conchi Presedo Garca EUITI Bilbao 2015 57 Conchi Presedo Garca EUITI Bilbao 2015 58
LABORATORIO 8 FUNDAMENTOS DE INFORMTICA LABORATORIO 8 FUNDAMENTOS DE INFORMTICA

4.3 Ejercicio 3 Generacin de un vector ascendente a partir de otro 4.3.3 Ayuda para el enunciado 3

4.3.1 Objetivo 3 Los pasos a dar POR ORDEN en el programa principal sern:

Aprender a trabajar con varios arrays simultneamente. a) Mediante la funcin pedir_vector pedir los enteros para el vector v1 hasta que el
Aprender a implementar funciones tpicas con arrays. usuario teclee un nmero < 0 se hayan dado 10 nmeros

4.3.2 Enunciado 3 i: 0 1 2 3 4 5 6 7 8 9
v1 12 14 3 11 4 17 15 28 24
Escribir un programa en C que pida un vector de hasta 10 enteros no negativos, a
continuacin genere otro vector eliminando los nmeros que no mantienen el orden b) Mediante la funcin crear_vector_asc crear v2, copiando desde v1 a v2 los
ascendente, y por ltimo pida un nuevo nmero no negativo y lo inserte en el lugar nmeros que mantienen el orden ascendente.
adecuado del nuevo vector, de forma que se mantenga el orden ascendente. En el ejemplo, se eliminan los nmeros que estn entre 14 y 17 por no mantener el
orden ascendente. Lo mismo ocurre con el nmero que est entre el 17 y el 28 y el
nmero que est detrs del 28.
Ejemplo de (para N = 10)
ejecucin:
Vector de hasta 10 enteros no negativos : j: 0 1 2 3 4 5 6 7 8 9 10
12 14 3 11 4 17 15 28 24 -5 v2 12 14 17 28
Vector eliminando los nmeros que no mantienen el orden
ascendente: c) Mediante la funcin ver_vector visualizar v2.
12 14 17 28 d) Mediante la funcin pedir_entero pedir un nuevo nmero, num.
Dame un numero entero no negativo: 15 e) Mediante la funcin insertar_en_vector_asc insertar este nmero num en la
Tras insertar 15 en el vector anterior: posicin adecuada del vector v2 manteniendo el orden ascendente. Los pasos a
12 14 15 17 28 seguir son:
Encontramos en v2 la posicin en la que debe ir num para mantener el orden
(posicin de v2 en la que est el primer nmero que es mayor o igual que
num, o bien la primera posicin libre en caso de que no haya ningn
Prototipos y explicacin de las funciones a utilizar: elemento mayor o igual que num). Tomando los valores del ejemplo para v2,
int pedir_vector(int v[]); si num es 15 la posicin es la 2, si num fuese 30 la posicin sera la 4.
Mediante esta funcin llamada pedir_vector que tiene como argumento un vector de
enteros se piden los distintos elementos para el vector v y se devuelve su dimensin 0 1 2 3 4 5 6 7 8 9 10
(nmero de elementos vlidos). v2 12 14 17 28
int crear_vector_asc(int v1[], int dim1,int v_asc[]);
Mediante esta funcin llamada crear_vector_asc que tiene como argumentos un Desplazamos los nmeros del vector v2, a partir de esa posicin incluida, una
vector de enteros v1, su dimensin dim1 y un vector v_asc, crea a partir de v1 el vector posicin a la derecha (si el nuevo nmero num es 15, como la posicin es la
v_asc con los enteros que seguan el orden ascendente y devuelve la dimensin de este 2, desplazaramos el 17 y el 28)
nuevo vector v_asc.
void ver_vector(int v[], int dim); 0 1 2 3 4 5 6 7 8 9 10
Mediante esta funcin llamada ver_vector que tiene como argumentos un vector de v2 12 14 17 17 28
enteros y su dimensin visualizamos los elementos del vector de enteros v que tiene
dim elementos. Para finalizar, colocamos num en la posicin adecuada del vector v2:
int pedir_entero();
Mediante esta funcin llamada pedir_entero se pide un entero no negativo por teclado 0 1 2 3 4 5 6 7 8 9 10
y cuando es correcto se devuelve. v2 12 14 15 17 28
int insertar_en_vector_asc(int num, int v[], int dim);
Mediante esta funcin llamada insertar_en_vector_asc que tiene como argumentos el
f) Mediante la funcin ver_vector visualizar este nuevo v2.
nmero a insertar num, un vector con enteros colocados en orden ascendente v y su
dimensin dim, inserta el nmero en el lugar adecuado de v para que se siga
manteniendo el orden ascendente. Devuelve la nueva dimensin de v que ser dim+1.

Conchi Presedo Garca EUITI Bilbao 2015 59 Conchi Presedo Garca EUITI Bilbao 2015 60
LABORATORIO 9 FUNDAMENTOS DE INFORMTICA LABORATORIO 9 FUNDAMENTOS DE INFORMTICA

4 EJERCICIOS

LABORATORIO 9 4.1 Ejercicio 1 Clculo del nmero de palabras

CADENAS DE CARACTERES - STRINGS 4.1.1 Objetivo 1

Aprender a pedir un string y a recorrerlo para contar el nmero de palabras.


1 OBJETIVOS

Al finalizar esta actividad, sers capaz de: 4.1.2 Enunciado 1

Trabajar adecuadamente con las cadenas de caracteres, tambin llamadas strings. Realizar un programa que pida una cadena (mximo 250 caracteres) e indique de cuntas
Utilizar funciones que manejen strings. palabras est compuesta.

2 MOTIVACIN
Ejemplo de ejecucin:
Existen multitud de problemas que no se pueden solucionar si no es con el uso de (los datos tecleados por DADA UNA CADENA CUENTO SUS PALABRAS.
estructuras de datos como las cadenas de caracteres. el usuario estn en Introduce un conjunto de palabras:
En particular, nos referimos a problemas en los que es necesario almacenar, manejar cursiva y subrayados) _Hola gente____
y escribir series de caracteres (frases, listas de palabras, cdigos, etc.). Numero de palabras: 2.

3 LAS CADENAS DE CARACTERES EN C 4.1.3 Ayuda para el enunciado 1

Almacenan en una misma estructura un nmero determinado de valores de tipo Cada palabra puede estar separada de la siguiente por uno o ms espacios en blanco;
carcter. asimismo, puede ocurrir que antes de la primera palabra, o despus de la ltima, haya uno
o ms blancos. Ejemplo:
En general, su uso es como el de las tablas numricas sustituyendo los nmeros por
caracteres. Por ejemplo, para declarar una cadena se pondr: cad 'H' 'o' 'l' 'a' 'g' 'e' 'n' 't' 'e' '\0' ...
char nombre_cadena[N];
Para contar palabras basta con identificar dnde empieza cada una de ellas, de modo que al
Las diferencias ms notables se citan a continuacin. detectar un espacio en blanco seguido de una letra podemos asegurar que hemos
encontrado una nueva palabra. Atencin a la primera palabra del string, pues puede ser un
Las cadenas de caracteres se piden y visualizan sin necesidad de bucles: caso especial.
o Pedir por teclado gets(nombre_cadena); De modo anlogo, podran contarse los finales de palabra, es decir, el nmero de letras
o Visualizar printf(%s, nombre_cadena); seguidas por un blanco. En este caso, la ltima palabra de la cadena sera el caso especial.

Toda cadena en C debe terminar con un carcter especial de fin de cadena ('\0')
que se ubica detrs de la ltima posicin ocupada del string. 4.2 Ejercicio 2 Clculo de la letra que ms aparece
o Existe la funcin predefinida strlen(nombre_cadena) que nos devuelve la
posicin de este carcter de fin de cadena en nombre_cadena; esta funcin se 4.2.1 Objetivo 2
encuentra en la librera string.h y es til porque esta posicin coincide con
el nmero de caracteres de la cadena. Aprender a trabajar diferentes aspectos de los strings. Requiere la realizacin de
bsquedas y filtrados (lo que exige un adecuado uso de los ndices para el acceso a
las posiciones del string) y, opcionalmente, la definicin de funciones.

4.2.2 Enunciado 2

Hacer un programa que pida una cadena de caracteres formada exclusivamente por letras y
espacios en blanco (250 caracteres mximo), y visualice las iniciales de cada palabra de
dicha cadena, sabiendo que las palabras pueden estar separadas por uno o ms blancos.

Conchi Presedo Garca EUITI Bilbao 2015 61 Conchi Presedo Garca EUITI Bilbao 2015 62
LABORATORIO 9 FUNDAMENTOS DE INFORMTICA LABORATORIO 9 FUNDAMENTOS DE INFORMTICA

A continuacin se generar otra cadena, que resulte de eliminar en la anterior todos los Funcin cambiar_c: Dada una cadena la transforma cambiando la 'c' por la 'k'
blancos y convertir todas sus letras a minsculas. Por ltimo, se visualizar cul es la letra siempre que est seguida por 'a', 'o', 'u'. Ejemplo: dado guepardo agil vaga
que ms aparece. cansado se transformara en guepardo agil vaga kansado.
Funcin cambiar_bv: Dada una cadena la transforma cambiando 'v' por 'b', y 'b' por
'v'. Ejemplo: dado guepardo agil vaga cansado se transformara en guepardo agil
Ejemplo de baga cansado.
ejecucin: DADA UNA CADENA VISUALIZO INICIALES Y LETRA QUE MAS APARECE. Funcin cambiar_gue_gui: Dada una cadena la transforma eliminando la 'u' en los
Introduce una cadena (solo letras y blancos):
casos gue y gui. Ejemplo: dado guepardo agil vaga cansado se transformara
_Hola gente____
Las iniciales de las palabras son: H g en gepardo agil vaga cansado.
Cadena transformada: holagente Funcin insertar_h: Dada una cadena la transforma insertando 'h' en cada palabra
La letra que mas aparece es e (2 veces) que empiece por vocal. Ejemplo: dado guepardo agil vaga cansado se
transformara en guepardo hagil vaga cansado.

4.2.3 Ayuda para el enunciado 2


Ejemplo de
Utilizar como punto de partida el ejercicio 1. ejecucin: DADA UNA CADENA PRODUZCO FALTAS DE ORTOGRAFIA.
Introduce una frase: guepardo agil vaga cansado
La frase con faltas es: gepardo hagil baga kansado
Se supone (no hay que comprobarlo) que la cadena que pedimos (cad1) est formada por
letras y blancos. Utilizando los datos del ejemplo de ejecucin, la cadena pedida sera:
4.3.3 Ayuda para el enunciado 3
cad1 'H' 'o' 'l' 'a' 'g' 'e' 'n' 't' 'e' '\0' ...
Puede ser til la funcin predefinida strcpy(cad1,cad2) que copia el contenido de cad2 en
En ella buscamos las iniciales de las palabras: 'H' y 'g'. cad1. Se encuentra en la librera string.h.
A continuacin, la transformamos en otra (cad2) sin blancos y con las letras en minsculas,
que sera: Se supone que la frase inicial est en minsculas y sin acentos (no hay que comprobar
nada), y que puede contener un mximo de 250 caracteres, incluyendo el fin de cadena.

cad2 'h' 'o' 'l' 'a' 'g' 'e' 'n' 't' 'e' '\0' ... Si seguimos el ejemplo de ejecucin, la frase inicial cad sera:

i:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ...
Visualizamos esta nueva cadena para ver si la hemos hecho bien. 'g' 'u' 'e' 'p' 'a' 'r' 'd' 'o' ' ' 'a' 'g' 'i' 'l' ' ' 'v' 'a' 'g' 'a' ' ' 'c' 'a' 'n' 's' 'a' 'd' 'o' '\0' ...
Y, por ltimo, en esta nueva cadena calculamos qu letra aparece ms y cuntas veces. En
el ejemplo es la 'e', que aparece 2 veces. Y la aplicacin de todas las transformaciones indicadas debe dar como resultado una nueva
Incluir si se desea una funcin llamada visualizar_maximo que, dado un string formado cadena, que llamaremos cad_con_faltas :
exclusivamente por letras determine el carcter que ms aparece y cuntas veces lo hace,
visualizando el mensaje La letra que mas aparece es X (Y veces).. j:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ...
'g' 'e' 'p' 'a' 'r' 'd ' 'o' '' 'h' 'a' 'g' 'i' 'l' ' ' 'b' 'a' 'g' 'a' ' ' 'k' 'a' 'n' 's' 'a' 'd' 'o' '\0' ...

4.3 Ejercicio 3 Generador de faltas de ortografa


Se recomienda aplicar los cambios sobre la cadena de uno en uno: haz uno y comprueba
4.3.1 Objetivo 3 que funciona. Debes tener cuidado con las ltimas posiciones del array; por ejemplo, en el
caso de que la posicin 249 tenga una 'g' no tiene sentido preguntar si la siguiente posicin
Seguir trabajando con strings, en este caso realizando algunas modificaciones sobre tiene una 'u', ya que la posicin 250 no est definida.
una cadena de caracteres.

4.3.2 Enunciado 3

Escribir un programa que pida una frase y produzca ciertas faltas de ortografa. Para ello si
encontramos una 'c' seguida de 'a', 'o' 'u' la cambiaremos por una 'k', intercambiaremos 'v'
y 'b', cuando encontremos gue gui eliminaremos la 'u' e insertaremos una 'h' en todas
las palabras que empiecen por vocal, tal como se indica en el apartado de Ayuda para el
enunciado 3.
Para incluir las faltas de ortografa en la frase inicial deberemos realizar cambios, que
podemos programar mediante las siguientes funciones:
Conchi Presedo Garca EUITI Bilbao 2015 63 Conchi Presedo Garca EUITI Bilbao 2015 64
LABORATORIO 9 FUNDAMENTOS DE INFORMTICA LABORATORIO 9 FUNDAMENTOS DE INFORMTICA

4.4 Ejercicio 4 Validacin de un posible nmero capica 4.5 Ejercicio 5 Validacin de un posible palndromo

4.4.1 Objetivo 4 4.5.1 Objetivo 5

Aprender a trabajar con un nmero que ha sido almacenado como string. Se Aprender a abordar un problema relativamente complejo de strings, simplificndolo
trata de ver la ventaja de almacenar un nmero en una cadena cuando se quiere mediante el uso de funciones.
trabajar con sus distintas cifras, ya que cuando hacemos esto cada dgito del nmero
y la coma decimal si la tiene - queda guardado automticamente en cada una de 4.5.2 Enunciado 5
las posiciones de la cadena.
Hacer un programa que pida por teclado una cadena de caracteres y muestre por pantalla si
4.4.2 Enunciado 4 se trata de un palndromo o no. Un palndromo es una cadena que se lee igual de izquierda
a derecha que de derecha a izquierda. Por ejemplo: Dbale arroz a la zorra el abad
Realizar un programa que pida por teclado un nmero entero con un mximo de N dgitos y
visualice un mensaje que indique si es capica o no.
Ejemplos de ejecucin: (para N = 250)
Ejemplos de (para N = 5)
ejecucin: DADO UN NUMERO MUESTRO SI ES CAPICUA O NO. DADA UNA CADENA MUESTRO SI ES UN PALINDROMO O NO.
Introduce un numero de HASTA 5 cifras y pulsa Intro: 1231 Introduce una cadena (mximo 250 caracteres):
El numero 1231 NO es CAPICUA. Sara Baras
Es PALINDROMO

DADO UN NUMERO MUESTRO SI ES CAPICUA O NO.


Introduce un numero de HASTA 5 cifras y pulsa Intro: 79597 DADA UNA CADENA MUESTRO SI ES UN PALINDROMO O NO.
El numero 79597 es CAPICUA. Introduce una cadena (mximo 250 caracteres):
El coche de Sole
NO Es PALINDROMO

4.4.3 Ayuda para el enunciado 4


4.5.3 Ayuda para el enunciado 5
El programa deber pedir el nmero como cadena, con lo que almacenar automticamente
cada cifra del nmero en una posicin de esa cadena (cada cifra sera un carcter) y Para resolver este problema se sugiere seguir estos pasos:
despus se comparar sucesivamente el primer dgito con el ltimo, el segundo con el
penltimo y as hasta encontrar dos dgitos distintos o llegar a la mitad del nmero de cifras Convertir la cadena de entrada a otro string en el que se han eliminado los espacios
(se habran comparado todos los dgitos). Si utilizamos el nmero dado en el ejemplo de en blanco. Usar para ello una funcin que llamaremos eliminar_blancos.
ejecucin tendramos: Convertir el string sin blancos a otra cadena en la que las maysculas se han
convertido en minsculas. Usar para ello una funcin que llamaremos
i 0 1 2 3 4 5 N pasar_a_minusculas.
cad[i] 1 2 3 1 \0 Decidir si la cadena resultante (que slo tendr letras minsculas) es la misma leda
de izquierda a derecha y viceversa. Usar para ello una funcin que llamaremos
Y compararamos cifra con cifra: es_palindromo que devuelva true si la cadena es palndromo y false si no lo es.
cad[0]=1 con cad[3]=1 como son iguales puede ser capica (seguimos comparando) Alternativamente, se puede usar 1 para true y 0 para false.
cad[1]=2 con cad[2]=3 como son distintos el nmero ya NO puede ser capica (dejamos
de comparar). La funcin es_palndromo es similar a la utilizada para el nmero capica de este mismo
laboratorio.
Para realizar este programa utiliza la funcin es_capicua, que dada una cadena de
caracteres y su nmero de elementos devuelva true si la tabla contiene las cifras de un
nmero capica y false en caso contrario. Alternativamente, se puede usar 1 para true y 0
para false.

Conchi Presedo Garca EUITI Bilbao 2015 65 Conchi Presedo Garca EUITI Bilbao 2015 66
LABORATORIO 10 FUNDAMENTOS DE INFORMTICA LABORATORIO 10 FUNDAMENTOS DE INFORMTICA

4 EJERCICIOS

LABORATORIO 10 4.1 Ejercicio 1 Almacenamiento de nmeros reales en un fichero

FICHEROS 4.1.1 Objetivo 1

1 OBJETIVOS Almacenar en un fichero de disco, los datos introducidos desde el teclado.

Al finalizar esta actividad, sers capaz de: 4.1.2 Enunciado 1

Trabajar adecuadamente con ficheros. 1. Escribir un programa que nos permita almacenar en el fichero float.txt los datos
Utilizar funciones que manejen ficheros. introducidos por el teclado. El programa debe finalizar cuando se introduzca un
Entender la diferencia entre los ficheros y las variables que los manipulan. nmero negativo.
Entender la diferencia entre los ficheros y los nombres de los ficheros. 2. Ejecutar el programa.
Utilizar los ficheros realizando acceso secuencial y directo. 3. Comprobar que los datos introducidos por teclado se corresponden con los datos
Comprobar la utilidad de la utilizacin de ficheros. almacenados en el fichero.
4. Ejecutar el programa por segunda vez y comprobar los resultados.
5. Modificar el programa para que los datos introducidos se aadan al final del fichero.
2 MOTIVACIN

Existen multitud de problemas que no se pueden solucionar fcilmente si no es con


Ejemplo de ejecucin:
el uso de ficheros. INTRODUCIR VALORES REALES POSITIVOS
La utilizacin de ficheros simplifica la entrada y salida de datos, ya que (los datos tecleados por
almacenndolos una vez, se pueden utilizar todas las veces que deseemos. el usuario estn en X(1): 31.91
Con pequeas variaciones los problemas que hemos hecho hasta ahora se pueden cursiva y subrayados ) X(2): 32.11
utilizar con ficheros, permitindonos almacenar permanentemente los resultados X(3): 7
obtenidos. Por ejemplo, si obtenemos un vector desde el teclado, podemos X(4): 12.22
almacenarlo permanentemente en un fichero de disco.
Adems, los resultados obtenidos en un programa, si los almacenamos en un fichero X(5): -1
de disco, podemos reutilizarlos en otros programas.
Podemos introducir los datos una nica vez en un fichero y utilizarlos muchas veces.
Adems, si nos damos cuenta que un dato es errneo, podemos modificarlo sin En este caso la pantalla de ejecucin del programa no tiene demasiado inters ya que los
necesidad de tener que modificar el resto de datos introducidos. resultados se almacenarn en el fichero float.txt. Deberemos comprobar que el fichero
Podemos editar directamente los datos y luego utilizarlos. contiene los datos que acabamos de introducir.
Podemos generar automticamente los datos, para luego utilizarlos.
Podemos almacenar los resultados y luego comprobarlos adecuadamente. 4.1.3 Ayuda para el enunciado 1

3 USO DE FICHEROS EN C Escribir un programa cclico que permita introducir datos desde el teclado, para luego
almacenar dichos datos en un nuevo fichero.
Los prototipos de las funciones que podemos utilizar en este laboratorio son los siguientes:
Lo primero que tenis que hacer es escribir un breve programa de introduccin de datos.
FILE *fopen(char nombre_fichero[], char modo_apertura[]); Podis utilizar cualquier programa de los que habis escrito hasta ahora que solicite datos
int fprintf(FILE * fichero, char formato[], ); numricos del usuario y finalice al introducir un nmero negativo.
int fputs(char cadena[], FILE *fichero);
int fscanf(FILE * fichero, char cadena[], ); Despus de ejecutar el programa, los datos que habis introducido deberan estar
char *fgets(char cadena[], int n, FILE *fichero); almacenados en el fichero float.txt. Eso lo podis comprobar abriendo el fichero desde el
int fclose(FILE *fichero); entorno de desarrollo o bien desde el explorador de Windows.
int fseek(FILE *fichero, long pos, int modo);
int feof(FILE *fichero); Recordar que para almacenar los datos en un fichero, podis utilizar la funcin:
char *strerror(int error);
int rand(void); int fprintf(FILE * fichero, char formato[], );
void srand(unsigned int semilla);
pero para ello necesitis con anterioridad disponer de una variable fichero, a la cual le
podis asignar valor al utilizar la funcin:

Conchi Presedo Garca EUITI Bilbao 2015 67 Conchi Presedo Garca EUITI Bilbao 2015 68
LABORATORIO 10 FUNDAMENTOS DE INFORMTICA LABORATORIO 10 FUNDAMENTOS DE INFORMTICA

FILE * fopen(char nombre[], char modo_apertura[]);


4.3 Ejercicio 3 Suma y producto de nmeros de un fichero
Recordar que, en este caso, el modo de apertura debera ser w o a
4.3.1 Objetivo 3
Observar cmo afecta la modificacin del modo de apertura al fichero que almacenar los
resultados. Dependiendo del tipo de problema interesar un comportamiento u otro.
Dado que ya sabemos cmo almacenar datos en los ficheros, ahora queremos
utilizarlos, es decir, queremos usar los datos numricos que se encuentran en un
Observar que los datos se pueden almacenar en el fichero de formas diferentes
fichero para obtener su suma y su producto (en general cualquier tipo de
dependiendo de la cadena de formato que hayamos utilizado.
operaciones).

4.3.2 Enunciado 3
4.2 Ejercicio 2 Almacenamiento del juego de caracteres ASCII
Escribir un programa que utilizando los datos del fichero float.txt obtenga su suma y su
4.2.1 Objetivo 2 producto. Para ello definir dos funciones una para la suma y otra para el producto, con
prototipos similares a los siguientes:
Almacenar en disco datos generados por el programa.
Observar que existen algunos caracteres que no tienen representacin visible. float sum_fich (char nomfich[]);
float mult_fich (char nomfich[]);
4.2.2 Enunciado 2

Escribir un programa que almacene en el fichero ascii.txt el juego de caracteres ASCII. Ejemplo de ejecucin:
SUMA Y PRODUCTO DE LOS VALORES GUARDADOS
Ejemplo de ejecucin: EN EL FICHERO float.txt
CODIGO ASCII CARACTER
Suma de los numeros: 83.24
Comprende
Producto de los numeros: 87646.87
cdigos de 0 a 65 A
127 (7 bits) e 66 B
incluye las letras
67 C Comprobar que podemos eliminar los decimales en el fichero float.txt y el programa
correspondientes
al ingls 68 D funciona correctamente; es decir, podemos introducir los datos tanto con representacin
entera como con representacin decimal.

1. Generalizar el programa anterior para recibir desde el teclado el nombre del fichero
que deseamos utilizar.
Modificar el programa para que almacene el juego de caracteres extendido.

4.2.3 Ayuda para el enunciado 2 4.3.3 Ayuda para el enunciado 3

Recordar que algunos de los caracteres, aquellos cuyo cdigo es menor que 32, no son Utilizar el fichero float.txt obtenido anteriormente para editar o aadir nuevos valores.
representables grficamente en la pantalla (por ejemplo el carcter 8 no se visualiza y
suena un pitido). El fichero debera tener un aspecto similar al siguiente:

.
4.4 Ejercicio 4 Almacenamiento de nmeros aleatorios
65 A En este caso los cdigos van de 0
66 B 4.4.1 Objetivo 4
a 255 (8 bits) e incluye las letras
67 C correspondientes al castellano. Por
68 D Comprobar la utilidad de la generacin de nmeros al azar para obtener datos
ejemplo existen cdigos para cada
69 E almacenados en ficheros que sern utilizados posteriormente para la realizacin de
letra con acento y la ee (164 es
test de programas).
y 165 es )
76 L

En donde la primera columna representa los valores numricos correspondientes a los


caracteres de la segunda columna.

Conchi Presedo Garca EUITI Bilbao 2015 69 Conchi Presedo Garca EUITI Bilbao 2015 70
LABORATORIO 10 FUNDAMENTOS DE INFORMTICA LABORATORIO 10 FUNDAMENTOS DE INFORMTICA

4.4.2 Enunciado 4 del autobs, que indicar el estado del asiento. As, en cada asiento para viajeros se pondr
un 0 (libre) o un 1 (ocupado) dependiendo de un nmero que habremos de generar
1. Escribir una funcin que almacene en un fichero, cuyo nombre ha sido proporcionado aleatoriamente. Si el nmero generado es par pondremos un 0 en esa posicin del autobs
por el usuario, una secuencia 100 de nmeros generados al azar mediante la funcin y si es impar pondremos un 1.
rand(). Una vez creados todos los asientos, deberemos visualizar el fichero resultante como aparece
2. Utilizando los datos del fichero, escribir una funcin que proporcione el valor medio, en el ejemplo de ejecucin, es decir, 4 asientos por fila.
la varianza y la desviacin tpica.
3. Construir un fichero denominado semilla.txt que contenga un valor entero.
4. Modificar la funcin del punto primero con el fin de almacenar diferentes secuencias
de nmeros, usando el valor de la semilla almacenado en semilla.txt

4.4.3 Ayuda para el enunciado 4

El valor de la semilla se puede almacenar directamente en un fichero utilizando el entorno


de desarrollo para editar directamente el fichero semilla.txt, o bien utilizar el programa
para solicitar una nueva semilla al usuario.

Frmulas de la media, la varianza y la desviacin tpica de n nmeros:

La desviacin tpica es la raz cuadrada de la varianza.

4.5 Ejercicio 5 Generacin aleatoria de asientos autobs

4.5.1 Objetivo 5

Visualizar por pantalla datos almacenados en ficheros en forma de matriz.

4.5.2 Enunciado 5

Realizar un programa en C que genere aleatoriamente las plazas ocupadas y libres de un


autobs. Esta generacin se har en un fichero que despus se visualice de forma que
aparezca el estado de cuatro asientos en cada fila.

Ejemplo de Nombre del fichero a crear: ocuAutobus.txt


ejecucin: Numero de asientos para viajeros (multiplo de 4): 16
Creado el fichero ocuAutobus.txt.
Visualizacion de los asientos del autobus (0: libre, 1:
ocupado)
0011
1000
1111
0101
Presione una tecla para continuar

4.5.3 Ayuda para el enunciado 5

Se debe generar un fichero que contenga tantas posiciones como asientos disponga el
autobs. A la hora de crear el fichero iremos escribiendo libre u ocupado en cada posicin

Conchi Presedo Garca EUITI Bilbao 2015 71 Conchi Presedo Garca EUITI Bilbao 2015 72
ANEXO. Manual de MS Visual Studio para C FUNDAMENTOS DE INFORMTICA ANEXO. Manual de MS Visual Studio para C FUNDAMENTOS DE INFORMTICA

Cada plantilla de proyecto crea y mantiene un archivo de proyecto para almacenar los
metadatos especficos del proyecto en cuestin. Mientras trabaja en el entorno de desarrollo
ANEXO integrado (IDE), la plantilla crea y mantiene dicho archivo de proyecto por el usuario. La
MANUAL DE MS VISUAL STUDIO PARA C/C++ extensin y el contenido real del archivo de proyecto vendrn determinados por el tipo de
proyecto que se defina.

Microsoft Visual Studio es un Entorno Integrado de Desarrollo que permite desarrollar EL EXPLORADOR DE SOLUCIONES
aplicaciones en varios lenguajes de programacin. Es un software de propietario, sin El Explorador de soluciones proporciona una vista grfica de toda la solucin que le ayuda a
embargo existen maneras de conseguirlo de forma gratuita: administrar los proyectos y archivos durante el desarrollo de la aplicacin.
Por un tiempo limitado: Cualquiera se puede descargar una versin de prueba El Explorador de soluciones, una interfaz para ver y administrar estos contenedores y sus
(vlida durante 30 das) en http://www.microsoft.com/spain/visualstudio elementos asociados, forma parte del entorno de desarrollo integrado (IDE).
Sin lmite de tiempo: Teniendo una licencia acadmica de Microsoft MSDNAA. Muchas
universidades poseen este ltimo tipo de licencia para profesores y alumnos.

Generalidades sobre Visual Studio

INTRODUCCION A SOLUCIONES, PROYECTOS Y EXPLORADOR DE SOLUCIONES


Visual Studio dispone de dos contenedores que ayudan a administrar eficazmente los
elementos necesarios para el desarrollo, como referencias, conexiones de datos, carpetas y
archivos. Estos contenedores se denominan soluciones y proyectos. Ambos contenedores
permiten a Visual Studio habilitar el entorno de desarrollo integrado (IDE) y aplicar su gran
variedad de herramientas, diseadores, plantillas y configuraciones.

Asimismo, Visual Studio proporciona carpetas de soluciones para organizar proyectos


relacionados en grupos y, a continuacin, llevar a cabo acciones en esos grupos de
proyectos.
Dado que cada proyecto o solucin comprende un directorio y su contenido, las soluciones y
los proyectos se pueden mover, copiar o eliminar como cualquier otro elemento desde el
Explorador de Windows.

SOLUCIONES
Las soluciones administran la manera en que Visual Studio configura, genera e implementa Figura 3. El entorno integrado de desarrollo MS Visual Studio 2010
conjuntos de proyectos relacionados. Una solucin incluye uno o varios proyectos ms los
archivos y metadatos que ayudan a definir la solucin como un todo.
Visual Studio 2010 almacena la definicin correspondiente a una solucin en dos archivos:
.sln y .suo. En versiones anteriores de Visual Studio, se almacenaba en los archivos de
grupo (.vbg) o de rea de trabajo (.dsw) en Visual Basic y Visual C++, respectivamente.

PROYECTOS
Para organizar los elementos y realizar tareas comunes con los elementos que est
desarrollando, los proyectos de Visual Studio se utilizan como contenedores dentro de una
solucin a fin de administrar, compilar y depurar lgicamente los elementos que componen
la aplicacin. El resultado de un proyecto suele ser un programa ejecutable (.exe), un
archivo de biblioteca de vnculos dinmicos (.dll) o un mdulo, entre otros.

Un proyecto incluye un conjunto de archivos de cdigo fuente ms los metadatos


relacionados, como referencias de componentes e instrucciones de generacin.
Normalmente, los proyectos crean uno o ms archivos cuando se generan.

La manera ms fcil de crear y administrar los proyectos es utilizar las mltiples plantillas y
configuraciones predefinidas en Visual Studio.

Conchi Presedo Garca EUITI Bilbao 2015 73 Conchi Presedo Garca EUITI Bilbao 2015 74
ANEXO. Manual de MS Visual Studio para C FUNDAMENTOS DE INFORMTICA ANEXO. Manual de MS Visual Studio para C FUNDAMENTOS DE INFORMTICA

Antes de empezar a trabajar con Visual Studio y C/C++ Funcionamiento bsico de MS Visual Studio

CREAR UN NUEVO PROYECTO VACO PARA TRABAJAR CON C/C++ Cmo Editar un programa
Si todava no hemos creado ningn proyecto, debemos crear un proyecto vaco del tipo
Aplicacin de consola Win32. ABRIR EL PROYECTO QUE LO VA A CONTENER
Entrar en Visual Studio y
En una Aplicacin de consola habitualmente el diseo no tiene interfaz grfica de usuario En la pgina principal buscarlo en Proyectos Recientes, o bien
(GUI) y se compila en un archivo ejecutable. En un Proyecto vaco la plantilla crea la
estructura de archivos necesaria para almacenar la informacin sobre la aplicacin. Las Men Archivo Abrir Proyecto y hacer doble clic en el .sln o el .vcxproj
referencias, archivos o componentes se deben agregar de forma manual.
CREAR UN ARCHIVO NUEVO EN UN PROYECTO
Como ejemplo vamos a crear un proyecto vaco llamado labo1ejer2:
Entrar en el proyecto y seleccionar Men Archivo Nuevo Archivo
En el Men Archivo seleccionamos Nuevo proyecto
En las plantillas de Visual C++ elegimos Archivo C++ (.cpp) le ponemos un
Aparece una pantalla con las plantillas predefinidas:
nombre y damos a Aceptar.
En el explorador de soluciones podemos ver todos los ficheros de nuestro proyecto.
Seleccionamos Visual C++ Win32 Aplicacin de consola Win32 Por ejemplo, si creamos un archivo nuevo llamado labo1ejer2 en el proyecto vaco creado
Especificamos en el cuadro de dilogo algunas de las propiedades del nuevo proyecto: su anteriormente tendramos:
Nombre, Ubicacin y Nombre de la solucin que va a contener el proyecto y damos a
Aceptar.

Figura 2. Parte del cuadro de dilogo Nuevo Proyecto

Aparece la pantalla de configuracin de la aplicacin, marcamos Proyecto vaco y damos a Figura 5. Detalle del Explorador de soluciones
Finalizar.
Y una nueva pantalla en la que deberemos teclear el cdigo fuente del programa:

Figura 4. Pantalla de configuracin de la plantilla Aplicacin Win32

PERSONALIZACIN DEL IDE


Antes de trabajar con Visual Studio podemos personalizarlo desde el Men Herramientas.
Figura 6. Detalle del Editor de cdigo
Por ejemplo, podemos visualizar los nmeros de lnea en el programa fuente desde el men
Herramientas Opciones Editor de texto Todos los lenguajes y marcando la
Un * en la pestaa del nombre significa que no lo hemos guardado todava.
opcin Nmeros de lnea.

Conchi Presedo Garca EUITI Bilbao 2015 75 Conchi Presedo Garca EUITI Bilbao 2015 76
ANEXO. Manual de MS Visual Studio para C FUNDAMENTOS DE INFORMTICA ANEXO. Manual de MS Visual Studio para C FUNDAMENTOS DE INFORMTICA

ABRIR UN ARCHIVO YA EXISTENTE


Una vez abierto el proyecto que lo contiene haremos doble clic en su icono .

Cerrar ventanas de edicin


Figura 8. Detalle del resultado de una generacin
Haciendo clic en el icono de la pestaa del archivo a cerrar, o bien
Men Archivo Cerrar (cierra el documento que se encuentra activo), o bien
Si tuvisemos abiertos varios documentos y queremos cerrarlos todos excepto uno, Cmo Ejecutar un programa ya generado
basta con hacer clic en su pestaa y seleccionar Cerrar todo excepto esta Ir a la carpeta donde se ha generado el .exe y hacer doble clic en l.
ventana.

Cmo Guardar un Fichero Fuente

Hacer clic en para guardar solamente el archivo

Hacer clic en para guardar todos los archivos del proyecto


Se recomienda que durante el proceso de construccin del programa se guarde el cdigo
con relativa frecuencia.

Figura 9. Carpeta contenedora del archivo ejecutable


Cmo Compilar un programa
Desde aqu se puede ejecutar (no lo hace automticamente).
Men Generar Compilar, o bien
Ctrol-F7
En la ventana Resultados aparecer el resultado de la compilacin

Figura 10. Ejecucin del programa fuera del IDE


Figura 7. Detalle del resultado de una compilacin
Cmo Compilar, Crear el ejecutable y Probarlo de una sola vez
Si todo ha ido bien, obtenemos un fichero con el cdigo objeto de nuestro programa, pero Men Depurar Iniciar sin depurar ,o bien
An no hemos obtenido el fichero ejecutable !! Ctrl+F5
Lo hace todo en un solo paso: compilar + intentar generar el ejecutable y si consigue
generarlo nos deja probar su funcionamiento.
Cmo Crear el ejecutable de un programa Por defecto, el fichero ejecutable se crea en la carpeta Debug que se encuentra dentro de la
carpeta del proyecto.
Si quisiramos compilar y despus obtener el fichero ejecutable de una sola vez deberamos La ejecucin del programa se realizar en una ventana de MS-DOS emergente.
utilizar la opcin:
Generar Generar <nombre del archivo>
Esto intenta generar el ejecutable, si hay errores de compilacin no nos dejar.

En nuestro ejemplo iramos a Men Generar Generar labo1Ejer2

El resultado obtenido se puede ver en la ventana Resultados


Figura 11. Ejecucin del programa desde dentro del IDE

Conchi Presedo Garca EUITI Bilbao 2015 77 Conchi Presedo Garca EUITI Bilbao 2015 78
ANEXO. Manual de MS Visual Studio para C FUNDAMENTOS DE INFORMTICA ANEXO. Manual de MS Visual Studio para C FUNDAMENTOS DE INFORMTICA

Deteccin y eliminacin de Errores de compilacin Depuracin de programas con Visual Studio


Cuando la fase de compilacin no ha terminado con xito, en la parte inferior de la ventana
principal aparece activada la pestaa Lista de errores, con tres tipos de informacin: Cmo Depurar programas
Errores : Son los fallos que impiden la compilacin satisfactoria del cdigo
fuente. Los deberemos quitar para poder generar el ejecutable. Un Depurador nos permite ejecutar un programa por partes, viendo en cualquier momento
Advertencias o warnings : Son simplemente avisos que normalmente no el valor de las variables o expresiones que ms nos interesen. Por lo tanto es una
impiden la generacin del programa compilado. Conviene leerlos pero la mayora de herramienta muy til para detectar errores lgicos que de otro modo resultaran muy
las veces no es necesario quitarlos. difciles de localizar.
Utilizaremos el depurador integrado en el entorno Visual Studio.
IntelliSense : Ofrecen una explicacin de los errores detectados por el Formas de entrar en el modo depuracin:
compilador. Son los que nos seala el propio Visual Studio incluso sin volver a Desde el men Depurar: elegir Iniciar depuracin, Paso a paso por
compilar y se puede ver la explicacin situando el ratn encima del error subrayado instrucciones o Paso a paso por procedimientos.
Desde una lnea de cdigo: Clic botn derecho Ejecutar hasta el cursor.
Haciendo doble clic en la fila, nos posicionaremos sobre la lnea del fichero fuente donde el
compilador detect el error.

Figura 12. Programa con errores de compilacin


Figura 13. Visual Studio en MODO DEPURACIN
Una vez quitados stos pueden existir otros. Volvemos al men Generar Compilar hasta
que no quede ningn error. Para ilustrar los siguientes apartados utilizamos un programa en C que pide un radio por
teclado y calcula la longitud de la circunferencia y el rea del crculo correspondiente si el
Despus de corregir el primer error que aparezca, debemos guardar el archivo y volver a radio es positivo. Si el radio no es positivo visualiza un mensaje de error.
compilar. Esto lo haremos siempre, aunque aparezcan ms errores en la ventana, ya que es
muy posible que el resto de los errores sean consecuencia del primero.
Depuracin de un programa paso a paso (instruccin por instruccin)
Un ejemplo de errores en cascada se obtendra si cambiamos float por flot en el cdigo sin
errores. En este caso si compilamos sin haberlo arreglado nos salen 14 errores aunque Para entrar en el MODO DEPURACION y depurar un programa ignorando las instrucciones
realmente solo es uno, por este motivo siempre hay que ir 1 por 1, es decir hay que de las funciones, es decir, yendo solamente paso a paso en el main utilizaremos el modo
arreglar el primer error que aparezca y volver a compilar y as hasta acabar sin errores. Paso a paso por procedimientos.
Men Depurar Paso a paso por procedimientos, o bien
F10
Nada ms entrar a este modo aparece una flecha amarilla que indicar la siguiente
instruccin que se va a ejecutar al volver a pulsar F10. Adems aparecer una ventana de
MS-DOS para que se realicen las entradas y salidas que el programa necesite durante su
depuracin. Cada vez que pulsemos F10 continuar la ejecucin paso a paso del programa,
indicndose con una flecha amarilla cul ser la lnea que se ejecutar.

Conchi Presedo Garca EUITI Bilbao 2015 79 Conchi Presedo Garca EUITI Bilbao 2015 80
ANEXO. Manual de MS Visual Studio para C FUNDAMENTOS DE INFORMTICA ANEXO. Manual de MS Visual Studio para C FUNDAMENTOS DE INFORMTICA

Si queremos que haga tambin paso a paso alguna de nuestras funciones, deberemos Detener la depuracin
combinar la depuracin por procedimientos (F10) y la depuracin por instrucciones (F11) En cualquier momento podemos salirnos del modo depuracin con:
segn nos convenga:
Men Depurar Detener depuracin, o bien
Men Depurar Paso a paso por instrucciones, o bien Myus. + F5
F11.
Control de la depuracin
Visualizacin en el cdigo fuente Cuando depuramos existen varias maneras de hacerlo, que se pueden combinar entre s
Podemos visualizar el valor contenido situndonos con el cursor sobre la variable o como ms nos convenga.
seleccionando la expresin directamente en el cdigo fuente. Instruccin a instruccin:
Paso a paso por procedimientos (F10): Ejecuta la siguiente instruccin del
programa (la flecha amarilla). Cuando dicha instruccin contiene una llamada a una
funcin, dicha funcin se ejecuta completamente , es decir, no se hace paso a paso.
Figura 14. Visualizacin de valores en el cdigo fuente Esta posibilidad es muy til cuando estamos seguros de que esa funcin no contiene
ningn tipo de error.
Visualizacin del contenido de las variables
Paso a Paso por instrucciones (F11): Ejecuta la siguiente instruccin del
Para ello existe la ventana Variables locales, en la que se aaden automticamente todas
programa. Si dicha instruccin contiene una llamada a una funcin el ndice de
las variables del programa en el momento en que ejecutemos su declaracin.
ejecucin (la flecha amarilla) se situar en la primera sentencia de dicha funcin
En el ejemplo, despus de declarar las variables tendramos:
para ejecutarla paso a paso.
Hasta un punto determinado del cdigo fuente:
Ejecutar hasta el cursor (Ctrl+F10): Ejecuta sentencias hasta el lugar donde
se sita el cursor.
Mediante puntos de ruptura:
Punto de interrupcin : Se crea haciendo un clic en el margen gris de la lnea
de cdigo en la que queramos insertarlo. Esto har que quede marcada la instruccin
Figura 15. Visualizacin de valores en la ventana Variables locales con un punto rojo, indicando que se ha insertado un punto de ruptura que obligar al
depurador a detenerse. Para eliminar los puntos de ruptura basta realizar un doble
Visualizacin de otras expresiones que nos interesen clic sobre el punto.
Iniciar depuracin o Continuar (F5): Ejecuta instrucciones hasta alcanzar el
En MODO DEPURACIN tambin podemos incluir otras expresiones que nos interese ver siguiente punto de ruptura. Cuando no hay puntos de ruptura situados despus de la
utilizando la ventana Inspeccin 1. Para ello, seleccionamos la expresin en el cdigo sentencia actual, se ejecutarn todas las instrucciones hasta finalizar el programa.
fuente

Figura 16. Seleccin de la expresin radio>0 en el cdigo fuente

y con el botn derecho del ratn elegimos Agregar inspeccin, con lo que la
expresin se aade a la ventana Inspeccin 1.

Figura 17. Ventana Inspeccin 1

Para quitar una expresin de esta ventana, la marcamos y pulsamos Eliminar inspeccin.

Conchi Presedo Garca EUITI Bilbao 2015 81 Conchi Presedo Garca EUITI Bilbao 2015 82
ANEXO. MANUAL DE Dev-C++ FUNDAMENTOS DE INFORMTICA ANEXO. MANUAL DE Dev-C++ FUNDAMENTOS DE INFORMTICA

Para dar un determinado aspecto al editor: Herramientas Opciones del


Editor Sintaxis Pre-configuraciones: Classic.
ANEXO Herramientas Opciones del Editor Cdigo Cdigo por defecto.
Herramientas Opciones del Entorno Principal Idioma: Espaol
MANUAL DE DEV-C++ (Castellano)
Herramientas Opciones del Entorno Principal Crear archivos de
respaldo (Copia de Seguridad).
Para indicar el tipo de archivos que se abren por defecto con Dev-C++:
Dev-C++ es un Entorno Integrado de Desarrollo para el lenguaje de programacin
Herramientas Opciones del Entorno Asociacin de archivos
C/C++ que usa Mingw (Minimalist GNU for Windows, www.mingw.org ) de GCC
Para que acepte algunas caractersticas de C++ (por ejemplo los comentarios de
(GNU Compiler Collection www.gnu.org/home.es.html ). Tiene integrado un depurador
tipo //) cuando trabajemos en C: Herramientas Opciones de Compilador
basado en GDB (Gnu DeBugger).
Configuracin Compilador de C Soporte para Programas ANSI
Es un software de libre distribucin sujeto a los trminos de la Licencia Pblica General
Estndar en C: No.
(GPL) de GNU.
Si lo ponemos a Yes acepta solamente lo que es estrictamente lenguaje C.
La ltima versin de Dev-C++ se puede descargar gratuitamente en la direccin:
Para poder depurar programas: Herramientas Opciones de Compilador
http://orwelldevcpp.blogspot.com.es/
Configuracin Linker Generar Informacin de Debug: Yes.

Funcionamiento bsico de Dev-C++

Cmo Editar un programa

Un fichero fuente nuevo: , o bien Archivo Nuevo Cdigo Fuente


Un fichero fuente ya existente: , o bien Archivo Abrir Proyecto o Archivo

Cerrar ventanas de edicin

- Archivo Cerrar (cierra el documento que se encuentra activo), o bien


- Pulsar dentro del programa que se desea cerrar con el botn derecho del ratn y elegir
la opcin Cerrar.
- Si tuvisemos abiertos varios documentos y queremos cerrarlos todos, basta con
seleccionar Archivo Cerrar Todo.

Cmo Guardar un Fichero Fuente

- Archivo Guardar, o bien Ctrl+S


Por defecto, los ficheros fuente se guardan con extensin .cpp lo que significa que
son archivos de C++. Los laboratorios de este libro estn programados en C, por lo
Figura 18. El entorno integrado de desarrollo Dev-C++ que para que funcionen adecuadamente hay que guardarlos en el ordenador como
tipo C source files (*.c) y su extensin ser .c.
Antes de empezar a trabajar con Dev-C++ podemos personalizar sus caractersticas
desde el Men Herramientas. Algunas opciones posibles son:
Herramientas Opciones del Editor Principal Resaltar llaves y
parntesis concordantes.
Herramientas Opciones del Editor Visualizacin Nmeros de lnea.
Conchi Presedo Garca EUITI Bilbao 2015 83 Conchi Presedo Garca EUITI Bilbao 2015 84
ANEXO. MANUAL DE Dev-C++ FUNDAMENTOS DE INFORMTICA ANEXO. MANUAL DE Dev-C++ FUNDAMENTOS DE INFORMTICA

- Mensaje: Indica el tipo de error detectado por el compilador. Pueden ser errores que
hay que corregir aparecer [Error] al principio del mensaje o simplemente avisos
[Warning].

Figura 19. Ventana Guardar Archivo

Se recomienda que durante el proceso de construccin del programa se guarde el


cdigo con relativa frecuencia.

Cmo Compilar un programa

- Ejecutar Compilar , o bien Ctrl+F9


Si todo ha ido bien, obtenemos un fichero con el cdigo objeto de nuestro programa,
pero An no hemos obtenido el fichero ejecutable !!.
Si quisiramos compilar y despus obtener el fichero ejecutable deberamos realizar los
siguientes pasos:
- Ejecutar Compilar y Ejecutar o bien F9
Tras la compilacin, los resultados de la misma podremos verlos en las pestaas
Figura 20. Ventana con errores de compilacin
Resultado de la compilacin y Compilador
. En esta ventana tambin aparecen filas que no tienen asociado nmero de lnea, y que
Deteccin de Errores de compilacin dan informacin sobre la funcin en la que se produjo el error.
Cuando la fase de compilacin no ha terminado con xito, en la parte inferior de la Despus de corregir un error, debemos guardar el archivo y volver a compilar. Esto
ventana principal aparece activada la pestaa Compilador , con cuatro lo haremos siempre, aunque aparezcan ms errores en la ventana, ya que es muy
columnas: posible que el resto de los errores sean consecuencia del primero. Los avisos no es
- Lnea: Indica la lnea donde el compilador detect el error sobre el fichero fuente. necesario corregirlos.
Realmente el error puede estar en dicha lnea o en alguna de las anteriores. Haciendo
doble clic en esta fila de la pestaa Compilacin, nos posicionaremos sobre la lnea del
fichero fuente donde el compilador detect el error.
- Columna: Indica la columna dentro de la lnea anterior.
- Unidad: Indica la ubicacin del fichero en la unidad de almacenamiento.

Conchi Presedo Garca EUITI Bilbao 2015 85 Conchi Presedo Garca EUITI Bilbao 2015 86
ANEXO. MANUAL DE Dev-C++ FUNDAMENTOS DE INFORMTICA ANEXO. MANUAL DE Dev-C++ FUNDAMENTOS DE INFORMTICA

Cmo Ejecutar un programa. donde aparece el nmero de lnea y pulsar el botn izquierdo del ratn en dicha
posicin, o bien Depurar Aadir/Quitar punto de ruptura.
Para ejecutar un programa, previamente compilado, realizaremos lo siguiente: Esto har que quede marcada la instruccin, indicando que se ha insertado un punto de
ruptura (la lnea quedar marcada en rojo) que obligar al depurador a detenerse en
- Ejecutar --> Ejecutar , o bien Ctrl+F10
este punto. Para eliminar los puntos de ruptura se realiza la misma operacin que para
Para realizar compilacin y ejecucin en un solo paso:
marcarlos.
- Ejecutar --> Compilar y Ejecutar , o bien F9 Para depurar el programa entero se debe colocar el punto de ruptura sobre la primera
La ejecucin del programa se realizar en una ventana de consola emergente. instruccin del main.
Opcionalmente se pueden aadir al programa tantos puntos de ruptura como se estime
Por defecto, el fichero ejecutable con extensin .exe - se crea en el mismo directorio conveniente.
donde se almacen el fichero fuente.
2.- Entrar en el modo depuracin. Pulsar , o bien Ejecutar Depurar (bien en
el Men Principal, bien en las pestaas inferiores), con lo que comenzar la ejecucin
paso a paso del programa, indicndose en azul cul ser la siguiente lnea que se
ejecutar. Adems aparecer una ventana de consola para que se realicen las entradas y
salidas que el programa necesite durante su depuracin.

Figura 21. Salida del programa

Depuracin de programas con Dev-C++

Un Depurador nos permite ejecutar un programa instruccin a instruccin, viendo en


cualquier momento el valor de las variables que ms nos interesen. Por lo tanto es una
ventana
herramienta muy til para detectar errores lgicos que de otro modo resultaran muy Watch
difciles de localizar. A este tipo de ejecucin se le denomina ejecucin paso a paso o
depuracin.
En el entorno Dev-C++ utiliza un depurador llamado gdb. Para que funcione, antes de
compilar, y para que se aada al fichero ejecutable cierta informacin que luego
utilizar el depurador de programas, debemos comprobar que est seleccionada la
siguiente opcin:
- Herramientas Opciones de Compilador Configuracin Linker
Generar Informacin de Debug: Yes.

Comenzar la depuracin

Para ilustrar los pasos supongamos un programa en C que pide un radio por teclado y
calcula la longitud de la circunferencia y el rea del crculo correspondiente. Figura 22. Ventana con una depuracin paso a paso en curso

Se deben dar varios pasos en orden:


3.- Indicar qu elementos interesa observar. Para poder seguir los valores que van
1.- Indicar en qu instruccin comenzar la depuracin. Se realiza aadiendo un punto
tomando distintas expresiones del programa a medida que ste se ejecuta existe la
de ruptura en la instruccin de comienzo. Para indicar que una instruccin es un punto
ventana Watch, que se activa pulsando la pestaa Depurar situada en la parte izquierda
de ruptura, se debe mover el ratn a la parte ms izquierda de una lnea de cdigo
del entorno.
Conchi Presedo Garca EUITI Bilbao 2015 87 Conchi Presedo Garca EUITI Bilbao 2015 88
ANEXO. MANUAL DE Dev-C++ FUNDAMENTOS DE INFORMTICA ANEXO. MANUAL DE Dev-C++ FUNDAMENTOS DE INFORMTICA

Cuando se quiere aadir una variable a dicha ventana puede hacerse pulsando el botn marcada en azul) se situar en la primera sentencia de dicha funcin/mtodo para
Aadir Watch para despus escribir el nombre de la variable. Como ejemplo, en la ejecutarlo paso a paso.
siguiente pantalla se est observando la variable radio y se est a punto de aadir la - Saltar Paso: Ejecuta instrucciones hasta alcanzar el siguiente punto de ruptura.
variable longitud a la ventana Watch. Cuando no hay puntos de ruptura situados despus de la sentencia actual, se ejecutarn
todas las instrucciones hasta finalizar el programa.
- Parar ejecucin : Detiene la ejecucin paso a paso, sin necesidad de llegar al
final del programa.

En la pantalla que aparece a continuacin se est ejecutando paso a paso el cdigo del
ejemplo, vigilando los valores de las variables: PI, radio, area y longitud. Las
instrucciones de 9 a 12 ya han sido ejecutadas, lo que se refleja en la consola. Al pulsar
Siguiente Paso se ejecutar la lnea 13 del cdigo fuente.

Figura 23. A punto de aadir la variable longitud

Otra manera de aadir una variable a seguir, esta vez desde el cdigo fuente, es
seleccionar con el ratn la variable en cualquier sitio del programa donde aparezca, dar
botn derecho y pulsar Aadir Watch. Esta ltima forma tambin permite seguir
cualquier expresin, frmula y/o condicin que aparezca en el programa a depurar.
Cuando se observa el valor de una condicin se sigue la convencin que adopta C para
Figura 24. Tras visualizar la longitud en la pantalla
las condiciones, es decir, 0 significa Falso y 1 Verdadero.
Para eliminar una variable, frmula o condicin de la ventana Watch, hay que marcarla
en la ventana, dar botn derecho y elegir Quitar Watch.

Botones para controlar la depuracin.

- Siguiente Paso: Ejecuta la siguiente instruccin del programa (la marcada en color
azul). Cuando dicha instruccin contiene una llamada a una funcin/mtodo, dicha
funcin/mtodo se ejecuta completamente tras seleccionar Siguiente Paso. Esta
posibilidad es muy til cuando estamos seguros de que esa funcin/mtodo no contiene
ningn tipo de error.
- Avanzar Paso a Paso: Ejecuta la siguiente instruccin del programa. Si dicha
instruccin contiene una llamada a una funcin o mtodo el ndice de ejecucin (lnea

Conchi Presedo Garca EUITI Bilbao 2015 89 Conchi Presedo Garca EUITI Bilbao 2015 90

Potrebbero piacerti anche