📄 jsq.c
字号:
#include<stdio.h>
#include<stdlib.h>
#include<bios.h>
#include<malloc.h>
char far *address;
unsigned char *p;
void cur_lock(int flag)
{
union REGS r,o;
r.h.ah=1;
r.h.ch=0;
r.h.cl=0;
r.h.bh=0;
if(flag==1){r.h.ch=23;r.h.cl=25;}
int86(0x10,&r,&o);
}
void goto_xy(int x,int y)/*置光标位置*/
{
union REGS r;
r.h.ah=2;
r.h.bh=0;
r.h.dh=(char)x;
r.h.dh=(char)y;
int86(0x10,&r,&r);
}
get_key()/*获取按键值*/
{
union REGS r;
r.h.ah=0;
return int86(0x16,&r,&r);
}
void write_char(int x,int y,char ch,int attrib)/*显示字符*/
{
union REGS r;
goto_xy(x,y);
r.h.ah=9;
r.h.bh=0;
r.h.cx=1;
r.h.al=ch;
r.h.bl=(char)attrib;
int86(0x10,&r,&r);
}
void write_video(int x,int y,char *p,int attrib) /*显示字符串*/
{
register int i;
union REGS r;
for(i=y;*p;i++){
if(*p=='\n')
{ goto_xy(x+1,2);break;}
goto_xy(x,i);
r.h.ah=9;
r.h.bh=0;
r.h.cx=1;
r.h.al=*p++;
r.h.bl=(char)attrib;
int86(0x10,&r,&r);
}
}
void save_popup(int startx,int starty)/*保存屏幕*/
{
register int i,j;
int endx,endy;
unsigned char *buf_ptr;
union REGS r;
endx=startx+11;
endy=starty+32;
p=(unsigned char * )malloc(2*(endx-startx)*(endy-starty));
if(! p)exit(1);
buf_ptr=p;
for(j=startx;j<endx;j++)
for(i=starty;i<endy;i++){
goto_xy(j.i);
r.h.ah=8;
r.h.bh=0;
int86(0x10,&r,&r);
*buf_ptr++=r.h.al;
*buf_ptr++=r.h.ah;
}
}
void restore_popup(int startx,int starty)/*恢复屏幕*/
{
register int i,j;
int endx,endy;
unsigned char *buf_ptr;
union REGS r;
buf_ptr=p;
endx=startx+11;
endy=starty+32;
for(j=startx;j<endx;j++)
for(i=starty;i<endy;i++){
goto_xy(j,i);
r.h.ah=9;
r.h.bh=0;
r.x.cx=1;
r.h.al=*buf_ptr++;
r.h.bl=*buf_ptr++;
int86(0x10,&r,&r);
}
}
void main(int argv,char *argv[])
{
int startx,int starty,endx,endy;
int i,k=0,k1=0;
union inkey{char ch[2];int i;)c;
double dc=0.0,dr=0.0,dm=0.0,j=0.0;
char ch='',ch1='',dec='';
address=(char far * )0x00400017l; /*Numlock on*/
*address=* address|0x20;
cur_lock(0);/*隐去光标*/
startx=atoi(argv[1]);
starty=atoi(argv[2]);
if(startx>12)startx=12;
if(starty>48)starty=48;
endx=startx+10;
endy=starty+32;
save_poppup(startx,starty); /*保存屏幕*/
write_video(startx,starty," ",0x3f);
write_video(startx+1,starty," ",0x3f);
write_video(startx+2,starty," ",0x3f);
write_video(startx+3,starty," ",0x3f);
write_video(startx+4,starty," ",0x3f);
write_video(startx+5,starty," ",0x3f);
write_video(startx+6,starty," ",0x3f);
write_video(startx+7,starty," ",0x3f);
write_video(startx+8,starty," ",0x3f);
write_video(startx+9,starty+2," ",0x1f);
write_video(startx+1,starty+2," ",0x1f);
for(i=0;i<10;i++) write_video(startx+i,starty+30," ",0x1f);
goto_xy(startx+1,starty+7);
printf("%18.4f",dc);
while(1)
{
c.i=get_key();
if(dr>999999999999.9999||dc>999999999999.9999) /*位数超出范围*/
{
dr=0.0;
dc=0.0;
ch='';
dec='';
goto_xy(24,0);
printf("value out of range\7");
}
if(c.ch[0]>='0'&&c.ch[0]<='9'&&dec!='.'&&k<10) /*接受整数数字*/
{
j=c.ch[0]-48;
dc=dc*10+j;
k++;
if(k>9)k=0;
goto_xy(startx+1,starty+7);
printf("%18.4f",dc);
}
if(c.ch[0]>='0'&&c.ch[0]<='9'&&dec='.'&&k<4) /*接受小数数字*/
{
j=c.ch[0]-48;
switch(k1){
case 0:dc+=j/10;break;
case 1:dc+=j/100;break;
case 2:dc+=j/1000;break;
case 3:dc+=j/10000;break;
}k1++;
if(ch=='') /*初级运算处理*/
switch(c.ch[0]){
case'+':case'-':case'*':case'/':
if(dr==0.0)dr=dc;
dr=0.0;
dec='';k=0;k1=0;
write_char(startx+1,starty+5,c.ch[0],0x0f);
break;
}
if(ch!='') /*非初级运算处理*/
switch(c.ch[0]){
case'+':case'-':case'*':case'/':
switch(ch){
case '+':dr=dr+dc;break;
case '-':dr-=dc;break;
case '*':dr=dr*dc;break;
case '/':if(dc!=0.0)dr=dr/dc;break;
}
dc=0.0;k=0;k1=0;dec='';
write_char(startx+1,starty+5,ch,0x0f);
goto_xy(startx+1,starty+7);
printf("%18.4f",dr);break;
}
if(c.ch[0]=='='||c.ch[0]==13)&&dr!=0) /*取当前运算结果*/
{
switch(ch){ /*接受有效运算符*/
case '+':dr=dr+dc;break;
case '-':dr-=dc;break;
case '*':dr=dr*dc;break;
case '/':if(dc!=0.0)dr=dr/dc;break;
}
write_char(startx+1,starty+5,'',0x0f);
goto_xy(startx+1,starty+7);printf("%18.4f",dr);
k=0;k1=0;dec='';dc=0.0;
}
switch(c.ch[0]){
case'+':case'-':case'*':case'/':
write_char(startx+1,starty+5,c.ch[0],0x0f);
break;
}
break;
case'.':dec='.';break;
}
if(c.ch[0]=='c'||c.ch[0]=='C')&&ch1=='') /*清除处理*/
{
dr=0.0;dc=0.0;dec='';ch='';
write_char(startx+1,starty+5,'',0x0f);
goto_xy(startx+1,starty+7);printf("%18.4f",dr);
}
if(ch1=='m')
switch(c.ch[0]){
case'+':case'-':case'*':case'/':
ch1=c.ch[0];
break;
}
if(ch1!='')
switch(c.ch[0]){
case'+':case'-':case'*':case'/':
if(dr==0&&dc!=0) dr=dc;
switch(ch1){
case '+':dm=dr+dm;break;
case '-':dm=dm-dr;break;
case 'C':case 'c':dm=0.0;
write_video(startx+1,starty+2,"",0x0f);break;
case 'R':case 'r':
write_char(startx+1,starty+5,c.ch[0],0x0f);
if(dm==0.0)
write_video(startx+1,starty+2,"",0x0f);
goto_xy(startx+1,starty+7);
printf("%18.4f",dr);break;
}
dr=0.0;dc=0.0;ch1='';ch='';k=0;k1=0;
break;
}
if(c.ch[0]=='m'||c.ch[0]=='M') /*显示累加运算标志*/
{
ch1='m';
write_char(startx+1,starty+2,'M',0x0f);
}
if(ch=='=') /*安错误处理*/
switch(c.ch[0]){
case'+':case'-':case'*':case'/':
dr=0.0;dec='';ch='';
break;
}
if(c.ch[0]==27)break; /*结束返回*/
}
restore_popup(startx,starty); /*恢复屏幕*‘
address=(char far * )0x00400017L; /*Numlock off*/
*address=*address&0xdf;
cur_lock(1); /*恢复光标*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -