ayuda con este programa

the_nefarius
24 de Febrero del 2006
el asunto es que no funciona como deveria y no se como o que correjirle si alfuien pudiera revisarlo y ayudarme a mejjorarlo estaria muy agradecido pd si ya note que desperdicio memoria

#include <stdio.h>
#include <graphics.h>
#include<conio.h>
#include<dos.h>
#include<stdlib.h>
#include<math.h>

void inicia_graficos();
void marco();
void inicia_mouse();
void aparece_mouse();
void boton_normal(int mix, int miy, char *titulo);
void boton_presionado(int mix, int miy);
void funcion(char *tipo, char *dato, char *boton);
void variable(char *tipo, char *dato, char *boton, char cad[]);
void resultado(char *tipo, char *dato, char *boton, char cad[], char var[]);


void main()
{
int x=300, y=200, tecla=0;
inicia_graficos();
inicia_mouse();
funcion("FUNCION","f(x)=","Continuar");
}

void inicia_graficos()
{
int gdriver = DETECT, gmode, errorcode;
initgraph(&gdriver, &gmode, "c:\tc\bgi");
errorcode = graphresult();

if (errorcode != grOk)
{
printf("Error de graficos: %sn", grapherrormsg(errorcode));
printf("No se encuentran los archivos necesarios para iniciar el programa");
delay(5000);
exit(1);
}
}

//funcion que inicia el mouse colocando un 0 en in.x.ax
void inicia_mouse()
{
union REGS in,out;
in.x.ax=0;
int86(0x33,&in,&out);
}

//esta funcion muestra el mouse en pantalla colocando un 1 en in.x.ax
void aparece_mouse()
{
union REGS in,out;
in.x.ax=1;
int86(0x33,&in,&out);
}

//la funcion edo_mouse regresa las coordenadas donde se encuentra el mouse y si se presiono un boton de este
void edo_mouse(int *botrat1,int *x,int *y)
{
union REGS in,out;
in.x.ax=3;
int86(0x33,&in,&out);
*botrat1=out.x.bx;
*x=out.x.cx;
*y=out.x.dx;
}

//esta funcion desaparece el mouse de la pantalla para que se pueda dibujar algo sin que el mouse se interponga
//para ello coloca un 2 en in.x.ax
void esconde_mouse()
{
union REGS in,out;
in.x.ax=2;
int86(0x33,&in,&out);
}

void marco()
{
//cuadro instalacion
setfillstyle(1,DARKGRAY);
setcolor(WHITE);
arc(175,170,90,180,5);
arc(465,170,0,90,5);
arc(175,310,180,270,5);
arc(465,310,270,360,5);
line(175,165,465,165);
line(170,170,170,310);
line(175,315,465,315);
line(470,170,470,310);
floodfill(190,180,WHITE);
setcolor(BLACK);
line(235,240,430,240);
line(235,240,235,256);
setcolor(LIGHTGRAY);
line(235,257,430,257);
line(430,240,430,256);
}

void boton_normal(int mix, int miy, char *titulo)
{
int px;

setcolor(LIGHTGRAY);
line(mix,miy,mix+80,miy);
arc(mix,miy+8,90,270,8);
setcolor(BLACK);
line(mix,miy+16,mix+80,miy+16);
arc(mix+80,miy+8,270,90,8);
setcolor(WHITE);
px =(80-textwidth(titulo)) / 2;
outtextxy(mix+px, miy+5, titulo);
}

void boton_presionado(int mix, int miy)
{
setcolor(BLACK);
line(mix,miy,mix+80,miy);
arc(mix,miy+8,90,270,8);
setcolor(LIGHTGRAY);
line(mix,miy+16,mix+80,miy+16);
arc(mix+80,miy+8,270,90,8);
}


void funcion(char *tipo, char *dato, char *boton)
{
int x=240, y=248, tecla=0, botrat1, xr, yr, i=0;
union REGS raton;

char cad[23];
marco();
setcolor(WHITE);
outtextxy(200,200, tipo);
outtextxy(195,245, dato);
boton_normal(350,280,boton);
aparece_mouse();
while(tecla!=13)
{ /*
do
{
setcolor(WHITE);
outtextxy(x,y,"_");
delay(200);
setcolor(DARKGRAY);
outtextxy(x,y,"_");

edo_mouse(&botrat1,&xr,&yr);

if(botrat1==1)
{
if(xr>350&&yr>280&&xr<430&&yr<360)
{
esconde_mouse();
boton_presionado(350,280);
delay(100);
boton_normal(350,280, "Continuar");
cleardevice();
variable("VARIABLE"," X =","Evaluar", cad);
}
}

delay(200);
}while(!kbhit());*/

if(tecla)
x+=8;

tecla=getch();
if(tecla!=13)
{
cad[i]=tecla;
cad[i+1]='';
i++;
}
else
{
cleardevice();
variable("VARIABLE"," X =","Evaluar", cad);
}
setcolor(WHITE);
outtextxy(240,y, cad);
}


}


