Urgente, ayúdenme a escribir un programa de calculadora usando vc
Curso de lenguaje C diseño_diseño de calculadora
#include
#include
#include
#include #include #include #include < gráficos.h> /*Funciones gráficas*/ #include #include #define ARRIBA 0x48 /*Tecla cursor arriba*/ #define ABAJO 0x50 /*Tecla cursor abajo*/ #define IZQUIERDA 0x4b /* Tecla de cursor izquierda*/ #define RIGHT 0x4d /*Tecla de cursor derecha*/ #define ENTER 0x0d /*Tecla Enter*/ void *rar ; /*Variable global, guardar imagen del cursor*/ estructura tipo paleta paleta; /*Usar información de paleta*/ int GraphDriver /* Controlador de dispositivo de gráficos*/ int GraphMode; /* Valor del modo de gráficos*/ int ErrorCode; /* Código de error*/ int MaxColors ; p> int MaxX, MaxY; /* Resolución máxima de la pantalla*/ doble AspectRatio; /* Relación de píxeles de la pantalla*/ void drawboder(void) ; /*función de dibujo de borde*/ void inicialize(void); /*función de inicialización*/ void computer(void) /*Función de cálculo de la calculadora*/ void changetextstyle(int fuente, int dirección, int charsize); /*Cambiar función de estilo de texto*/ void mwindow(char *header ); int specialkey(void) ; /*Obtener función de tecla especial*/ int arrow() /*Establecer función de cursor de flecha*/ /*Función principal*/ int main() { inicializar();/* Configurar el sistema para ingresar al modo de gráficos* / computadora( ); /*Ejecutar la calculadora*/ closegraph();/*El sistema cierra el modo de gráficos y vuelve al modo de texto*/ return( 0); Finalizar el programa*/ } /* Configurar el sistema para ingresar al modo de gráficos*/ void inicialize(void) { int xasp,yas p /* Se utiliza para leer la relación de aspecto en las direcciones x e y*/ GraphDriver = DETECT /* Detecta automáticamente la pantalla*/ initgraph( &GraphDriver, &GraphMode, "" ); /*Inicializar el sistema de gráficos*/ ErrorCode = graphresult() /*Leer el resultado de la inicialización*/ if( ErrorCode != grOk ) /* Si ocurre un error durante la inicialización*/ { printf("Error del sistema de gráficos: %s\n", grapherrormsg (ErrorCode) ); /* Mostrar código de error*/ exit( 1 );*Salir*/ } getpalette( &palette ); * Leer información del panel*/ MaxColors = getmaxcolor() + 1 /* Leer el valor máximo de color*/ MaxX = getmaxx() /* Leer el tamaño de la pantalla* / MaxY = getmaxy(); /* Leer el tamaño de la pantalla*/ getaspectratio( &xasp, &yasp ); > AspectRatio = (double) xasp/(double)yasp;/* Calcular el valor de la relación de aspecto*/ } /*Función de calculadora*/ void computer(void) p> { struct viewporttype vp; /*Definir variable de tipo de ventana gráfica*/ int color, alto, ancho; p> int x, y,x0,y0, i, j,v,m,n,act,flag=1; float num1=0,num2=0,resultado /* operandos y variables de resultado de cálculo*/ char cnum[5],str2[20]={""},c,temp[20]={""}; char str1[]="1230.456+ -789*/Qc=^%";/* Definir el símbolo mostrado por la cadena en el botón gráfico*/ mwindow( "Calculadora" /* Mostrar el ventana principal*/ color = 7 /*Establecer el valor del color gris*/ getviewsettings( &vp ); > width=(vp.right+ 1)/10; /*Establecer ancho del botón*/ height=(vp.bottom-10)/10 /*Establecer altura del botón*/ p> x = width /2 ; /*Establece el valor de las coordenadas de x*/ y = height/2 ;*Establece el valor de las coordenadas de y*/ setfillstyle(SOLID_FILL, color+3); p> bar( x+ancho*2, y, x+7*ancho, y+alto ); /*Dibuja una barra rectangular bidimensional para mostrar los operandos y resultados*/ setcolor( color+3 ) /*Establece la línea de borde de color verde claro*/ rectángulo); ( x+ ancho*2, y, x+7*ancho, y+alto ); /*Dibujar una línea de borde rectangular*/ setcolor(RED /*Set); el color a Rojo*/ outtextxy(x+3*width,y+height/2,"0." /*Cadena de salida "0."*/ x = 2*width-width/2 /*Establece el valor de las coordenadas de x*/ y =2*height+height/2 /*Establece el valor de las coordenadas de y*/ for( j=0 ; j<4 ; ++j ) /*Botón Dibujar*/ { for( i=0 ; i<5 ; + +i ) { setfillstyle(SOLID_FILL, color); setcolor(ROJO); bar( x, y, x+ancho, y+alto); /*Dibuja una barra rectangular*/ rectángulo( x, y, x+ancho, y+alto); sprintf(str2, "%c" ,str1[j*5+i]); /*Guardar caracteres en str2*/ outtextxy( x+(ancho/2), y+alto/ 2, str2); x =x+width+ (ancho / 2) /*Mover coordenadas de columna*/ } y +=(alto) /2 )*3; /* Mover coordenadas de fila*/ x =2*width-width/2; /*Restablecer coordenadas de columna*/ } x0=2*ancho; y0=3*alto; x=x0; y=y0; gotoxy( x,y); /*Mueve el cursor a la posición x,y*/ flecha() /*Mostrar el cursor*/ putimage(x,y); ,rar,XOR_PUT) ; m=0; n=0; strcpy(str2,""); /*Establecer str2 como vacío string*/ while((v=specialkey())!=45) /*Finaliza el programa cuando se presiona la tecla Alt+x, de lo contrario ejecuta el siguiente bucle*/ { while((v=specialkey())!=ENTER) /*Cuando la tecla presionada no es Enter*/ { putimage( x,y,rar,XOR_PUT ); /*Mostrar la imagen del cursor*/ if(v==RIGHT) /*Calcular la nueva posición al mover la flecha hacia la derecha*/ si(x>=x6 *ancho) /*Si te mueves hacia la derecha, muévete hasta el final, luego muévete a la posición del carácter más a la izquierda*/ { x=x0; m =0; } más { x=x+ancho+ancho/2; m++; } /*De lo contrario, muévase hacia la derecha a la siguiente posición del carácter*/ if(v==LEFT) /*Calcule la nueva posición al mover la flecha hacia la izquierda* / if(x<=x0) { x=x6*ancho; m=4; } /*Si te mueves hacia la cabeza y luego hacia la izquierda, muévete a la posición del personaje más a la derecha*/ else { x=x-width-width /2; m--; } /*De lo contrario, muévase a la izquierda a la posición anterior del carácter*/ if(v==UP) / *Cálculo de nueva posición al mover la flecha hacia arriba*/ if(y<=y0) { y =y4*height+height/2 ; n=3; } /*Si se mueve a la cabeza y luego se mueve hacia arriba, se moverá a la posición del carácter inferior*/ else { y=y-height-height/2; n--; } /* En caso contrario, mueve un carácter a la posición superior*/ if(v==DOWN) /*Nuevo cálculo de posición al mover la flecha hacia abajo*/ if(y>=7*altura) { y=y0; n=0; } /*Si se mueve hasta el final y luego se mueve hacia abajo, se moverá a la posición superior del carácter */ else { y= y+height+height/2; n++; } /*De lo contrario, muévase a la posición de carácter inferior*/ putimage(x,y, rar,XOR_PUT); /*Mostrar la flecha del cursor en la nueva posición*/ } c=str1[n*5+m] /*Guardar caracteres en la variable c */ if(isdigit(c)||c=='. ') /*Determina si es un número o un punto decimal*/ { if(flag==-1) /*Si la bandera es -1, indica un número negativo*/ p> { strcpy(str2,"-") ; /*Concatenar el signo negativo en la cadena*/ flag=1; } /*Restaurar el valor del indicador a 1*/ sprintf( temp,"%c",c); /*Guardar los caracteres en la variable de cadena temp*/ strcat(str2,temp /*Conectar la cadena en temp a str2*/ setfill estilo(SOLID_FILL,color+3); bar(2*ancho+ancho/2,alto/2,15*ancho/2,3*alto/2); outtextxy(5*ancho,alto,str2); /*Mostrar cadena*/ } if(c=='+') { num1=atof(str2); /*Convierte el primer operando a un número de coma flotante*/ strcpy(str2,""); /*Borrar str2*/ act=1; /*Calcular el valor del indicador de adición*/ setfillstyle(SOLID_FILL,color+3); bar(2*width+width /2, height/2,15*width/2,3*height/2); outtextxy(5*width,height,"0."); /*Mostrar cadena*/ p> } if(c=='-') { if(strcmp(str2,"")==0) /*Si str2 está vacío, significa un signo negativo, no un signo menos*/ flag=-1 /*Establece el indicador de número negativo*/ else
num1=atof(str2); /*Convertir el segundo operando a un número de punto flotante*/
strcpy(str2,""); /
act=2; /*Calcular valor del indicador de resta*/
setfillstyle(SOLID_FILL,color+3);
bar(2* ancho+ancho /2,height/2,15*width/2,3*height/2); /*Dibujar un rectángulo*/
outtextxy(5*width,height,"0."); Mostrar cadena*/
}
}
if(c=='*')
{
num1=atof(str2); /*Convertir el segundo operando a un número de coma flotante*/
strcpy(str2,""); /*Borrar str2*/
act =3; /*Calcular el valor del indicador de multiplicación*/
setfillstyle(SOLID_FILL,color+3*); height/2);
outtextxy(5*width,height,"0."); /*Mostrar cadena*/
}
if(c =='/')
{
num1=atof(str2); /*Convierte el segundo operando a un número de punto flotante*/ p>
strcpy( str2,""); /*Borrar str2*/
act=4; /*Calcular el valor del indicador de división*/
setfillstyle(SOLID_FILL ,color+3); p>
barra(2*ancho+ancho/2,alto/2,1
5*ancho/2,3*alto/2);
outtextxy(5*ancho,alto,"0."); /*Mostrar cadena*/
}< / p>
if(c=='^')
{
num1=atof(str2); /*Convierte el segundo operando a un número de punto flotante* /
strcpy(str2,""); /*Borrar str2*/
act=5; /*Calcular valor del indicador de exponenciación*/
setfillstyle(SOLID_FILL, color+3); /*Establecer para rellenar con entidades de color verde claro*/
bar(2*width+width/2,height/2,15*width/2,3*height /2); /*Dibujar un rectángulo*/
outtextxy(5*width,height,"0."); /*Mostrar cadena*/
}
if (c=='%')
{
num1=atof(str2 /*Convierte el segundo operando a un número de punto flotante*/ p>
strcpy(str2,""); /*Borrar str2*/
act=6 /*Calcular el valor del indicador de exponenciación de la operación modular*/
setfillstyle(SOLID_FILL,color+3 ); /*Establecer para rellenar con entidades de color verde claro*/
bar(2*width+width/2,height/2,15*width/2,3*height/ 2); a rectángulo*/
outtextxy(5*width,height,"0."); /*Mostrar cadena*/
}
if(c= ='=')
{
num2=atof(str2); /*Convierte el segundo operando a un número de punto flotante*/
switch(act ) /*Calcular según los símbolos de operación*/
{
case 1:result=num1+num2;break /*Hacer suma*/ p>
case; 2:result=num1-num2;break; /*Hacer resta*/
caso 3:result=num1*num2;break; /*Hacer multiplicación*/
caso 4: resultado=num1/num2;break; /*Hacer división*/
caso 5:result=pow(num1,num2);break; /*Hacer x elevado a la yésima potencia* /
caso 6:result=fmod(num1,num2);break; /*Hacer operación de módulo*/
}
setfillstyle(SOLID_FILL,color+ 3); para rellenar con entidades de color verde claro*/
bar(2*width+width/2,height/2,15*width/2,3*height/2 /*Sobrescribir área de resultados*/<); /p>
sprintf(temp,"%f",result); /*Guardar el resultado en temp*/
outtextxy(5*width,height,temp) /*Mostrar resultados*; /
}
if(c=='c')
{
num1=0 /*Restablece los dos operandos a 0 y el indicador de signo es 1*/
num2=0;
flag=1;
strcpy(str2,""); /*Borrar str2*/
setfillstyle(SOLID_FILL,color +3); /*Establecer para rellenar con entidades de color verde claro*/
bar(2*width+width/2,height/2,15*width/2,3*height/2); * Sobrescribir el área de resultados*/
outtextxy(5*width,height,"0." /*Display string*/
}
if ( c=='Q')exit(0); /*Si se selecciona q, presione Enter para finalizar el programa de cálculo*/
}
putimage(x,y, rar,XOR_PUT ); /*Borrar la flecha del cursor antes de salir*/
return /*Return*/
}
/*Función de ventana*/
void mwindow( char *header )
{
int height;
cleardevice() /* Limpiar la pantalla de gráficos* /
setcolor( MaxColors - 1 ); /* Establece el color actual en blanco*/
setviewport( 20, 20, MaxX/2, MaxY/2, 1 ); * Establecer el tamaño de la ventana gráfica */
height = texttheight( "H" ); /* Leer el tamaño del texto básico*/
settextstyle( DEFAULT_FONT, HORIZ_DIR, 1 ); Establecer estilo de texto*/
settextjustify( CENTER_TEXT, TOP_TEXT );/*Establecer disposición de caracteres*/
outtextxy( MaxX/4, 2, encabezado /*Título de salida*/);
setviewport( 20,2height+4, MaxX/2+4, MaxY/2+20, 1 ); /*Establecer el tamaño de la ventana gráfica*/
drawboder(); ; /*Dibujar borde*/
}
void drawboder(void) /*Dibujar borde*/
{
struct viewporttype; vp; /* Definir la variable de tipo de ventana gráfica*/
setcolor( MaxColors - 1 /*Establecer el color actual en blanco*/
setlinestyle(SOLID_LINE, 0, NORM_WIDTH) ;/*Establece el modo de línea de pintura*/
getviewsettings( &vp );/*Carga la información de la ventana gráfica actual en la estructura señalada por vp*/
rectángulo( 0, 0 , vp.right- vp.left, vp.bottom-vp.top ); /*Dibujar un borde rectangular*/
}
/*Diseñar la función de gráficos del mouse*/
int flecha( )
{
int tamaño;
int raw[]={4,4,4,8,6,8,14,16,16,16,8,6,8,4,4,4} /*Definir coordenadas del polígono*/
setfillstyle(SOLID_FILL,2); /*Establecer modo de relleno*/
fillpoly(8,raw); /*Dibujar una flecha de cursor*/
size=imagesize ( 4,4,16,16); /*Probar tamaño de imagen*/
rar=malloc(size); /*Asignar área de memoria*/
getimage(4, 4, 16,16,rar); /*Guardar la imagen de la flecha del cursor*/
putimage(4,4,rar,XOR_PUT /*Eliminar la imagen de la flecha del cursor*/
return 0;
}
/*Función clave*/
int tecla especial(void)
{
int key;
while(bioskey(1)==0); /*esperar entrada del teclado*/
key=bioskey(0); /*entrada del teclado* /
key=key&0xff? key&0xff:key>>8; /*Solo toma el valor de escaneo de la clave especial, el resto es 0*/
return(key); Devuelve la clave Valor*/
}