Está en la página 1de 41

MP 11 Fundamentos Programacin UF 02 Diseo Modular

MDULO 2 FUNDAMENTOS PROGRAMACIN EN C, C++.

OBJETIVOS.
En este mdulo repasaremos el concepto de dato. Utilizaremos constantes y variables de diferentes tipos y aprenderemos como aplicarlas. Tambin aprenderemos a hacer nuestras propias funciones, base de una programacin modular, y a utilizar funciones de la librera estndar. Concretamente, los aspectos que tratar este mdulo son:
Variables enteras y reales. Identificadores (char, int, float, double, bool) y modificadores

(signed, unsigned, long, short). Declaracin de variables.


Rango de las variables. El operador sizeof(). Uso de las funciones printf() y scanf() con diferentes tipos de variables. Uso de cin y cout con diferentes tipos de variables. Visualizacin e inicializacin de variables. El operador de resolucin de mbito (C++). Constantes. Operadores aritmticos, operadores lgicos, operadores de asignacin. Operadores

incrementales, operadores relacionales.


Expresiones, jerarqua de las operaciones. Conversiones implcitas y explcitas. Conversiones funcionales (C++). Las directivas #include, #define. Introduccin a las funciones. Declaracin, prototipos, llamada.

MP 11 UF 02 Mdulo 2 Fundamentos Programacin.

Pgina 1

1.

PRCTICA 1: LAS VARIABLES TIPO CHAR.

Una variable tipo char sirve para representar indistintamente un carcter y un entero pequeo, la relacin se hace a travs del cdigo ASCII. En esta prctica comenzaremos a familiarizarnos con estos tipos de variables.

1.1. DESARROLLO DE LA PRCTICA.


Crearemos un nuevo archivo C denominado m2p01.cc y escribiremos en la ventana de edicin el siguiente cdigo:
//m2p01.c - Las variables tipo char #include <stdio.h> #include <stdlib.h> //system() int main(){ char a, b; system("clear"); a=66; printf("La variable a contiene la letra %c\n",a); printf("El valor numrico de la variable a es %d\n",a); a='A'; printf("\nLa variable a contiene la letra %c\n",a); printf("El valor numrico de la variable a es %d\n",a); a=a+10; b=a; printf("\nLa variable a contiene la letra %c\n",a); printf("El valor numrico de la variable a es %d\n",a); printf("\nLa variable b contiene la letra %c\n",b); printf("El valor numrico de la variable b es %d\n",b); b='A'+2; printf("\nLa variable b contiene la letra %c\n",b); printf("El valor numrico de la variable b es %d\n",b); return 0; }

1.2. EXPLICACIN DEL PROGRAMA.


En este programa declaramos dos variables denominadas a y b: char a, b; Ambas son del tipo char y sern almacenadas en un byte u octeto de la memoria. La nica diferencia entre una y otra es como se interpretar uno de los bits del octeto. Las variables a y b podrn almacenar valores enteros entre -128 y 127. Vamos a ver con detenimiento cada parte del programa:
a=66; printf("La variable a contiene la letra %c\n",a); printf("El valor numrico de la variable a es %d\n",a);

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 2

La primera es una sentencia de asignacin que asigna el valor 66 a la variable a. Para ver el contenido de esta variable por pantalla se utiliza la funcin printf(). Si utilizamos el cdigo de tipo %c se ver una pantalla de carcter ASCII asociado al nmero 66, que es una B. Si utilizamos el cdigo de tipo %d se ver en pantalla el nmero 66.
a='A'; printf("\nLa variable a contiene la letra %c\n",a); printf("El valor numrico de la variable a es %d\n",a);

En estas tres lneas la asignacin se hace mediante el carcter ASCII directamente. Este carcter se debe poner entre comillas sencillas. El resto es exactamente igual, la variable a contendr 'A' o el nmero 65. Para imprimir por pantalla 'A' se debe utilizar el cdigo de tipo %c y para imprimir por pantalla 65 se debe utilizar el cdigo de tipo %n.
a=a+10; b=a; printf("\nLa variable a contiene la letra %c\n",a); printf("El valor numrico de la variable a es %d\n",a); printf("\nLa variable b contiene la letra %c\n",b); printf("El valor numrico de la variable b es %d\n",b);

En este trozo de programa podemos ver dos aspectos importantes de este tipo de variables: el primero es que las variables tipo char pueden ser parte de expresiones, de la misma forma que otras variables numricas. Como el contenido de la variable a es 65 y al sumar 65+10 nos da 75.
b='A'+2; printf("\nLa variable b contiene la letra %c\n",b); printf("El valor numrico de la variable b es %d\n",b);

Por ltimo, se puede comprobar en este trozo de programa que se puede mezclar en una expresin las constantes del tipo carcter ASCII con los nmeros enteros.

1.3. CAPTURA DE LA EJECUCIN DEL PROGRAMA.

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 3

2.

PRCTICA 2: EL TAMAO Y EL RANGO DE LAS VARIABLES.

En esta prctica comprobaremos el tamao y rango de los diferentes tipos de variables con el uso del operador sizeof().

2.1. DESARROLLO DE LA PRCTICA.


Crearemos un nuevo archivo C denominado m2p02.cc y escribiremos en la ventana de edicin el siguiente cdigo:
//m2p02.c - El tamao de las variables #include <stdio.h> #include <limits.h> #include <float.h> #include <stdlib.h> int main(){ system("clear"); //Borra la pantalla. //Tamao de las variables. printf("Tamao del tipo char : %d\n",sizeof(char)); printf("Tamao del tipo short : %d\n",sizeof(short)); printf("Tamao del tipo int : %d\n",sizeof(int)); printf("Tamao del tipo long : %d\n",sizeof(long)); printf("Tamao del tipo float : %d\n",sizeof(float)); printf("Tamao del tipo double : %d\n",sizeof(double)); printf("Tamao del tipo long double : %d\n",sizeof(long double)); printf("Tamao del tipo bool : %d\n" ,sizeof(bool); printf("\n"); //Lmites. printf("Mnimo printf("Mximo printf("Mnimo printf("Mximo printf("Mnimo printf("Mximo printf("Mnimo printf("Mnimo printf("\n"); y mximo de de unsigned y mximo de de unsigned y mximo de de unsigned y mximo de y mximo de char : %d %d\n",CHAR_MIN, CHAR_MAX); char : %u\n",UCHAR_MAX); short : %d %d\n",SHRT_MIN, SHRT_MAX); short : %u\n",USHRT_MAX); int : %d %d\n",INT_MIN, INT_MAX); int : %u\n",UINT_MAX); float : %g %g\n",FLT_MIN, FLT_MAX); double : %g %g\n",DBL_MIN, DBL_MAX);

//Tamao de las expresiones. char c=0; int i=0; float f=0; double d=0; printf("Tamao printf("Tamao printf("Tamao printf("Tamao return 0; } de de de de la la la la expression expression expression expression c+i i+f i+d f+d : : : : %d\n", %d\n", %d\n", %d\n", sizeof(c+i)); sizeof(i+f)); sizeof(i+d)); sizeof(f+d));

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 4

2.2. EXPLICACIN DEL PROGRAMA.


Este sencillo programa no necesita muchas explicaciones. Es una comprobacin del tamao real en octetos que ocupa cada tipo de variable. Esto se hace con el operador sizeof(), que es un operador de C/C++ y no una funcin. No tiene ninguna declaracin en ningn archivo de cabecera. De todas formas se comporta como una funcin que admite como argumento el nombre de una variable, un tipo de variable o bien una expresin y retorna un entero corresponde al nmero de octetos que ocupa la variable, tipo o expresin. El resultado podra ser diferente en compiladores diferentes, pero en nuestro entorno es el siguiente:
Tamao Tamao Tamao Tamao Tamao Tamao Tamao Tamao Mnimo Mximo Mnimo Mximo Mnimo Mximo Mnimo Mnimo Tamao Tamao Tamao Tamao del del del del del del del del tipo tipo tipo tipo tipo tipo tipo tipo char short int int long int float double long double bool char char short short int int float double c+i i+f i+d f+d :1 :2 :4 :4 :4 :8 :12 :1

y mximo de de unsigned y mximo de de unsigned y mximo de de unsigned y mximo de y mximo de de de de de la la la la

:-128 127 :225 :-32768 32767 :65535 :-2147483648 2147483647 :4294967259 :1.17549e-038 3.40282e038 :2.22507e-308 1.79769e308 :4 :4 :8 :8

expresin expresin expresin expresin

