FUNDAMENTOS DE PROGRAMACIÓN BOLETÍN 12.1: Lenguaje C. Estructura de un programa Curso: 2012/13 Versión: 1.0.5 OBJETIVOS Introducir al alumnado en la instalación del IDE Eclipse para C. 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 trabajen en entorno Windows deberán descargar el archivo eclipse-cpp-juno-SR2-win32.zip (la siguiente imagen corresponde a esta opción). Para otros sistemas operativos habrá que seleccionar la plataforma Linux o Mac OS X y descargar el Eclipse IDE for C/C++ Developers correspondiente. Se descomprime en una carpeta que se recomienda llamar 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 en C se hace necesario instalar el compilador 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-inst-20120426.exe. Al ejecutar este archivo se procederá a la instalación. Se aconseja aceptar lo que por defecto se ofrece, salvo en la pantalla: Boletín 12.1: Lenguaje C. Estructura de un programa 2 En la que podemos marcar también C++ Compiler. Durante la instalación se abre una ventana en la que se descomprimen e instalan los respectivos paquetes que conforman la instalación. 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. En Variables del sistema modificar Path, para añadir al final: “;C:\MinGW\bin\” (observe el punto y coma (;) que se inserta por delante para separar de los paths que ya existen). Boletín 12.1: Lenguaje C. Estructura de un programa 3 INTRODUCCION AL ENTORNO: MI PRIMER PROGRAMA C En primer lugar, ofrecerá un workspace por defecto que podremos cambiar a otra carpeta (se recomienda BP12.1, 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 Toolchains (herramientas): MinGW GCC y finalmente <<Finish>> 3. Sobre el nombre de proyecto con BC: New Source File, y como nombre: holaMundo.c (observar 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> void main(void){ printf("Hola Mundo"); } 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. ======================================================================== Otro ejemplo: escriba otro proyecto denominado “HolaYo”. Descripción del programa: Declare un nuevo proyecto denominado “HolaYo”. Declare un nuevo programa (Source File) denominado “holaYo.c” (recuerde que termina en .c) Incluya la librería <stdio.h> que permite el manejo de funciones de entrada/salida. Programe la función main: void 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. 1. 2. 3. 4. Boletín 12.1: Lenguaje C. Estructura de un programa 4 PARTE 1: EJERCICIOS BÁSICOS PROPUESTOS 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. 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 void 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. Boletín 12.1: Lenguaje C. Estructura de un programa 5 PARTE 2: EJERCICIOS SOBRE TRASFORMACIÓN DE MÉTODOS ESTÁTICOS JAVA EN FUNCIONES C EJERCICIO 2 – FUNCIONES SOBRE ENTEROS (PROPUESTO PARA EL FINAL DE LA CLASE O, EN SU CASO, PARA CASA) 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. 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 void 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, int 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) d) //Comprobar 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 de n) boolean esPrimo(int n) EJERCICIO 3 – MÁS FUNCIONES SOBRE ENTEROS (EN SU CASO, PROPUESTO PARA CASA) Siguiendo la metodología del ejercicio anterior, aumente las funcionalidades de “funcionesDeEnteros.c” añadiendo las siguentes funciones: 1. sumaPrimosMenores, que dado un número n>0, devuelva la suma de los números primos menores o iguales que n. 2. 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] 3. formanTrianguloRectangulo, que dados tres números a, b y c, positivos, compruebe si forman un triángulo rectangulo; Recuerde el teorema de Pitágoras.