ayudenme por fa

giannina30
15 de Marzo del 2006
necesito saber como realizar una calculadora cientifica en c++, se utilizan solo instructores sencillos como: do while, for, if,array,etc. por fa denme respuesta que sea la mas pronta posible

Miguel L.
15 de Marzo del 2006
#include <ctype.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <string.h>
#include <dos.h>
#include <bios.h>

#define ESC 0x11b
#define ENTER 0x1c0d

void toca(void)
{sound(400);delay(200);nosound();}

void p(int x,int y,char men[])
{gotoxy (x,y);cprintf("%s", men);}

void p (int x,int y,float f)
{gotoxy (x,y);cprintf("%0.2f ",f);}

void pc (int y,char men[],char c=40)
{gotoxy (c-((strlen(men))/2),y);cprintf("%s", men);}

void tc(int c)
{textcolor(c);}

void fc(int c)
{textbackground(c);}

void marco (char t[])
{
char i;
fc(1);
clrscr();
tc(7);
p(2,2,"CALCULADORA CIENTIFICA");
for(i=1;i<=80;i++) {p(i,1,"▀"); sound(i+150);delay(3);}
for(i=80;i;i--) {p(i,24,"▄");sound(i+150);delay(3);}
pc(3,t);
nosound();
tc(6);fc(0);
p(62,2,"▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒");
p(62,3,"▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒");
tc(0);
fc(1);
}

//**************************** FUNCIONES DE NUMEROS **************************
// ▄▄▄▄▄ ▄▄▄ ▄▄▄▄▄ ▄▄▄▄▄ ▄ ▄ ▄▄▄▄▄ ▄▄▄▄▄ ▄▄▄▄▄ ▄▄▄▄▄ ▄▄▄▄▄
// █ █ █ ▄▄▄▄█ ▄▄▄█ █▄▄▄█ █▄▄▄▄ █▄▄▄▄ ▀ █ █▄▄▄█ █▄▄▄█ ▄▄▄
// █▄▄▄█ ▄▄█▄▄ █▄▄▄▄ ▄▄▄▄█ █ ▄▄▄▄█ █▄▄▄█ █ █▄▄▄█ █ ▄

void cero (char x, char y)
{
p(x,y, "▄▄▄▄▄");
p(x,y+1,"█ █");
p(x,y+2,"█▄▄▄█");
}

void uno (char x, char y)
{
p(x,y, "▄▄▄ ");
p(x,y+1," █ ");
p(x,y+2,"▄▄█▄▄");
}

void dos (char x, char y)
{
p(x,y, "▄▄▄▄");
p(x,y+1,"▄▄▄█");
p(x,y+2,"█▄▄▄");
}

void tres (char x, char y)
{
p(x,y, "▄▄▄▄");
p(x,y+1," ▄▄█");
p(x,y+2,"▄▄▄█");
}


void cuatro (char x, char y)
{
p(x,y, "▄ ▄");
p(x,y+1,"█▄▄▄█");
p(x,y+2," █");
}


void cinco (char x, char y)
{
p(x,y, "▄▄▄▄");
p(x,y+1,"█▄▄▄");
p(x,y+2,"▄▄▄█");
}

void seis (char x, char y)
{
p(x,y, "▄▄▄▄");
p(x,y+1,"█▄▄▄");
p(x,y+2,"█▄▄█");
}

void siete (char x, char y)
{
p(x,y, "▄▄▄▄");
p(x,y+1,"▀ █");
p(x,y+2," █");
}

void ocho (char x, char y)
{
p(x,y, "▄▄▄▄▄");
p(x,y+1,"█▄▄▄█");
p(x,y+2,"█▄▄▄█");
}

void nueve (char x, char y)
{
p(x,y, "▄▄▄▄▄");
p(x,y+1,"█▄▄▄█");
p(x,y+2," █");
}

void punto (char x, char y)
{
p(x,y+2," ▄ ");
}

void menos (char x, char y)
{
p(x,y+1," ▄▄▄ ");
}

void numero (char x, char y,char c)
{
char n=0;
void (*fun []) (char,char) = {cero,uno,dos,tres,cuatro,cinco,seis,siete,ocho,nueve,punto,menos};
if(c=='.') n=10;
if(c=='-') n=11;
if(c>='0'&&c<='9') n=c-'0';
fun[n] (x,y);
}


