programación 1 tema iii – clase de...

25
Programación 1 Tema III – Clase de problemas Representación de datos con estructura de registro y diseño de una lista de operaciones para trabajar con ellos 1

Upload: doanxuyen

Post on 05-Oct-2018

220 views

Category:

Documents


0 download

TRANSCRIPT

Programación 1

Tema III – Clase de problemas

Representación de datos con estructura de registro 

y diseño de una lista de operaciones para trabajar con ellos

1

Números racionales

Un número racional es todo número que puede representarsecomo el cociente de un entero y un natural positivo. Cadanúmero racional puede representarse mediante un númeroilimitado de fracciones equivalentes, por ejemplo:

2/3 = 4/6 = 6/9 = 8/12 = 10/15 = …

‐7/3 = ‐14/6 = ‐21/9 = ‐28/12 = …

0/1 = 0/2 = 0/3 = 0/4 = …

2

Representación de un número racional

Vamos a optar por representar cada número racional por el parde datos enteros a y b que definen una fracción a / birreducible, es decir, donde a (el numerador) y b (eldenominador) son primos entre sí y b es un entero positivo.

• De este modo la fracción 2/3 representa a 2/3, a 4/6, a6/9, a 8/12, a 10/15, etc., etc.

• De igual modo la fracción ‐7/3 representa a ‐7/3, a ‐14/6, a ‐21/9, a ‐28/12, etc., etc.

• De este modo la fracción 0/1 representa a 0/1, a 0/2, a0/3, a 0/4, a 0/5, etc., etc.

3

Tarea 1ª.Se pide, en primer lugar, definir un tipo de dato denominadoRacional, con estructura de registro, que permita representarcualquier número racional que responda al planteamientoanterior (representación como un par de enteros que definenuna fracción irreducible y con denominador positivo).

/** Representa un número racional*/struct Racional {

... Falta definir los campos del registro ...};

4

Tarea 2ª.Se pide escribir el código del fichero de interfaz del móduloracional, definiendo el tipo de dato Racional junto con lacolección de operaciones (funciones C++) siguiente, cuyasespecificaciones se detallan en las páginas que siguen.

Racional definirRacional (int a, int b);

int numerador (Racional r);int denominador (Racional r);

Racional sumar (Racional r, Racional s);void restar (Racional m, Racional s, 

Racional& diferencia);

Racional multiplicar (Racional r1, Racional r2);void dividir (Racional dividendo, Racional divisor, 

Racional& cociente);5

/** Fichero de interfaz racional.h del módulo racional*/

/** Representa un número racional*/

struct Racional {... Falta definir los campos del registro ...

};

/** Pre: b > 0 y a y b son primos entre sí* Post: Devuelve el número racional a / b*/

Racional definirRacional (int a, int b);

. . . 6

. . . 

/** Pre: ‐‐‐* Post: Devuelve el numerador del número racional r*/

int numerador (Racional r);

/** Pre: ‐‐‐* Post: Devuelve el denominador del número racional r*/

int denominador (Racional r);

. . . 

7

. . . 

/** Pre: ‐‐‐* Post: Devuelve la suma de r y s, es decir, r + s*/

Racional sumar (Racional r, Racional s);

/** Pre: ‐‐‐* Post: Asigna a diferencia la resta de m y s, es decir,*       el número racional m ‐ s*/

void restar (Racional m, Racional s, Racional& diferencia);

. . . 

8

. . . 

/** Pre: ‐‐‐* Post: Devuelve el producto de r1 y r2, es decir, r1 x r2*/

Racional multiplicar (Racional r1, Racional r2);

/** Pre: ‐‐‐* Post: Asigna a cociente el resultado de dividir *       dividendo y divisor, es decir, dividendo / divisor*/

void dividir (Racional dividendo, Racional divisor, Racional& cociente);

9

Tarea 1ª.  Representación de los datos de tipo Racional

