LABORATORIO 5: Objetos y Clases (Revisiones)

 

 

1.

Objetivos

2.

Planteamiento Problema Parcial

2.1

Aplicación solicitada

2.2

Valoración para el parcial

3.

Análisis

4.

Archivo header

5.

Tarea

6.

Consulta

 

 

OBJETIVOS

 

-         Afianzar los conocimientos alcanzados hasta el momento

-         Disolver cualquier duda

-         Revisar el parcial aplicado

 

 

PLANTEAMIENTO DEL PROBLEMA

 

SISTEMA DE NUMERACION ROMANO

 

El sistema numérico romano ha perdurado hasta hoy, utilizándose para identificar siglos, indicar orden, en números de relojes, tablas periódicas de elementos químicos y otras aplicaciones, mientras que el arábigo se emplea masivamente.

IVXLCDMLos siete símbolos en que se basa la numeración romana

 

Este sistema de numeración se compone de siete letras del alfabeto romano; las cuales también son llamadas símbolos. Cada símbolo tiene un valor específico, el cuál se muestra en la siguiente tabla:

Sistema de numeración Romano

I

V

X

L

C

D

M

Sistema de numeración Decimal

1

5

10

50

100

500

1 000

 

Los símbolos se clasifican en:

Primarios: I, X, C, M, los cuales se pueden repetir hasta tres veces.

Secundarios: V, L, D, los cuales no pueden repetirse.

 

Los números se forman con base a los principios de adición, sustracción y multiplicación.

 

REGLAS.

            NOTA.  El número cero o un negativo no se pueden representar!

  1. Se pueden repetir hasta tres veces los símbolos primarios (I, X, C, M) y sus valores se suman. No se repiten ni anteponen los símbolos secundarios (V, L y D).
  2. Si a la derecha de un símbolo está otro de menor valor, se suman los dos.

 

VI  = 6, ya que 5 + 1 = 6;

XV = 15, ya que 10 + 5 = 15

MCVI = 1 106, ya que 1 000 + 100 +  5 + 1 = 1 106

 

  1. Si los símbolos I, X o C están a la izquierda de otro de mayor valor, se le resta al de mayor valor.  Teniendo en cuenta que:

 I va sólo a la izquierda de V ó X,

X va sólo a la izquierda de L ó C y

C va sólo a la izquierda de D ó M.

Ejemplo:

 

Existen dos casos posibles.

 

IV = 4, ya que  5 - 1 = 4

IX = 9, ya que 10 - 1 = 9

XL = 40, ya que 50 - 10 = 40

XC = 90, ya que 100 - 10 = 90

CD = 400, ya que 500 - 100 = 400

CM = 900, ya que 1 000 - 100 = 900

 

  1. Una raya arriba de un número romano o parte de él, multiplica su valor por mil.

 

Árabigo

Cardinal

Ordinal

Romano

1

unus - una - unum

Primus

I

2

duo - duae - duo

Secundas

II

3

tres - tria

Tertius

III

4

quattuor

Quartus

IV

5

quinque

Quintus

V

6

sex

Sextus

VI

7

septem

Septimus

VII

8;

octo

Octavus

VIII

9

novem

Nonus

IX

10

decum

decimus

X

11

undecim

undecimus

XI

12

duodecim

duodecimus

XII

13

tredecim

tertius decimus

XIII

14

quattourdecim

Quartus decimus

XIV

15

quindecim

Quintus decimus

XV

16

sedecim

sextus decimus

XVI

17

septendecim

septimus decimus

XVII

18

duodeviginti

duodevicesimus

XVIII

19

undeviginti

undevicesimus

XIX

20

viginti

vicesimus

XX

21

viginti unus

vicesimus primus

XXI

22

viginti duo  -  duo et viginti   (2 & 20)

vicesimus secundas

XXII

23

viginti tria  -  tria et viginti     (3 & 20)

vicesimus tertius

XXIII

24

viginti..quattuor..-..quatour..et..vinginti.

vicesimus quartus

XXIV

30

triginta

tricesimus

XXX

40

quadraginta

quadragesimus

XL

50

quinquaginta

quinquagesimus

L

60

sexaginta

sexagesimus

LX

70

septuaginta