char *sup_char (char i, char *en)
{
char x;
for(x=i;en[x];x++)
en[x]=en[x+1];
return en;
}

char *redondeo (char *en)
{
char i;
for(i=0;en[i];i++) if(en[i]=='.') break;
if(!en[i]) return en;
for(i=strlen(en)-1;i>=0&&en[i]=='0';i--)
sup_char (i,en);
if(en[i]=='.'&&(!en[i+1])) sup_char (i,en);
return en;
}

char *flotante (float f,int n,char *en)
{
const char *cad[]={"%0.0f","%0.1f","%0.2f","%0.3f","%0.4f","%0.5f","%f"};
sprintf(en,cad[n],f);
return redondeo(en);
}


char *a_cadena (float f, char *en)
{
char n;
if(f>999999999999.00) f=999999999999.00;
if(f<-99999999999.00) f=-99999999999.00;
for(n=6;n>=0&&(strlen(flotante (f,n,en))>12);n--);
return en;
}

void cifra (char *cad)
{
window(5,6,76,8);clrscr();window(1,1,80,25);
char i,x;
for(i=strlen(cad)-1,x=71;i>=0&&x>=5;i--,x=x-6)
numero(x,6,cad[i]);
p(40,24,"");
}

void cifra (float f)
{
char cad[50];
cifra(a_cadena(f,cad));
}
//**************************************************************************


//********************** OPERACIONES **********************************
// ▄▄▄▄ ▄▄▄▄ ▄▄▄▄ ▄▄▄▄ ▄▄▄▄
// █▄▄ █▄▄█ █▄▄█ █ █ █▄▄█
// █▄▄▄ █ ▀▄ █ ▀▄ █▄▄█ █ ▀▄
char error (void)
{
window(5,6,76,8);clrscr();window(1,1,80,25);
tc(8+BLINK);
pc(6,"▄▄▄▄ ▄▄▄▄ ▄▄▄▄ ▄▄▄▄ ▄▄▄▄");
pc(7,"█▄▄ █▄▄█ █▄▄█ █ █ █▄▄█");
pc(8,"█▄▄▄ █ ▀▄ █ ▀▄ █▄▄█ █ ▀▄");
p(40,24,"");
toca();
toca();
toca();
delay(200);
tc(8);
return 0;
}

char divi (float *r, float n1, float n2)
{
if(!n2) return error();
*r=n1/n2;
return 1;
}

char modulo (float *r, float n1, float n2)
{
if(!n2) return error();
*r=(int)n1%(int)n2;
return 1;
}

char potencia (float *r, float n1, float n2)
{
double d;
if(((!n1)&&n2<=0.00)||(n1<0.00&&n2<1.00)) return error();
d=pow(n1,n2);
*r=d;
return 1;
}

char inversa (float *r, float n1)
{
if(!n1) return error();
*r=1/n1;
return 1;
}

char exponencial (float *r, float n1)
{
return potencia(r,exp(1.00),n1);
}

char diez_ala (float *r, float n1)
{
return potencia(r,10.00,n1);
}

char raiz (float *r, float n1)
{
return potencia(r,n1,0.5);
}

char raiz_y (float *r, float n1,float n2)
{
float inv;
if(!inversa(&inv,n2)) return 0;
return potencia(r,n1,inv);
}

char ln (float *r, float n1)
{
if(n1<=0.00) return error();
*r=log(n1);
return 1;
}

char log_10 (float *r, float n1)
{
if(n1<=0.00) return error();
*r=log10(n1);
return 1;
}

char cardinalidad (float *en,float n)
{
long int c,i=n;
float m=n-i;;
if(n<0.00||(m)) return error();
*en=1;
for(c=0;c<i&&(*en)<99999999999.00;c++)
*en=(*en)*(c+1);
return 1;
}

//*****************************************************************************
void teclas (char x, char y, char t[], char f[])
{
p(x,y,t);p(x+11,y,f);
}