Los modificadores signed y unsigned no afectan al tamao de las variables. El operador sizeof() es til si se quieren hacer programas "portables"; es decir, que se puedan compilar en diferentes compiladores. Se debe tener en cuenta que las variables del tipo int, por ejemplo, que ocupan 4 octetos, en compiladores bajo sistemas operativos de 16bits ocupan 2 octetos. El uso de modificadores como long, que pueden parecer redundantes, aseguran tambin la portabilidad de los programas. El tipo bool es una novedad del Visual C++ desde la versin 5.0. Este tipo de variable slo puede contener dos valores: true (1) y false (0) y ocupan 1 octeto. Estas variables se suelen utilizar para las condiciones de las sentencias condicionales, no obstante, C y C++ permiten el uso de cualquier expresin numrica en las expresiones condicionales. En la segunda parte del programa se muestran los valores mnimos y mximos de los diferentes tipos. Para visualizar estos valores se han hecho unas MACROS o constantes predefinidas, las cuales estn definidas en los archivos cabecera limits.h y float.h Se deben incluir ambos archivos para poder usar todas estas MACROS.

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 5

En la tercera parte del programa se pueden comprobar las conversiones automticas entre tipos. La expresin: c+i es la suma de dos variables, una del tipo char y otra del tipo int, el resultado de la expresin en un valor del tipo int. Siempre que se mezclen dos datos (variables o constantes) de tipos diferentes en una misma expresin, los datos promocionan a datos de tipo superior segn el siguiente orden: bool char int unsigned int long unsigned long float double long double En este programa, la declaracin de las variables c, i, f, d no se hace al inicio de la funcin main(). Si este programa se compilase en un compilador ANSI C dara un error. En ANSI C, todas las variables se deben declarar antes de cualquier sentencia. C++ permite que las variables se puedan declarar en cualquier parte del programa. La prctica habitual es declarar todas las variables al inicio. Slo se debe hacer servir esta caracterstica de C++ si el cdigo gana significativamente en comprensin.

2.3. CAPTURA DE LA EJECUCIN DEL PROGRAMA.

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 6

3.

PRCTICA 3: LETRA DEL NIF.

En esta prctica conoceremos, sin profundizar en exceso, los vectores de caracteres o cadenas de caracteres. Veremos cul es el sencillo algoritmo para encontrar la letra del NIF a partir de las cifras del DNI.

3.1. DESARROLLO DE LA PRCTICA.


Abriremos un nuevo archivo denominado m2p03.c. Escribiremos el siguiente cdigo:
//m2p03.c - Letra del NIF #include <stdio.h> void main(){ int num; char letra[]="TRWAGMYFPDXBNJZSQVHLCKE"; printf("Introducir el nmero del DNI (8 car) "); scanf("%d\n",&num); printf("\n NIF %d - %c\n\n", num, letra[num%23]); }

3.2. EXPLICACIN DEL PROGRAMA.


Con esta prctica queremos dar a conocer un ejemplo de vector o array. Un vector es una coleccin de datos del mismo tipo que se almacenan con el mismo nombre. Una cadena de caracteres es un vector de caracteres. Un vector de caracteres que pueda contener una cadena de caracteres se puede declarar de la siguiente forma: char nombre_variable[numero_de_caracteres]; o bien: char nombre_variable[]="cadena_de_iniciacion"; En este programa se ha optado por la segunda forma, se ha declarado un vector del tipo char con el nombre de la letra de una tamao de 24 octetos, 23 para guardar los 23 caracteres que hay entre dobles comillas, ms un carcter adicional '\0' que indicar el fin de la cadena. Para referirse a uno de los elementos de un vector o cadena de caracteres se escribe el nombre del vector o cadena con un nombre desde el 0 hasta al mximo nmero de elementos menos 1. Este nmero estar cerrado entre corchetes []. Por ejemplo, si hemos definido la variable letra de esta forma:
char letra[]="TRWAGMYFPDXBNJZSQVHLCKE"; letra[0] contiene el carcter 'T', letra[1] contiene el carcter 'R', , letra[22] contiene el carcter 'E' y letra[23] contiene el carcter de fin de cadena '\0'.

Para conocer la letra del NIF slo se debe dividir el nmero del DNI entre 23 y quedarse con el resto de esta divisin (num%23). Este resto estar un nmero comprendido entre 0 y 22 y cada uno de estos posibles restos corresponde a una letra con el orden en que se ha definido la variable letra.

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 7

3.3. CAPTURA DE LA EJECUCIN DEL PROGRAMA.

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 8

4.

PRCTICA 4: TABLA ASCII.

La relacin entre caracteres y nmeros enteros se realiza a partir de la tabla ASCII. En esta prctica haremos un programa para obtener la tabla ASCII completa.

4.1. DESARROLLO DE LA PRCTICA.


Crearemos un nuevo archivo C denominado m2p01.cc y escribiremos en la ventana de edicin el siguiente cdigo:
//m2p04.c - Tabla ASCII #include <stdio.h> #include <stdlib.h> int main(){ char c; system("clear"; printf("\nCodigo ASCII estandar\n\n"); for(c=33;c<128;c++){ printf("%c=%d\t",c,c); } printf("\n"); return 0; }

4.2. EXPLICACIN DEL PROGRAMA.


Aunque este programa contiene una estructura de programacin que aunque no se ha tratado (el bucle for), puede ser til proponerlo en este mdulo, donde se ha tratado la equivalencia entre los valores numricos y los caracteres ASCII. En el siguiente mdulo se estudiar en profundidad los bucles. En primer lugar, este programa llama a dos archivos cabecera: stdio.h y stdlib.h. El primero es necesario para utilizar las funciones ya estudiadas: printf() y scanf(), el segundo es necesario para la funcin system("cls") ya comentada en el mdulo anterior. En primer lugar, se define una variable del tipo char. En la siguiente parte del cdigo se escribe el nmero y el carcter de los cdigos desde el 33 hasta el 127 (los cdigos desde el 0 hasta el 32 no son imprimibles). Este cdigo corresponde a un bucle C/C++. El cdigo de escape \t es el cdigo del tabulador horizontal ya tratado en el mdulo 1.
for(c=33;c<128;c++){ printf("%c=%d\t",c,c); }

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 9

4.3. CAPTURA DE LA EJECUCIN DEL PROGRAMA.

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 10

5.

PRCTICA 5: TABLAS DE LA VERDAD DE OPERADORES LGICOS.

En esta prctica se conocern los operadores lgicos: !, &&, ||, tambin aprenderemos a crear constantes (MACROS) con la directiva del preprocesador #define..

5.1. DESARROLLO DE LA PRCTICA.


Crearemos un nuevo archivo denominado m2p05.c del tipo y escribiremos en la ventana de texto el siguiente cdigo:
//m2p05.c - Tablas de la verdad de los operadores lgicos #define V 1 #define F 0 #include <stdio.h> #include <stdlib.h> int main(){ system("clear"); //Borra la pantalla. printf("Tabla de la verdad del operador logico !\n"); printf("noF = %d\n",!F); printf("noV = %d\n\n",!V)); printf("Tabla printf("F y F printf("F y V printf("V y F printf("V y V printf("Tabla printf("F y F printf("F y V printf("V y F printf("V y V de la verdad del conector logico &&\n"); = %d\n",F&&F); = %d\n",F&&V); = %d\n",V&&F); = %d\n\n",V&&V); de la verdad del conector logico ||\n); = %d\n",F||F); = %d\n",F||V); = %d\n",V||F); = %d\n\n",V||V);

printf("Operaciones combinadas\n",); printf("! ((V y F)o(F y F) = %d\n", (V&&F)||(F&&F)); return 0; }

5.2. EXPLICACIN DEL PROGRAMA.


En este programa construimos las tablas de la verdad de os operadores lgicos: no, y, o. Estos operadores actan sobre expresiones lgicas. En C, una expresin lgica es una expresin numrica. El valor numrico 0 representa FALSO y el valor numrico diferente de 0 representa VERDAD. Si se evala una expresin lgica verdadera toma el valor 1. En C++ las palabras true y false corresponden a los valores que puede retornar una variable del tipo bool. Por comodidad se han creado las constantes V y F, que pueden ser ms fciles de leer que 1 y 0. Estas constantes se han definido mediante la directiva #define del preprocesador. Muchas veces, a las constantes definidas de esta forma se las denominan macros.

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 11

Antes de comenzar la compilacin del cdigo, se sustituye automticamente todos las V por 1 y todas las F por 0. Se debe tener mucho cuidado con estas macros ya que el compilador sustituye todas las apariciones del texto que se pone a continuacin de la directiva #define. Es una prctica muy habitual escribir las macros con maysculas para no confundir estas con las variables propias del programa. Con este programa podemos entender cmo actan los operadores lgicos, por ejemplo, el operador !, que en C se expresa como &&, retornando el valor 1 slo en el caso en que los dos operantes sean verdaderas (diferentes de 0), en cambio, el operador o, que en C se expresa como ||, retorna el valor 1 siempre que alguno de los dos operandos sean verdaderos.