septuagesimus

LXX

80

octoginta

octogesimus

LXXX

90

nonaginta

nonagesimus

XC

100

centum

centesimus

C

101

centum unus  -  centum et unus

centesimus primus

CI

102

centum..duo..-..centum..et..duo..

centesimus secundas

CII

200

ducenti,  -ia,  -a

ducentesimus

CC

300

trecenti

trecentesimus

CCC

400

quadringenti

quadringentesimus

CD

500

quingenti

quingentesimus

D

600

sescengenti

sescentesimus

DC

700

septingenti

septingentesimus

DCC

753

sepingenti quinquaginta tria

Año de la fundación de Roma 
 21 de abril  753 BC

DCCLIII

800

octingenti

octingentesimus

DCCC

900

nongenti

nongentesimus

CM

1000

mille

millesimus

M

1001

mille unus

millesimus primus

MI

1002

mille duo

millesimus secundas

MII

1003

mille tre

millesimus tertius

MIII

1900

mille nongenti

millesnongentesimus

MCM

1999

mille nongenti nonginta novem

millesnongentesimus nonagesimus nonus

MCMXCIX

2000

duomilia

bismillesimus

MM

2001

duomilia unus

bismillesimus primus

MMI

2002

duomilia duo

bismillesimus secundas

MMII

2100

duomilia centum

bismilles centesimus

MMC

3000

tresmilia

tresmillesimus

MMM

4000

quadramilia

quadramillesimus

IV

5000

quinmilia

quinmillesimus

V

6000

sesmilia

sesmillesimus

VM

7000

Septuamilia

septuamillesimus

VMM

8000

Octomilia

octomillesimus

VMMM

9000

Nonamilia

nonamillesimus

MX

10,000

decem milia

decies millesimus

X

 


APLICACIÓN SOLICITADA

 

Implemente un programa orientado a objetos que permita visualizar y operar números romanos, que se caracterizan por poseer el valor arábigo equivalente, su cardinal y el número romano propio, se manejarán básicamente dos objetos (números romanos) que correspondan a la siguiente notación:

 

 

  Se requieren implementar como mínimo las siguientes operaciones:

-         Constructor de Inicialización de un objeto con el valor LXIX (69).

-         Constructor Ordinario fijando en nulos los atributos.

-         leeArabigo, que solicita un entero sin signo igual o inferior 1000.

-         leeOrdinal, que solicita el nombre ordinal de cierto número a manejar.

-         calculaNumeroRomano, que genera el respectivo número romano.

-         visualizaNumero, permite verificar los atributos de un cierto objeto.

 

Adicionalmente se deben posibilitar las siguientes operaciones aritméticas básicas entre Números Romanos:

-         Adición

-         Sustracción

 

 

VALORES A ASIGNAR

 

Es prerrequisito que el programa corra para ser revisado.

-         [3]  Modularidad + Makefile

-         [8] Abstracción (Métodos y atributos)

-         [4] Grado de cohesión entre módulos

-         [8] Constructores

-         [10] Sobrecarga de operadores

-         [7] Eficiencia algoritmo de Cálculo del número Romano

-         [6] Validaciones

-         [4] Operacionalización de la Interfaz

 

 

ANÁLISIS

 

 

¿Qué nos piden?. Hágame click

Para desarrollar la aplicación Orientada a Objetos, debemos realizar la abstracción del Tipo Abstracto de Datos a representar por medio de una clase (class) que deberá poseer:

-         Atributos (estructura básica) Hágame click

-         Métodos básicos (Funciones que describen su comportamiento) Hágame click

-         Se solicita poder sumar y restar objetos (números romanos), lo que nos invita a sobrecargar los operadores + y –

Recordemos que existen cuatro tipos de Constructores, pedían la implementación de dos de ellos:

-         Inicialización con el valor LXIX, eso indica que se recibe implícitamente la cadena “LXIX” y se deposita en el respectivo atributo (romano, tal como lo describe el gráfico del objeto).

-         Ordinario que debe recibir un argumento para cada atributo y justamente se solicitaba que fijara los valores a nulos.

 

Fijémonos, toda la información era demasiado transparente para la implmenetación.

 

 

HEADER: romano.h

 

Presento a continuación un header básico para nuestra aplicación, que a medida de la implementación podría especificar el requerimiento de nuevos métodos.

 

/*Archivo romano.h

Información Administrativa

Autor:                    MIGUEL ANGEL MENDOZA MORENO

Código:  64000000

Fecha:                    2 de Septiembre de 2004. 11:00 a.m.

Plataforma:            Linux

Descripción:         Aplicación  que permite instanciar y operar objetos del tipo Abstracto de Dato Número Romano.

*/

 

#ifndef ROMANO_H

#define ROMANO_H

class Romano{

                               char romano[10];  //podria trabajarse memoria dinamica

                               char cardinal[30];

                               unsigned arabigo;

/*Inicialmente omita estos métodos privados

                               void llamaWhile(unsigned *,unsigned int *,const int,const char);

                               void llamaIf(unsigned *,unsigned int *,const int,const char);

                               void llamaIf2(unsigned *,unsigned int *,const int,const char,const char);

*/

                public:

                               Romano(char [],char [],unsigned);

                               Romano(char []);

                               void leeArabigo();

                               void leeOrdinal();

                               char* obtieneRomano();                    //Necesaria para tomar el atributo romano

                               unsigned int obtieneArabigo();       //Necesaria para tomar el atributo arabigo

                               void calculaRomano();

                               void visualizaNumero();

                               Romano operator+(Romano&);  //Sobrecarga operador +

                               Romano operator-(Romano&);

};

/*Inicialmente omita este metodo

int validaSustraccion(Romano *,Romano *);

*/

#endif

 

 

Esta definición enmarca el comportamiento básico de nuestro ejercicio.

 

 

 

IMPLEMENTACIÓN

 

Ojo: No olvide crear las respectivas carpetas!

 

A partir del anterior Archivo header, que contiene las definiciones elementales de nuestro TAD representado por medio de la clase Romano, implemente cada operación básica en el archivo romano.cpp, junto con el siguiente archivo principa.cpp, cree un makefile y ejecute.

 

 

#include"romano.h"

#include<iostream.h>

int main(){

      Romano num1(0,0,0);     //Invoca Constructor Ordinario

      Romano num2("LXIX");    //Invoca Constructor de Inicialización

      cout<<"Digite los datos del primer numero ";

      num1.leeArabigo();

      num1.leeOrdinal();

      num1.calculaRomano();

      cout<<endl<<"1.  Visualizacion de cada objeto: ";

      cout<<endl<<"Primer Numero (Objeto1): ";

      num1.visualizaNumero();

      cout<<endl<<"Segundo Numero (Objeto2): ";

      num2.visualizaNumero();

      cout<<endl<<"2.  Adicion de Romanos: ";

      cout<<endl<<num1.obtieneRomano()<<" + "<<num2.obtieneRomano()<<" = ";

      num1+num2;

      cout<<num1.obtieneRomano()<<endl;

      cout<<endl<<"3.  Lectura de Datos del Romano resultante de la suma: ";

      num1.leeOrdinal();

      cout<<endl<<"4.  Sustraccion de Romanos  ";

      /*De momento omita la siguiente linea

      if(validaSustraccion(&num1,&num2)){

      */

            cout<<endl<<num1.obtieneRomano()<<" - "<<num2.obtieneRomano()<<" = ";

            num1=num1-num2;

            cout<<num1.obtieneRomano()<<endl;

            num1.leeOrdinal();

      /*

      }

      */

      num1.visualizaNumero();

      return 0;

}

 

 

TAREA

 

-         [tarea1] Modifique el archivo anterior programa de manera que los streams se empleen únicamente en la interfaz (principa.cpp).  Analice las implicaciones de estos cambios.

-         [tarea2]  Suponga un vector de números romanos que posea seis posiciones, en las dos primeras almacena dos números y en las cuatro restantes los resultados de ejecutar las cuatro operaciones aritméticas elementales entre el primer y segundo números respectivamente.

 

 

 

 

CONSULTAS

 

Preparemos las siguientes temáticas más a fondo:

-         Apuntador this.

-         Clases y funciones amigas

-         Parámetros implícitos

-          Jerarquía de Clases, Relaciones y Herencia (Simple y Múltiple)