Files
ed/Practica0/Practica0.cpp
2026-03-14 15:11:19 +01:00

503 lines
12 KiB
C++
Raw Permalink Blame History

#include <iostream> //cin, cout
#include <conio.h> // getch
#include <fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXIMO 20
#define M 5
using namespace std;
class quebrado {
int numerador, denominador;
public:
quebrado() { numerador=0; denominador=1; }
quebrado(int n, int d=1);
int getnumerador() { return numerador; }
int getdenominador() {return denominador; }
void valor(int n, int d=1);
quebrado operator+(quebrado q);
quebrado operator-(quebrado q);
quebrado operator*(quebrado q);
quebrado operator/(quebrado q);
quebrado operator-();
int operator==(quebrado q);
void mostrar();
};
typedef quebrado tipoelemento ;
int mcd(int a, int b) {
int comun,encontrado=0;
a=abs(a);
b=abs(b);
if (a>b) comun=b;
else comun=a;
while (comun>1 && !encontrado)
{
if (a%comun==0 && b%comun==0)
encontrado=1;
else comun--;
}
return(comun);
}
//calcula el mcm de a y b (en positivo)
int mcm(int a, int b) {
int comun,encontrado;
if (a<0) a=-a;
if (b<0) b=-b;
if (a>b) comun=a;
else comun=b;
encontrado=0;
while (!encontrado) {
if (comun%a==0 && comun%b==0)
encontrado=1;
else
comun++;
}
return(comun);
}
quebrado::quebrado(int n, int d) {
if (d==0) cout << "\nError: Quebrado no valido";
numerador=n; denominador=d;
}
void quebrado::valor(int n, int d) {
if (d==0) cout << "\nError: Quebrado no valido";
numerador=n; denominador=d;
}
void quebrado::mostrar() {
if (denominador>0) cout << numerador << "/" << denominador;
else cout << -numerador << "/" << -denominador;
}
quebrado quebrado::operator/(quebrado q) {
quebrado division;
division.numerador=numerador*q.denominador;
division.denominador=denominador*q.numerador;
return division;
}
quebrado quebrado::operator-() {
quebrado aux;
aux.numerador=-numerador;
aux.denominador=denominador;
return aux;
}
int quebrado::operator==(quebrado q) {
int igual;
if (numerador*q.denominador==denominador*q.numerador)
igual=1;
else
igual=0;
return igual;
}
quebrado quebrado::operator+(quebrado q) {
quebrado suma;
int comun;
if (denominador==q.denominador) {
suma.numerador= numerador + q.numerador;
suma.denominador = denominador;
}
else {
comun=mcm(denominador,q.denominador);
suma.denominador = comun;
suma.numerador=numerador*comun/denominador + q.numerador*comun/q.denominador;
}
return suma;
}
quebrado quebrado::operator-(quebrado q) {
quebrado resta;
q.numerador=-q.numerador;
resta=(*this)+q;
return(resta);
}
quebrado quebrado::operator*(quebrado q) {
quebrado producto;
producto.numerador=numerador*q.numerador;
producto.denominador=denominador*q.denominador;
return producto;
}
class complejo {
double real, imag;
public:
complejo(void) { real = 0.0; imag = 0.0; }
complejo(double re, double im=0.0) { real = re; imag = im;}
complejo(const complejo& r) { real = r.real;imag = r.imag;}
void SetReal(double re) { real = re; }
void SetImag(double im) { imag = im; }
double GetReal(void) {return real; }
double GetImag(void) {return imag; }
complejo operator+(int e);
complejo operator+(complejo c); //por valor
complejo operator-(const complejo& c); //por ref
int operator== (complejo c);
complejo operator=(complejo c);
complejo operator*(complejo c);
complejo operator++(); // ++obj;
complejo operator++(int notused); //obj++
complejo operator-();
void mostrar();
};
complejo complejo::operator+ (int e) {
complejo suma;
suma.real = real + e; suma.imag = imag;
return suma;
}
// sobrecarga de +
complejo complejo::operator+ (complejo c) {
complejo suma;
suma.real = real + c.real;
suma.imag = imag + c.imag;
return suma;
}
// sobrecarga de -
complejo complejo::operator- (const complejo &c) {
complejo resta;
resta.real = real - c.real;
resta.imag = imag - c.imag;
return resta;
}
// sobrecarga de ==
int complejo::operator== (complejo c) {
if (real==c.real && imag==c.imag)
return 1;
else
return 0;
}
// sobrecarga de =
complejo complejo::operator= (complejo c) {
real=c.real; imag=c.imag;
return c;
}
// sobrecarga de <20> unario
complejo complejo::operator-() {
complejo copia;
copia.real=-real;
copia.imag=-imag;
return copia;
}
// sobrecarga de ++ (++obj)
complejo complejo::operator++() {
complejo copia;
real++;
copia.real=real;
copia.imag=imag;
return copia;
}
// sobrecarga de ++ (obj++)
complejo complejo::operator++(int notused){
complejo copia;
copia.real=real;
copia.imag=imag;
real++;
return copia;
}
//sobrecarga de *
complejo complejo::operator*(complejo c){
//Falta implementar
complejo copia;
return copia;
}
// mostrar complejo
void complejo::mostrar(){
if (imag>0)
cout<<real<<"+"<<imag<<"i";
else
cout<<real<<imag<<"i";
}
class matriz {
private:
tipoelemento celda[M][M];
int fila,col;
public:
matriz(int f=0, int c=0);
int getfila() { return fila; }
int getcol() { return col; }
bool operator==(matriz m);
matriz operator*(matriz m);
matriz operator+(matriz m);
matriz operator-(matriz m);
matriz operator-();
void mostrar();
void cargar();
void cargar(char cad[]);
};
void matriz::cargar(char cad[]) {
int x, y;
FILE *fin=NULL;
do {
cout << "Filas: "; cin >> fila;
cout << "Columnas: "; cin >> col;
} while (fila>M || fila<1 || col>M || col<1);
cout << "Carga de una matriz " << fila << " x " << col << ":\n";
fin = fopen(cad, "rb");
if (fin != NULL) {
for (int i=0; i<fila; i++)
for (int j=0; j<col; j++) {
int n= rand()%80+1;
fseek(fin,sizeof(int)*n,SEEK_SET);
fread(&x,sizeof(int),1,fin);
fread(&y,sizeof(int),1,fin);
tipoelemento A(x,y);
celda[i][j]=A;
cout << "[" << i+1 << "," << j+1 << "]: ";
A.mostrar();
cout<<'\n';
}
fclose(fin);
fin = NULL;
}
else {
cout << "Error al abrir el fichero de numeros\n";
}
}
void matriz::cargar() {
int x, y;
do {
cout << "Filas: "; cin >> fila;
cout << "Columnas: "; cin >> col;
} while (fila>M || fila<1 || col>M || col<1);
cout << "Carga de una matriz " << fila << " x " << col << ":\n";
for (int i=0; i<fila; i++) {
for (int j=0; j<col; j++) {
cout << "[" << i+1 << "," << j+1 << "]: ";
cin>>x>>y;
tipoelemento A(x,y);
celda[i][j]=A;
//A.mostrar();
}
}
}
matriz::matriz(int f, int c) {
fila=f;
col=c;
for (int i=0; i<fila; i++)
for (int j=0; j<col; j++)
celda[i][j]=0;
}
bool matriz::operator==(matriz m){
bool iguales=true;
if (fila==m.fila && col==m.col){
int i=0;
while(i<fila && iguales)
{
int j=0;
while(j<col && iguales){
if (!(celda[i][j]==m.celda[i][j]))
iguales=false;
else j++;
}
i++;
}
}
else iguales=false;
return iguales;
}
matriz matriz::operator*(matriz m) {
int i,j,k;
tipoelemento prod;
matriz p(fila,m.col);
for (i=0; i< fila; i++)
for (j=0; j< m.col; j++) {
prod=0;
for (k=0; k< col; k++)
prod=prod+(celda[i][k]*m.celda[k][j]);
p.celda[i][j]=prod;
}
return(p);
}
matriz matriz::operator+(matriz m) {
int i,j;
matriz p(fila,col);
for (i=0; i< fila; i++) {
for (j=0; j< col; j++) {
p.celda[i][j]=celda[i][j]+m.celda[i][j];
}
}
return(p);
}
matriz matriz::operator-(matriz m) {
matriz p(fila,col);
for (int i=0; i< fila; i++) {
for (int j=0; j< col; j++) {
p.celda[i][j]=celda[i][j]-m.celda[i][j];
}
}
return(p);
}
matriz matriz::operator-() {
int i,j;
matriz p(fila,col);
for (i=0; i< fila; i++) {
for (j=0; j< col; j++) {
p.celda[i][j]=-celda[i][j];
}
}
return(p);
}
void matriz::mostrar() {
int i,j;
for (i=0; i<fila; i++) {
for (j=0; j< col; j++) {
celda[i][j].mostrar();cout << "\t";
}
cout << "\n";
}
}
int main() {
matriz m[MAXIMO];
matriz result;
int n,N=0;//Numero de matrices del vector
int i,pos,pos2;
char comando[20];
bool salir=false;
system("cls");
do {
cout << ">";
fflush(stdin); gets(comando);
if (strcmp(comando,"cargar")==0) {
cout<<"Cuantas matrices quieres cargar? \n"; cin>>n;
if (n+N>=MAXIMO)
cout<<"Se excede el numero de matrices con las que operar\n";
else
{
N=N+n;
for (i=0;i<n;i++)
m[i].cargar("numeros.dat");
}
}
else if (strcmp(comando,"listar")==0) { //listar
if (N==0)
cout << "No hay cargada ninguna matriz" << endl;
else
{
for (i=0;i<N;i++){
cout<<"\nMatriz " <<i+1<<":\n\n";
m[i].mostrar();
}
}
}
else if (strcmp(comando,"buscar")==0) { //buscar
if (N==0)
cout << "No hay cargada ninguna matriz" << endl;
else
{
result.cargar();
i=0;
while (i<N && !(result==m[i]))
i++;
if (result==m[i])
cout<<"\nLa matriz esta en la posicion "<<i<<" del vector\n";
else cout<<"\nNo se ha encontrado la matriz\n";
}
}
else if (comando[0]=='+'){
switch(comando[1])
{
case '+': cout<<"Posicion?:";cin>>pos;//Insertar matriz en la posicion pos
if (pos>=0 && pos<=N){
N++;
for(i=N-1;i>=pos;i--)
m[i]=m[i-1];
m[pos].cargar();
}
else cout<<"La posicion no es valida\n";break;
case 0: cout<<"Posiciones?:";cin>>pos>>pos2;//Sumar matrices en estas posiciones
if (pos>=0 && pos<N && pos2>=0 && pos2<N ){
if (m[pos].getfila()!=m[pos2].getfila() || m[pos].getcol()!=m[pos2].getcol())
cout << "Error: Las matrices no se pueden sumar" << endl;
else {
result= m[pos]+ m[pos2];
cout<<"Matriz resultante:\n";result.mostrar();
}
}
else cout<<"Posiciones no validas\n";
}
}
else if (comando[0]=='-') {
switch(comando[1])
{
case '-':cout<<"Posicion?:";cin>>pos;//Eliminar matriz en la posicion pos
if (pos>=0 && pos<N){
for(i=pos;i<N-1;i++)
m[i]=m[i+1];
N--;
}
else cout<<"La posici<63>n no es valida\n";break;
case 0: cout<<"Posiciones?:";cin>>pos>>pos2;//Restar matrices en estas posiciones
if (pos>=0 && pos<N && pos2>=0 && pos2<N ){
if (m[pos].getfila()!=m[pos2].getfila() || m[pos].getcol()!=m[pos2].getcol())
cout << "Error: Las matrices no se pueden sumar" << endl;
else {
result= m[pos]-m[pos2];
cout<<"Matriz resultante:\n";result.mostrar();
}
}
else cout<<"Posiciones no validas\n";
}
}
else if (comando[0]=='*') {
cout<<"Posiciones?:";cin>>pos>>pos2;//Multiplicar matrices en estas posiciones
if (pos>=0 && pos<N && pos2>=0 && pos2<N){
if (m[pos].getcol()!=m[pos2].getfila())
cout << "Error: Las matrices no se pueden multiplicar" << endl;
else {
result= m[pos]*m[pos2];
cout<<"Matriz resultante:\n";result.mostrar();
}
}
else cout<<"Posiciones no validas\n";
}
else if (comando[0]=='?') { //Mostrar una matriz del vector
cout<<"Posicion?:";cin>>pos;
if (pos>=0 && pos<N) m[pos].mostrar();
else cout<<"La posicion no es valida\n";
}
else if (strcmp(comando,"salir")==0) salir=true;
else
cout << "comando o orden incorrecta" << endl;
} while (!salir);
return 0; // Valor de retorno al S.O.
}