5.3. CAPTURA DE LA EJECUCIN DEL PROGRAMA.

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 12

6.

PRCTICA 6: OPERADORES RELACIONALES.


COMPROBACIN DE CONDICIONES.

En esta prctica aprenderemos a utilizar simultneamente operadores relacionales y lgicos.

6.1. DESARROLLO DE LA PRCTICA.


Crearemos un nuevo archivo denominado m2p06.c y escribiremos el siguiente cdigo:
//m2p06.c - Operadores relacionales y lgicos #include <stdio.h> #include <math.h> #include <stdlib.h> int main(){ int num; system("clear"); //Borra la pantalla. printf("Introduzca un nmero.\n"); printf("Si el nmero est entre 5 y 10 escribir un 1.\n"); printf("En caso contrario escribir un 0.\n"); printf("%d",&num); printf("%d\n",(num>5)&&(num<10); printf("Introduzca un nmero.\n"); printf("Si el nmero es mltiplo de 3 escribir un 1.\n"); printf("En caso contrario escribir un 0.\n"); printf("%d",&num); printf("%d\n",num%3==0); printf("Introduzca un nmero.\n"); printf("Si est en el intervalo [0,3]U[10,13] escribir un 1.\n"); printf("En caso contrario escribir un 0.\n"); printf("%d",&num); printf("%d\n",((num>=0)&&(num<=3))||((num>010)&&(num<=13))); printf("Introduzca un nmero.\n"); printf("Si el nmero es un cuadrado perfecto escribir un 1.\n"); printf("En caso contrario escribir un 0.\n"); printf("%d",&num); printf("%d\n",(int)(sqrt(num))-sqrt(num)==0); return 0; }

6.2. EXPLICACIN DEL PROGRAMA.


La funcin sqrt(num) que utilizamos dentro del ltimo printf() de esta prctica implica tener que insertar el archivo cabecera #include<math.h>. Recordaremos tal y como hemos visto en la Prctica 6 del Mdulo 1, que debemos modificar las rdenes de compilacin que encontraremos en HerramientasOpciones del Compilador y aadir -lm.

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 13

