Solución Ex. Junio’06 GrD - Programación C++ Pág. 1 INDICE 1. CONVERSOR DEC-BIN Y BIN-DEC ............................................................................................................ 1 2. CLASES - INMOBILIARIA ............................................................................................................................ 2 1. Conversor Dec-Bin y Bin-Dec // Ejercico para convertir un número Decimal a Binario // Paul Bustamante - Tecnun // Copyright @ PBM #include <iostream.h> #include <string.h> #include <math.h> void Dec2Bin( int NumDec, char *NumBin); void Bin2Dec(char *NumBin, int &NumDec ); void main() { int num,opc; char NumBin[80]; while(1){ cout <<"** Menu **\n1. Dec to Bin\n2. Bin to Dec\n3. Salir\n\t Opc: ?"; cin >> opc; if (opc==1){ cout << "\tNumero decimal:?"; cin >> num; Dec2Bin(num,NumBin); cout << "\tEl Numero "<< num << " en binario es:" << NumBin << endl; }else if (opc==2){ cout << "\tNumero Binario:?"; cin >> NumBin; Bin2Dec(NumBin,num); cout << "\tEl Numero "<< NumBin << " en decimal es:" << num << endl; }else if (opc==3) break; } } void Dec2Bin( int NumDec, char *NumBin) { int cont=0; int num=NumDec; //numerador while(1){ int val = num/2; int r = num%2; if (val<2) { NumBin[cont++]='0'+ r; NumBin[cont++]='0'+ val; //el ultimo break; } NumBin[cont++]='0'+ r; //guardamos el resto num=val; } NumBin[cont]=0; //final de la cadena //invertimos el numero Informática II - Fundamentos de Programación Paul Bustamante Solución Ex. Junio’06 GrD - Programación C++ Pág. 2 int len=strlen(NumBin); for (int i=0;i<len/2;i++) { char a = NumBin[i]; NumBin[i]=NumBin[len-1-i]; NumBin[len-1-i] = a; } } void Bin2Dec(char *NumBin, int &NumDec ) { NumDec=0; int len = strlen(NumBin); for (int i=len-1;i>=0;i--){ NumDec += (NumBin[i] - '0') * pow( 2, len-1-i ); } } 2. Clases - Inmobiliaria // Ejercico de Clases: Herencia y Polimorfismo // Paul Bustamante - Tecnun // Copyright @ PBM #include <fstream.h> #include <iomanip.h> class Inmo { int tipo; //1: vivienda 2:local double precio; char direccion[40]; double m2; //area, en metros cuadrados bool venta; //true:venta false:alquiler public: Inmo(int tip){ tipo=tip; } int GetTipo(){ return tipo; } virtual void MostrarInfo() { venta? cout << "\tEn Venta.."<<endl : cout << "\tEn Alquiler.."<<endl; cout << "\tPrecio:" << setw(10)<<precio ; cout << "\tArea:" << m2 <<endl; cout << "\tDireccion:" << direccion <<endl; } friend void operator>>(istream& ci, Inmo* in) { int v; cout << "Venta (1) o Alquiler(0):?"; cin>>v; if (v==1) in->venta=true; else in->venta=false; cout << "Precio:?"; cin >> in->precio; cout << "Area(m2):?"; cin >> in->m2; cin.ignore(); cout << "Direccion:?"; cin.getline(in->direccion,40); } }; class Vivienda : public Inmo { int numHab; int numBan; bool trastero; bool garage; public: Informática II - Fundamentos de Programación Paul Bustamante Solución Ex. Junio’06 GrD - Programación C++ }; Pág. 3 Vivienda(int tip):Inmo(tip){;} friend void operator>>(istream& ci, Vivienda* viv) { char ch; cin >> (Inmo*)viv; cout << "Num.Habitaciones:?"; cin >> viv->numHab; cout << "Num.Banos:?"; cin >> viv->numBan; cout << "Trastero (s/n):?"; cin >>ch; if (ch=='s') viv->trastero=true; else viv->trastero=false; cout << "Garage (s/n):?"; cin >>ch; if (ch=='s') viv->garage=true; else viv->garage=false; } void MostrarInfo() { cout << "Vivienda:"<<endl; Inmo::MostrarInfo(); cout << "\tNumero de habitaciones:"<<numHab; cout << "\tNumero de Banos:"<<numBan<<endl; cout << "\tOpciones:"; trastero? cout << "CON trastero, " : cout << "SIN trastero, "; garage? cout << "CON garage"<<endl : cout << "SIN garage"<<endl; } class Local : public Inmo { int numOf; //numero de oficinas char Actividad[40]; //bar, peluquería, informática, etc. bool almacen; //true: tiene almacen public: Local(int tip):Inmo(tip){;} friend void operator>>(istream& ci, Local* loc) { char ch; cin >> (Inmo*)loc; //para ejecutar el opera. de Inmo cout << "Actividad:?"; cin.getline(loc->Actividad,40); cout << "Num.Oficinas:?"; cin >> loc->numOf; cout << "Almacen (s/n):?"; cin >>ch; if (ch=='s') loc->almacen=true; else loc->almacen=false; } void MostrarInfo() { cout << "Local:"<<endl; Inmo::MostrarInfo(); cout << "\tNumero de Oficinas:"<<numOf<<endl; cout << "\tActividad:"<<Actividad<<endl; cout << "\tOpciones: "; almacen? cout << "CON almacen"<<endl : cout << "SIN almacen"<<endl; } }; int Menu() { int opc; cout<<"\t***** Menu *****"<<endl; cout<<"\t1.Introducir oferta \n\t2.Ver Ofertas. \n\t3.Grabar Ofertas. \n\t 4.Leer Ofertas\n\t5.Salir"<<endl; cout<<"\t opcion:? "; cin>>opc; return opc; } Informática II - Fundamentos de Programación Paul Bustamante Solución Ex. Junio’06 GrD - Programación C++ Pág. 4 /************** Función Principal ****************/ void main() { Inmo *Lista[40]; int cont=0,tipo; while(1){ int opc=Menu(); if (opc==5) { for (int i=0;i<num;i++) delete Lista[i]; //liberar memoria break; } if (opc==1){ cout << "Introducir Viviendas(1) o Locales(2):?"; cin >> tipo; if (tipo==1){ Vivienda *v1 = new Vivienda(1); cin >> v1; Lista[cont++]=v1; } else { Local *l1 = new Local(2); cin >> l1; Lista[cont++]=l1; } } else if (opc==2){ cout << "Que tipo desea ver: Viviendas(1), Locales(2), Todas(3):?"; cin >> tipo; cout << "\n******** Listado *********"<<endl; for (int i=0;i<cont;i++){ if (Lista[i]->GetTipo()==tipo) //1 o 2 Lista[i]->MostrarInfo(); else if (tipo==3) Lista[i]->MostrarInfo(); //muestra todos } cout << "******** Fin del Listado *********\n"<<endl; } else if (opc==3){ //grabar los objetos a disco fstream fout("pp.dat",ios::out | ios::binary); for (int i=0;i<cont;i++){ //primero escribe el tipo, para saber qué leer fout.write((char*)Lista[i]->GetTipo(),sizeof(int)); if (Lista[i]->GetTipo()==1) fout.write((char*)Lista[i],sizeof(Vivienda)); else if (Lista[i]->GetTipo()==2) fout.write((char*)Lista[i],sizeof(Local)); } fout.close(); } else if (opc==4){ //Leer de disco //hacer la opción de lectura. Primero leer el Tipo de Objeto } } } Informática II - Fundamentos de Programación Paul Bustamante