C语言课程设计--简单计算器
#include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #include <windows.h> int main() { void fun1(int n); void fun2(char ac[]); void fun3(int x,int n); void fun4(int R1,int R2); void print1(); void print2(); void print3(); void print4(); void print5(); void print6(); void print7(); int compare(char a,char b); double change(char s[]); double operate(double x1,char op,double x2); int judge(char s[]); int R1; int R2; int xx; int nn; int open=0; char cp; char a[1010]; system("color 1D"); system("title 简单计算器"); print1(); while(1) { if(!open) { printf("\n**********************欢迎访问程序作者博客!"); printf("快捷访问请输入【1】*****************\n"); open=1; } scanf("%c",&cp); if(cp=='1') { getchar();//吸收输入1后的空格字符 ShellExecute(NULL, "open", "http://blog.csdn.net/ydd97", NULL, NULL, SW_MINIMIZE); } else if(cp=='N'||cp=='Y'||cp=='n'||cp=='y') break; //else printf("请输入 [Y]进入程序 或 [N]退出程序\n"); } if(cp=='N'||cp=='n') { system("cls"); printf("**********************************"); printf("谢谢使用!************************************\n"); return 0; } if(cp=='Y'||cp=='y') { print2(); } while(1) { char xz; getchar(); scanf("%c",&xz); if(xz=='N'||xz=='n') { system("cls"); printf("**********************************"); printf("谢谢使用!************************************\n"); return 0; } else if(xz!='1'&&xz!='2'&&xz!='3'&&xz!='4'&&xz!='5'&&xz!='n'&&xz!='N') printf("请输入正确选项:[1] [2] [3] [4] [5] [N]\n"); else if(xz=='1') { system("cls"); print3(); while(1) { int jc; printf("请输入你想计算阶乘的数字:"); scanf("%d",&jc); if(jc==-1) { print2(); break; } else { printf("%d的阶乘为:\n",jc); fun1(jc); } } } else if(xz=='2') { print4(); fun2(a); } else if(xz=='3') { print5(); while(1) { printf("请输入x和n,两个数字之间用空格隔开:"); scanf("%d%d",&xx,&nn); if(xx==-1&&nn==-1) { print2(); break; } else { printf("%d^%d的值为:",xx,nn); fun3(xx,nn); } } } else if(xz=='4') { print6(); while(1) { printf("你想从几进制转化成几进制?两个数字之间用空格隔开!\n"); scanf("%d%d",&R1,&R2); if(R1==-1&&R2==-1) { print2(); break; } else fun4(R1,R2); } } else if(xz=='5') { print7(); system("cls"); printf("正在使用计算器。。。。。\n"); system("C:\\Windows\\System32\\calc.exe"); print2(); } } } /*计算阶乘*/ void fun1(int n) { int i; int j; int carry_bit; int temp; int len=1; int a1[10000]; memset(a1,0,sizeof(a1)); a1[0]=1; for(i=2;i<=n;i++) { carry_bit=0; for(j=0;j<len;j++) { temp=a1[j]*i+carry_bit; a1[j]=temp%10; carry_bit=temp/10; } while(carry_bit) { a1[len++]=carry_bit%10; carry_bit/=10; } } for(i=len-1;i>=0;i--) printf("%d",a1[i]); printf("\n"); } /*表达式计算*/ void fun2(char ac[]) { void print2(); int compare(char ax,char bx); double change(char s[]); int judge(char s[]); double operate(double x1,char op,double x2); int i; char op; int flag=0; double x; double y; int cl;//定义是否发生除0错误的变量 char c[1010];//用数组模拟栈的操作。 double num[1010]; char t[100]; int k;//k记录数字 int xctop; int xntop;//xn数字个数,xc字符个数,xtop代表栈顶。 while(1) { int l; cl=1; scanf("%s",ac); if(strcmp(ac,"-1")==0) { print2(); break; } if(strcmp(ac,"N")==0||strcmp(ac,"n")==0) { print2(); return; } k=0; xctop=0; xntop=0;//初始化,也相当于清空栈 c[xctop++]='='; l=strlen(ac); if(ac[l-1]!='=') { ac[l]='='; l++; ac[l]='\0'; } if(!judge(ac)) { printf("程序输入有误,请按正确格式输入!\n"); } for(i=0;i<l;) { if((ac[i]>='0'&&ac[i]<='9')||ac[i]=='.') { flag=1; t[k++]=ac[i++];//把数字记录到数组 t。 continue; } if(flag) { flag=0; //此处可使用atof函数转化,但要在此行加上语句t[k]='\0'; //因为atof函数处理的是字符串。 t[k]='\0'; num[xntop++]=atof(t); k=0; } switch(compare(c[xctop-1],ac[i])) { case -1: c[xctop++]=ac[i++]; break;//栈顶运算符优先级小于当前运算符,进栈 case 0: xctop--; i++; break;//优先级相同,上一运算符出栈 case 1: x=num[xntop-1]; xntop--; y=num[xntop-1]; xntop--; op=c[xctop-1]; xctop--; if(op=='/'&&x==0) { printf("发生除0错误,请输入正确的表达式!!!\n"); cl=0; break; } num[xntop++]=operate(y,op,x);//注意此处,x,y顺序 break; } if(cl==0) break; } if(cl==0) { continue; } printf("表达式值为:"); if(num[xntop-1]==ceil(num[xntop-1])) printf("%d\n",(int)num[xntop-1]); else printf("%.6lf\n",num[xntop-1]); } } /*判断运算符之间的优先级*/ int compare(char ax,char bx) { if(ax=='+'||ax=='-') { if(bx=='*'||bx=='/'||bx=='(') { return -1; } else return 1; } if(ax=='*'||ax=='/') { if(bx=='(') return -1; else return 1; } if(ax=='('||ax=='=') { if((ax=='('&&bx==')')||(ax=='='&&bx=='=')) return 0; else return -1; } } /*计算函数*/ double operate(double x1,char op,double x2) { if(op=='+') return x1+x2; if(op=='-') return x1-x2; if(op=='*') return x1*x2; if(op=='/') return x1/x2; } /*判断表达式是否包含违法运算符*/ int judge(char s[]) { int l=strlen(s); int i; for(i=0;i<l-1;i++) { if((s[i]<='9'&&s[i]>='0')) continue; if(s[i]=='+'||s[i]=='-'||s[i]=='/'||s[i]=='*'||s[i]=='('||s[i]==')'||s[i]=='.'||s[i]=='=') continue; else return 0; } return 1; } void fun3(int x,int n) { double num=pow(x,n); if(num==ceil(num)) printf("%0.lf\n",num); else printf("%.6lf\n",num); } /*进制转化*/ void fun4(int R1,int R2) { double jz2(char *js,int R); void jz1(int ja,int jb); char js[100]; double res; int ja; if(R1==10) { printf("请输入你想转化的数字:"); scanf("%d",&ja); printf("10进制的%d转化成%d进制为:",ja,R2); jz1(ja,R2); } else if(R2==10) { printf("请输入你想转化的数字:"); scanf("%s",js); printf("%d进制的%s转化成10进制为:",R1,js); res=jz2(js,R1); if(res==ceil(res)) printf("%.0lf\n",res); else printf("%.6lf\n",res); } else { printf("请输入你想转化的数字:"); scanf("%s",js); printf("%d进制的%s转化成%d进制为:",R1,js,R2); res=jz2(js,R1); jz1((int)res,R2); } } /*R进制转化成10进制*/ double jz2(char *js,int R) { double sum; int i; int j; int l; int point_x; double temp; point_x=0; l=strlen(js); sum=0; while(point_x<l)//找出小数点的位置 { if(js[point_x]=='.') break; point_x++; } i=point_x-1; j=0; while(i>=0) { if(js[i]>='A') temp=10+js[i]-'A'; else temp=(double)(js[i]-'0'); sum+=temp*pow((double)R,(double)j); j++; i--; } i=point_x+1; j=-1; while(i<l) { if(js[i]>='A') temp=10+js[i]-'A'; else temp=(double)(js[i]-'0'); sum+=temp*pow((double)R,(double)j); j--; i++; } return sum; } /*10进制转化成R进制*/ void jz1(int ja,int jb) { char js[100]; int jk=0; int ji=0; int jl=ja; while(jl) { if(jl%jb>=10) { js[jk++]='A'+(jl%jb-10); } else { js[jk++]=jl%jb+'0'; } jl/=jb; } for(ji=jk-1;ji>=0;ji--) { printf("%c",js[ji]); } printf("\n"); } /*打印语句使用函数*/ void print1() { printf("********************************【简 单 计 算 器】"); printf("*****************************\n\n\n"); printf("**********************************制作人:111111"); printf("*******************************\n\n\n"); printf("*****************************专业班级:111111111111"); printf("****************************\n\n\n"); printf("********************************学号:111111111111"); printf("*****************************\n\n\n"); printf("*****************************输入Y进入程序,输入N退出"); printf("**************************\n\n"); } void print2() { system("cls");//清空屏幕函数 printf("**********************************【简 单 计 算 器】"); printf("****************************\n\n\n"); printf("______________________________________"); printf("__________________________________________\n"); printf("****************************计算阶乘请输入:"); printf(" [1] ************************\n"); printf("****************************计算表达式请输入:"); printf(" [2] ************************\n"); printf("****************************n次方计算请输入:"); printf(" [3] ************************\n"); printf("****************************进制转化请输入:"); printf(" [4] ************************\n"); printf("****************************使用计算器程序请输入:"); printf(" [5] ************************\n"); printf("****************************退出程序请输入:"); printf(" [N]*************************\n"); } void print3() { printf("**************************【简 单 计 算 器--阶乘计算】"); printf("**************************\n\n\n"); printf("______________________________________"); printf("__________________________________________\n"); printf("***************************【输入 [-1]"); printf(" 退出阶乘计算】***************************\n"); } void print4() { system("cls"); printf("**************************【简 单 计 算 器"); printf("--表达式求值】***********************\n\n\n"); printf("____________________________________"); printf("____________________________________________\n"); printf("**************************程序数据范围"); printf("在double型范围之内***********************\n"); printf("*******************************请不要输入"); printf("违法运算符****************************\n"); printf("*********************************计算器"); printf("包含运算符:****************************\n"); printf("****************************【'+',"); printf("'-','*','/','(',')'】************************\n"); printf("**************************如果结果为小数"); printf(",默认保存7位小数**********************\n"); printf("************************程序在处理含"); printf("有负数的表达式时有时会出错*****************\n"); printf("**************************如需使用负数"); printf("尽量写成(0-x)的形式**********************\n"); printf("***************************输入字符时"); printf("一定要使用英文字符************************\n"); printf("*****************【按下回车键得出结果,"); printf("输入 [-1] 退出表达式计算】***************\n"); } void print5() { system("cls"); printf("**************************【简 单 计 算 器"); printf("--x^n计算】***************************\n\n\n"); printf("______________________________________"); printf("__________________________________________\n"); printf("******************************只需输入x和n"); printf("两个数值即可**************************\n"); printf("***************************【输入 [-1 -1]"); printf(" 退出计算】****************************\n"); } void print6() { system("cls"); printf("****************************【简 单 计 算 器"); printf("--进制转换】************************\n\n\n"); printf("____________________________________"); printf("____________________________________________\n"); printf("*************************该进制转换可实现R1"); printf("进制转化成R2进制*********************\n"); printf("*************支持从R进制转化成10进制可以是小数,"); printf("其他转化只能转化正整数**********\n"); printf("***************************【输入 [-1 -1]"); printf(" 退出进制转换】************************\n"); } void print7() { system("cls"); printf("正在开启计算机的计算器程序.........\n"); printf("倒计时程序开启时间:\n"); printf(" ▓▓▓▓▓▓▓▓\n"); printf(" ▓▓▓▓▓▓▓▓\n"); printf(" ▓▓\n"); printf(" ▓▓\n"); printf(" ▓▓\n"); printf(" ▓▓\n"); printf(" ▓▓▓▓▓▓▓▓\n"); printf(" ▓▓▓▓▓▓▓▓\n"); printf(" ▓▓\n"); printf(" ▓▓\n"); printf(" ▓▓\n"); printf(" ▓▓\n"); printf(" ▓▓▓▓▓▓▓▓\n"); printf(" ▓▓▓▓▓▓▓▓\n"); Sleep(600);//使用Sleep函数实现倒计时的时间差。 system("cls"); printf("正在开启计算机的计算器程序.........\n"); printf("倒计时程序开启时间:\n"); printf(" ▓▓▓▓▓▓▓▓\n"); printf(" ▓▓▓▓▓▓▓▓\n"); printf(" ▓▓\n"); printf(" ▓▓\n"); printf(" ▓▓\n"); printf(" ▓▓\n"); printf(" ▓▓▓▓▓▓▓▓\n"); printf(" ▓▓▓▓▓▓▓▓\n"); printf(" ▓▓\n"); printf(" ▓▓\n"); printf(" ▓▓\n"); printf(" ▓▓\n"); printf(" ▓▓▓▓▓▓▓▓\n"); printf(" ▓▓▓▓▓▓▓▓\n"); Sleep(600); system("cls"); printf("正在开启计算机的计算器程序.........\n"); printf("倒计时程序开启时间:\n"); printf(" ▅▆▓▓\n"); printf(" ▓▓\n"); printf(" ▓▓\n"); printf(" ▓▓\n"); printf(" ▓▓\n"); printf(" ▓▓\n"); printf(" ▓▓\n"); printf(" ▓▓\n"); printf(" ▓▓\n"); printf(" ▓▓\n"); printf(" ▓▓\n"); printf(" ▓▓\n"); printf(" ▓▓\n"); printf(" ▓▓▓▓▓▓\n"); printf(" ▓▓▓▓▓▓\n"); Sleep(600); } /* //将数字的字符数组转化成double型常数 double change(char s[]) { int i; double sum; int l; int point_x; sum=0; point_x=0; l=strlen(s); while(s[point_x]!='.'&&point_x<l) { point_x++; } if(point_x==l-1) point_x=l; for(i=point_x-1;i>=0;i--) { sum=sum*10+(s[i]-'0'); } for(i=point_x+1;i<l;i++) { sum=sum+(s[i]-'0')*0.1; } return sum; } */