En este programa se pide al usuario que introduzca un nmero entero y con los operadores de relacin y lgicos comprobaremos si el nmero introducido satisface algunas condiciones:
printf("%d\n",(num>5)&&(num<10);

Esta lnea imprimir un 1 si la expresin: (num>5)&&(num<10) es cierta; es decir, si el nmero introducido se encuentra entre 5 y 10, ambos inclusive.
printf("%d\n",num%3==0);

Esta lnea imprimir un 1 si la expresin: num%3==0 es un operador aritmtico que retorna la resta de la divisin entera entre num y 3. En el caso que num sea mltiplo de 3, la expresin num%3 ser 0, y por tanto, la expresin relacional num%3== ser 1 (verdad).
printf("%d\n",((num>=0)&&(num<=3))||((num>010)&&(num<=13)));

Esta lnea imprimir un 1 si la expresin es cierta y eso suceder en el caso que num est entre 0 y 3, ambos inclusive, o bien entre 10 y 13, ambos inclusive.
printf("%d\n",(int)(sqrt(num))- sqrt(num)==0);

Por ltimo, esta lnea imprimir un 1 si la expresin es cierta; es decir, si la raz cuadrada de num es entera (si num es un cuadrado perfecto). int(sqrt(num)) es la parte entera de sqrt(num), por tanto, si la diferencia entre un nmero y su parte entera es 0, este nmero es un entero. En esta expresin utilizamos la funcin sqrt(), la declaracin de la cual se encuentra en el fichero de cabecera math.h.

6.3. CAPTURA DE LA EJECUCIN DEL PROGRAMA.

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 14

7.

PRCTICA 7: CLCULO DEL VOLUMEN DE UNA ESFERA.

En esta prctica veremos que una expresin puede mezclar diferentes tipos de datos, no obstante, es necesario conocer las reglas de conversin para no cometer errores.

7.1. DESARROLLO DE LA PRCTICA.


Crearemos un nuevo archivo denominado m2p07.c y escribiremos el siguiente cdigo:
//m2p07.c - Clculo del volumen de una esfera #define PI 3.1415f #include <stdio.h> int main(){ float r, v1, v2, v3; printf("Calculo del volumen de una esfera.\n"); printf("Introduce el radio:\n"); scanf("%f",&r); v1=4/3*PI*r*r*r; v2=4./3*PI*r*r*r;; v3=4.f/3*PI*r*r*r; printf("\n\nLa expresion v1=4/3*PI*r*r*r = %f\n",v1); printf("\nLa expresion v2=4./3*PI*r*r*r = %f\n",v2); printf("\nLa expresion v3=4.f/3*PI*r*r*r = %f\n",v3); return 0; }

7.2. EXPLICACIN DEL PROGRAMA.


Este sencillo programa calcular el volumen de una esfera a partir del radio. Se utilizan variables del tipo float. Se han definido 4 variables de este tipo: r corresponde al radio, que ser entrado por teclado; v1, v2 y v3 sern tres variables en las cuales almacenaremos el valor del rea con tres expresiones diferentes:
v1=4/3*PI*r*r*r;

Esta expresin es incorrecta, ya que 4 y 3 son constantes enteras y, por tanto, el operador aritmtico / operando sobre enteros dar un resultado entero. Aunque la expresin es incorrecta, el compilador no detecta ningn error, de hecho, sintcticamente, la expresin es correcta.
v2=4./3*PI*r*r*r;;

Esta expresin, aunque es correcta, da lugar a un mensaje de advertencia del compilador. Por defecto, todas las constantes que contienen un punto decimal son del tipo double. Por tanto, esta expresin da un resultado del tipo double, y cuando intentamos asignar un valor del tipo double a una variable del tipo float podra haber un error, el cual se producir en el tiempo de ejecucin, el compilador solo nos advierte de esta circunstancia pero realiza la compilacin.
v3=4.f/3*PI*r*r*r;

Esta expresin es totalmente correcta y no da lugar a ningn mensaje de advertencia del compilador. La constante 4.f es del tipo float, por tanto, la expresin final ser del tipo float y la asignacin se har siempre correctamente.
MP 11 UF 01 Mdulo 2 Fundamentos Programacin. Pgina 15

7.3. CAPTURA DE LA EJECUCIN DEL PROGRAMA.

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 16

8.

PRCTICA 8: OPERADORES RELACIONALES.


COMPROBACIN DE CONDICIONES.
En esta prctica comenzaremos a crear funciones propias.

8.1. DESARROLLO DE LA PRCTICA.


Crearemos un nuevo archivo denominado m2p08.c y escribiremos el siguiente cdigo:
//m2p08.c - Tringulos rectngulos #include <stdio.h> #include <math.h> //Recuerda -lm double Hipotenusa(double,double); double Cateto (double,double); int main(){ double a, b; printf("Introduzca los dos catetos de un triangulo rectangulo: \n"); scanf("%lf %lf", &a, &b); printf("\nLa hipotenusa del triangulo es %lf\n", Hipotenusa(a,b)); printf("Introduzca la hipotenusa y un cateto: \n"); printf("Asegurese que la hipotenusa es mayor que el cateto.\n"); scanf("%lf %lf", &a, &b); printf("\nEl otro cateto del tringulo es: %lf\n", Cateto (a,b)); return 0; } //Definicion de la hipotenusa. double Hipotenusa (double c1, double c2){ return sqrt(c1*c1+c2*c2); } //Definicion de la funcin cateto. double Cateto (double h, double c){ return sqrt(h*h-c*c); }

8.2. EXPLICACIN DEL PROGRAMA.


Una funcin es una parte de cdigo independiente del programa principal y de otras funciones. A una funcin se la puede llamar envindole datos y su funcin retornar un valor. De hecho, las funciones pueden hacer ms cosas que retornar un solo valor. En esta prctica se crean y se hacen servir dos funciones: hipotenusa y cateto, que reciben dos parmetros del tipo double y retornan un valor, tambin del tipo double.

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 17

Para poder hacer utilizar funciones, estas deben definirse. La definicin de una funcin consiste en el cdigo necesario para poder realizar la tarea prevista. La definicin de la funcin Hipotenusa() es:
double Hipotenusa (double c1, double c2){ return sqrt(c1*c1+c2*c2); }

La primera lnea recibe el nombre de encabezamiento (header). Consiste en el tipo de dato que retorna, en este caso double, el nombre de la funcin y, entre parntesis y separadas por comas, la lista de argumentos con el tipo double denominado c1 y c2. Estos argumentos, denominados argumentos formales deben coincidir en tipo y nmero (no en nombre) con los argumentos actuales que son los argumentos que contienen una llamada a la funcin. La llamada a una funcin se hace incluyendo el nombre en una expresin o sentencia del programa principal o bien de otra funcin. La llamada a la funcin Hipotenusa se realiza en esta lnea:
printf("\nLa hipotenusa del tringulo es %lf\n", Hipotenusa(a,b));

El segundo argumento de esta funcin de la librera estndar printf() es una llamada a la funcin creada Hipotenusa(). Los dos argumentos actuales a y b son dos variables del tipo double, los valores de los cuales se han introducido con la funcin estndar scanf() en la lnea:
scanf("%lf %lf", &a, &b);

Cuando se llama a la funcin Hipotenusa(), los valores de las variables a y b son copiados en las variables formales c1 y c2 de la definicin de la funcin. La sentencia return permite retornar el control al programa que haga la llamada. En este caso, la palabra return va seguida de una expresin del tipo double. El valor de esta expresin ser el valor de retorno, que es un valor nico del tipo declarado en la lnea de encabezamiento. En este caso, el valor de retorno es el valor de la hipotenusa de un tringulo rectngulo de catetos c1 y c2, calculada mediante el conocido Teorema de Pitgoras:
return sqrt(c1*c1+c2*c2);

Para poder utilizar la funcin Hipotenusa(), se debe declarar previamente, que se hace mediante el prototipo de la funcin. Normalmente se hace fuera de la funcin main(). C++ obliga a declarar explcitamente una funcin antes de llamarla. El prototipo de la funcin Hipotenusa() es:
double Hipotenusa(double,double);

El prototipo de una funcin consiste en el tipo de valor de retorno, el nombre de la funcin y una lista de tipo de argumentos (sin identificadores o nombres). Si se ponen identificadores, estos son ignorados por el compilador. Lo mismo que se ha dicho de la funcin Hipotenusa() puede decirse lo mismo de la funcin Cateto().

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 18

8.3. CAPTURA DE LA EJECUCIN DEL PROGRAMA.

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 19

9.

PRCTICA 6: OPERADORES RELACIONALES.

En esta prctica conoceremos dos de los tipos de variables que existen en C/C++ por lo que respecta al mbito de existencia: las variables globales o extern y las variables locales o auto.

9.1. DESARROLLO DE LA PRCTICA.


Crearemos un nuevo archivo denominado m2p09.c y escribiremos el siguiente cdigo:
//m2p09.c - Variables locales y globales #include <stdio.h> void function (int); int ga; int gb=2; int g=5; int main(){ int la; //Variable local no inicializada. int lb=2; //Variable local inicializada. int g=5; //Variable local con el mismo nombre de una variable global. g=10; printf("Valor printf("Valor printf("Valor printf("Valor printf("Valor de de de de de la la la la la variable variable variable variable variable global ga: %d\n",ga); global gb: %d\n",gb); local la: %d\n",la); local g: %d\n",lb); global g: %d\n",g); //Variable global no inicializada. //Variable global inicializada. //Variable global inicializada.

funcin(lb); //Llama a una funcin. printf("Valor de la variable local la: %d\n",la); printf("Valor de la variable local g: %d\n",g); printf("Valor de la variable global g: %d\n",g); return 0; } void funcin (int a){ int lc; //Variable local. int g; //Variable local del mismo nombre de una global y otra local. int la; //Variable local con el mismo nombre que otra local de la funcin main. lc=14;g=15;la=16; printf("\n\n\n"); printf("FUN:valor printf("FUN:valor printf("FUN:valor printf("FUN:valor printf("FUN:valor printf("\n\n\n"); } de la variable local lc: %d\n",lc); del parametro formal a: %d\n",a); de la variable local g: %d\n",g); de la variable global g: %d\n",g); de la variable local la: %d\n",la);

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 20

9.2. EXPLICACIN DEL PROGRAMA.


Este programa contiene una funcin denominada funcin(). Su declaracin se hace al comienzo y contiene los tipos de la funcin y de su argumento:
void function (int);

La funcin es del tipo void, esto quiere decir que no retornar ningn valor. Una llamada a esta funcin slo ejecutar las sentencias de su definicin ntrelas cuales hay sentencias de asignacin a variables globales. La definicin de la funcin es la siguiente:
void funcin (int a){ int lc; //Variable local. int g; //Variable local del mismo nombre de una global y otra local. int la; //Variable local con el mismo nombre que otra local de la funcin main. lc=14;g=15;la=16; printf("\n\n\n"); printf("FUN:valor printf("FUN:valor printf("FUN:valor printf("FUN:valor printf("FUN:valor printf("\n\n\n"); } de la variable local lc: %d\n",lc); del parametro formal a: %d\n",a); de la variable local g: %d\n",g); de la variable global g: %d\n",g); de la variable local la: %d\n",la);

Donde a es el nombre de su parmetro formal y es del tipo int. Adems de este parmetro formal, la funcin define tres variables locales ms: lc, g y la. Despus de la sentencia de asignacin: lc=14;g=15;la=16;las variables contendrn estos valores. Las sentencias printf() imprimirn los siguientes valores: lc 14. a 2 (ya que la llamada a la funcin se hace con la funcin(lb) y el valor de lb era 2, que es asignado a la variable local a). g 15 (aunque g tenga el valor 5 como variable global y el valor 10 como variable local de la funcin main()). g 5 (el operador :: es propio del lenguaje C++ y se denomina resolucin de mbito. Permite recuperar una variable global que ha sido ocultada por una variable local con el mismo nombre). la 16 (el valor asignado dentro de la funcin. Esta asignacin ultrapasa el mbito de la funcin). Una vez ejecutada la funcin funcion() el programa retorna a la funcin que la ha llamado, en este caso a la funcin main(). Una nueva sentencia con la funcin printf() nos demuestra que la asignacin de la variable la es un valor sin sentido ya que las variables locales que no se inicializan contienen valores aleatorios. En el programa se puede comprobar que las inicializaciones de las variables globales y locales se pueden hacer en el mismo momento de su declaracin. Si una variable global no se inicializa, contiene inicialmente un valor arbitrario. El compilador nos avisa si se utiliza una variable local que no ha sido inicializada.

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 21

9.3. CAPTURA DE LA EJECUCIN DEL PROGRAMA.

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 22

10. RESUMEN TERICO. 10.1. TIPOS DE DATOS FUNDAMENTALES: VARIABLES.


En lenguaje C/C++, como en otros lenguajes, tenemos la posibilidad de trabajar con diferentes tipos de datos: caracteres alfanumricos, nmeros enteros, reales, etc. Adems, algunos de estos tipos de datos permiten concretar el rango (y/o precisin) y la posibilidad que los nmeros sean solo positivos o tengan signo. Todas las variables que se utilizan en un programa en C se deben declarar previamente. La declaracin se hace al comienzo de un bloque o bien antes de cualquier funcin. En C++ no es necesario que est al comienzo, pero casi siempre es aconsejable, por claridad, hacer las declaraciones al comienzo. Para declarar una variable se escribe el tipo de variable seguido de su nombre. Como toda instruccin C, las declaraciones se acaban con un punto y coma. Los tipos fundamentales del C estndar son: char, int, float y double. Estos tipos fundamentales se pueden ampliar con el uso de los modificadores de tipos. Esta tabla muestra todos los tipos que se pueden utilizar en C:

Los nmeros enteros (int o char) pueden ser positivos o negativos (signed), o negativos nicamente (unsigned). Los modificadores short y long hacen referencia al nmero de cifras o rango de los nmeros. Los modificadores signed e int son opcionales y se pueden omitir; por ejemplo, es el mismo short int que short, y signed char que char. C++ aade a esta lista, el tipo bool para almacenar slo dos valores, true y false. Estas tres palabras son nuevas palabras clave incorporadas por C++.

10.1.1. LAS VARIABLES INT.


Las variables del tipo int pueden ocupar 2 o 4 octetos. Si las definimos con signo (signed) el rango est comprendido entre -2.147.483.648 y 2.147.483.647 y si las definimos sin signo (unsigned), el rango est comprendido entre 0 y 4.294.967.295 (=232-1). Aunque el tamao de los octetos de una variable del tipo int depende de la mquina correcta, podemos asegurarnos que ocupar 2 octetos si utilizamos el modificador short, ya que con el modificador long el rango ser de 4 octetos. El uso de modificadores que parecen redundantes aseguran la portabilidad del cdigo de un sistema a otro.

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 23

10.1.2. LAS VARIABLES CHAR.


Las variables char contienen un nico carcter y se almacenan en un byte u octeto (8bits). Por tanto, una variable char puede contener 28 = 256 valores diferentes: de 0 a 255 si se ha declarado explcitamente unsigned, o bien de -128 a 127 en otro caso. Se puede pensar en el contenido de una variable char como un entero pequeo o bien como un carcter. La correspondencia se hace a travs del cdigo ASCII. Esta tabla se puede crear con el programa de la prctica 4 de este mdulo. Por ejemplo, el carcter 'A' corresponde al cdigo ASCII: 65. Se puede observar que el cdigo ASCII asocia nmeros consecutivos con las letras maysculas y minsculas ordenadas alfabticamente. Esto simplifica notablemente las operaciones de ordenacin alfabtica (sobre todo en ingls). Los caracteres con cdigo ASCII ms pequeo que 32 son caracteres especiales no imprimibles. El 32 corresponde a un espacio. Una variable del tipo char se puede considerar como un entero y, por tanto, estn permitidas las mismas operaciones que entre los enteros. En la prctica 1 podemos un ejemplo que hace referencia a este aspecto. Las variables tipo char se pueden escribir como caracteres o como nmeros pequeos segn el formato de conversin que se utiliza en la llamada a la funcin de escritura. En la prctica 1 se contempla esta dicotoma.

10.1.3. LAS VARIABLES FLOAT Y DOUBLE.


Las variables float y double (tambin denominadas de punto flotante) permiten representar nmeros con una parte entera y una parte fraccionaria. Adems, tambin permiten representar nmeros ms grandes que los enteros, aunque sea perdiendo precisin. Estas variables se representan internamente por medio de la mantisa, que es un nmero comprendido entre 0.1 y 1.0, y el exponente, que representa la potencia de 10 que multiplica a la mantisa. El nmero quedar definido como: mantisa por 10 elevado al exponente. Por ejemplo, el nmero PI () se representa como 0.314592654101. Tanto la mantisa como el exponente pueden ser positivos o negativos. Las variables float ocupan 4 octetos (32bits). Utilizan 24bits para la mantisa (1bit para el signo y 23 para el valor) y 8bits para el exponente (1bit para el signo y 7bits para el valor). Las variables double ocupan 8 octetos o 64bits (53bits para la mantisa y 11 para el exponente). Las variables reales no pueden tener el identificador unsigned.

10.1.4. LAS VARIABLES BOOL.


El estndar C++ emitidos por ANSI/ISO proporciona el tipo de datos del tipo bool, y sus valores slo pueden ser false o true. Estas variables son una buena alternativa a utilizar 0 (cero) para indicar falso y diferente de 0 (cero) para indicar verdad.
#include <iostream> #include <ionmanip> using namespace std;

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 24

int main() { bool bVar=true; //Correcto. bool bVar2=10; //No da error pero no es una buena prctica. int x=5; cout<<"La variable bVar vale "<<bVar; if(x) cout<<"\nverdad"; else cout<<"\nfalso"; return 0; }

Cualquier valor diferente de cero es interpretado como verdad (cierto). Este es el caso de la variable x del anterior programa. En la tabla siguiente se muestra la lista de tipos, los octetos que ocupan y el rango de datos numricos que pueden contener:

C incluye un operador en tiempos de compilacin denominado sizeof() que retorna el tamao de la variable o tipo que tiene como argumento. Este operador es otra herramienta que tiene C para hacer programas portables de una mquina a otra.

10.1.5. DURACIN Y VISIBILIDAD DE LAS VARIABLES.


El tipo de variable se refiere a la naturaleza de la informacin que contiene y de la calidad de memoria necesaria para su almacenamiento. Otra propiedad que tienen las variables es la visibilidad o duracin. En C existen cuatro modos fundamentales: register, auto, extern y static.

10.1.5.1. register.
Este modelo es una recomendacin para el compilador, con el objetivo que (si es posible) algunas variables sean almacenadas directamente en los registros de la CPU, consiguiendo de esta forma un aumento de la velocidad.
MP 11 UF 01 Mdulo 2 Fundamentos Programacin. Pgina 25

10.1.5.2. auto (automtico).


Es la opcin por defecto para las variables que se declaran dentro de un bloque {}, incluso el bloque que contiene el cdigo de las funciones. En C, al contrario que en C++, es obligatorio que las declaraciones de variables estn al comienzo. La palabra auto es optativa y casi nunca se pone. Las variables auto son variables locales; es decir, slo existen dentro de los bloques donde estn definidas y los bloques interiores de estos, donde se ocultan si hay otra variable con el mismo nombre. Las variables auto no son inicializadas por defecto, al crearse tienen valores aleatorios.

10.1.5.3. extern.
Son variables globales, que se definen fuera de cualquier bloque o funcin, incluso de la funcin main(). Estas variables estn a lo alrgo de toda la ejecucin del programa y son visibles para todas las funciones que estn entre la definicin y el final del archivo. Para que otras funciones puedan ver una variable extern, se debe declarar la variable en estas funciones como extern El uso de estas variables es considerada una prctica peligrosa y poco recomendable; se debe evitar siempre que se pueda. Las variables extern son automticamente inicializadas a 0. Si en un programa una variable global (extern) tiene el mismo nombre que una variable local (auto), esta oculta la primera. No obstante, se puede utilizar la variable global con el operador de resolucin de mbito (::). Este operador es propio de C++ y no se puede utilizar con programas que se deben compilar en compiladores ANSI C.

10.1.5.4. static.
Las variables que se definen static dentro de un bloque conservan su valor entre diferentes ejecuciones de este bloque. Las variables static son inicializadas a 0 automticamente. Las variables definidas como static extern son visibles slo por las funciones y bloques comprendidos desde su definicin hasta al final del archivo. No son visibles desde otras funciones aunque se declaren en estas funciones como extern. Esta es una forma de restringir la visibilidad de las variables.

10.2. CONSTANTES.
Las constantes son un tipo de informacin numrica o alfanumrica que no pueden cambiar ms que con una nueva compilacin del programa. Las constantes pueden ser: constantes numricas o alfanumricas.

10.2.1. CONSTANTES NUMRICAS.


Las constantes numricas pueden ser enteras o de punto flotante. Las constantes enteras pueden estar en base 10 (decimal), base 8 (octal) o base 16 (hexadecimal). Las constantes octales comienzan con un 0 (cero) y las hexadecimales con x0. Aunque un programador no experto no utilice las bases octal y hexadecimal, es importante conocer su existencia para no escribir por error constantes enteras que comiencen con 0.
MP 11 UF 01 Mdulo 2 Fundamentos Programacin. Pgina 26

El tipo de la constante se puede determinar automticamente segn su magnitud, o explcitamente con los caracteres de tipo justo a continuacin del nmero. Por ejemplo: 12312 constante tipo int 54154551145 contante no vlida 54154551145. constante tipo double 1.25f constante tipo float 1.25l constante tipo long double Las constantes de punto flotante por defecto son double. Para indicar que una constante es float se debe aadir una f o F y para indicar que es del tipo long double una l o L. Las constantes de punto flotante se pueden representar con notacin cientfica, es decir, una parte entera, un punto, una parte fraccionaria, la letra e o E y un exponente entero.

10.2.2. CONSTANTES DE CARCTER.


Una constante de carcter es aquel cerrado entre comillas simples (' '). De hecho, el valor de una constante de carcter es el valor numrico segn el cdigo ASCII.

10.2.3. CADENAS DE CARCTER.


Una cadena de carcter es una secuencia de caracteres delimitada por dobles comillas (" "). Para almacenar una cadena de caracteres hace falta un vector char o conjunto de variables del tipo char con el mismo nombre.

10.2.4. CONST.
Se puede utilizar el calificador const delante de la declaracin de una variable. Esto servir para asegurarnos que el contenido de esta variable no ser modificado a lo largo de la ejecucin del programa.

10.3. OPERADORES, EXPRESIONES Y SENTENCIAS.


Un operador es un carcter o grupo de caracteres que acta sobre una o ms variables, constantes o expresiones para realizar una determinada operacin. Una expresin es un conjunto de variables y constantes relacionadas a travs de operadores. Las expresiones pueden contener parntesis () para poder agrupar parte de ellas y para alterar la jerarqua de las operaciones.

10.3.1. OPERADORES ARITMTICOS.


Los operadores aritmticos de C son: + * / % Cambia el signo (es un operador unario, es decir, acta slo sobre un operando). Suma. Resta. Producto. Divisin. Mdulo (resto de la divisin entera).

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 27

10.3.2. OPERADORES DE ASIGNACIN.


Una expresin da un resultado. Este resultado puede asignarse a una variable mediante un operador de asignacin. El operador de asignacin ms utilizado es (=), que no se debe confundir con una igualdad matemtica. Su forma general es: Nombre_variable = expresin; En la expresin de la derecha puede aparecer la misma variable a la cual se quiere asignar la expresin. Una sentencia tal como: a = a + 1; es totalmente correcta en C, aunque matemticamente parezca incorrecta. Adems del operador de asignacin (=) existen cuatro operadores de asignacin ms (+=, -=, *= y /=): a += b significa a = a + b a -= b significa a = a - b a *= b significa a = a * b a /= b significa a = a / b

10.3.3. OPERADORES INCREMENTALES.


Los operadores incrementales (++) y (--) son operadores unarios (un solo operando), que incrementan o decrementan en una unidad el valor de la variable a la que afectan. Estos operadores pueden ir delante de la variable o tras la variable. A continuacin se muestra la diferencia entre estos dos usos de los operadores incrementales: a = 2; b = a++; /* a = 3 y b = 2 */ b = ++a; /* a =3 y b = 3 */ En la segunda asignacin, primero se asigna a b el valor de a i a continuacin se incrementa la variable a. En la tercera asignacin, primero se incrementa la variable a y a continuacin se asigna a la variable b.

10.3.4. OPERADORES RELACIONALES.


Los operadores relacionales permiten analizar si se cumplen o no algunas condiciones. Si una condicin se cumple se dice que es cierta (true), en caso contrario se dice que es falsa (false). En C, false se representa con un 0 y true con cualquier nmero diferente de 0. Por convenio, C asigna un 1 si una expresin lgica es cierta. Los operadores relacionales de C son: == Igual que (no confundir con el operador de asignacin =) < Menor que > Mayor que <= Menor o igual que >= Mayor o igual que != Diferente que

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 28

10.3.5. OPERADORES LGICOS.


Los operadores lgicos permiten combinar los resultados de los operadores relacionales. Hay tres operadores lgicos: !, &&, || El operador ! es unario y retorna 1 (verdad) si el operando es 0 (falso) o retorna 0 (falso) si el operando es diferente de 0 (verdad). El operando binario && corresponde a la conjuncin y (and). Retorna 1 (verdad) en el caso que los dos operandos sean diferentes de 0 (verdad), en otro caso retorna 0 (falso). El operando binario || corresponde a la disyuncin o (or). Retorna 0 (falso) en el caso que los dos operandos sean 0 (falso), en otro caso retorna 1 (verdad).

10.3.6. OTROS OPERADORES.


operador unario: + no hace nada, pero sirve como complemento del operador unario -. operador sizeof(): retorna el tamao del tipo, variable o expresin introducida como argumento. operador ,(coma): sirve para evaluar expresiones mltiples. Su uso ms frecuente est en las expresiones de la sentencia for.

10.4. JERARQUA DE LAS OPERACIONES.


Es sabido que el valor de una expresin depende de la orden en que se hagan las operaciones. Por este motivo se debe determinar unas reglas de jerarqua de las operaciones. Esta orden siempre se puede modificar con parntesis. Estas reglas se presentan a la tabla derecha directamente de las ayudas de VC++. Se debe tener en cuenta que hay operadores no tratados en este curso como los operadores sobre bits.

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 29

10.5. EXPRESIONES.
Una expresin es una combinacin de variables, constantes y operadores. Cuando el compilador encuentra una expresin, la evala y retorna su resultado. Aunque se pueden diferenciar dos tipos de expresiones: aritmticas y lgicas, de hecho como que en C/C++ los operadores lgicos actan sobre nmeros, estos dos tipos de expresiones se suelen mezclar. En C es habitual una expresin como: (a-b*2.0)||(c!=a)

10.6. CONVERSIONES DE TIPOS IMPLCITAS Y EXPLCITAS (CASTING).


Si se mezclan variables o constantes de tipos diferentes para hacer operaciones, se produce una conversin implcita y automtica del dato de menor rango antes de realizarse la operacin. Se dice que la variable o constante de menor rango promociona al rango de la otra. La jerarqua de los rangos es la siguiente: long double > double > float > unsigned long > long > unsigned int > int > charN Otra clase de promocin implcita se da cuando el resultado de una expresin es asignado a una variable. Este resultado se convierte al tipo de la variable. Esta ltima circunstancia es advertida por el compilador. En C tambin es posible realizar conversiones explcitas de tipo (casting). Para hacer esta conversin se puede escoger la forma tradicional de C que consiste en poner delante de la variable o constante que se quiera convertir el tipo nuevo entre parntesis. Por ejemplo, en la expresin: k = (int) 1.7 + (int) 2.5; donde k tomar el valor 3, ya que al convertir 1.7 y 2.5 a enteros, se han convertido en 1 y 2. C++ incorpora otra forma de hacer estas conversiones y consiste en hacer servir el tipo de variable como una funcin el argumento del cual es la expresin que se quiera convertir, por ejemplo: k = int (1.7) + int (2.5); es equivalente a la anterior.

10.7. SENTENCIAS.
Una sentencia en C es una unidad ejecutable como puede ser una asignacin o una llamada a una funcin. Una sentencia puede ser simple o compuesta. Las sentencias simples acaban con el carcter ; (punto y coma). Las sentencias compuestas son un conjunto de sentencias simples agrupadas dentro de llaves {}. Una sentencia compuesta tambin se conoce con el nombre de bloque.

10.8. DIRECTIVAS DEL PREPROCESADOR: #include Y #define.


El preprocesador del lenguaje C/C++ acta previamente al compilador. Entre otras directivas que puede hacer el preprocesador, las ms usuales son #define y #include. Todas las directivas estn precedidas por el carcter #. La directiva #include va seguida de un nombre de archivo. El preprocesador sustituye esta lnea por el contenido del archivo. Si el archivo est entre dobles comillas: "nombre_archivo", el preprocesador busca el archivo en el directorio actual y despus en el directorio estndar de libreras. Si el archivo se escribe entre los smbolos <>: <nombre_archivo>, el preprocesador busca el archivo directamente en el directorio estndar de libreras. El directorio estndar est contenido en una variable de entorno.
MP 11 UF 01 Mdulo 2 Fundamentos Programacin. Pgina 30

Esta directiva se utiliza normalmente para incluir archivos con las declaraciones de las funciones de librera. Estos archivos suelen tener la extensin .h. La directiva #define permite definir macros o constantes. Una sentencia como: #define
NOMBRE texto, busca en el cdigo NOMBRE y lo sustituye por texto. Es importante darse cuenta

que esta sustitucin se hace antes de realizar la compilacin.

10.9. FUNCIONES.
Las aplicaciones informticas que se utilizan hoy da suelen tener decenas de miles de lneas de cdigo fuente. A medida que un programa aumenta de tamao es indispensable la modularizacin que es el proceso de dividir un programa en partes ms pequeas que hacen cosas ms concretas. A estas partes se las denominan subprogramas, subrutinas, procedimientos, funciones, dependiendo del lenguaje empleado. En C++ tambin se utiliza este trmino, aunque C++ permite otra forma de programar que abstrae el concepto de funcin con el concepto de objeto. En este resumen veremos las caractersticas de las funciones propias de C. La divisin de un programa en unidades ms pequeas o funciones presenta muchas ventajas: Cada funcin tiene un nmero de lneas ms pequeo y es ms fcil manipularla; Una misma funcin puede ser llamada muchas veces por partes diferentes del programa ahorrando memoria, tiempo de desarrollo y presentando ms claridad; Independencia de datos y ocultamiento de la informacin que disminuye la posibilidad de error al modificar una funcin. A la tcnica de programacin que consiste en dividir el programa en unidades separadas de cdigo y datos se la denomina programacin estructurada. Un programa en C es una coleccin de una o ms funciones. Una funcin de C es una porcin de cdigo o programa que realiza una determinada tarea. Una funcin est asociada con un identificador o nombre, y una lista de argumentos, que se utiliza para referirse a ella desde el resto del programa. En todas las funciones de C cabe distinguir entre definicin, declaracin y llamada.

10.9.1. LLAMADA.
Las funciones de C se llaman escribiendo su nombre seguido de los argumentos en una sentencia del programa principal o de otra funcin. Los argumentos son datos que se envan a la funcin. Se ponen dentro de un parntesis y se separan por comas. Por ejemplo, podemos considerar la funcin denominada Hipotenusa que calcula el valor de la hipotenusa de un tringulo rectngulo a partir de la medida de sus catetos a y b. Una forma de llamar a esta funcin en C sera: hipotenusa (a, b) En este ejemplo, Hipotenusa es el nombre de la funcin, y a y b son los argumentos o datos necesarios para el clculo deseado. El resultado de las instrucciones que realiza una funcin es el valor de retorno y este sustituir el nombre de la funcin en el mismo lugar donde se ha hecho la llamada.

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 31

10.9.2. DEFINICIN.
Para poder hacer una llamada a una funcin es necesario que en otro lugar, en el mismo archivo o en otro, est la definicin de la funcin. La definicin es el conjunto de sentencias o instrucciones necesarias para que la funcin pueda realizar su tarea cuando sea llamada. Adems del cdigo, la definicin de la funcin incluye la definicin del tipo de valor y de cada uno de sus argumentos. A continuacin, de forma incompleta y a modo de ejemplo, est el posible cdigo de la funcin Hipotenusa():
double Hipotenusa (double Cateto1, double Cateto2){ double Resultado ; . . . Resultado = . . . ; Return Resultado ; }

La primera lnea de la definicin contiene el tipo de valor de retorno (double en este caso). A continuacin viene el nombre de la funcin seguido (entre parntesis) de los argumentos y de sus tipos respectivos. En este caso hay dos argumentos ( Cateto1 y Cateto2), ambos del tipo double. Despus se abren las claves que contienen el cdigo de la funcin. Dentro de este cdigo hay una o ms sentencias return que retornan el valor de retorno. En este caso, retorna el valor de la variable resultado de la funcin que ha llamado a la funcin. Las llaves"{}" son el mtodo utilizado por C para agrupar diferentes sentencias para que se comporten como una sentencia nica. Todo el cuerpo de una funcin debe estar siempre comprendido entre llaves.

10.9.3. DECLARACIN.
Una funcin debe ser declarada antes de ser llamada. La declaracin de la funcin es una sentencia que permite al compilador comprobar el nmero y tipo de argumentos, as como el de su valor de retorno. La declaracin de una funcin tambin se conoce como el prototipo de la funcin. La declaracin de una funcin era optativa en C y es obligatoria en C++. La funcin main() es una funcin que existe en todo el programa C, desde el ms pequeo al ms grande. Contiene el cdigo por el cual comienza la ejecucin del programa. Este programa principal es tambin una funcin.

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 32

11. PRCTICAS DE AMPLIACIN. 11.1. OPERACIONES CON FRACCIONES.


En esta prctica veremos el uso de variables globales y como una funcin las puede modificar. Ms adelante veremos como una funcin puede modificar variables sin que estas sean globales. El uso de variables globales es siempre un ltimo recurso que debe evitarse siempre que se pueda.

11.1.1. DESARROLLO DE LA PRCTICA.


Crearemos un nuevo archivo del tipo C denominado m2pa1.c y escribiremos el siguiente cdigo:
//m2pa1.c - Operaciones con fracciones #include <stdio.h> void void void void Suma(); Resta(); Producto(); Division();

int nm1,dn1; //Variable global. int nm2,dn2; //Variable global. int nms,dns; //Variable global. int main(){ printf("Introduzca la primera fraccion (nm/dn)...\n"); scanf("%d%d", &nm1, &dn1); printf("Introduzca la segunda fraccion (nm/dn)...\n"); scanf("%d%d", &nm2, &dn2); Suma(); printf("%d/%d + %d/%d = %d/%d \n\n",nm1,dn1,nm2,dn2,nms,dns); Resta(); printf("%d/%d - %d/%d = %d/%d \n\n",nm1,dn1,nm2,dn2,nms,dns); Producto(); printf("%d/%d * %d/%d = %d/%d \n\n",nm1,dn1,nm2,dn2,nms,dns); Division(); printf("%d/%d / %d/%d = %d/%d \n\n",nm1,dn1,nm2,dn2,nms,dns); return 0; } //Definicin de la funcin Suma() void Suma(){ dns=dn1*dn2 nms=nm1*dn2+nm2*dn1; }

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 33

//Definicin de la funcin Resta() void Resta(){ dns=dn1*dn2 nms=nm1*dn2-nm2*dn1; } //Definicin de la funcin Producto() void Producto(){ dns=dn1*dn2 nms=nm1*nm2; } //Definicin de la funcin Division() void Suma(){ dns=dn1*nm2 nms=nm1*dn2; }

11.1.2. CAPTURA DE LA EJECUCIN DEL PROGRAMA.

11.1.3. EXPLICACIN DEL PROGRAMA.


En este programa se han creado cuatro funciones denominadas Suma(), Resta(), Producto(), y Divisin(); estas funciones no retornan valores, se han declarado del tipo void, slo modifica variables globales. La declaracin de las variables se hace antes de la definicin de todas las funciones, incluyendo la funcin main(). Estas funciones no retornan ningn valor ni aceptan ningn argumento: void Suma();
void Resta(); void Producto(); void Division();

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 34

A continuacin, y antes tambin de la definicin de la funcin main(), se declaran las variables globales, que corresponden al numerador y denominador de dos fracciones, y el numerador y el denominador del resultado correspondiente: int nm1,dn1;
int nm2,dn2; int nms,dns;

Detallemos, por ejemplo, la funcin Suma(). Esta funcin utiliza directamente las variables globales sin tener que declararlas. Tampoco hay ninguna sentencia return. Las modificaciones que se hacen a las variables globales ya se vern fuera de la funcin. Es interesante resaltar en este programa el uso del primer argumento de la funcin scanf(): scanf("%d%d, &nm1, &dn1);. La cadena de control: "%d%d" significa que se lee un entero, se ignora el carcter '/' y se vuelve a leer otro entero. Cuando se solicite la introduccin de la fraccin debe hacerse de la siguiente forma: nm/dn; por ejemplo: 3/4.

11.2. NGULO DE DOS VECTORES.


En esta prctica se podr comprobar cmo una funcin puede llamar a otra funcin.

11.2.1. DESARROLLO DE LA PRCTICA.


Crearemos un nuevo archivo del tipo C denominado m2pa2.c y escribiremos el siguiente cdigo:
//m2pa2.c - ngulo de dos vectores #include <stdio.h> #include <math.h> double double double double deg(double); //Convierte radianes en grados. modulo(double,double); //Calcula el mdulo de un vector. prod_esc(double,double,double,double); //Producto escalar. angulo(double,double,double,double); //ngulo.

int main(){ double ux,uy; double vx,vy; printf("Introduzca las coordenadas de u: \n"); scanf("%lf %lf",&ux,&uy); printf("Introduzca las coordenadas de v: \n"); scanf("%lf %lf",&vx,&vy); printf("El angulo que forman es %.2lf grados\n", angulo (ux,uy,vx,vy)); return 0; } double angulo(double ux, double uy, double vx, double vy){ double coseno; coseno=prod_esc(ux,uy,vx,vy)/modulo(ux,uy)/modulo(vx,vy); return deg(acos(coseno)); }

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 35

double deg(double ang){ const double PI=3.14159265358979; return ang*180/PI; } double modulo(double x, double y){ return sqrt(prod_esc(x,y,x,y)); } double prod_esc(double ux, double uy, double vx, double vy){ return ux*uy*vx*vy; }

11.2.2. CAPTURA DE LA EJECUCIN DEL PROGRAMA.

11.2.3. EXPLICACIN DEL PROGRAMA.


Este programa permite calcular en grados sexagesimales el ngulo que forman dos vectores del plano. Los dos vectores se introducen mediante dos funciones scanf() y se almacenan en las variables ux, uy, vx, vy, las dos primeras variables representan el primer vector y las dos ltimas el segundo vector. Segn las frmulas de geometra elemental del plano, el coseno del ngulo que forman dos vectores viene dado por la frmula: ( )

Donde uv representa el producto escalar de los vectores u y v; es decir: representa el mdulo del vector u; es decir: ( )

Una vez calculado el coseno del ngulo, para poder calcular el ngulo se utiliza la funcin de la librera estndar acos() (arcoseno), esta funcin acepta un argumento del tipo double y retorna el valor, tambin del tipo double.

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 36

El valor de retorno es el ngulo expresado en radianes. Para convertirlo en grados sexagesimales se debe hacer la siguiente conversin: ( ) ( )

En este programa se han creado cuatro funciones: deg(), modulo(), prod_esc(), y angulo(). La declaracin de estas funciones es la siguiente:
double double double double deg(double); //Convierte radianes en grados. modulo(double,double); //Calcula el mdulo de un vector. prod_esc(double,double,double,double); //Producto escalar. angulo(double,double,double,double); //ngulo.

Todas aceptan argumentos del tipo double y retornan valores del tipo double. El ngulo que forman los vectores se calcula con la funcin angulo(), la cual llama a las funciones deg(), modulo() y prod_esc(). Al mismo tiempo, la funcin modulo() llama tambin a la funcin prod_esc().

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 37

12. EJERCICIOS.
En este mdulo deberemos proporcionar el cdigo fuente de los ejercicios realizados.

1) Cine.
A partir de la calificacin de una pelcula y la edad del espectador, indicar si ste puede o no pasar. Calificacin de las pelculas: T M J A Todos los pblicos. Mayores de 13 aos. Mayores de 16 aos. Mayores de 18 aos.

El programa solicitar una letra que determina la calificacin de la pelcula y la edad del espectador para, a continuacin, mostrar por pantalla si este puede pasar a la sala o no. El programa debe controlar que la calificacin de la pelcula sea T, M, J o A. Cualquier otra entrada no ser vlida. Denominaremos al programa m2e1.c dentro de la carpeta Mdulo_2.

2) Resolucin de un sistema lineal de dos ecuaciones con dos incgnitas.


Un sistema lineal de dos ecuaciones con dos incgnitas es una expresin del tipo: ax + by = e cx + dy = f Debemos realizar un programa que, dados los coeficientes: a, b, c, d y los trminos independientes: e y f, escriba la solucin del sistema en el caso que exista. La solucin de este sistema, como se puede comprobar fcilmente, es: x = (e*d-b*f)/(a*d-b*c) y = (a*f-e*c)/(a*d-b*c) De momento, no se realizar ninguna comprobacin de que el sistema sea compatible y determinado, pero se debe tener en cuenta que si los coeficientes cumplen (a*d-b*c)=0, el programa tendr un error de divisin por 0. Para este programa todas las variables sern del tipo double. Denominaremos al programa m2e2.c dentro de la carpeta Mdulo_2.

3) Leyes de Morgan.
Las leyes de Morgan permiten relacionar los conectores lgicos "i" y "o". Estas leyes son: no (p y q) = no p o no q no (p o q) = (no p) y (no q) donde p y q son expresiones lgicas. Para poder comprobar estas leyes utilizaremos los operadores lgicos de C/C++: !, && y ||. Debemos calcular para los cuatro casos posibles de valores de p y q las expresiones lgicas: !(p||q) !p&&!q para poder comprobar la primera ley y: !(p&&!q) !p||!q para poder comprobar la segunda ley. En lugar de los valores numricos 1 y 0, definiremos las macros V y F tal y como se ha hecho en la prctica 5. Denominaremos al programa m2e3.c dentro de la carpeta Mdulo_2.

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 38

4) Verificacin de condiciones con operadores relacionales.


Siguiendo la misma pauta que en la prctica 6, crearemos un programa que solicite las coordenadas del centro de una circunferencia (a, b), su radio r y las coordenadas de otro punto (x, y). El programa debe escribir un 1 si el punto (x, y) pertenece al crculo definido por la circunferencia {(a, b), r}, en caso contrario debe escribir un 0. No debe utilizarse ninguna sentencia if, slo deberemos utilizar operadores aritmticos, relacionales y lgicos. Debemos recordar que la condicin que el punto (x, y) pertenece al crculo de centro (a, b) y radio r es: ) ( ) ; o bien ( ) ( ) ( es decir; que la distancia del punto (x, y) al punto (a, b) sea ms pequea o igual al radio. Para este programa todas las variables sean del tipo double. Denominaremos al programa m2e4.c dentro de la carpeta Mdulo_2.

5) Parmetros estadsticos con tres datos.


En este ejercicio se trata de crear un programa que calcule la media aritmtica, la media geomtrica, la varianza y la desviacin tpica de un conjunto de tres datos del tipo double, por eso, debemos crear tres funciones con los siguientes protocolos:
double Mediaa(double,double,double); // Media aritmtica. double Mediag(double,double,double) ; //Media geomtrica. double var(double,double,double) ; //Varianza

La primera funcin retornar el valor de la media aritmtica de los tres nmeros; es decir, la suma dividido por 3. La segunda funcin retornar el valor de la media geomtrica de los tres nmeros; es decir, la raz cbica del producto de los tres. Para realizar esta raz cbica debemos utilizar la funcin pow() donde el segundo argumento deber ser 1./3 (Atencin!!, 1/3 no es lo mismo que 1./3): ( )

