c语言课程设计

时间:2021-07-07 00:21:49

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;
}
*/