www.pudn.com > 3.rar > 3.c


    /*我在这个程序中用到了BIOS的设置-对光标的设置,有一些汇编程序*/ 
 #include 
 #include 
 #include 
 #include 
 cbar 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;j12)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);                  /*恢复光标*/ 
  }