La tercera funcin retornar la varianza de los tres nmeros. La varianza de tres nmeros: a, b y c, se puede calcular como la media aritmtica de los cuadrados de a, b y c menos el cuadrado de la media aritmtica de a, b y c; es decir:

M(a, b, c) = media aritmtica de a, b y c. Mit = M(a, b, c) V(a, b, c) = M(a*a, b*b, c*c) - Mit*Mit
Por ltimo, para calcular la desviacin tpica de los datos debemos recordar que es la raz cuadrada de la Varianza. Para poder utilizar las funciones matemticas: pow() y sqrt() es necesario incluir el archivo de cabecera math.h. Denominaremos al programa m2e5.c dentro de la carpeta Mdulo_2.

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 39

12.1. PROBLEMAS COMPLEMENTARIOS.


Estos ejercicios sirven para completar este mdulo pero suponen una ampliacin voluntaria. No es necesario entregar estos ejercicios. No obstante, es conveniente hacerlos y entregarlos.

6) La descomposicin horaria.
Debemos escribir un programa que lea un nmero natural que representa un cierto tiempo en segundos (por ejemplo: 125342 segundos) y escriba su descomposicin en das, horas, minutos y segundos (por ejemplo: 1 da, 10 horas, 49 minutos, 2 segundos). Denominaremos al programa m2e6.c dentro de la carpeta Mdulo_2.

