⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jsq.c

📁 具有计算器所要求实现简单的计算
💻 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 + -