仿真计算器!
本人需要一个仿真计算器!谢谢
1系统的基本要求 1. 算术运算功能。能够实现+、-、*、/、mod、int运算。 2. 函数运算功能。能够实现exp、ln、sin、x^y、log、cos、x^3、n!、tan、x^2、1/x等运算。 3. 进制之间的转换功能。能够实现十六、十、二、八进制数据之间的转换。 4.通过键盘控制字符和数字的输入。 2.2数据结构设计及用法说明 此程序调用的函数主要有<math.h> /*数学函数的定义*/<conio.h> /*屏幕操作函数*/<stdio.h> /*I/O函数*/<stdlib.h> /*库函数*/<stdarg.h> //<ctype.h> /*字符操作函数*/。基本使用:用→←↑↓控制鼠标图形移动,当*变量长度参数表*/<graphics.h> /*图形函数*/<string.h> /*字符串函数*移动到相应得按钮时按回车键输入当前数字或执行对应的函数。 加法:输入一个被加数数,按“+”,输入被加数,按“=”,输出结果。 乘法: 输入一个数,按“*”,输入另个数,按“=”,输出结果。 除法: 输入一个被除数,按“+”,输入另个除数,按“=”,输出结果。 求余:输入一个数,按“mod”,按“=”,输出结果。 取整:输入一个数,按“int”,按“=”,输出结果。 八进制转十进制:输入一个八进制数,按“10->8”,按“=”,输出十进制结果。 十六进制转十进制:输入一个十六进制数,按下“jz”+“16- >10” 按“=”,输出十进制结果 2.3 功能模块 键盘控制模块:通过int specialkey(void)和键盘来实现输入数据,操作方式的控制。 计算模块:通过调用math.h中的数学函数,如:+、-、*、/、sin、cos、mod等来实现对result的赋值。 输出模块:在指定位置输出计算模块中result的值,在指定位置输出键盘控制模块中对参量所赋的值以及在指定位置输出键盘控制模块中得到的运算符。
3.2数据结构 用到了if判断语句,for循环语句,while语句,且主要通过while语句实现对键盘、光标的操作和数据、运算符的输入,还用到了switch语句,switch语句的主要作用是实现对所输入的数据的运算操作,然后将运算结果赋值给result,最后输出。 3.3中心算法说明 这个函数的作用是控制键盘,只获得键盘中特殊键的扫描值。 int specialkey(void) { int key; while(bioskey(1)==0); /*等待键盘输入*/ key=bioskey(0); /*键盘输入*/ key=key&0xff? key&0xff:key>>8; /*只取特殊键的扫描值,其余为0*/ return(key); /*返回键值*/ } 在本程序中,数组str1[]的作用很大,其中的字符顺序去屏幕输出的键盘按钮顺序一致。它与int specialkey(void),while语句配合完成对键盘的控制操作。 char str1[]={'A','1','2','3','4','5','6','7','B','8','9','=','+','-','*','/','C', 'G','H','I','J','K','L','0','D','M','N','O','P','Q','.','$','E','R','S','T','U', 'V','@','(','F','W','X','Y','Z','&',')','|'}; 这段程序的作用是在屏幕左上角绘制光标图像,然后保存,再在原位置输出,消去光标图像。 int arrow() { int size; int raw[]={4,4,4,8,6,8,14,16,16,16,8,6,8,4,4,4}; /*定义多边形坐标*/ setcolor(1); setfillstyle(1,3); /*设置填充模式*/ fillpoly(8,raw); /*画出一光标箭头*/ size=imagesize(4,4,16,16); /*测试图象大小*/ rar=malloc(size); /*分配内存区域*/ getimage(4,4,16,16,rar); /*存放光标箭头图象*/ putimage(4,4,rar,XOR_PUT); /*消去光标箭头图象*/ return 0; } 本段程序的作用是将十六进制转化为十进制,该程序是作为十六进制转化为其他进制的桥梁。 cd1=strlen(str7); for(i=0,j=1;i<cd1;i++,j++) { if(str7[i]=='1') num=num+1*pow(16,cd1-j); else if(str7[i]=='2') num=num+2*pow(16,cd1-j); else if(str7[i]=='3') num=num+3*pow(16,cd1-j); else if(str7[i]=='4') num=num+4*pow(16,cd1-j); else if(str7[i]=='5') num=num+5*pow(16,cd1-j); else if(str7[i]=='1') num=num+1*pow(16,cd1-j); else if(str7[i]=='6') num=num+6*pow(16,cd1-j); else if(str7[i]=='7') num=num+7*pow(16,cd1-j); else if(str7[i]=='8') num=num+8*pow(16,cd1-j); else if(str7[i]=='9') num=num+9*pow(16,cd1-j); else if(str7[i]=='A') num=num+10*pow(16,cd1-j); else if(str7[i]=='B') num=num+11*pow(16,cd1-j); else if(str7[i]=='C') num=num+12*pow(16,cd1-j); else if(str7[i]=='D') num=num+13*pow(16,cd1-j); else if(str7[i]=='E') num=num+14*pow(16,cd1-j); else if(str7[i]=='F') num=num+15*pow(16,cd1-j); } 本段程序的作用是将二进制转化为十进制,可作为二进制转化为其他进制的桥梁。 zj=num1; result=0; for(i=0;i<=cd;i++) { result=result+fmod((int)(zj),10)*pow(2,i); zj=(int)(zj/10); } 本段程序的作用是将八进制转化为十进制,可作为八进制转化为其他进制的桥梁。 zj=num1; result=0; for(i=0;i<=cd;i++) { result=result+fmod((int)(zj),10)*pow(8,i); zj=(int)(zj/10); } 本段程序的作用是将十进制转化为十六进制,它避开开了复杂的算法,而采用sprintf(str5,"%x",(int)result);语句,利用系统自带的输出功能完成转化。 if(flag4==0) /*flag4为十进制和十六进制输出标识符*/ { sprintf(str5,"%x",(int)result); /*转换为十六进制*/ outtextxy(440,76,str5); /*显示结果*/ flag4=1; }直接往上接的你一个一个copy
本程序通过调用int specialkey(void) 和#include <conio.h> 来实现对屏幕的操作,通过调用int arrow()函数,int specialkey(void) 和#include <conio.h>来实现对光标的操作。计算器图形采用Turbo C 2.0绘图程序制作,大致运行画面如下。 光标起始位置在“A”上,通过键盘来控制光标的运动,如进行双目运算1+2时,移动光标,将其指在“1”上,按“Enter”,在屏幕上会输出“1”,再移动光标,将其指在“2”上,按“Enter”,在屏幕上会在指定位置输出“2”,再移动光标,将其指在“=”上,按“Enter”,结果便会在指定位置输出。 在进行单目运算9!时,按照上面的方法输入“9”,在输入“n!”,输入“=”,显示结果。 在进行十六进制转化为十进制或八进制时,需要注意的是:先输入一个十六进制数据,再输入“sft”然后输入“16->10”或“16->8”,最后输入“=”,输出转换后的结果。 按下“CE”可以清零,重新进行下一组运算。 按“Esc”可以退出系统。
#include <dos.h> /*DOS接口函数*/ #include <math.h> /*数学函数的定义*/ #include <conio.h> /*屏幕操作函数*/ #include <stdio.h> /*I/O函数*/ #include <stdlib.h> /*库函数*/ #include <stdarg.h> /*变量长度参数表*/ #include <graphics.h> /*图形函数*/ #include <string.h> /*字符串函数*/ #include <ctype.h> /*字符操作函数*/ #define UP 0x48 /*光标上移键*/ #define DOWN 0x50 /*光标下移键*/ #define LEFT 0x4b /*光标左移键*/ #define RIGHT 0x4d /*光标右移键*/ #define ENTER 0x0d /*回车键*/ void drawmat(char *mat,int matsize,int x,int y,int color) /*依次:字模指针、点阵大小、起始坐标(x,y)、颜色*/ { int i, j, k, n; n = (matsize - 1) / 8 + 1; for(j = 0; j < matsize; j++) for(i = 0; i < n; i++) for(k = 0;k < 8; k++) if(mat[j * n + i] & (0x80 >> k)) /*测试为1的位则显示*/ putpixel(x + i * 8 + k, y + j, color); } void *rar; /*全局变量,保存光标图象*/ int specialkey(void) ; /*获取特殊键函数*/ int arrow(); /*设置箭头光标函数*/ main() { float num1=0,num2=0,result; int x,y,x0=315,y0=160,i,j,v,m,n,act,t1=0,t2=0,cd=0,zj=0,zj1=0,num=0,cd1=0,a[25]; int flag1,flag2=1,flag3=1,flag4=1,flag5=1,flag6=1; char str2[5]={""},temp[20]={""},c,str3[10]={""},str4[10]={""},str5[20]={""},str7[20]={""}; char str1[]={'A','1','2','3','4','5','6','7','B','8','9','=','+','-','*','/','C', 'G','H','I','J','K','L','0','D','M','N','O','P','Q','.','$','E','R','S','T','U', 'V','@','(','F','W','X','Y','Z','&',')','|'}; char ji16S[]={ /* 以下是 '计' 的 16点阵宋体 字模,32 byte */ 0x40,0x20,0x20,0x20,0x30,0x20,0x20,0x20, 0x00,0x20,0xF3,0xFE,0x10,0x20,0x10,0x20, 0x10,0x20,0x10,0x20,0x10,0x20,0x12,0x20, 0x14,0x20,0x18,0x20,0x10,0x20,0x00,0x20, }; char suan16S[]={ /* 以下是 '算' 的 16点阵宋体 字模,32 byte */ 0x40,0x40,0x7E,0x7E,0x48,0x90,0xBF,0xF8, 0x20,0x10,0x3F,0xF0,0x20,0x10,0x3F,0xF0, 0x20,0x10,0x3F,0xF0,0x08,0x40,0xFF,0xFE, 0x08,0x40,0x10,0x40,0x10,0x40,0x20,0x40, }; char qi16S[]={ /* 以下是 '器' 的 16点阵宋体 字模,32 byte */ 0x3E,0x7C,0x22,0x44,0x22,0x44,0x3E,0x7C, 0x01,0x10,0x01,0x08,0xFF,0xFC,0x06,0xC0, 0x18,0x30,0xE0,0x0E,0x3E,0xFC,0x22,0x88, 0x22,0x88,0x22,0x88,0x3E,0xF8,0x00,0x00, }; char shi24S[]={ /* 以下是 '石' 的 24点阵宋体 字模,72 byte */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0C,0x3F,0xFF,0xF0,0x00, 0x20,0x00,0x00,0x60,0x00,0x00,0x40,0x00, 0x00,0xC0,0x00,0x00,0x80,0x00,0x01,0x80, 0x00,0x01,0x80,0x30,0x02,0xFF,0xE0,0x04, 0x80,0x20,0x08,0x80,0x20,0x10,0x80,0x20, 0x20,0x80,0x20,0x40,0x80,0x20,0x00,0x80, 0x20,0x00,0x80,0x20,0x00,0xFF,0xE0,0x00, 0x80,0x20,0x00,0x80,0x00,0x00,0x00,0x00, }; char jia24S[]={ /* 以下是 '家' 的 24点阵宋体 字模,72 byte */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38, 0x00,0x00,0x18,0x00,0x00,0x08,0x08,0x1F, 0xF7,0xFC,0x18,0x00,0x10,0x30,0x00,0x60, 0x07,0xFF,0xE0,0x00,0x60,0x00,0x00,0xE0, 0x60,0x01,0x90,0xE0,0x06,0x39,0x00,0x18, 0x6F,0x00,0x00,0xC5,0x00,0x01,0x0C,0x80, 0x06,0x16,0x40,0x18,0x26,0x60,0x00,0xC6, 0x30,0x01,0x06,0x1E,0x06,0x06,0x08,0x18, 0x6C,0x00,0x20,0x18,0x00,0x00,0x00,0x00, }; char zhuang24S[]={ /* 以下是 '庄' 的 24点阵宋体 字模,72 byte */ 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x18, 0x00,0x00,0x08,0x00,0x00,0x08,0x08,0x0F, 0xFF,0xFC,0x08,0x0C,0x00,0x08,0x04,0x00, 0x08,0x04,0x00,0x08,0x04,0x00,0x08,0x04, 0x00,0x08,0x04,0x00,0x08,0x04,0x30,0x09, 0xFF,0xC0,0x08,0x04,0x00,0x18,0x04,0x00, 0x10,0x04,0x00,0x10,0x04,0x00,0x10,0x04, 0x00,0x20,0x04,0x00,0x20,0x04,0x0C,0x4F, 0xFF,0xFE,0x40,0x00,0x00,0x00,0x00,0x00, }; char tie24S[]={ /* 以下是 '铁' 的 24点阵宋体 字模,72 byte */ 0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x01, 0x80,0x0C,0x01,0x00,0x08,0x1D,0x00,0x08, 0xD9,0x00,0x1F,0x11,0x08,0x10,0x1F,0xFC, 0x10,0x11,0x00,0x3F,0xA1,0x00,0x44,0x61, 0x00,0x04,0x41,0x00,0x04,0x01,0x0C,0x04, 0xFF,0xF0,0x3F,0x03,0x80,0x04,0x02,0x80, 0x04,0x02,0x40,0x04,0x46,0x40,0x04,0x8C, 0x20,0x07,0x08,0x30,0x0E,0x10,0x18,0x04, 0x60,0x0E,0x00,0x80,0x00,0x00,0x00,0x00, }; char dao24S[]={ /* 以下是 '道' 的 24点阵宋体 字模,72 byte */ 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10, 0x60,0x0C,0x18,0x40,0x0C,0x08,0x80,0x04, 0x08,0x8C,0x00,0xF7,0x70,0x00,0x02,0x00, 0x04,0x24,0x10,0x7E,0x3B,0xF0,0x04,0x20, 0x30,0x04,0x20,0x30,0x04,0x3F,0xF0,0x04, 0x20,0x30,0x04,0x20,0x30,0x04,0x3F,0xF0, 0x04,0x20,0x30,0x04,0x20,0x30,0x0C,0x3F, 0xF0,0x33,0x20,0x00,0x20,0xC0,0x00,0x00, 0x7F,0xFC,0x00,0x01,0xF8,0x00,0x00,0x00, }; char da24S[]={ /* 以下是 '大' 的 24点阵宋体 字模,72 byte */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18, 0x00,0x00,0x10,0x00,0x00,0x10,0x00,0x00, 0x10,0x00,0x00,0x10,0x00,0x00,0x10,0x0C, 0x3F,0xFF,0xFE,0x00,0x10,0x00,0x00,0x18, 0x00,0x00,0x18,0x00,0x00,0x34,0x00,0x00, 0x34,0x00,0x00,0x22,0x00,0x00,0x22,0x00, 0x00,0x41,0x00,0x00,0xC1,0x80,0x00,0x80, 0xC0,0x01,0x00,0x60,0x02,0x00,0x38,0x0C, 0x00,0x1C,0x30,0x00,0x08,0x00,0x00,0x00, }; int sj1[]={50,250,250,250,150,175,50,250},sj2[]={145,285,155,285,150,275,145,285}; int driver,mode; driver=DETECT; mode=0; initgraph(&driver,&mode,""); /*初始化*/ drawmat(ji16S, 16, 465, 22,4);/*输出 计 */ drawmat(suan16S, 16, 485, 22,4);/*输出 算 */ drawmat(qi16S, 16, 505, 22,4);/*输出 器*/ setcolor(0); /*绘画*/ setlinestyle(0,0,3); setfillstyle(1,13); sector(150,250,0,360,100,200); setfillstyle(1,2); setcolor(2); fillpoly(4,sj1); setcolor(4); setfillstyle(1,6); pieslice(150,250,180,360,80); setfillstyle(1,15); line(105,255,125,255); line(175,255,195,255); pieslice(115,265,0,360,5); pieslice(185,265,0,360,5); fillpoly(4,sj2); ellipse(150,295,180,360,12,7); setlinestyle(0,0,3); /*标题*/ settextstyle(4,0,8); setbkcolor(3); setcolor(5); setfillstyle(5,9); bar3d(280,120,630,440,5,3); /*键盘外框 三维*/ setlinestyle(0,0,1); setfillstyle(1,8); bar3d(290,130,620,430,5,1); /*键盘内框 三维*/ setcolor(2); /*绿色*/ setfillstyle(1,7); /*画按钮轮廓 三维*/ bar3d(300,140,330,180,2,1); bar3d(340,140,370,180,2,1); bar3d(380,140,410,180,2,1); bar3d(420,140,450,180,2,1); bar3d(460,140,490,180,2,1); bar3d(500,140,530,180,2,1); bar3d(540,140,570,180,2,1); bar3d(580,140,610,180,2,1); bar3d(300,185,330,225,2,1); bar3d(340,185,370,225,2,1); bar3d(380,185,410,225,2,1); bar3d(420,185,450,225,2,1); bar3d(460,185,490,225,2,1);源代码: