Módulo 2 - Fundamentos de Programación en C, C++
Módulo 2 - Fundamentos de Programación en C, C++
Módulo 2 - Fundamentos de Programación 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
Pgina 1
1.
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.
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.
Pgina 3
2.
En esta prctica comprobaremos el tamao y rango de los diferentes tipos de variables con el uso del operador sizeof().
//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));
Pgina 4
:-128 127 :225 :-32768 32767 :65535 :-2147483648 2147483647 :4294967259 :1.17549e-038 3.40282e038 :2.22507e-308 1.79769e308 :4 :4 :8 :8
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.
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.
Pgina 6
3.
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.
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.
Pgina 7
Pgina 8
4.
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.
Pgina 9
Pgina 10
5.
En esta prctica se conocern los operadores lgicos: !, &&, ||, tambin aprenderemos a crear constantes (MACROS) con la directiva del preprocesador #define..
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.
Pgina 12
6.
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.
Pgina 14
7.
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.
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
Pgina 16
8.
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().
Pgina 18
Pgina 19
9.
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.
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);
Pgina 20
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.
Pgina 21
Pgina 22
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++.
Pgina 23
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.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.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.
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.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.
Pgina 27
Pgina 28
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.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.
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
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.
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.
Pgina 32
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; }
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; }
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.
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)); }
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; }
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.
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().
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.
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.
Pgina 38
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.
Pgina 39
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.
Pgina 40
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.
Pgina 41