PR23 - Lenguaje C (I)

Anuncio
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.
Descargar