void ambiente (void)
{
char i;
marco("FUNCIONAMIENTO DE LA CALCULADORA");
tc(0);
fc(1);
p(2,11, "┌──────────┬─────────────┐┌──────────┬─────────────┐┌──────────┬─────────────┐");
for(i=12;i<=22;i=i+2)
{
p(2,i, "│ │ ││ │ ││ │ │");
p(2,i+1,"├──────────┼─────────────┤├──────────┼─────────────┤├──────────┼─────────────┤");
}
p(2,23, "└──────────┴─────────────┘└──────────┴─────────────┘└──────────┴─────────────┘");
pc(10,"<F1>,<F2>,<F3> MEMORIA AUXULIARES, <SHIF+Fx> CARGAR MEMORIA");
teclas(4, 12,"TECLA<S>","sen(x)");
teclas(4,14,"TECLA<C>","cos(x)");
teclas(4,16,"TECLA<T>","tan(x)");
teclas(4,18,"TECLA<E>","exp^(x)");
teclas(4,20,"TECLA<L>","ln(x)");
teclas(4,22,"TECLA<X>","(x)^(y)");
teclas(30,12,"TECLA<I>","1/(x)");
teclas(30,14,"TECLA<A>","10^(x)");
teclas(30,16,"TECLA<D>","log(x)");
teclas(30,18,"TECLA<Y>","(y)raiz(x)");
teclas(30,20,"TECLA<">","(x)ř");
teclas(30,22,"TECLA<R>","raizř (x)");
teclas(56,12,"TECLA<─>","˝(x)");
teclas(56,14,"TECLA<P>","(x)=Pi");
teclas(56,16,"TECLA<M>","M+");
teclas(56,18,"TECLA<N>","M-");
teclas(56,20,"ALT+M","(x)=M");
teclas(56,22,"CTRL+M","M = 0.00");

tc(7);
pc(25,"<Barra> AC, <Supr> C, <══> Borrar, <Esc> Off");
tc(0);
fc(7);
p(2,5,"█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█");
p(2,6,"█ █");
p(2,7,"█ █");
p(2,8,"█ █");
p(2,9,"█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█");
//5 //76
tc(8);
}


char existe_char (char *cad,char c)
{
char i;
for(i=0;cad[i]&&cad[i]!=c;i++);
return cad[i];
}

void incertar (float *c,int k,int *i,char *cad)
{
if(((*i)>11)||(k=='0'&&(!(*i)))||(k=='.'&&existe_char (cad,'.'))) return;
cad[*i]=k;
cad[(*i)+1]=NULL;
(*i)++;
*c=atof(cad);
}

void borrar (float *c,int *i,char *cad)
{
if(!(*i)) return;
(*i)--;
cad[*i]=NULL;
if(!(*i)) {cad[0]='0'; cad[1]=NULL;}
*c=atof(cad);
}

int comenzar (char *op,float *c, float *a,char *cad)
{
cad[0]='0';
cad[1]=NULL;
*c=0.00;
*a=0.00;
*op=NULL;
return 0;
}

char operacion (float *en, char op, float c, float a)
{
switch (op)
{
case '+': *en=a+c; break;
case '-': *en=a-c; break;
case '*': *en=a*c; break;
case '/': return divi (en,a,c);
case '%': return modulo (en,a,c);
case 'X': return potencia (en,a,c);
case 'Y': return raiz_y (en,a,c);
};
return 1;
}

int resultado (char *op, float *c, float *a, char *cad,char i)
{
float en=0.00;
if(!(*op)) return i;
if (!operacion(&en,*op,*c,*a)) return comenzar (op,c,a,cad);
*op=NULL;
*c=en;
return strlen(a_cadena(en,cad));
}

int cambia_signo (float *c,char *cad,char i)
{
if((!(*c))||(!i)) return i;
*c=(*c)*(-1);
return strlen(a_cadena(*c,cad));
}


char operacion_unitaria (float *en,int k,float n)
{
switch (k)
{
case '"': *en=n*n; break;
case '˙': *en=n*n*n; break;
case '$': *en=n*n*n*n; break;
case 'P': *en=3.141592654; break;
case 'T': *en=tan(n); break;
case 'S': *en=sin(n); break;
case 'C': *en=cos(n); break;
case 'R': return raiz(en,n);
case 'I': return inversa(en,n);
case 'L': return ln(en,n);
case 'E': return exponencial(en,n);
case 'D': return log_10(en,n);
case 'A': return diez_ala(en,n);
case '!': return cardinalidad (en,n);
}
return 1;
}


int resultado_unitario (int k,float *c, float *a, char *cad)
{
float en=0.00;
char op=0;
if (!operacion_unitaria(&en,k,*c)) return comenzar (&op,c,a,cad);
*c=en;
*a=0.00;
return strlen(a_cadena(en,cad));
}


int pon_numero (float num,float *c,char *cad)
{
*c=num;
return strlen(a_cadena(num,cad));
}

void abrir (float *F1, float *F2, float *F3, float *M, float *c)
{
FILE *fp;
if(!(fp=fopen("calcu.dat","r"))) return;
fscanf(fp,"%fn",F1);
fscanf(fp,"%fn",F2);
fscanf(fp,"%fn",F3);
fscanf(fp,"%fn",M);
fscanf(fp,"%fn",c);
fclose(fp);
}

void grabar (float F1, float F2, float F3, float M, float c)
{
FILE *fp;
if(!(fp=fopen("calcu.dat","w"))) return;
fprintf(fp,"%fn",F1);
fprintf(fp,"%fn",F2);
fprintf(fp,"%fn",F3);
fprintf(fp,"%fn",M);
fprintf(fp,"%fn",c);
fclose(fp);
}

void calculadora (void)
{
ambiente();
int k,i=0;
char cad[15]="0",op=NULL;
float a=0.00,c=0.00,F1=0.00,F2=0.00,F3=0.00,M=0.00;
abrir (&F1,&F2,&F3,&M,&c);
i=pon_numero(c,&c,cad);
while(1)
{
if((!c)&&i) i=0;
cifra(cad);
if(!i) {cad[0]='0';cad[1]=NULL;}
k=bioskey(0);
if(k==ESC) break;
if(k==ENTER&&op) {i=resultado(&op,&c,&a,cad,i); a=0.00;}
if(k==0xe08) {borrar(&c,&i,cad);continue;}
if(k==0x5300) {i=pon_numero(0.00,&c,cad);continue;}
if(k==0x3b00) {i=pon_numero(F1,&c,cad);continue;}
if(k==0x3c00) {i=pon_numero(F2,&c,cad);continue;}
if(k==0x3d00) {i=pon_numero(F3,&c,cad);continue;}
if(k==0x3200) {i=pon_numero(M,&c,cad);continue;}
if(k==0x3920) {i=comenzar(&op,&c,&a,cad);continue;}
if(k==0xf09) {i=cambia_signo (&c,cad,i);continue;}
if(k==0x5400) {F1=c; continue;}
if(k==0x5500) {F2=c; continue;}
if(k==0x5600) {F3=c; continue;}
if(k==0x320d) {M=0; continue;}

k=toupper(k&0xFF);
if(k=='M') {M=M+c;continue;}
if(k=='N') {M=M-c;continue;}
if(k=='.'||(k>='0'&&k<='9')) {incertar(&c,k,&i,cad); continue;}
if(k=='"'||k=='R'||k=='I'||k=='L'||k=='E'||k=='D'||k=='A'||k=='˙'||k=='$'||k=='P'||k=='T'||k=='S'||k=='C'||k=='!')
{
resultado(&op,&c,&a,cad,i);
i=resultado_unitario(k,&c,&a,cad);
continue;
}

if(k=='+'||k=='*'||k=='-'||k=='/'||k=='%'||k=='X'||k=='Y')
{
resultado(&op,&c,&a,cad,i);
op=k;
a=c;
c=0.00;
i=0;
continue;
}
}
grabar (F1,F2,F3,M,c);
}


//DA EL EFECTO DE MOVIMIENTO VERTICAL A UNA CADENA
// COMENZANDO DESDE YI Y FINALIZANDO EN Y;
void mueve (int yi,int y,char que[50])
{int ya, yc;
yc=yi;ya=yi;
while(yc<=y)
{
pc(ya," ");
pc(yc,que);
sound(yc+100);
p(40,24,"");
delay(50);
ya=yc;yc++;
}
nosound();
}

void mueve_horizontal (int xi,int y,char men[])//DA EFECTO DE BALAS
{
int i,x,xc;
i=strlen(men)-1;
xc=xi;
while(i>=0)
{
for(x=2;x<=xc;x++)
{
gotoxy(x,y); cprintf("%c",men[i]);
sound(x+100);
delay(1);
if(x!=xc) p(x,y," ");
}
xc--;
i--;
}
nosound();
}


void main (void)
{
textmode(BW80);

calculadora ();
}

Miguel L.
15 de Marzo del 2006
ALGUNAS PARTES DEL CODIGO NO SE VEW BIEN... SI QUIERES AYUDA ENVIAME UN MAIL O AGREGAME A TU MSN.. SUERTE