7) rea de un tringulo.
Crearemos un programa que, dados los tres puntos, escribiremos el rea de un tringulo que forman:

Si los vrtices introducidos son (x1, y1), (x2, y2) y (x3, y3), el rea del paralelogramo determinado por estos puntos coinciden con el mdulo del producto vectorial de los vectores: u = (x1 - x2 , y1 - y2, 0) y v = (x3 - x2 , y3 - y2 , 0) es decir: A = |(x1 - x2) (y3 - y2) - (y1 - y2) (x3 - x2)| y, por tanto, el rea del tringulo ser: A = 0.5|(x1 - x2) (y3 - y2) - (y1 - y2) (x3 - x2)| Para este programa todas las variables sean del tipo double. Denominaremos al programa m2e7.c dentro de la carpeta Mdulo_2.

8) Localizacin de una celda.


Un rectngulo est dividido en n filas y en m columnas. Las filas estn numeradas desde el 0 hasta el n-1 y las columnas desde la 0 hasta la m-1. Se trata de escribir un programa que, dado un nmero p comprendido entre 0 y nm-1, nos escriba a qu fila y columna pertenece este nmero. Por ejemplo, si el rectngulo est dividido en n=4 filas y m=5 columnas y escribimos p=14, debe responder: fila 2, columna 4: El programa deber solicitar los valores de n, m y p, todos enteros. Como pista diremos que si los nmeros de la primera fila los dividimos por n (5 en este caso) el cociente tiene parte entera igual a 0; es decir, la fila a la cual pertenecen. Y lo mismo pasa con todas las filas. Denominaremos al programa m2e8.c dentro de la carpeta Mdulo_2.

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 40

