FUNDAMENTOS DE PROGRAMACIÓN BOLETÍN 13.1: LENGUAJE C Curso: 2013/14 Versión: 1.0.2 OBJETIVOS Introducir al alumnado en la instalación del IDE Eclipse para C: su instalación y manejo. En la primera parte, familiarizarse con los conceptos básicos: elementos del lenguaje, uso de las funciones básicas y construcción de programas sencillos en lenguaje C. En la segunda parte, profundizar en la construcción en lenguaje C de algunos métodos estáticos ya implementados en Java. INSTALACIÓN DEL IDE ECLIPSE PARA C En http://www.eclipse.org/downloads/: quienes tengan entorno Windows deberán descargar el archivo eclipse-cpp-Kepler-SR2-win32.zip (la siguiente imagen se personaliza en esta opción). Para otros sistemas operativos habrá que seleccionar la plataforma Linux o Mac OS X y descargar Eclipse IDE for C/C++ Developers correspondiente (al final de este boletín hay un guía para Mac OS X) Se descomprime en una carpeta que se recomienda se llame Eclipse_C, para no colisionar, en su caso, con la carpeta Eclipse que contiene el IDE para Java. Si lo desea, puede crear un acceso directo en el escritorio (si ya tiene uno para Eclipse para Java, llámele a este acceso, por ejemplo: “Eclipse_C”. Finalmente para poder compilar y enlazar los programas C se hace necesario instalar gcc. En los sistemas MAC OS X ya suele venir integrado y en Linux dependerá de la distribución del mismo por lo que habrá que buscar el que corresponda; en Windows instalaremos MinGW desde http://sourceforge.net/projects/mingw/files/latest/download?source=files descargando el archivo mingw-get-setup.exe que es el instalador. Normalmente se abre automáticamente una pantalla para guardarlo. En otro caso hacer clic en “direct link” (enlace directo). Una vez guardado, ejecute dicho instalador. Boletín 13.1: Lenguaje C 2 En la siguiente pantalla elegir mingw32.base y mingw32-gcc-c++ En el menú: Installation Apply Changes Finalmente hay que acceder a las variables de entorno del sistema operativo. En Windows XP, consultando las propiedades de Mi PC Opciones avanzadas (o similar en otras versiones de Windows) Variables de Entorno, y modificar la variable Path, añadiendo al final: “;C:\MinGW\bin\” (observe el punto y coma (;) que se debe insertar por delante para separar de los paths que ya existen). Boletín 13.1: Lenguaje C 3 INTRODUCCIÓN AL ENTORNO: MI PRIMER PROGRAMA C En primer lugar, ofrecerá un workspace por defecto que podremos cambiar a otra carpeta (se recomienda BP13, y en ningún caso utilice uno que haya sido usado para java). En segundo lugar, veamos cómo crear el primer programa C en el IDE “Eclipse C”. Para ello realice los siguientes pasos: 1. En el Explorador de Proyectos (el equivalente al Explorador de Paquetes en la perspectiva Java), con el botón contextual –BC- del ratón (botón derecho para los diestros), seleccione: New Project C/C++ C Project <<siguiente>> 2. Escriba el nombre del proyecto: HolaMundo (observe que empieza por mayúsculas), eligiendo como Tipo de Proyecto: Executable (empty project) y posteriormente en Toolchains (herramientas) elegir MinGW GCC y finalmente <<Finish>> 3. Sobre el nombre de proyecto con BC: New Source File, y como nombre: holaMundo.c (observe que empieza por minúsculas y que tiene la extensión .c) <<Finish>> 4. Escriba en la ventana de edición (la misma que en la perspectiva Java): #include <stdio.h> int main(void){ printf("Hola Mundo"); return 0; } 5. Guarde el código escrito. 6. Se compila y enlaza el proyecto eligiendo en la barra de menú: Project Build All 7. Se ejecuta el proyecto eligiendo en la barra de menú: Run As Local C/C++ Applications, o simplemente Run. 8. En la consola se visualizará el resultado. Boletín 13.1: Lenguaje C 4 Otro ejemplo: escriba otro proyecto denominado “HolaYo”. Descripción del programa: 1. Declare un nuevo proyecto denominado “HolaYo”. 2. Declare un nuevo programa (Source File) denominado “holaYo.c” (recuerde que termina en .c) 3. Incluya como primera línea la librería <stdio.h> que permite el manejo de funciones de entrada/salida. 4. Programe la función main: int main(void) como se indica a continuación: a. Declare dos variables que permitan almacenar un nombre de menos de 30 caracteres y un número entero. b. Visualice el mensaje “Escribe tu nombre y tu edad: \n”. c. Escriba la sentencia fflush(stdout) que permite vaciar el buffer de salida antes de una entrada por teclado. Aclarar que en otros entornos no es necesario, pero es una buena práctica hacerlo siempre. d. Mediante la sentencia o sentencias oportunas de captura de datos desde el teclado, haga que se pueda introducir una cadena con el nombre y un número entero para almacenar la edad (recuerde en el caso de la edad anteponer &) e. Por último debe visualizar mediante una sola sentencia “Hola NNNNN ya tienes EE años de edad”. 5. Ejecute el programa y pruébelo. Algunas observaciones sobre la ejecución de un proyecto. 1. Antes de ejecutar un proyecto, asegúrese de haberlo compilado y enlazado. 2. Debe haberlo seleccionado en el explorador de paquetes. 3. Si cuando compila y enlaza visualiza el mensaje: “cannot open output file nombre_proyecto.exe: Permission denied” Comprobará que aparecerá un aspa roja en el nombre del proyecto. Seleccione el proyecto y con el botón contextual del ratón elija la opción “Clean Project” e inmediatamente vuelva a compilar y enlazar. PARTE 1: EJERCICIOS BÁSICOS PARA HACER EN EL AULA EJERCICIO 1 – CÁLCULO DEL FACTORIAL DE UN NÚMERO NATURAL CON FUNCIONES ALMACENADAS EN ARCHIVOS INDEPENDIENTES Y POR TANTO CON ARCHIVOS DE CABECERAS CREADOS POR EL USUARIO. El ejercicio anterior se ha resuelto programando un único archivo C denominado holaMundo.c u holaYo.c respectivamente, al que se le incluía al principio una librería que viene incorporada en el compilador de C para el manejo de funciones de E/S: stdio.h. Ahora se trata de construir un proyecto con tres archivos independientes en un mismo proyecto que denominaremos respectivamente testNumeroCombinatorio.c, numeroCombinatorio.h y numeroCombinatorio.c. Realice los siguientes pasos: 1. Cree un proyecto llamado: NumeroCombinatorio. 2. Cree un programa C (Source File) llamado: testNumeroCombinatorio.c. Boletín 13.1: Lenguaje C 5 3. Incluya la librería que permite usar las funciones de entrada/salida e incluya el archivo de cabecera numeroCombinatorio.h. Recuerde que mientras las librerías del compilador de C necesitan en la sintaxis <_.h>, las creadas por el usuario van entre comillas: “_.h”. 4. Programe la función int main (void) con las sentencias necesarias para que se visualice el mensaje “Teclee el numerador y el denominador de un número combinatorio:\n” y a continuación permita introducirlos por teclado (recuerde incluir fflush (stdout) antes de la sentencia y que las variables que se necesitan en un programa C hay que definirlas en las primeras líneas del programa) . 5. Una vez capturados los valores invoque a la función numeroCombinatorio(m, n) y visualice el mensaje: “ xx sobre yy es zz” donde xx es el valor introducido para m, yy el introducido para n y zz el resultado obtenido por la función numeroCombinatorio. 6. En la ventana del explorador de proyectos, encima del nombre del proyecto con –BC- se elige new Header File y se crea un archivo de cabeceras denominado numeroCombinatorio.h, en el que se incluyen, entre otras cosas, los prototipos de las funciones que serán invocadas desde el archivo principal y que se han codificado en otros archivos (esto le sirve al compilador para tener declaradas las funciones cuando compile el citado archivo principal). Incluya por tanto: #ifndef NUMEROCOMBINATORIO_H_ #define NUMEROCOMBINATORIO_H_ long numeroCombinatorio(int,int); long factorial(int); #endif /* NUMEROCOMBINATORIO_H_ */ 7. Por último, en otro (Source File) llamado numeroCombinatorio.c, en el que se debe incluir como primera línea #include “numeroCombinatorio.h”, programe las dos siguientes funciones: a. long factorial (int n), que devuelve el factorial del parámetro de entrada n. Recuerde que el factorial de un número n es n * (n − 1) * (n − 2) * ... * 1. b. long numeroCombinatorio(int m, int n), que apoyándose en la función anterior devuelve el número combinatorio de m sobre n: m m! = n n! (m - n)! Pruebe el resultado del ejercicio con 8 sobre 5 cuyo resultado es 56, lo mismo que 8 sobre 3. PARTE 2: EJERCICIOS SOBRE TRANSFORMACIÓN DE MÉTODOS ESTÁTICOS JAVA EN FUNCIONES C PARA HACER EN EL AULA EJERCICIO 2 – FUNCIONES SOBRE ENTEROS. Cree un proyecto que se denominará Enteros. Cree un archivo de cabecera de nombre “enteros.h” donde debe incluir: a) Los ficheros de cabecera que necesite para el manejo de las funciones de entrada/salida <stdio.h>, las matemáticas <math.h> y la función valor absoluto abs, que se encuentra en <stdlib.h>. b) La definición de un tipo enumerado (use la declaración typedef) denominado boolean que pueda tomar los valores falso y cierto, para usarlo en lugar de sus homónimos de Java. Boletín 13.1: Lenguaje C 6 c) Y, como en el ejercicio anterior, los prototipos de las funciones que más abajo se describen (añádalos ya, con independencia de que las funciones las vaya realizando progresivamente mientras avanza en el ejercicio) Todas la funciones que figuran más abajo se implementarán en el archivo denominado “funcionesDeEnteros.c”. Recuerde que debe incluir como primera línea el fichero de cabecera que acaba de realizar. Por último, para probar las citadas funciones se creará otro archivo denominado “testEnteros.c” donde estará codificada la función int main(void) que irá solicitanto oportunamente los datos por teclado invocando a las funciones que se quieran probar y visualizando los resultados de las mismas. Recuerde también incluir como primera línea el fichero de cabecera enteros.h. Los métodos Java a transformar en funciones C son los siguientes: a) Comprueba que el valor v está en el intervalo [a,b] boolean estaEn(int a, int b, double v) b) Máximo común divisor (recuerde al algoritmo de Euclides que consiste en dividir el número mayor entre el menor. Si la división es exacta, el divisor es el m.c.d.; en otro caso, se continúa dividiendo el divisor entre el resto obtenido y así sucesivamente hasta obtener una división exacta, siendo el último divisor el m.c.d.) int mcd(int m, int n) c) Mínimo común multiplo (se recuerda que es el producto de los números dividido por el m.c.d. de los mismos) int mcm(int m , int n) PARTE 3: EJERCICIOS SOBRE TRANSFORMACIÓN DE MÉTODOS ESTÁTICOS JAVA EN FUNCIONES C PARA HACER EN CASA EJERCICIO 3 – MÁS FUNCIONES SOBRE ENTEROS. Siguiendo la metodología del ejercicio anterior, aumente las funcionalidades de “funcionesDeEnteros.c” añadiendo las siguentes funciones: 1. boolean esPrimo(int n), que compruebe si un número es primo. Si el número es negativo o cero se devuelve falso (recuerde que basta probar si es divisible por los números comprendidos desde 2 hasta la raíz cuadrada del propio número) 2. sumaPrimosMenores, que dado un número n>0, devuelva la suma de los números primos menores o iguales que n. 3. sumaNoPrimosEntre, que dados dos numeros a y b, positivos y tales que a<b, devuelva la suma de los números que no son primos y que están en el intervalo [a,b] 4. formanTrianguloRectangulo, que dados tres números a, b y c, positivos, compruebe si forman un triángulo rectángulo; recuerde el teorema de Pitágoras.