/** Un dato de tipo Racional representa un número racional*/struct Racional {

int num;         // Numerador del racional int den;         // Denominador del racional con den > 0       

// y num y den primos entre sí };

10

/** Fichero de interfaz racional.h del módulo racional*/

/** Un dato de tipo Racional representa un número racional*/

struct Racional {int num;         // Numerador del racional int den;         // Denominador del racional con den > 0       

// y num y den primos entre sí };

/** Pre: b > 0 y a y b son primos entre sí* Post: Devuelve el número racional a / b*/

Racional definirRacional (int a, int b);11

. . .

/** Pre: ‐‐‐* Post: Devuelve el numerador del número racional r*/

int numerador (Racional r);

/** Pre: ‐‐‐* Post: Devuelve el denominador del número racional r*/

int denominador (Racional r);

/** Pre: ‐‐‐* Post: Devuelve la suma de r y s, es decir, r + s*/

Racional sumar (Racional r, Racional s);12

. . .

/** Pre: ‐‐‐* Post: Asigna a diferencia la resta de m y s, es decir, *       el número racional m ‐ s*/

void restar (Racional m, Racional s, Racional& diferencia);

/** Pre: ‐‐‐* Post: Devuelve el producto de r1 y r2, es decir, el número*       racional r1 x r2*/

Racional multiplicar (Racional r1, Racional r2);

. . .

13

. . .

/** Pre: ‐‐‐* Post: Asigna a cociente el resultado de dividir *       dividendo y divisor, es decir, el número *       racional dividendo / divisor*/

void dividir (Racional dividendo, Racional divisor, Racional& cociente);

14

Tarea 3ª.Se pide escribir el fichero de implementación delmódulo racional.

15

¿Cómo sumar, restar, multiplicar y dividir dosracionales?

• 3/10 + 8/15 = 9/30 + 16/30 = 25/30 = 5/6

• 3/10 ‐ 8/15 = 9/30 ‐ 16/30 = ‐7/30

• 3/10 x 8/15 = (3x8)/(10x15) = 24/150 = 4/25

• 3/10 : 8/15 = (3x15)/(10x8) = 45/80 = 9/16

16

/** Fichero de implementación racional.cc del módulo racional*/

/** Pre: NOT (a == 0 AND b == 0)* Post: Devuelve el máximo común divisor de a y b*/

int mcd (int a, int b) {if (a < 0) { a = ‐a; }if (b < 0) { b = ‐b; }// Aplica el algoritmo de Euclideswhile (b != 0) {

int resto = a % b;a = b;  b = resto;

}return a;

}   17

… 

/** Pre: a > 0 y b > 0* Post: Devuelve el mínimo común múltiplo de a y b*/

int mcm (int a, int b) {// Se tiene en cuenta que mcd(a,b) * mcm(a,b) = a * breturn a / mcd(a,b) * b;

}

/** Pre: b > 0 y a y b son primos entre sí* Post: Devuelve el número racional a / b*/

Racional definirRacional (int a, int b) {Racional r = { a, b };return r;

}           18

… 

/** Pre: ‐‐‐* Post: Devuelve el numerador del número racional r*/

int numerador (Racional r) {return r.num;

}

/** Pre: ‐‐‐* Post: Devuelve el denominador del número racional r*/

int denominador (Racional r) {return r.den;

… 19

… 

/** Pre: ‐‐‐* Post: Devuelve la suma de r y s, es decir, el número *       racional r + s*/

Racional sumar (Racional r, Racional s) {int m_c_m = mcm(r.den, s.den);int numerador = m_c_m / r.den * r.num 

+ m_c_m / s.den * s.num;int denominador = m_c_m;int  m_c_d = mcd(numerador, denominador);Racional suma = { numerador / m_c_d , denominador / m_c_d };return suma;

}

… 

20

… 

/** Pre: ‐‐‐* Post: Asigna a diferencia la resta de m y s, es decir, *       el número racional m ‐ s*/

void restar (Racional m, Racional s, Racional& diferencia) {int m_c_m = mcm(m.den, s.den);int numerador = m_c_m / m.den * m.num 

‐ m_c_m / s.den * s.num;int denominador = m_c_m;int m_c_d = mcd(numerador, denominador);diferencia.num = numerador / m_c_d;diferencia.den = denominador / m_c_d;

}

… 

21

… 

/** Pre: ‐‐‐* Post: Devuelve el producto de r1 y r2, es decir, el*  número racional r1 x r2*/

Racional multiplicar (Racional r1, Racional r2) {int numerador = r1.num * r2.num;int denominador = r1.den * r2.den;int m_c_d = mcd(numerador, denominador);Racional producto = { numerador / m_c_d ,

denominador / m_c_d };return producto;

}

… 

22

… 

/** Pre: ‐‐‐* Post: Asigna a cociente el resultado de dividir dividendo y*       divisor, es decir, el número racional dividendo/divisor*/

void dividir (Racional dividendo, Racional divisor, Racional& cociente) {

int numerador = dividendo.num * divisor.den;int denominador = dividendo.den * divisor.num;if (denominador < 0) {

numerador = ‐ numerador;  denominador = ‐ denominador;}int m_c_d = mcd(numerador, denominador);cociente.num = numerador / m_c_d;cociente.den =  denominador / m_c_d;

}

23

Tarea 4ª.Se pide escribir y poner a punto algún programa deprueba que trabaje con números racionales haciendouso del módulo racional.

24

25