C语言简易计算器

本人的一个简单的作品(学校作业),第一次发文,由于本人水平不足,所以未加过多注释,好多地方也达不到最好请大家多多指正。

简易计算器,可以进行简单的加减乘除运算,也可以进行矩阵的复杂运算(如矩阵和差,求逆矩阵等)和三角函数的计算等。

源代码如下:

#define M 20
#define N 20
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <malloc.h>
void jianyimenu();
void juzhenmenu();
void sanjiaohanshumenu();
void twodimesionalarray();
void nijuzhen();
void shuchengjuzhen();
void zhuanzhijuzhen();
void shangsanjiaohua();
void sinhanshu();
void coshanshu();
void tanhanshu();
int main()
{
    while(1)
    {
        int xuanxiang;
        printf("--------------------------------\n");
        printf("*      欢迎使用科学计算器      *\n");
        printf("--------------------------------\n");
        printf("*     请选择你想使用的功能:    *\n");
        printf("*      1 简易功能计算器        *\n");
        printf("*      2 矩阵计算器            *\n");
        printf("*      3 三角函数计算器        *\n");
        printf("*      4 退出程序              *\n");
        printf("--------------------------------\n");
        printf("请输入选项:");
        scanf("%d",&xuanxiang);
        switch(xuanxiang)
        {
            case 1:
            {
                jianyimenu();
                break;
            }
            case 2:
            {
                juzhenmenu();
                break;
            }
            case 3:
            {
                sanjiaohanshumenu();
                break;
            }
            case 4:
                printf("----------感谢您使用本系统----------");
                exit(0);
            default:
                printf("\n-----选择错误,请重试-------\n");
                break;
        }
    }
}
void jianyimenu()
{
    int select;
    printf("--------------------------------\n");
    printf("*      欢迎使用简易计算器      *\n");
    printf("--------------------------------\n");
    printf("*     请选择你想使用的功能:    *\n");
    printf("*           1 加法             *\n");
    printf("*           2 减法             *\n");
    printf("*           3 乘法             *\n");
    printf("*           4 除法             *\n");
    printf("*           5 取模             *\n");
    printf("*           6 返回主菜单       *\n");
    printf("--------------------------------\n");
	printf("输入菜单项:\n");
	scanf("%d",&select);
	switch (select)
	{
	case 1:
		{
			float num1,num2;
			printf("做加法。\n");
			printf("输入两个数,逗号分隔。\n");
			scanf("%f,%f",&num1,&num2);
			printf("%.2f+%.2f=%.2f\n",num1,num2,num1+num2);
			break;
		}
	case 2:
		{
			float num1,num2;
			printf("做减法。\n");
			printf("输入两个数,逗号分隔。\n");
			scanf("%f,%f",&num1,&num2);
			printf("%.2f-%.2f=%.2f\n",num1,num2,num1-num2);
			break;
		}
	case 3:
		{
			float num1,num2;
			printf("做乘法。\n");
			printf("输入两个数,逗号分隔。\n");
			scanf("%f,%f",&num1,&num2);
			printf("%.2f*%.2f=%.2f\n",num1,num2,num1*num2);
			break;
		}
	case 4:
		{
			float num1,num2;
			printf("做除法。\n");
			printf("输入两个数,逗号分隔。\n");
			scanf("%f,%f",&num1,&num2);
			printf("%.2f/%.2f=%.2f\n",num1,num2,num1/num2);
			break;
		}
	case 5:
		{
			float num1,num2;
			printf("取模运算。\n");
			printf("输入两个数,逗号分隔。\n");
			scanf("%f,%f",&num1,&num2);
			printf("%.2f%%%.2f=%.2f\n",num1,num2,fmod(num1,num2));
			break;
		}
    case 6:
        {
            break;
        }
	}
	return 0;
}
void juzhenmenu()
{
    int select;
    printf("--------------------------------\n");
    printf("*      欢迎使用矩阵计算器      *\n");
    printf("--------------------------------\n");
    printf("*     请选择你想使用的功能:    *\n");
    printf("*      1 求逆矩阵              *\n");
    printf("*      2 二维矩阵的和差计算    *\n");
    printf("*      3 矩阵的上三角化        *\n");
    printf("*      4 数乘矩阵              *\n");
    printf("*      5 转置矩阵              *\n");
    printf("*      6 返回主菜单            *\n");
    printf("--------------------------------\n");
	printf("输入菜单项:\n");
	scanf("%d",&select);
	switch (select)
	{
    case 1:
    {
        nijuzhen();
        break;
    }
	case 2:
	    {
	        twodimesionalarray();
	        break;
	    }
    case 3:
		{
		    shangsanjiaohua();
		    break;
		}
    case 4:
        {
            shuchengjuzhen();
            break;
        }
    case 5:
        {
            zhuanzhijuzhen();
            break;
        }
    case 6:
        {
            break;
        }
	}
	return 0;
}
void nijuzhen()
{
    float A[M][N];
    float B[M][N];
    float C[M][N];
    int i,j,m,n,p,q;
    float y=1.0;
    float a[M][2*M];
    float b[N][2*N];
    float t,x;
    int k,T;
    printf("输入方阵的维数:\n"); //请输入方阵,即行和列相等的矩阵。
    scanf("%d",&T);
    printf("请输入矩阵:\n");
    for(i=0;i<T;i++)
        for (j=0;j<T;j++)
        {
            printf("第%d行第%d个数为: ",i+1,j+1);
            scanf("%f",&b[i][j]);
        }
    printf("原矩阵为:\n");
    for (i=0;i<T;i++)
    {
        for (j=0;j<T;j++)
            printf("%10.3f",b[i][j]);
        printf("\n");
    }
    for(i=0;i<T;i++)
        for(j=0;j<(2*T);j++)
        {
            if (j<T)
                a[i][j]=b[i][j];
            else if (j==T+i)
                a[i][j]=1.0;
            else
                a[i][j]=0.0;
        }
    for(i=0;i<T;i++)
    {
        for(k=0;k<T;k++)
        {
            if(k!=i)
            {
                t=a[k][i]/a[i][i];
                for(j=0;j<(2*T);j++)
                {
                    x=a[i][j]*t;
                    a[k][j]=a[k][j]-x;
                }
            }
        }
    }
    for(i=0;i<T;i++)
    {
        t=a[i][i];
        for(j=0;j<(2*T);j++)
            a[i][j]=a[i][j]/t;
    }
    for(i=0;i<T;i++)
        y=y*a[i][i];
    if(y==0)
        printf("对不起,您输入的矩阵没有逆矩阵,请重新输入。\n");
    else
    {
        for(i=0;i<T;i++)
            for(j=0;j<T;j++)
                b[i][j]=a[i][j+T];
        printf("逆矩阵为:\n");
        for (i=0;i<T;i++)
        {
            for (j=0;j<T;j++)
                printf("%10.3f",b[i][j]);
            printf("\n");
        }
    }
}

void twodimesionalarray()
{
    int i,j,k,P,Q;
    printf("\t\t矩阵的加减法运算\n");
    printf("请输入矩阵的行数");
	scanf("%d",&Q);
    printf("\n请输入矩阵的列数");
    scanf("%d",&P);
    system("cls");
	printf("\n请你输入矩阵A(%d行%d列)\n",P,Q);
	int A_1[P][Q],B_1[P][Q];
    for(i=0;i<P;i++)
    {
    	for(j=0;j<Q;j++)
    	{
    	    printf("第%d行第%d个数为:",i+1,j+1);
    	    scanf("%d",&A_1[i][j]);
    	}
	}
	printf("\n请你输入矩阵B(%d行%d列)\n",P,Q);
	for(i=0;i<P;i++)
    {
    	for(j=0;j<Q;j++)
    	{
    	    printf("第%d行第%d个数为:",i+1,j+1);
    	    scanf("%d",&B_1[i][j]);
    	}
    }
    printf("\n计算矩阵之和还是差(和:1/差:2)\n");
	scanf("%d",&k);
	while (k!=1&&k!=2)
	    {
	    	system("cls");
	    	printf("输入有误\n请输入(和:1/差:2)\n");
	    	scanf("%d",&k);
       }
       switch(k)
    	{
		case 1 :
		    printf("矩阵A和矩阵B之和为:\n");
            for(i=0;i<P;i++)
        {
    	    for(j=0;j<Q;j++)
    	    {
    		    A_1[i][j]+=B_1[i][j];
    		    printf("% d\t",A_1[i][j]);

	     	}
			printf("\n");
        }return 0;
        case 2:
        	printf("矩阵A和矩阵B之差为:\n");
            for(i=0;i<P;i++)
        {
    	    for(j=0;j<Q;j++)
    	    {
    		    A_1[i][j]-=B_1[i][j];
    		    printf("% d\t",A_1[i][j]);

	     	}
			printf("\n");

    	} return 0;
    	}
}
void shangsanjiaohua()
{
    float A[M][N];
    float B[M][N];
    float C[M][N];
    int i,j,n,p,q;
    float y=1.0;
    int k,v,hang,lie;
    double a[50][50], m;
    double b[50][50];  //定义可中途放置的地址
    double c[50][50] = { 0 }; //定义检查层的中途存放地址
    int num1, num2, num3, num4  ;//输入部分
    printf("请输入你想计算的行的个数:");
    scanf("%d", &hang);
    printf("请输入你想计算的列的个数:");
    scanf("%d", &lie);
    for (i = 0; i < hang; ++i)
    {
        printf("请输入第%d行元素:", i + 1);
        for (j = 0; j < lie; ++j)
            scanf("%lf", &a[i][j]);
    }
    //对角化部分
    for (k = 0; k < hang - 1; ++k)
    {
        for (i = k; i < hang - 1; ++i)
        {
            for (j = 0; j < lie; ++j)
            {
                //数组行交换
                if (a[k][k] == 0)
                {
                    for (num1 = k; num1 == k; ++num1)
                    {
                        for (num2 = 0; num2 < lie; ++num2)
                        {
                            c[num1][num2] = a[num1][num2];
                            a[num1][num2] = a[num1 + 1][num2];
                            a[num1 + 1][num2] = c[num1][num2];
                            for (v = 0; v < lie; ++v)
                                b[k][v] = a[k][v];
                        }
                    }
                }
                //矩阵换行结束
                m = a[i + 1][k] / (1.0*a[k][k]);
                b[i + 1][j] = a[i + 1][j] - (m)*a[k][j];
            }
        }
        //将寄存在b中的数据转到a中
        for (num3 = 1; num3 <= hang; ++num3)
            for (num4 = 0; num4 < lie; ++num4)
            {
                a[num3][num4] = b[num3][num4];
            }
    }
    //矩阵输出
    for (i = 0; i < hang; ++i)
    {
        {
            for (j = 0; j < lie; ++j)
                printf("%.2lf    ", a[i][j]);
        }
        printf("\n");
    }
}
void shuchengjuzhen()
{
    float A[M][N];
    float B[M][N];
    float C[M][N];
    int i,j,m,n,p,q;
    float y=1.0;
    float k;
    printf("请输入矩阵A的行数和列数(用空格隔开):");
    scanf("%d %d",&i,&j);
    printf("请输入矩阵A\n");
    for(p=0;p<i;p++)
        for(q=0;q<j;q++)
            scanf("%f",&A[p][q]);
    printf("输出矩阵A\n");
    for(p=0;p<i;p++)
        for(q=0;q<j;q++)
        {
            printf("%10.2f",A[p][q]);
            if((q+1)%j==0)
                printf("\n");
        }
    printf("请输入一个实数:\n");
    scanf("%f",&k);
    for(p=0;p<i;p++) //数乘矩阵
        for(q=0;q<j;q++)
            B[p][q]=k*A[p][q];
    printf("输出k乘矩阵A的结果\n");
    for(p=0;p<i;p++)
        for(q=0;q<j;q++)
        {
            printf("%10.2f",B[p][q]);
            if((q+1)%j==0)
                printf("\n");
        }
}
void zhuanzhijuzhen()
{
    float A[M][N];
    float B[M][N];
    float C[M][N];
    int i,j,m,n,p,q;
    float y=1.0;
    printf("请输入矩阵A的行数和列数(用空格隔开):");
    scanf("%d %d",&i,&j);
    printf("请输入矩阵A:\n");
    for(p=0;p<i;p++)
        for(q=0;q<j;q++)
            scanf("%f",&A[p][q]);
    printf("输出矩阵A\n");
    for(p=0;p<i;p++)
        for(q=0;q<j;q++)
        {
            printf("%10.2f",A[p][q]);
            if((q+1)%j==0)
                printf("\n");
        }
    for(p=0;p<i;p++) //转置
        for(q=0;q<j;q++)
            B[q][p]=A[p][q];
    printf("输出矩阵A的转置矩阵:\n");
    for(p=0;p<j;p++)
        for(q=0;q<i;q++)
        {
            printf("%10.2f",B[p][q]);
            if((q+1)%i==0)
                printf("\n");
        }
}
void sanjiaohanshumenu()
{
    int select;
    printf("--------------------------------\n");
    printf("*    欢迎使用三角函数计算器    *\n");
    printf("--------------------------------\n");
    printf("*     请选择你想使用的功能:    *\n");
    printf("*        1 求sin值             *\n");
    printf("*        2 求cos值             *\n");
    printf("*        3 求tan值             *\n");
    printf("*        4 返回主菜单          *\n");
    printf("--------------------------------\n");
	printf("输入菜单项:\n");
	scanf("%d",&select);
	switch(select)
	{
    case 1:
        {
            sinhanshu();
            break;
        }
    case 2:
        {
            coshanshu();
            break;
        }
    case 3:
        {
            tanhanshu();
            break;
        }
    case 4:
        {
            break;
        }
	}
}
void sinhanshu()
{
    const double Pi=3.14;
    double a,b;
    printf("请输入需要计算的角度:");
    scanf("%lf",&a);
    b=sin(a*(Pi/180));
    printf("所求的正弦值是:%lf\n",b);
}
void coshanshu()
{
    const double Pi=3.14;
    double a,b;
    printf("请输入需要计算的角度:");
    scanf("%lf",&a);
    b=cos(a*(Pi/180));
    printf("所求的余弦值是:%lf\n",b);
}
void tanhanshu()
{
    const double Pi=3.14;
    double a,b;
    printf("请输入需要计算的角度:");
    scanf("%lf",&a);
    b=tan(a*(Pi/180));
    printf("所求的正切值是:%lf\n",b);
}

感谢阅读,让我们一起加油~

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

misakaaaaaa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值