免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2008 | 回复: 3
打印 上一主题 下一主题

我和一个网友合作写了一个dos下的计算器请高手指点 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-01-03 23:18 |只看该作者 |倒序浏览
  1. /*changeRMB.h 这个是我上次写的人民币小写转换大写的程序*/
  2. #define FALSE 0;
  3. #define TRUE 1;
  4. char *Number[]= {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
  5. char *Other[]={"元","角","分","整"};
  6. char *zi[]={"拾","佰","仟","万","拾","百","仟","亿" };

  7. int Yxsz(char *arr)/*判断输入是否为有效的数字*/
  8. {
  9.         int leap,point=0;
  10.         char *temp=arr;
  11.         while(*temp!='\0')
  12.         {
  13.                 if(*temp=='0'||*temp=='1'||*temp=='2'||*temp=='3'
  14.                         ||*temp=='4'||*temp=='5'||*temp=='6'||*temp=='7'
  15.                         ||*temp=='8'||*temp=='9'||*temp=='.')
  16.                         {
  17.                                 if(*temp=='.')
  18.                                 {
  19.                                         point++;
  20.                                 }
  21.                                 leap=TRUE;
  22.                                 temp++;
  23.                         }
  24.                 else
  25.                 {
  26.                         leap=FALSE;
  27.                         break;
  28.                 }
  29.        
  30.         }
  31.         if(point>;1)
  32.         {
  33.                 leap=FALSE;
  34.         }
  35.        
  36.         return leap;
  37. }

  38. void Yxws(char **arr)   /*判断输入的有效位数小数点前后去零,只保留有效部分*/
  39. {
  40.        
  41.         int first,length,var,point=0,poi=0,j;
  42.         length=strlen(*arr);
  43.        
  44.         char *temp=*arr;
  45.                
  46.         for(var=0;var<length;var++)/*/找到数组第一个非0值的下标first*/
  47.         {
  48.                 if((*arr)[var]!='0')
  49.                 {
  50.                         first=var;
  51.                         break;
  52.                 }
  53.         }
  54.        
  55.         for(var=first;var<length;var++)/*找到数组.的下标point*/
  56.         {
  57.                 if((*arr)[var]=='.')
  58.                 {
  59.                         point=var;
  60.                         break;
  61.                 }
  62.         }
  63.                
  64.         if((*arr)[point]!='.')   /*如果没有小数点处理整数*/
  65.         {
  66.                 for(var=0,j=first;var<length;var++,j++)
  67.                 {
  68.                         temp[var]=(*arr)[j];
  69.                 }
  70.                 temp[var]='\0';
  71.         }
  72.         else if((*arr)[point]=='.')/*有小数点*/
  73.         {
  74.                 for(var=point+2;var>;=point;var--)/*找到小数点后第一个有效数字的地址用poi保存*/
  75.                 {
  76.                         if((*arr)[var]!='0')
  77.                         {
  78.                                 poi=var;
  79.                                 break;
  80.                         }
  81.                
  82.                 }
  83.                
  84.                 if((*arr)[first]=='.')
  85.                 {
  86.                         for(var=0,j=first;j<=poi;var++,j++)
  87.                         {
  88.                                 temp[var]=(*arr)[j];
  89.                         }
  90.                         temp[var]='\0';
  91.                        
  92.                 }
  93.                 else
  94.                 {
  95.                         for(var=0,j=first;j<=poi;var++,j++)
  96.                         {
  97.                                 temp[var]=(*arr)[j];
  98.                         }
  99.                         temp[var]='\0';
  100.                        
  101.                 }
  102.         }
  103.         /*printf("\nyxws%s",temp);*/
  104. }
  105. void Fenjie(char **hd,char **rd,char *num) /*分解小数点前与小数点后*/
  106. {
  107.         int i,h,r,point=0;
  108.         char *temp=num;
  109.         char *head=*hd;
  110.         char *rear=*rd;
  111.                        
  112.         int length=strlen(temp);
  113.         for(i=0;i<length;i++)
  114.         {
  115.                 if(temp[i]=='.')
  116.                 {
  117.                         point=i;
  118.                         break;
  119.                 }
  120.         }
  121.        
  122.         if(point==0&&temp[point]!='.') /*判断有无小数点,如果没有,那么只有整数部分*/
  123.         {
  124.                 for(i=0,h=0;i<length;i++,h++)
  125.                 {
  126.                         head[h]=temp[i];
  127.                 }
  128.                 head[h]='\0';
  129.                 *rear='\0';
  130.         }
  131.         else if(point==0&&temp[point]=='.')/*判断如果小数点是第一个元素,那么只有小数部分*/
  132.         {
  133.                         for(i=point+1,r=0;i<length;i++,r++)
  134.                         {
  135.                                 rear[r]=temp[i];
  136.                         }
  137.                         rear[r]='\0';
  138.                         *head='\0';
  139.                                
  140.         }
  141.         else                                                                /*如果有小数点而且不再第一个位置,那么整数*/
  142.         {                                                                        /*部分和小数部分分开处理*/       
  143.                 for(i=0,h=0;i<point;i++,h++)
  144.                 {
  145.                         head[h]=temp[i];
  146.                 }
  147.                
  148.                 for(i=point+1,r=0;i<length;i++,r++)
  149.                 {
  150.                         rear[r]=temp[i];
  151.                 }
  152.                 head[h]='\0';
  153.                 rear[r]='\0';
  154.         }
  155.        
  156. }

  157. void Head(char *head,char **headok[])/*处理整数部分*/
  158. {
  159.         int i,length,l,j=0;
  160.         char *arr=head;
  161.         char **temp=*headok;
  162.         char *hh[20];
  163.         length=strlen(head);
  164.         for(i=0,l=length;i<length;i++,l--)
  165.         {
  166.                
  167.                 switch(arr[i])
  168.                 {
  169.                         case '0':
  170.                                 temp[i]=Number[0];
  171.                                 break;
  172.                         case '1':
  173.                                 temp[i]=Number[1];
  174.                                 break;
  175.                 case '2':
  176.                     temp[i]=Number[2];
  177.                     break;
  178.                 case '3':
  179.                     temp[i]=Number[3];
  180.                     break;
  181.                 case '4':
  182.                     temp[i]=Number[4];
  183.                     break;
  184.                 case '5':
  185.                     temp[i]=Number[5];
  186.                     break;
  187.                 case '6':
  188.                     temp[i]=Number[6];
  189.                     break;
  190.                 case '7':
  191.                     temp[i]=Number[7];
  192.                     break;
  193.                 case '8':
  194.                     temp[i]=Number[8];
  195.                            break;
  196.                 case '9':
  197.                     temp[i]=Number[9];
  198.                     break;
  199.                 }
  200.         }
  201.                


  202.         for(i=0;i<length;i++)
  203.         {
  204.                 if(arr[i]=='0'&&arr[i+1]=='0')
  205.                 {
  206.                         temp[i]=0;
  207.                        
  208.                 }
  209.                 if(arr[length-1]=='0')
  210.                 {
  211.                         temp[length-1]=0;
  212.                 }
  213.                                
  214.         }
  215. /*        printf("\n这里打印NULL laster\n");
  216.         for(i=0;i<length;i++)
  217.         {
  218.                 printf("%s",temp[i]);
  219.         }

  220.         printf("\n这里打印NULL laster\n");        */
  221.         for(i=0,l=length;i<length;i++,l--)
  222.         {
  223.                 switch(l)
  224.                 {
  225.                         case 1:
  226.                                 if(temp[i]==NULL)
  227.                                 {
  228.                                         hh[j++]=Other[0];
  229.                                         break;
  230.                                 }
  231.                                                                
  232. /*                                printf("%s%s",temp[i],Other[0]);*/
  233.                                 hh[j++]=temp[i];
  234.                                 hh[j++]=Other[0];
  235.                                
  236.                                
  237.                                 break;
  238.                                        
  239.                        case 2:
  240.                            if(temp[i]==NULL)
  241.                                         break;
  242.                                 if(temp[i]==Number[0])
  243.                                 {
  244. /*                                        printf("%s",temp[i]);*/
  245.                                         hh[j++]=temp[i];
  246.                                        
  247.                                 }       
  248.                                 else
  249.                                 {
  250. /*                                        printf("%s%s",temp[i],zi[0]);*/
  251.                                         hh[j++]=temp[i];
  252.                                         hh[j++]=zi[0];
  253.                                        
  254.                                 }
  255.                     break;
  256.                        case 3:
  257.                                if(temp[i]==NULL)
  258.                                         break;
  259.                                 if(temp[i]==Number[0])
  260.                                 {
  261. /*                                        printf("%s",temp[i]);*/
  262.                                         hh[j++]=temp[i];
  263.                                 }
  264.                                 else
  265.                                 {
  266. /*                                        printf("%s%s",temp[i],zi[1]);*/
  267.                                         hh[j++]=temp[i];
  268.                                         hh[j++]=zi[1];
  269.                                 }
  270.                     break;
  271.                 case 4:
  272.                            if(temp[i]==NULL)
  273.                                         break;
  274.                                 if(temp[i]==Number[0])
  275.                                 {
  276. /*                                        printf("%s",temp[i]);*/
  277.                                         hh[j++]=temp[i];
  278.                                 }
  279.                     else
  280.                     {
  281. /*/                            printf("%s%s",temp[i],zi[2]);*/
  282.                             hh[j++]=temp[i];
  283.                             hh[j++]=zi[2];
  284.                     }
  285.                        break;
  286.                 case 5:
  287.                            if(temp[i]==NULL)
  288.                            {
  289.                                    if(length==9)
  290.                                            break;
  291.                                    else
  292.                                    {
  293. /*/                                           printf("%s",zi[3]);*/
  294.                                            hh[j++]=zi[3];
  295.                                            break;
  296.                                    }
  297.                            }
  298.                            if(temp[i]==Number[0])
  299.                            {
  300. /*/                                   printf("%s%s",zi[3],temp[i]);*/
  301.                                    hh[j++]=zi[3];
  302.                                    hh[j++]=temp[i];
  303.                            }
  304.                                 else
  305.                                 {
  306. /*/                                        printf("%s%s",temp[i],zi[3]);*/
  307.                                         hh[j++]=temp[i];
  308.                                         hh[j++]=zi[3];
  309.                                 }
  310.                            break;
  311.                 case 6:
  312.                            if(temp[i]==NULL)
  313.                                         break;
  314.                                 if(temp[i]==Number[0])
  315.                                 {
  316. /*/                                        printf("%s",temp[i]);*/
  317.                                         hh[j++]=temp[i];
  318.                                 }
  319.                                 else
  320.                                 {
  321. /*/                                        printf("%s%s",temp[i],zi[4]);*/
  322.                                         hh[j++]=temp[i];
  323.                                         hh[j++]=zi[4];
  324.                                 }
  325.                            break;
  326.                 case 7:
  327.                            if(temp[i]==NULL)
  328.                                         break;
  329.                                 if(temp[i]==Number[0])
  330.                                 {
  331. /*/                                        printf("%s",temp[i]);*/
  332.                                         hh[j++]=temp[i];
  333.                                 }
  334.                                 else
  335.                                 {
  336. /*/                                        printf("%s%s",temp[i],zi[5]);*/
  337.                                         hh[j++]=temp[i];
  338.                                         hh[j++]=zi[5];
  339.                                 }
  340.                     break;
  341.             case 8:
  342.                            if(temp[i]==NULL)
  343.                                         break;
  344.                                 if(temp[i]==Number[0])
  345.                                 {
  346. /*/                                        printf("%s",temp[i]);*/
  347.                                         hh[j++]=temp[i];
  348.                                 }
  349.                                 else
  350.                                 {
  351. /*/                                        printf("%s%s",temp[i],zi[6]);*/
  352.                                         hh[j++]=temp[i];
  353.                                         hh[j++]=zi[6];
  354.                                 }
  355.                            break;
  356.                 case 9:
  357. /*/                           printf("%s%s",temp[i],zi[7]);*/
  358.                            hh[j++]=temp[i];
  359.                            hh[j++]=zi[7];
  360.                            break;
  361.                 }
  362.         }

  363.         hh[j]=NULL;
  364.        

  365.         for(i=0;i<j;i++)
  366.         {
  367.                 temp[i]=hh[i];
  368.         }
  369.         temp[j]=NULL;
  370. }


  371. void Point(char *rear,char **rearok[]) /*/处理小数部分*/
  372. {
  373.         char *arr=rear;
  374.         int length,i;
  375.         char **temp=*rearok;
  376.         //char **rr;
  377.         length=strlen(rear);
  378.         for(i=0;i<length;i++)
  379.         {
  380.                 switch(arr[i])
  381.                 {
  382.                         case '0':
  383.                                 temp[i]=Number[0];
  384.                                 break;
  385.                         case '1':
  386.                                 temp[i]=Number[1];
  387.                                 break;
  388.                 case '2':
  389.                     temp[i]=Number[2];
  390.                     break;
  391.                 case '3':
  392.                     temp[i]=Number[3];
  393.                     break;
  394.                 case '4':
  395.                     temp[i]=Number[4];
  396.                     break;
  397.                 case '5':
  398.                     temp[i]=Number[5];
  399.                     break;
  400.                 case '6':
  401.                     temp[i]=Number[6];
  402.                     break;
  403.                 case '7':
  404.                     temp[i]=Number[7];
  405.                     break;
  406.                 case '8':
  407.                     temp[i]=Number[8];
  408.                            break;
  409.                 case '9':
  410.                     temp[i]=Number[9];
  411.                     break;
  412.                 }
  413.                
  414.         }
  415.                
  416.         if(length==1)
  417.         {
  418.                 temp[length]=Other[1];
  419.                 temp[length+1]=NULL;
  420.         }
  421.         else if(length==2)
  422.         {
  423.                 if(arr[0]!='0')
  424.                 {
  425.                         temp[length]=temp[length-1];
  426.                         temp[length-1]=Other[1];
  427.                         temp[length+1]=Other[2];
  428.                         temp[length+2]=0;
  429.                 }
  430.                 else
  431.                 {
  432.                         temp[0]=temp[1];
  433.                         temp[1]=Other[2];
  434.                         temp[length]=0;
  435. //                        temp[length]=Other[2];
  436. //                        temp[length+1]=0;
  437.                 }
  438.         }       
  439.         /*for(i=0;temp[i]!=0;i++)
  440.                 printf("\ntemp=%s",temp[i]);*/
  441.        
  442. }                          


  443. void Value(char *num)/*/最终结果*/
  444. {
  445.         char *p=num;
  446.        
  447.         char head[20],rear[4];
  448.         char *rearok[12],*headok[30];
  449.         char **rok=rearok,**hok=headok;
  450.         char *h=head,*r=rear;
  451.        
  452.         int i,rearl,headl;
  453.         if(Yxsz(p))
  454.         {
  455.                 Yxws(&p);
  456.                 printf("输入的有效数字是,保留小数点第二位:  %s",p);
  457.                 Fenjie(&h,&r,p);
  458.                
  459.                 if(strlen(rear))
  460.                         Point(r,&rok);
  461.                 if(strlen(head))
  462.                         Head(h,&hok);
  463.                 for(rearl=0;rearok[rearl]!=NULL;rearl++)/*求小数部分长度*/
  464.                 {
  465.                 }
  466.                 for(headl=0;headok[headl]!=NULL;headl++)/*求整数部分长度*/
  467.                 {
  468.                 }
  469.                 char *value[rearl+headl];
  470.                 if(strlen(rear))
  471.                 {
  472.                         if(strlen(head))
  473.                         {
  474.                                 for(i=0;headok[i]!=NULL;i++)
  475.                                 {
  476.                                         value[i]=headok[i];
  477.                                 }
  478.                                 value[i++]=Number[0];
  479.                                 for(rearl=0;rearok[rearl]!=NULL;rearl++,i++)
  480.                                 {
  481.                                         value[i]=rearok[rearl];
  482.                                 }
  483.                                 value[i]=NULL;
  484.                         }
  485.                         else
  486.                         {
  487.                                 for(i=0;rearok[i]!=NULL;i++)
  488.                                 {
  489.                                         value[i]=rearok[i];
  490.                                 }
  491.                                 value[i]=NULL;
  492.                                
  493.                         }
  494.                 }
  495.                 else
  496.                 {
  497.                         for(i=0;headok[i]!=NULL;i++)
  498.                         {
  499.                                 value[i]=headok[i];
  500.                         }
  501.                         value[i++]=Other[3];
  502.                         value[i]=NULL;
  503.                        
  504.                 }
  505.                 printf("\n转换结果为: ");
  506.                
  507.                 for(i=0;value[i]!=NULL;i++)
  508.                 {
  509.                         printf("%s",value[i]);
  510.                 }
  511.         }
  512.         else
  513.         {
  514.                 printf("\n你输入的字符不合法\n");
  515.                 return;               
  516.         }
  517. }

  518. /*calculator.c这个是主程序*/

  519. #include <stdio.h>;
  520. #include <malloc.h>;
  521. #include <stdlib.h>;
  522. #include <string.h>;
  523. #include <conio.h>;
  524. #include <math.h>;
  525. #include "stack.h"  /*这个是自己写的一个栈*/
  526. #include "changeRMB.h"

  527. void transform(char *a, char *b);
  528. int IN(char);
  529. int precede(char, char);

  530. int GetTwoOperand(Stack *s,Type *num1,Type *num2) /*从栈中取得两个操作数*/
  531. {
  532.         if(StackEmpty(*s))
  533.         {
  534.                 printf("\nMissing operand!");
  535.                 return 0;
  536.         }
  537.         *num1=pop(s);
  538.        
  539.         if(StackEmpty(*s))
  540.         {
  541.                 printf("\nMissing operand!");
  542.                 return 0;
  543.         }
  544.         *num2=pop(s);
  545.         return 1;
  546.        
  547. }

  548. void Compute(Stack *s,char ch) /*用去的的两个操作书进行计算结果再压入栈中*/
  549. {
  550.         int leap;
  551.         Type operand1,operand2;
  552.         leap=GetTwoOperand(s,&operand1,&operand2);
  553.         if(leap==1)
  554.         {
  555.                 switch(ch)
  556.                 {
  557.                         case '+':
  558.                                 push(s,operand2+operand1);
  559.                                 break;
  560.                         case '-':
  561.                                 push(s,operand2-operand1);
  562.                                 break;
  563.                         case '*':
  564.                                 push(s,operand2*operand1);
  565.                                 break;
  566.                         case '^':
  567.                                 push(s,pow(operand2,operand1));
  568.                                 break;
  569.                         case '/':
  570.                                 if(operand1==0)
  571.                                         break;
  572.                                 else
  573.                                         push(s,operand2/operand1);
  574.                                 break;
  575.                 }
  576.         }
  577.         else
  578.                 ClearStack(s);
  579. }

  580. void Run(Stack *s,char *num) /*判断字符,把操作数压入栈,遇到操作符进行运算,斌且输出结果*/
  581. {
  582.         char *c=num;
  583.         char N[10];
  584.         Type temp;
  585.         int i=0;

  586.         while(*c!='\0')
  587.         {
  588.                 if(*c!=',')
  589.                 {                       
  590.                         N[i++]=*c;
  591.                 }
  592.                 N[i]='\0';
  593.                
  594.                 if(*c==',')
  595.                 {
  596.                         i=0;
  597.                         if(strlen(N)!=1)
  598.                         {                               
  599.                                 temp=atof(N);
  600.                                 push(s,temp);
  601.                         }
  602.                         if(strlen(N)==1)
  603.                         {
  604.                                 if(N[0]!='+'&&N[0]!='-'&&N[0]!='*'&&N[0]!='/'&&N[0]!='^')
  605.                                 {
  606.                                         temp=atof(N);
  607.                                         push(s,temp);
  608.                                 }
  609.                         }
  610.                 }
  611.                
  612.                 if((*c=='+'||*c=='-'||*c=='*'||*c=='/'||*c=='^')&&(*(c+1)==','||*(c+1)=='\0'))
  613.                 {
  614.                         Compute(s,*c);                       
  615.                 }
  616.                        
  617.                 ++c;
  618.         }

  619.         if(!StackEmpty(*s))
  620.                 printf("=%.2f",GetTop(*s));
  621.        
  622. }

  623. void Zhuan(int num,int jz) /*10进制数到任意进制的转换*/
  624. {
  625.         Stack s;
  626.         int temp=num;
  627.         if(jz<2)
  628.         {
  629.                 printf("本程序之支持2以上进制的转换");
  630.                 return;
  631.         }
  632.         if(jz==16)
  633.         {
  634.                 printf("\n%d转换成%d进制数是: %x",num,jz,num);
  635.         }
  636.         else if(jz==8)
  637.         {
  638.                 printf("\n%d转换成%d进制数是: %o",num,jz,num);
  639.         }
  640.         else if(jz==2)
  641.         {
  642.                 InitStack(&s,100);
  643.                 while(temp!=0)
  644.                 {
  645.                         push(&s,temp%jz);
  646.                         temp=temp/jz;
  647.                 }
  648.                 printf("\n%d转换成%d进制数是: ",num,jz);
  649.                 while(!StackEmpty(s))
  650.                 {
  651.                         printf("%0.f",pop(&s));
  652.                 }
  653.                 DestroyStack(&s);
  654.         }
  655.         else
  656.         {
  657.                 printf("\n本程序只支持10进制到2,8,16进制的转换");
  658.                 return;
  659.         }
  660. }

  661. /*这里以下是龌龊的转换函数*/
  662. void transform(char *ps, char *pe)               /*转化为后缀表达式*/
  663. {
  664.          typedef struct data{
  665.            char *top;
  666.            char *base;
  667.            int  size;
  668.            }zu;
  669.       zu S;
  670.       char *temp;
  671.       S.base=(char*)malloc(40*sizeof(char));
  672.       S.size=40;
  673.       S.top=S.base;
  674.       *S.base='#';
  675.       temp=pe;

  676.       while(*pe!='\0')
  677.       {
  678.           /*printf("\n~~~~~~~~~~~~~~~");*/
  679.           if(*pe==','&&*(ps-1)!=',')
  680.           *ps++=*pe;
  681.           else
  682.           if(*pe==',')
  683.           ;
  684.           else
  685.            if(IN(*pe)||(*pe!='('&&*pe!=')'&&!IN(*pe)&&(IN(*(pe+1)))&&*(pe+1)!=','))
  686.            *ps++=*pe;
  687.            else
  688.            {
  689.             switch (*pe)
  690.             {
  691.               case '(':
  692.                   {*(++S.top)=*pe;
  693.                   break;}
  694.               case ')':
  695.                   {while (*S.top!= '(')
  696.                    {
  697.                      if(*(ps-1)!=',')
  698.                        *ps++=',';
  699.                      *ps++=*S.top--;
  700.                    }
  701.                    S.top--;
  702.                    break;}
  703.               default :
  704.                    {while(precede(*S.top,*pe))
  705.                     {
  706.                      if(*(ps-1)!=',')
  707.                       *ps++=',';
  708.                      *ps++=*S.top--;
  709.                     }
  710.                    if(*pe!='\0')
  711.                    *(++S.top)=*pe;
  712.                    break;}
  713.             }
  714.           }
  715.       if(*pe!='\0')
  716.       pe++;
  717.       }
  718.       while(*S.top!='#')
  719.       {
  720.          *ps++=',';
  721.          *ps++=*S.top--;
  722.       }
  723.       *ps='\0';
  724.       /*return 0;*/
  725. }

  726. int IN(char ch)                            /*判断是否是字符*/
  727. {
  728.     /*printf("\n~~~~~~~~~~~~~~~");*/
  729.     switch (ch)
  730.     {
  731.         case '(' :
  732.              return 0;
  733.         case ')' :
  734.              return 0;
  735.         case '+' :
  736.              return 0;
  737.         case '-' :
  738.              return 0;
  739.         case '*' :
  740.              return 0;
  741.         case '/' :
  742.              return 0;
  743.         case '^' :
  744.              return 0;
  745.         default :
  746.              return 1;
  747.      }
  748. }

  749. int precede(char c, char ch)           /*判断字符优先级*/
  750. {
  751.      int i,j;
  752.      /*printf("\n~~~~~~~~~~~~~~~");*/
  753.      switch (c)
  754.      {
  755.         case '#' :
  756.              {i=-1;
  757.              break;}
  758.         case '(' :
  759.              {i=0;
  760.              break;}
  761.         case '+' :
  762.              {i=1;
  763.              break;}
  764.         case '-' :
  765.              {i=1;
  766.              break;}
  767.         case '*' :
  768.              {i=2;
  769.              break;}
  770.         case '/' :
  771.              {i=2;
  772.              break;}
  773.         case '^' :
  774.              i=3;
  775.              break;
  776.      }

  777.           switch (ch)
  778.      {
  779.         case '#' :
  780.              {j=-1;
  781.              break;}
  782.         case '(' :
  783.              {j=0;
  784.              break;}
  785.         case '+' :
  786.              {j=1;
  787.              break;}
  788.         case '-' :
  789.              {j=1;
  790.              break;}
  791.         case '*' :
  792.              {j=2;
  793.              break;}
  794.         case '/' :
  795.              {j=2;
  796.              break;}
  797.         case '^' :
  798.              j=3;
  799.              break;
  800.      }
  801.      if(i>;=j)
  802.      return 1;
  803.      else return 0;
  804. }

  805. void enter(char exp[])
  806. {
  807.       char d[80],*p;
  808.       int i=0;
  809.       p=d;
  810.       printf("输入表达式:");
  811.       scanf("%s",d);
  812.       printf("\n%s",d);
  813.     while(*p!='\0')
  814.     {
  815.         /*printf("010010");*/
  816.             if(IN(*p)||(!IN(*p)&&(!IN(*(p-1))))||(!IN(*p)&&p==d))
  817.             {
  818.                     exp[i++]=*p;
  819.             }
  820.             else
  821.             {
  822.                     if((*p)!='('&&(*p)!=')')
  823.                     {
  824.                             exp[i++]=',';
  825.                             exp[i++]=*p;
  826.                             exp[i++]=',';
  827.                     }
  828.                     else
  829.                     {
  830.                             exp[i++]=*p;
  831.                     }
  832.               }
  833.     p++;
  834.     }
  835. exp[i]='\0';
  836. }


  837. int main()
  838. {
  839.         char suffix[80];
  840.     char exp[80],c;
  841.         Stack test;
  842.         int num,jinzhi;
  843.         printf("\n/****************************************/");
  844.         printf("\n     作者:nbfan AND 龌龊,于2005年1月3日");
  845.         printf("\n/****************************************/");
  846.        
  847.         printf("\n欢迎使用我们的计算器程序");
  848.         printf("\n请选择你需要的服务");
  849.         printf("\n1.进行常规运算.");
  850.         printf("\n2.进行进制转换运算.");
  851.         printf("\n3.人民币小写金额转换大写.");
  852.         printf("\n4.退出本程序.");
  853.         while((c=getch()))
  854.         {
  855.                 switch(c)
  856.                 {
  857.                         case '1':
  858.                                 printf("\n进行常规运算");
  859.                                 enter(exp);
  860.                                 transform(suffix,exp);
  861.                                 InitStack(&test,strlen(suffix));
  862.                                 Run(&test,suffix);
  863.                                 DestroyStack(&test);
  864.                                 break;
  865.                         case '2':
  866.                                 printf("\n本程序只支持10进制到2,8,16进制的转换");
  867.                                 printf("\n请输入你要转换的十进制数字: ");
  868.                                 scanf("%d",&num);
  869.                                 printf("\n请输入你要转换的进制: ");
  870.                                 scanf("%d",&jinzhi);
  871.                                 Zhuan(num,jinzhi);
  872.                                 break;
  873.                         case '3':
  874.                                 printf("\n人民币小写金额转换大写");
  875.                                 printf("\n请输入你要转换的金额数字: ");       
  876.                                 scanf("%s",exp);
  877.                                 Value(exp);       
  878.                                 break;               
  879.                         case '4':
  880.                                 printf("\n谢谢使用计算器程序");
  881.                                 exit(1);
  882.                                 break;
  883.                         default:
  884.                                 printf("\n/****************************************/");
  885.                                 printf("\n     作者:nbfan AND 龌龊,于2005年1月3日");
  886.                                 printf("\n/****************************************/");
  887.                                 printf("\n1.进行常规运算.");
  888.                                 printf("\n2.进行进制转换运算.");
  889.                                 printf("\n3.人民币小写金额转换大写.");
  890.                                 printf("\n4.退出本程序.");
  891.                                 break;
  892.                 }
  893.         }
  894.         return 0;
  895. }
复制代码


程序主要功能
1。可以计算任意表达式,支持+,-,*,/,^(成方)运算,支持括号优先级。
2。支持10进制到2,8,16进制的转换。
3。支持人民币小写金额到大写的转换。

论坛徽章:
0
2 [报告]
发表于 2005-01-03 23:21 |只看该作者

我和一个网友合作写了一个dos下的计算器请高手指点

怎么不能保持代码格式阿。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
3 [报告]
发表于 2005-01-04 09:01 |只看该作者

我和一个网友合作写了一个dos下的计算器请高手指点

用[ c o d e ]和[ / c o d e ]将你的代码括起来,就可以保持代码格式了。

计算器和这个转化程序,类似是很好的词法分析和语法分析的例子。鼓励。

论坛徽章:
0
4 [报告]
发表于 2005-01-04 16:21 |只看该作者

我和一个网友合作写了一个dos下的计算器请高手指点

谢谢 楼上,知道怎么保持代码格式了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP