好家伙,3000字终于写完了
开发环境为Visual C++
目前已实现的功能:
(1)解二元一次方程、一元二次方程
(2)进行矩阵相加、相减、相乘运算
(3)进行三角函数、阶乘运算
缺点:其中阶乘运算功能只能算到16,由于使用工具Visual C++不支持ong long类型的编译
行数名称及其对应实现的功能
函数名称
对应功能
First
解二元一次方程
Second
解一元二次方程
Third
矩阵的相加
Fourth
矩阵的相减
Fifth
矩阵的相乘
Sixth
三角函数运算
seventh
阶乘的运算
程序流程:
2.解一元二次方程
2.解一元二次方程
3.矩阵的相加
4.矩阵的相减
5.矩阵的相乘
(6)三角函数的运算。
(7)阶乘的运算
1.(first)函数解二元一次方程
算法分析:
开始时,按照” ax+by=m cx+dy=n”的格式依次输入:a,b,n,c,d,m;
核心算法部分:
(按照公式计算出x,y的值)
x=(d*m-n*b)/(a*d-b*c);
y=(a*n-c*m)/(a*d-b*c);
随后输出x和y的值
测试样例:
输入:1 3 4 1 1 2
输出:x=1.0000 y=1.0000
2.(second)函数 解一元二次方程
核心算法部分:
(按照公式计算出两解的值)
首先判断: b*b-4*a*c是否大于等于0
若小于0,则输出”该方程无解”,
若等于0,则使用求根公式x1=(-b+sqrt(b*b-4*a*c))/(2*a);
若大于零,用求根公式求出该方程的解,
x1=(-b+sqrt(b*b-4*a*c))/(2*a);
x2=(-b-sqrt(b*b-4*a*c))/(2*a);
测试样例:
输入:1 4 4
输出: 该方程仅有一解x=-2.000
3. (third)函数
解一元二次方程
核心算法部分:
(按照公式计算出矩阵的值)
3.1.矩阵输入
for(f=1;f<=d;f++)
{
for(h=1;h<=e;h++)
{
printf("请输入第%d行第%d列的数字",f,h);
scanf("%d",&a[f][h]);
}
}
printf("请输入第二个矩阵行数和列数.\n");
scanf("%d%d",&j,&k);
printf("请输入矩阵中的数字:\n");
for(f=1;f<=j;f++)
{
for(h=1;h<=k;h++)
{
printf("请输入第%d行第%d列的数字",f,h);
scanf("%d",&b[f][h]);
}
}
在其中,a[][]对应第一个矩阵,b[][]对应第二个矩阵
3.2.矩阵相加:
if(d==j&&e==k)//矩阵中只有行数于列数相同时候才能运算
{
for(f=1;f<=d;f++)
{
for(h=1;h<=e;h++)
{
c[f][h]=a[f][h]+b[f][h];
printf("%4d",c[f][h]);
}
printf("\n");
}
}
测试样例:
输入:2 2\n2\n2\n2\n2\n2 2\n 2\n2\n2\n2\n
输出: 4 4
4 4
4. (fourth)函数 解一元二次方程
核心算法部分:
(按照公式计算出矩阵的值)
4.1.矩阵输入:
for(f=1;f<=d;f++)
{
for(h=1;h<=e;h++)
{
printf("请输入第%d行第%d列的数字",f,h);
scanf("%d",&a[f][h]);
}
}
printf("请输入第二个矩阵行数和列数.\n");
scanf("%d%d",&j,&k);
printf("请输入矩阵中的数字:\n");
for(f=1;f<=j;f++)
{
for(h=1;h<=k;h++)
{
printf("请输入第%d行第%d列的数字",f,h);
scanf("%d",&b[f][h]);
}
}
在其中,a[][]对应第一个矩阵,b[][]对应第二个矩阵
4.2.矩阵相减:
if(d==j&&e==k)//矩阵中只有行数于列数相同时候才能运算
{
for(f=0;f
{
for(h=0;h
{
c[f][h]=a[f][h]-b[f][h];
printf("%4d",c[f][h]);
}
printf("\n");
}
}
测试样例:
输入:2 2\n2\n2\n2\n2\n2 2\n 2\n2\n2\n2\n
输出: 0 0
0 0
5. (fifth)函数 矩阵的相乘
核心算法部分:
(按照公式计算出最终矩阵的值,其中d,e是第一个矩阵的行数和列数,j,k是第二个矩阵的行数和列数)
for(f=0;f
{
for(h=0;h
{
sum=0;
for(t=0;t
{
sum+=a[f][t]*b[t][h];
}
c[f][h]=sum;
}
算法分析:此处使用三个for循环,
第一层for循环控制第一个矩阵的行数(f),
第二层for循环控制控制第一个矩阵的列数和第二个矩阵的行数,(t)
第三个for循环控制第二个矩阵的列数,(h)
我们以矩阵(1 1 11) (1 1)两个矩阵的相乘为例,
(1 1 1 ) (2 2)
(1 1)
第一个矩阵的行为d,列为e,即2*3,
第二个矩阵的行为j,列为k,即3*2,
通过两个for循环将两个矩阵输入
for(f=0;f
{
for(h=0;h
{
printf("请输入第%d行第%d列的数字",f,h);
scanf("%d",&a[f][h]);
}
}
printf("请输入第二个矩阵行数和列数.\n");
scanf("%d%d",&j,&k);
printf("请输入矩阵中的数字:\n");
for(f=0;f
{
for(h=0;h
{
printf("请输入第%d行第%d列的数字",f,h);
scanf("%d",&b[f][h]);
}
}
随后,我们知道两个矩阵相乘的结果应该是一个2*2的矩阵,我们用c[0][0]表示其中的第一项,其余三项为c[0][1], c[1][0], c[1][1],
在第三层循环中,
for(t=0;t
{
sum+=a[f][t]*b[t][h];
}
k为3,所以我们把这个循环跑三次,通过t++,我们得以实现,
第一次循环: sum=sum+a[0][0]*b[0][0];即sum=0+1*1=1;
第二次循环: sum=sum+a[0][1]*b[1][0];即sum=2+1*2=3;
第三次循环: sum=sum+a[0][2]*b[2][0];即sum=3+11*1=14;
随后,跳出第三层循环,回到第二层循环,将sum的值赋给c[0][0],c[0][0]的计算就结束了,
以此类推可以得出c[0][1], c[1][0], c[1][1]的值,分别为14,4,4
最后我们使用两个for循环将其输出
for(f=0;f
{
for(h=0;h
{
printf("%6.2f",c[f][h]);
}
printf("\n");
}
结束,
测试样例:
输入:2 3\n 1\n 1\n 11\n 1\n 1\n 1\n
2 3\n 1\n 1\n 2\n 2\n 1\n 1\n
输出:14.00 14.00
4.00 4.00
6. (sixth)函数 三角函数运算
核心算法部分:
(按照公式计算出三角函数的值)
6.1.计算sin,cos,tan(输入值n为角度(如:90)):
s=sin(n*pi/180);
c=cos(n*pi/180);
t=tan(n*pi/180);
测试样例:
输入:90
输出: sin90=1.00
cos90=0.00
tan90 不存在
7. (seventh)函数 阶乘的运算
核心算法部分:
(按照公式计算出 的值)
7.1.阶乘计算(输入值为b):
for(a=1;a<=b;a++)
{
sum*=a;
}
测试样例:
输入:10
输出: 计算的结果为:3628800
优点:程序简洁,业务逻辑合理,能够完成基本的功能,
困难:在编辑“矩阵乘法”这一算法时遇到困难,后在CSDN社区中进行搜索相关内容,并进行学习,最后实现该功能。
总结: 经过这段时间的课程学习和大作业的完成,我对计算机科学与技术有了更多的了解,从一个小白到了一个入门者。之前我们也学过编程语言(C),但是当时课程要求深入的并不多,学的只是表面,所以对编程语言掌握的仅是皮毛。因此,这次我便去深入了解语言。这次大作业,我选择了”四则运算器”题目,刚开始我们也并没有清楚的思路。于是,我开始构思本次大作业的代码结构,思考要实现的功能以及界面的布局。
在这期间,我主要在编写”矩阵相乘”函数时遇上了困难,在这过程中出现了好多问题,代码一直报错,计算也总是错误,最终在有的电脑上还一直运行不了,最终考虑到该功能的必要性必须将该功能实现,最终在多次的搜索和学习下,多次修正代码。虽然在这过程遇到了很多的挫折,而且最终没有达到预期的成果,但是这也让我对编程语言有了更深的了解。我想,在以后的学习过程中,无论学习什么,一定要多实践,实践了才能发现更多的错误,这样才能一点点进步。
写出自己编写该程序时阅读的书籍和出处
(1)
C语言设计(第五版) 谭浩强 清华大学出版社。
(2) CSDN社区博主L-阿烽
(1条消息) c语言矩阵的乘法_L-阿烽的博客-CSDN博客_c语言矩阵乘法
文章链接:https://blog.csdn.net/qq_46724903/article/details/105990859
(3) 百度一下以及百度百科
(4) 博客园社区
手机扫一扫
移动阅读更方便
你可能感兴趣的文章