9) Radiacin del cuerpo negro.


La densidad de energa monocromtica de la radiacin del cuerpo negro en funcin de su longitud de onda viene dada por la frmula: ( ) Donde: = 4.1416 h = 6.6256 x 10-34 J s. c = 2.9979 x 108 m/s2 k = 1.3805 x 10-23 J/K Todas las constantes estn expresadas en el mismo sistema (SI), por tanto, no debe hacerse ninguna conversin de unidades. Se trata de construir un programa que, dadas una temperatura (T), expresada en K, y una longitud de onda (=lambda), expresada en m, escriba el valor de la densidad de energa monocromtica a esta temperatura y a esta longitud de onda. Todas estas variables sern del tipo double. Es aconsejable utilizar las macros de definicin siguientes, para ahorrarnos introducir ms de una vez la misma constante y hacer que el cdigo sea mucho ms clara.
#define #define #define #define PI _h _c _k 3.1416 6.6256E-34 2.9979E8 1.3805E-23

El hecho de aadir el carcter _ delante de los caracteres h, c y k es para evitar la sustitucin en el caso de que alguna variable del cdigo contenga alguno de estos caracteres. Para utilizar 5 podemos utilizar la sentencia: pow(lambda, 5) Para utilizar eh c/ k T deberemos utilizar la funcin: exp(_h*h/lambda/_k/T) Para poder utilizar las funciones pow() y exp() debemos incluir el archivo de cabecera math.h. Ambas funciones tienen como argumentos variables del tipo double y tienen un valor de retorno del tipo double tambin. Denominaremos al programa m2e9.c dentro de la carpeta Mdulo_2.
Es fcil hacer correctamente el programa y pensar que se ha hecho mal por el hecho que siempre se obtiene una densidad de energa igual a 0. Esto es debido a que esta energa es negligible en una gran banda de longitudes de onda. Para evitar el resultado 0, podemos probar con una temperatura alta -6 (T=1600K) y una longitud de onda del orden de 10 m.

MP 11 UF 01 Mdulo 2 Fundamentos Programacin.

Pgina 41

También podría gustarte