Escolar Documentos
Profissional Documentos
Cultura Documentos
v=W62an6HrSww
// ESPARSA
#include<iostream.h>
#include<funciones.h>
float matrix[10][12];
class nodo
{
public:
nodo(int f,int c,nodoarbol *narbol,nodo *sf,nodo *sc)
{
valor=narbol;
fila=f;
columna=c;
sfila=sf;
scolumna=sc;
}
int fila,columna;
nodoarbol *valor;
nodo *sfila,*scolumna;
friend class esparsa;
};
typedef nodo *pnodo;
typedef nodoarbol *anodo;
class esparsa
{
public:
esparsa(int f,int c)
{
head=new nodo(0,0,NULL,NULL,NULL);
filas=f;columnas=c;
}
void insertar(int f,int c,char *expresion);
void borrar(int f,int c);
float evaluar(int f,int c);
void generarmatriz(int f,int c);
//cambiarla por la funcion generar matriz
pnodo buscar(int f,int c);
float procesararbol(anodo nod);
//necesariamente tiene q estar aca
private:
pnodo head;
int filas,columnas;
pnodo buscarpos(int v, pnodo nod, int band);
void borrarfc(pnodo nod);
void reducir(int v);
};
void esparsa::insertar(int f,int c,char *expresion)//inserta un elemento en la coordenadas
f,c, si ya existe modifica su valor con el nuevo valor introducido
{
pnodo nuevo,auxf,auxc,temp;
anodo auxa,auxb;
//puntero tipo
nodo arbol a la raiz del arbol de expresiones
auxa=generararbol(expresion);
temp=buscar(f,c);
if(temp!=NULL)
{
auxb=temp->valor;
temp->valor=auxa;
//si existe el nodo le
cambio de arbol de expresiones
borrararbol(auxb);
//y libero la memoria
utilizada por el arbol anterior
}
else
{
nuevo=new nodo(f,c,auxa,NULL,NULL);//si no existe crea un nodo con
el arbol de expresiones
auxc=buscarpos(c,head,0);
auxf=buscarpos(f,head,1);
temp=auxc;
if(auxc->sfila==NULL||auxc->sfila->fila>f)
{
nuevo->sfila=auxc->sfila;
auxc->sfila=nuevo;
}
else
{
while(temp->sfila!=NULL&&temp->sfila->fila<f)
temp=temp->sfila;
nuevo->sfila=temp->sfila;
temp->sfila=nuevo;
}
if(auxf->scolumna==NULL||auxf->scolumna->columna>c)
{
nuevo->scolumna=auxf->scolumna;
auxf->scolumna=nuevo;
}
else
{
temp=auxf;
while(temp->scolumna!=NULL&&temp->scolumna>columna<c)
temp=temp->scolumna;
nuevo->scolumna=temp->scolumna;
temp->scolumna=nuevo;
}
}
}
void esparsa::borrar(int f,int c)//borra el elemento q esta en las coordenadas f,c , si no
existe el elemento retorna
{
pnodo aux,auxf,auxc,temp;
anodo auxa;
aux=buscar(f,c);
if(aux==NULL)
{
cout<<" la celda no contiene ninguna informacion"<<endl;
return;
}
auxc=buscarpos(c,head,2);
if(auxc==head) return;
auxf=head->sfila;
while(auxf->fila!=f)
auxf=auxf->sfila;
temp=auxc;
while(temp->sfila!=NULL&&temp->sfila->fila!=f)
temp=temp->sfila;
aux=temp->sfila;
auxc=aux->scolumna;
temp->sfila=aux->sfila;
temp=auxf;
while(temp->scolumna!=aux)
temp=temp->scolumna;
temp->scolumna=auxc;
auxa=aux->valor;
//
borrararbol(auxa);
//borramos el arbol de expresiones ->
investigar sobre destructor de arbol bianrio
delete aux;
//luego borramos la celda
reducir(0);
reducir(1);
}
float esparsa::evaluar(int f,int c)
{
pnodo aux;
aux=buscar(f,c);
if(aux==NULL)
return 0.00005;
else
return procesararbol(aux->valor);//evalua el arbol q cuelga de la matriz
}
float esparsa::procesararbol(anodo nod)
{
int c=nod->band;
switch(c)
{
case 0: return nod->var;break;
case 1:
{
float a=procesararbol(nod->izq);
float b=procesararbol(nod->der);
if(a<=0.00005&&a>=0.000049||b<=0.00005&&b>=0.000049)
return (float)0.00005;
switch(nod->operador)
{
case '+':return a+b;break;
case '-':return a-b;break;
case '*':return a*b;break;
case '/':
{
if(b==0)
return 0.00005;
return a/b;
break;
}
}
}
case 2:
{
int f=nod->posicion[0];
int c=nod->posicion[1];
return evaluar(f,c);
}
}
}
void esparsa::generarmatriz(int f,int c)
{
int cuadrante=evaluar(f,c);
pnodo auxf,auxc;
switch(cuadrante)
{
case 0:f=1;c=1;break;
case 1:f=1;c=87;break;
case 2:f=42;c=1;break;
case 3:f=42;c=87;break;
default:f=f-5;c=c-6;
}
auxf=head->sfila;
while(auxf!=NULL&&auxf->fila<=f)
auxf=auxf->sfila;
for(int i=0;i<10;i++)
{
if(auxf!=NULL&&auxf->fila==i+1)
{
auxc=auxf->scolumna;
while(auxc!=NULL&&auxc->columna<=c)
auxc=auxc->scolumna;
for(int j=0;j<12;j++)
{
if(auxc!=NULL&&auxc->columna==j+1)
matrix[i][j]=evaluar(i+1,j+1);
else if(auxc!=NULL)
{
matrix[i][j]=-0.00005;
auxc=auxc->scolumna;
}
else
matrix[i][j]=-0.00005;
}
}
else if(auxf!=NULL)
auxf=auxf->sfila;
}
}
pnodo esparsa::buscarpos(int v,pnodo nod,int band)//para insertar necesitamos saber en
q fila y columna hacerlo
{
//retorna un puntero a la fila o columna deseada, si no
existe
pnodo aux,nuevo;
//crea el nodo q se necesite
if(band==0)
{
aux=nod;
while(aux->scolumna!=NULL&&aux->scolumna->columna<v)
aux=aux->scolumna;
if(aux->scolumna!=NULL&&aux->scolumna->columna==v)
return aux->scolumna;
nuevo=new nodo(0,v,0,NULL,NULL);
nuevo->scolumna=aux->scolumna;
aux->scolumna=nuevo;
return nuevo;
}
else if(band==1)
{
aux=nod;
while(aux->sfila!=NULL&&aux->sfila->fila<v)
aux=aux->sfila;
if(aux->sfila!=NULL&&aux->sfila->fila==v)
return aux->sfila;
nuevo=new nodo(v,0,0,NULL,NULL);
nuevo->sfila=aux->sfila;
aux->sfila=nuevo;
return nuevo;
}
else
{
aux=nod;
while(aux->scolumna!=NULL&&aux->scolumna->columna<=v)
aux=aux->scolumna;
if(aux->columna==v)
return aux;
else
return nod;
}
}
void esparsa::reducir(int v)//despues de eliminar puede que nos queden filas o columnas
vacias, se encarga de eliminarlas
{
pnodo aux,temp=head;
if(v==0)
aux=head->sfila;
else
aux=head->scolumna;
while(aux!=NULL)
{
if(v==0&&aux->scolumna==NULL)
{
temp->sfila=aux->sfila;
delete aux;
aux=temp->sfila;
}
else if(v==0)
{
aux=aux->sfila;
temp=temp->sfila;
}
else if(v==1&&aux->sfila==NULL)
{
temp->scolumna=aux->scolumna;
delete aux;
aux=temp->scolumna;
}
else
{
aux=aux->scolumna;
temp=temp->scolumna;
}
}
}
pnodo esparsa::buscar(int f,int c)//retorna el nodo si lo encuentra dentro de la matriz, si
no retorna null
{
pnodo aux;
aux=buscarpos(c,head,2);
if(aux==head)
return NULL;
while(aux->sfila!=NULL&&aux->sfila->fila<=f)
aux=aux->sfila;
if(aux->fila==f)
return aux;
else
return NULL;
}
///
FUNCIONES
#include<iostream.h>
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
#include<pila.h>
#include<ctype.h>
typedef nodoarbol *pnodoarbol;
int evaluare(char a)
{
int b=isalpha(a);
if(b!=0)
return 2;
int c=isdigit(a);
if(c!=0)
return 0;
return 1;
};
int evaluarf(char *celda)
{
int ant=0,i=0,valor=0;
while(isalpha(celda[i]))
{
valor=int(celda[i])-64;
valor=valor+ant;
ant+=26;
i++;
}
return valor;
};
int evaluarc(char *celda)
{
int ant=0,valor,i=0;
while(isalpha(celda[i]))
i++;
while(isdigit(celda[i]))
{
valor=int(celda[i])-48;
valor=valor+ant;
ant=valor*10;
i++;
}
return valor;
};
{
if(nodo!=NULL)
{
borrararbol(nodo->izq);
borrararbol(nodo->der);
delete nodo;
}
};
int evaluarcuadrante(int f,int c)
{
if(f<=10)
{
if(c<=12)
return 0;
if(c>=87)
return 1;
return 4;
}
else if(f>=42)
{
if(c<=12)
return 2;
if(c>=87)
return 3;
return 4;
}
else
return 4;
};
//-----Declaracin de funciones// funcion infijo a posfijo
//-----Variables globales
char Simb[4][2]={{'(',')'},{'-','+'},{'/','*'},{'$','\0'}},
expr[50], pila[50], expr_c[50], epre[50], epos[50],
elem, simb;
int i, j, n, tope, val, cont1, cont2, v;
//-----Limpia la variable */
void limpiar(char a[], int n){
for(i=0;i<n;i++){
a[i]='\0';
}
};
//-----Cuenta cuantos caracteres hay en la variable
int tama(char var[]){
for(n=0;var[n]!='\0';++n);
return(n);
};
//-----Pasa de una variable a otra
void pasar(char a[], char b[]){
if(pila[i]==')'){
cont2+=1;
}
}
if(cont1<cont2){
val=2;
}
if(cont1>cont2){
val=1;
}
}
else{
val=3;
}
}
else{
val=0;
}
return(val);
};
//-----Recorre los caracteres un lugar
void rec_exp(char a[]){
int x=tama(a);
for(i=0;i<(x-1);i++){
a[i]=a[i+1];
}
a[i]='\0';
};
//-----Verifica si es un operador
int sim(char s){
v=0;
for(i=0;i<4;i++){
for(j=0;j<2;j++){
if(s==Simb[i][j]){
v=1;
}
}
}
return(v);
};
//-----Verifica la prioridad para colocar en la pila // A3=A1 +A2 *4 +6
int prio(char s1, char s2){
int p1, p2;
p1=p2=0;
for(i=0;i<4;i++){
for(j=0;j<2;j++){
if(s1==Simb[i][j]){
p1=i;
}
if(s2==Simb[i][j]){
p2=i;
}
}
}
if(p1<p2){
i=-1;
}
else{
if(p1==p2){
i=0;
}
else{
i=1;
}
}
return(i);
};
}
else{
if(tama(pila)>0){
while(prio(simb,pila[tope])<=0){
int x=tama(epos);
epos[x]=pila[tope];
pila[tope]='\0';
tope-=1;
if(tope<0){
break;
}
}
}
tope+=1;
pila[tope]=simb;
}
}
}
}
while(tope>=0){
int x=tama(epos);
epos[x]=pila[tope];
pila[tope]='\0';
tope-=1;
}
};
void ajustarexpr(char epos[])
{
int j=0;
for(int i=0;epos[i]!='\0';i++,j++)
{
if(epos[i]=='+'||epos[i]=='*'||epos[i]=='-'||epos[i]=='/')
{
expr_c[j]=epos[i];
expr_c[j+1]=' ';
j++;
}
else
expr_c[j]=epos[i];
}
expr_c[j]='\000';
};
//
NODOARBOL
#include<iostream.h>
class nodoarbol
{
public:
nodoarbol(float v,char op,int pos[2],int b,nodoarbol *i,nodoarbol *d)
{
var=v;
operador=op;
posicion[0]=pos[0];
posicion[1]=pos[1];
band=b;
izq=i;
der=d;
}
float var;
int posicion[2],band;
char operador;
nodoarbol *izq,*der;
};
//
PILA
#include<iostream.h>
#include<nodoarbol.h>
typedef nodoarbol *anodo;
class nodo2
{
public:
nodo2(anodo v,nodo2 *sig=NULL)
{
valor=v;
siguiente=sig;
}
anodo valor;
nodo2 *siguiente;
friend class pila;
};
class pila
{
public:
pila(){ultimo=NULL;}
void push(anodo v);
anodo pop();
private:
nodo2 *ultimo;
};
void pila::push(anodo v)
{
nodo2 *nuevo;
nuevo=new nodo2(v,ultimo);
ultimo=nuevo;
}
anodo pila::pop()
{
nodo2 *nodo;
anodo v;
if(!ultimo) return NULL;
nodo=ultimo;
ultimo=nodo->siguiente;
v=nodo->valor;
delete nodo;
return v;
}
//
EXCEL
#include<iostream.h>
#include <stdio.h>
#include <conio.h>
#include<stdlib.h>
#include<esparsa.h>
void main()
{
esparsa Esparsa(52,99);//topes maximos en filas y columnas d ela hoja de
calculo
for(int i=0;i<10;i++)
{
for(int j=0;j<12;j++)
matrix[i][j]=-0.00005;
}
//mostrar(1,1,matrix);//
char celda[5];
int band=1;
int f,c,n;
do{
i=0;
for(;(expr[i]=getchar())!='\n';i++); //estoy desperdiciando mucha
memoria
{
if(expr[i]=='\n')
expr[i]='\0';
}
i=0;
for(;i<5&&expr[i]!='='&&expr[i]!=' '&&expr[i]!='\0';i++)
celda[i]=expr[i];
celda[i]='\0';
switch(expr[i])
{
case '=':
{
f=evaluarf(celda);
c=evaluarc(celda);
i++;
for(int j=0;expr[i]!='\0';j++,i++)
expr_c[j]=expr[i];
conv_pos(expr_c,epos);
ajustarexpr(epos);
Esparsa.insertar(f,c,expr_c);
break;
}
case ' ':
{
f=evaluarf(celda);
c=evaluarc(celda);
Esparsa.borrar(f,c);
break;
}
case '\0':
{
f=evaluarf(celda);
c=evaluarc(celda);
float respuesta=Esparsa.evaluar(f,c);
if(respuesta<=0.00005&&respuesta>=0.000049)
cout<<celda<<" celda vacia o falta informacion
para procesar"<<endl;
else
cout<<"El valor de "<<celda<<" es:
"<<respuesta<<endl;
break;
}
default:
band=0;
}
Esparsa.generarmatriz(f,c);
n=tama(expr_c);
//cout<<expr_c;
limpiar(expr_c,n);
/*int g=evaluarcuadrante(f,c);// evaluar la posicion de la impresion de las filas
y columnas
switch(g)
{
case 0: mostrar(1,1,matrix);break; //vamos phoco
case 1: mostrar(1,87,matrix);break;
case 2: mostrar(42,1,matrix);break;
case 3: mostrar(42,87,matrix);break;
default: mostrar(f-5,c-6,matrix);
}*/
}while(band==1);
}