void variable(char *tipo, char *dato, char *boton, char cad[])
{

int x=240, y=248, tecla=0, botrat1, xr,yr, i=0;
union REGS raton;

char var[5];
marco();
setcolor(WHITE);
outtextxy(200,200, tipo);
outtextxy(195,245, dato);
boton_normal(350,280, boton);
aparece_mouse();
while(tecla!=13)
{ /*
do
{
setcolor(WHITE);
outtextxy(x,y,"_");
delay(200);
setcolor(DARKGRAY);
outtextxy(x,y,"_");

edo_mouse(&botrat1,&xr,&yr);

if(botrat1==1)
{
if(xr>350&&yr>280&&xr<430&&yr<360)
{
esconde_mouse();
boton_presionado(350,280);
delay(100);
boton_normal(350,280, "Continuar");
cleardevice();
resultado("RESULTADO","f(x)=","Terminar", cad, var);
delay(1000);
exit(1);
}
}

delay(200);
}while(!kbhit());*/
if(tecla)
x+=8;
tecla=getch();

if(tecla!=13)
{
var[i]=tecla;
var[i+1]='';
i++;
}
else
{
cleardevice();
resultado("RESULTADO","f(x)=","Terminar", cad, var);
}
setcolor(WHITE);
outtextxy(240,y, var);
}
}


void resultado(char *tipo, char *dato, char *boton, char cad[], char var[])
{
int x=240, y=248, tecla=0, botrat1, xr,yr, i=0, j=0, k=0, a=0, b=0, a1=0, b1=0;
double res;
union REGS raton;
char resu[23], algo[23], oper[10];
float num[10], nvacad[23];

marco();
setcolor(WHITE);
outtextxy(200,200, tipo);
outtextxy(195,245, dato);
boton_normal(350,280, boton);
aparece_mouse();


while(cad[i]!='')
{
while(isdigit(cad[i])||cad[i]=='.')
{
algo[j]=cad[i];
algo[j+1]='';
i++;
j++;
}

nvacad[k]=atof(algo);
nvacad[k+1]='';
k++;
j=0;

while(isalpha(cad[i]))
{
nvacad[k]=cad[i];
nvacad[k+1]='';
i++;
k++;
}

while(cad[i]=='+'||cad[i]=='-'||cad[i]=='*'||cad[i]=='/'||cad[i]=='^')
{
nvacad[k]=cad[i];
nvacad[k+1]='';
i++;
k++;
}

}

res=atof(var);
i=0;

while(nvacad[i])
{
if(nvacad[i]>41&&nvacad[i]<48||nvacad[i]==94)
{
oper[b]=nvacad[i];
oper[b+1]='';
b++;
}
else
if(nvacad[i]>64&&nvacad[i]<91||nvacad[i]>96&&nvacad[i]<123)
{
num[a]=res;
a++;
oper[b]=42;
b++;
}
else
{
num[a]=nvacad[i];
a++;
}
i++;
}

while(b>0)
{
while(oper[b1]!='')
{
if(oper[b1]=='^')
{
num[b1]=pow(num[b1], num[b1+1]);
a1=b1+1;
a--;
while(a1!=a)
{
num[a1]=num[a1+1];
a1++;
}
a1=b1;
b--;
while(a1<=b)
{
oper[a1]=oper[a1+1];
a1++;
}
}
else
b1++;
}

b1=0;
while(oper[b1]!='')
{
if(oper[b1]=='*')
{
num[b1]=num[b1]*num[b1+1];
a1=b1+1;
a--;
while(a1!=a)
{
num[a1]=num[a1+1];
a1++;
}
a1=b1;
b--;
while(a1<=b)
{
oper[a1]=oper[a1+1];
a1++;
}
}
else
b1++;
}

b1=0;
while(oper[b1]!='')
{
if(oper[b1]=='+')
{
num[b1]=num[b1]+num[b1+1];
a1=b1+1;
a--;
while(a1<=a)
{
num[a1]=num[a1+1];
a1++;
}
a1=b1;
b--;
while(a1<=b)
{
oper[a1]=oper[a1+1];
a1++;
}
}
else
b1++;
}

b1=0;
while(oper[b1]!='')
{
if(oper[b1]=='-')
{
num[b1]=num[b1]-num[b1+1];
a1=b1+1;
a--;
while(a1!=a)
{
num[a1]=num[a1+1];
a1++;
}
a1=b1;
b--;
while(a1<=b)
{
oper[a1]=oper[a1+1];
a1++;
}
}
else
b1++;
}
}


//resu1=num[0];

itoa(num[0], resu,10);

setcolor(WHITE);
outtextxy(240,248, resu);


while(tecla!=13)
{

edo_mouse(&botrat1,&xr,&yr);

if(botrat1==1)
{
if(xr>350&&yr>280&&xr<430&&yr<360)
{
esconde_mouse();
boton_presionado(350,280);
delay(100);
boton_normal(350,280, "Terminar");
delay(100);
cleardevice();
exit(1);
}
}


}

}