- 论坛徽章:
- 0
|
- /*changeRMB.h 这个是我上次写的人民币小写转换大写的程序*/
- #define FALSE 0;
- #define TRUE 1;
- char *Number[]= {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
- char *Other[]={"元","角","分","整"};
- char *zi[]={"拾","佰","仟","万","拾","百","仟","亿" };
- int Yxsz(char *arr)/*判断输入是否为有效的数字*/
- {
- int leap,point=0;
- char *temp=arr;
- while(*temp!='\0')
- {
- if(*temp=='0'||*temp=='1'||*temp=='2'||*temp=='3'
- ||*temp=='4'||*temp=='5'||*temp=='6'||*temp=='7'
- ||*temp=='8'||*temp=='9'||*temp=='.')
- {
- if(*temp=='.')
- {
- point++;
- }
- leap=TRUE;
- temp++;
- }
- else
- {
- leap=FALSE;
- break;
- }
-
- }
- if(point>;1)
- {
- leap=FALSE;
- }
-
- return leap;
- }
- void Yxws(char **arr) /*判断输入的有效位数小数点前后去零,只保留有效部分*/
- {
-
- int first,length,var,point=0,poi=0,j;
- length=strlen(*arr);
-
- char *temp=*arr;
-
- for(var=0;var<length;var++)/*/找到数组第一个非0值的下标first*/
- {
- if((*arr)[var]!='0')
- {
- first=var;
- break;
- }
- }
-
- for(var=first;var<length;var++)/*找到数组.的下标point*/
- {
- if((*arr)[var]=='.')
- {
- point=var;
- break;
- }
- }
-
- if((*arr)[point]!='.') /*如果没有小数点处理整数*/
- {
- for(var=0,j=first;var<length;var++,j++)
- {
- temp[var]=(*arr)[j];
- }
- temp[var]='\0';
- }
- else if((*arr)[point]=='.')/*有小数点*/
- {
- for(var=point+2;var>;=point;var--)/*找到小数点后第一个有效数字的地址用poi保存*/
- {
- if((*arr)[var]!='0')
- {
- poi=var;
- break;
- }
-
- }
-
- if((*arr)[first]=='.')
- {
- for(var=0,j=first;j<=poi;var++,j++)
- {
- temp[var]=(*arr)[j];
- }
- temp[var]='\0';
-
- }
- else
- {
- for(var=0,j=first;j<=poi;var++,j++)
- {
- temp[var]=(*arr)[j];
- }
- temp[var]='\0';
-
- }
- }
- /*printf("\nyxws%s",temp);*/
- }
- void Fenjie(char **hd,char **rd,char *num) /*分解小数点前与小数点后*/
- {
- int i,h,r,point=0;
- char *temp=num;
- char *head=*hd;
- char *rear=*rd;
-
- int length=strlen(temp);
- for(i=0;i<length;i++)
- {
- if(temp[i]=='.')
- {
- point=i;
- break;
- }
- }
-
- if(point==0&&temp[point]!='.') /*判断有无小数点,如果没有,那么只有整数部分*/
- {
- for(i=0,h=0;i<length;i++,h++)
- {
- head[h]=temp[i];
- }
- head[h]='\0';
- *rear='\0';
- }
- else if(point==0&&temp[point]=='.')/*判断如果小数点是第一个元素,那么只有小数部分*/
- {
- for(i=point+1,r=0;i<length;i++,r++)
- {
- rear[r]=temp[i];
- }
- rear[r]='\0';
- *head='\0';
-
- }
- else /*如果有小数点而且不再第一个位置,那么整数*/
- { /*部分和小数部分分开处理*/
- for(i=0,h=0;i<point;i++,h++)
- {
- head[h]=temp[i];
- }
-
- for(i=point+1,r=0;i<length;i++,r++)
- {
- rear[r]=temp[i];
- }
- head[h]='\0';
- rear[r]='\0';
- }
-
- }
- void Head(char *head,char **headok[])/*处理整数部分*/
- {
- int i,length,l,j=0;
- char *arr=head;
- char **temp=*headok;
- char *hh[20];
- length=strlen(head);
- for(i=0,l=length;i<length;i++,l--)
- {
-
- switch(arr[i])
- {
- case '0':
- temp[i]=Number[0];
- break;
- case '1':
- temp[i]=Number[1];
- break;
- case '2':
- temp[i]=Number[2];
- break;
- case '3':
- temp[i]=Number[3];
- break;
- case '4':
- temp[i]=Number[4];
- break;
- case '5':
- temp[i]=Number[5];
- break;
- case '6':
- temp[i]=Number[6];
- break;
- case '7':
- temp[i]=Number[7];
- break;
- case '8':
- temp[i]=Number[8];
- break;
- case '9':
- temp[i]=Number[9];
- break;
- }
- }
-
- for(i=0;i<length;i++)
- {
- if(arr[i]=='0'&&arr[i+1]=='0')
- {
- temp[i]=0;
-
- }
- if(arr[length-1]=='0')
- {
- temp[length-1]=0;
- }
-
- }
- /* printf("\n这里打印NULL laster\n");
- for(i=0;i<length;i++)
- {
- printf("%s",temp[i]);
- }
- printf("\n这里打印NULL laster\n"); */
- for(i=0,l=length;i<length;i++,l--)
- {
- switch(l)
- {
- case 1:
- if(temp[i]==NULL)
- {
- hh[j++]=Other[0];
- break;
- }
-
- /* printf("%s%s",temp[i],Other[0]);*/
- hh[j++]=temp[i];
- hh[j++]=Other[0];
-
-
- break;
-
- case 2:
- if(temp[i]==NULL)
- break;
- if(temp[i]==Number[0])
- {
- /* printf("%s",temp[i]);*/
- hh[j++]=temp[i];
-
- }
- else
- {
- /* printf("%s%s",temp[i],zi[0]);*/
- hh[j++]=temp[i];
- hh[j++]=zi[0];
-
- }
- break;
- case 3:
- if(temp[i]==NULL)
- break;
- if(temp[i]==Number[0])
- {
- /* printf("%s",temp[i]);*/
- hh[j++]=temp[i];
- }
- else
- {
- /* printf("%s%s",temp[i],zi[1]);*/
- hh[j++]=temp[i];
- hh[j++]=zi[1];
- }
- break;
- case 4:
- if(temp[i]==NULL)
- break;
- if(temp[i]==Number[0])
- {
- /* printf("%s",temp[i]);*/
- hh[j++]=temp[i];
- }
- else
- {
- /*/ printf("%s%s",temp[i],zi[2]);*/
- hh[j++]=temp[i];
- hh[j++]=zi[2];
- }
- break;
- case 5:
- if(temp[i]==NULL)
- {
- if(length==9)
- break;
- else
- {
- /*/ printf("%s",zi[3]);*/
- hh[j++]=zi[3];
- break;
- }
- }
- if(temp[i]==Number[0])
- {
- /*/ printf("%s%s",zi[3],temp[i]);*/
- hh[j++]=zi[3];
- hh[j++]=temp[i];
- }
- else
- {
- /*/ printf("%s%s",temp[i],zi[3]);*/
- hh[j++]=temp[i];
- hh[j++]=zi[3];
- }
- break;
- case 6:
- if(temp[i]==NULL)
- break;
- if(temp[i]==Number[0])
- {
- /*/ printf("%s",temp[i]);*/
- hh[j++]=temp[i];
- }
- else
- {
- /*/ printf("%s%s",temp[i],zi[4]);*/
- hh[j++]=temp[i];
- hh[j++]=zi[4];
- }
- break;
- case 7:
- if(temp[i]==NULL)
- break;
- if(temp[i]==Number[0])
- {
- /*/ printf("%s",temp[i]);*/
- hh[j++]=temp[i];
- }
- else
- {
- /*/ printf("%s%s",temp[i],zi[5]);*/
- hh[j++]=temp[i];
- hh[j++]=zi[5];
- }
- break;
- case 8:
- if(temp[i]==NULL)
- break;
- if(temp[i]==Number[0])
- {
- /*/ printf("%s",temp[i]);*/
- hh[j++]=temp[i];
- }
- else
- {
- /*/ printf("%s%s",temp[i],zi[6]);*/
- hh[j++]=temp[i];
- hh[j++]=zi[6];
- }
- break;
- case 9:
- /*/ printf("%s%s",temp[i],zi[7]);*/
- hh[j++]=temp[i];
- hh[j++]=zi[7];
- break;
- }
- }
- hh[j]=NULL;
-
- for(i=0;i<j;i++)
- {
- temp[i]=hh[i];
- }
- temp[j]=NULL;
- }
- void Point(char *rear,char **rearok[]) /*/处理小数部分*/
- {
- char *arr=rear;
- int length,i;
- char **temp=*rearok;
- //char **rr;
- length=strlen(rear);
- for(i=0;i<length;i++)
- {
- switch(arr[i])
- {
- case '0':
- temp[i]=Number[0];
- break;
- case '1':
- temp[i]=Number[1];
- break;
- case '2':
- temp[i]=Number[2];
- break;
- case '3':
- temp[i]=Number[3];
- break;
- case '4':
- temp[i]=Number[4];
- break;
- case '5':
- temp[i]=Number[5];
- break;
- case '6':
- temp[i]=Number[6];
- break;
- case '7':
- temp[i]=Number[7];
- break;
- case '8':
- temp[i]=Number[8];
- break;
- case '9':
- temp[i]=Number[9];
- break;
- }
-
- }
-
- if(length==1)
- {
- temp[length]=Other[1];
- temp[length+1]=NULL;
- }
- else if(length==2)
- {
- if(arr[0]!='0')
- {
- temp[length]=temp[length-1];
- temp[length-1]=Other[1];
- temp[length+1]=Other[2];
- temp[length+2]=0;
- }
- else
- {
- temp[0]=temp[1];
- temp[1]=Other[2];
- temp[length]=0;
- // temp[length]=Other[2];
- // temp[length+1]=0;
- }
- }
- /*for(i=0;temp[i]!=0;i++)
- printf("\ntemp=%s",temp[i]);*/
-
- }
- void Value(char *num)/*/最终结果*/
- {
- char *p=num;
-
- char head[20],rear[4];
- char *rearok[12],*headok[30];
- char **rok=rearok,**hok=headok;
- char *h=head,*r=rear;
-
- int i,rearl,headl;
- if(Yxsz(p))
- {
- Yxws(&p);
- printf("输入的有效数字是,保留小数点第二位: %s",p);
- Fenjie(&h,&r,p);
-
- if(strlen(rear))
- Point(r,&rok);
- if(strlen(head))
- Head(h,&hok);
- for(rearl=0;rearok[rearl]!=NULL;rearl++)/*求小数部分长度*/
- {
- }
- for(headl=0;headok[headl]!=NULL;headl++)/*求整数部分长度*/
- {
- }
- char *value[rearl+headl];
- if(strlen(rear))
- {
- if(strlen(head))
- {
- for(i=0;headok[i]!=NULL;i++)
- {
- value[i]=headok[i];
- }
- value[i++]=Number[0];
- for(rearl=0;rearok[rearl]!=NULL;rearl++,i++)
- {
- value[i]=rearok[rearl];
- }
- value[i]=NULL;
- }
- else
- {
- for(i=0;rearok[i]!=NULL;i++)
- {
- value[i]=rearok[i];
- }
- value[i]=NULL;
-
- }
- }
- else
- {
- for(i=0;headok[i]!=NULL;i++)
- {
- value[i]=headok[i];
- }
- value[i++]=Other[3];
- value[i]=NULL;
-
- }
- printf("\n转换结果为: ");
-
- for(i=0;value[i]!=NULL;i++)
- {
- printf("%s",value[i]);
- }
- }
- else
- {
- printf("\n你输入的字符不合法\n");
- return;
- }
- }
- /*calculator.c这个是主程序*/
- #include <stdio.h>;
- #include <malloc.h>;
- #include <stdlib.h>;
- #include <string.h>;
- #include <conio.h>;
- #include <math.h>;
- #include "stack.h" /*这个是自己写的一个栈*/
- #include "changeRMB.h"
- void transform(char *a, char *b);
- int IN(char);
- int precede(char, char);
- int GetTwoOperand(Stack *s,Type *num1,Type *num2) /*从栈中取得两个操作数*/
- {
- if(StackEmpty(*s))
- {
- printf("\nMissing operand!");
- return 0;
- }
- *num1=pop(s);
-
- if(StackEmpty(*s))
- {
- printf("\nMissing operand!");
- return 0;
- }
- *num2=pop(s);
- return 1;
-
- }
- void Compute(Stack *s,char ch) /*用去的的两个操作书进行计算结果再压入栈中*/
- {
- int leap;
- Type operand1,operand2;
- leap=GetTwoOperand(s,&operand1,&operand2);
- if(leap==1)
- {
- switch(ch)
- {
- case '+':
- push(s,operand2+operand1);
- break;
- case '-':
- push(s,operand2-operand1);
- break;
- case '*':
- push(s,operand2*operand1);
- break;
- case '^':
- push(s,pow(operand2,operand1));
- break;
- case '/':
- if(operand1==0)
- break;
- else
- push(s,operand2/operand1);
- break;
- }
- }
- else
- ClearStack(s);
- }
- void Run(Stack *s,char *num) /*判断字符,把操作数压入栈,遇到操作符进行运算,斌且输出结果*/
- {
- char *c=num;
- char N[10];
- Type temp;
- int i=0;
- while(*c!='\0')
- {
- if(*c!=',')
- {
- N[i++]=*c;
- }
- N[i]='\0';
-
- if(*c==',')
- {
- i=0;
- if(strlen(N)!=1)
- {
- temp=atof(N);
- push(s,temp);
- }
- if(strlen(N)==1)
- {
- if(N[0]!='+'&&N[0]!='-'&&N[0]!='*'&&N[0]!='/'&&N[0]!='^')
- {
- temp=atof(N);
- push(s,temp);
- }
- }
- }
-
- if((*c=='+'||*c=='-'||*c=='*'||*c=='/'||*c=='^')&&(*(c+1)==','||*(c+1)=='\0'))
- {
- Compute(s,*c);
- }
-
- ++c;
- }
- if(!StackEmpty(*s))
- printf("=%.2f",GetTop(*s));
-
- }
- void Zhuan(int num,int jz) /*10进制数到任意进制的转换*/
- {
- Stack s;
- int temp=num;
- if(jz<2)
- {
- printf("本程序之支持2以上进制的转换");
- return;
- }
- if(jz==16)
- {
- printf("\n%d转换成%d进制数是: %x",num,jz,num);
- }
- else if(jz==8)
- {
- printf("\n%d转换成%d进制数是: %o",num,jz,num);
- }
- else if(jz==2)
- {
- InitStack(&s,100);
- while(temp!=0)
- {
- push(&s,temp%jz);
- temp=temp/jz;
- }
- printf("\n%d转换成%d进制数是: ",num,jz);
- while(!StackEmpty(s))
- {
- printf("%0.f",pop(&s));
- }
- DestroyStack(&s);
- }
- else
- {
- printf("\n本程序只支持10进制到2,8,16进制的转换");
- return;
- }
- }
- /*这里以下是龌龊的转换函数*/
- void transform(char *ps, char *pe) /*转化为后缀表达式*/
- {
- typedef struct data{
- char *top;
- char *base;
- int size;
- }zu;
- zu S;
- char *temp;
- S.base=(char*)malloc(40*sizeof(char));
- S.size=40;
- S.top=S.base;
- *S.base='#';
- temp=pe;
- while(*pe!='\0')
- {
- /*printf("\n~~~~~~~~~~~~~~~");*/
- if(*pe==','&&*(ps-1)!=',')
- *ps++=*pe;
- else
- if(*pe==',')
- ;
- else
- if(IN(*pe)||(*pe!='('&&*pe!=')'&&!IN(*pe)&&(IN(*(pe+1)))&&*(pe+1)!=','))
- *ps++=*pe;
- else
- {
- switch (*pe)
- {
- case '(':
- {*(++S.top)=*pe;
- break;}
- case ')':
- {while (*S.top!= '(')
- {
- if(*(ps-1)!=',')
- *ps++=',';
- *ps++=*S.top--;
- }
- S.top--;
- break;}
- default :
- {while(precede(*S.top,*pe))
- {
- if(*(ps-1)!=',')
- *ps++=',';
- *ps++=*S.top--;
- }
- if(*pe!='\0')
- *(++S.top)=*pe;
- break;}
- }
- }
- if(*pe!='\0')
- pe++;
- }
- while(*S.top!='#')
- {
- *ps++=',';
- *ps++=*S.top--;
- }
- *ps='\0';
- /*return 0;*/
- }
- int IN(char ch) /*判断是否是字符*/
- {
- /*printf("\n~~~~~~~~~~~~~~~");*/
- switch (ch)
- {
- case '(' :
- return 0;
- case ')' :
- return 0;
- case '+' :
- return 0;
- case '-' :
- return 0;
- case '*' :
- return 0;
- case '/' :
- return 0;
- case '^' :
- return 0;
- default :
- return 1;
- }
- }
- int precede(char c, char ch) /*判断字符优先级*/
- {
- int i,j;
- /*printf("\n~~~~~~~~~~~~~~~");*/
- switch (c)
- {
- case '#' :
- {i=-1;
- break;}
- case '(' :
- {i=0;
- break;}
- case '+' :
- {i=1;
- break;}
- case '-' :
- {i=1;
- break;}
- case '*' :
- {i=2;
- break;}
- case '/' :
- {i=2;
- break;}
- case '^' :
- i=3;
- break;
- }
- switch (ch)
- {
- case '#' :
- {j=-1;
- break;}
- case '(' :
- {j=0;
- break;}
- case '+' :
- {j=1;
- break;}
- case '-' :
- {j=1;
- break;}
- case '*' :
- {j=2;
- break;}
- case '/' :
- {j=2;
- break;}
- case '^' :
- j=3;
- break;
- }
- if(i>;=j)
- return 1;
- else return 0;
- }
- void enter(char exp[])
- {
- char d[80],*p;
- int i=0;
- p=d;
- printf("输入表达式:");
- scanf("%s",d);
- printf("\n%s",d);
- while(*p!='\0')
- {
- /*printf("010010");*/
- if(IN(*p)||(!IN(*p)&&(!IN(*(p-1))))||(!IN(*p)&&p==d))
- {
- exp[i++]=*p;
- }
- else
- {
- if((*p)!='('&&(*p)!=')')
- {
- exp[i++]=',';
- exp[i++]=*p;
- exp[i++]=',';
- }
- else
- {
- exp[i++]=*p;
- }
- }
- p++;
- }
- exp[i]='\0';
- }
- int main()
- {
- char suffix[80];
- char exp[80],c;
- Stack test;
- int num,jinzhi;
- printf("\n/****************************************/");
- printf("\n 作者:nbfan AND 龌龊,于2005年1月3日");
- printf("\n/****************************************/");
-
- printf("\n欢迎使用我们的计算器程序");
- printf("\n请选择你需要的服务");
- printf("\n1.进行常规运算.");
- printf("\n2.进行进制转换运算.");
- printf("\n3.人民币小写金额转换大写.");
- printf("\n4.退出本程序.");
- while((c=getch()))
- {
- switch(c)
- {
- case '1':
- printf("\n进行常规运算");
- enter(exp);
- transform(suffix,exp);
- InitStack(&test,strlen(suffix));
- Run(&test,suffix);
- DestroyStack(&test);
- break;
- case '2':
- printf("\n本程序只支持10进制到2,8,16进制的转换");
- printf("\n请输入你要转换的十进制数字: ");
- scanf("%d",&num);
- printf("\n请输入你要转换的进制: ");
- scanf("%d",&jinzhi);
- Zhuan(num,jinzhi);
- break;
- case '3':
- printf("\n人民币小写金额转换大写");
- printf("\n请输入你要转换的金额数字: ");
- scanf("%s",exp);
- Value(exp);
- break;
- case '4':
- printf("\n谢谢使用计算器程序");
- exit(1);
- break;
- default:
- printf("\n/****************************************/");
- printf("\n 作者:nbfan AND 龌龊,于2005年1月3日");
- printf("\n/****************************************/");
- printf("\n1.进行常规运算.");
- printf("\n2.进行进制转换运算.");
- printf("\n3.人民币小写金额转换大写.");
- printf("\n4.退出本程序.");
- break;
- }
- }
- return 0;
- }
复制代码
程序主要功能
1。可以计算任意表达式,支持+,-,*,/,^(成方)运算,支持括号优先级。
2。支持10进制到2,8,16进制的转换。
3。支持人民币小写金额到大写的转换。 |
|