LABORATORIO 5: Objetos y Clases (Revisiones)
1. |
|
2. |
|
2.1 |
|
2.2 |
|
3. |
|
4. |
|
5. |
|
6. |
OBJETIVOS
-
Afianzar los conocimientos alcanzados hasta el momento
-
Disolver cualquier duda
-
Revisar el parcial aplicado
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.
Los 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!
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 |
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 |
Á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 |
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
¿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.
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;
}
- [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.
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)