return0;
}
【运行结果】
请输入两个整数:
10
16
10和16的最大公约数为:
2
10和16的最小公倍数为:
80
实习题目四
【需求规格说明】
求解一元二次方程。
一元二次方程的定义为:
ax2+bx+c=0
(1)如果b2-4ac>0,方程有两个不同的实根,分别是:
(2)如果b2-4ac<0,方程没有实根,但有虚根;
(3)如果b2-4ac=0,方程有一个实根。
请你编写一个程序,使其能求出多个二次方程的根。
该程序要询问用户是否想继续解下一个方程。
程序要求用户输入a,b和c,然后根据前面的条件计算,并输出答案。
要求:
使用类实现。
分析:
对于该题首要的就是依据题目的意思编写一个抽象类fangcheng,在该过程中要注意确定public和private,然后就是在主函数中定义一个对象访问类中的成员解决实际问题。
【算法设计】
(1)设计思想:
首先编写抽象类fangcheng,包含计算根的成员函数doublex1();
doublex2();在类fangcheng中另增加私有成员doublea,doubleb,doublec,
(2)设计表示:
【调试报告】
通过类实现了值的输出,过程更明了,更简化。
【附录】
#if!
defined(AFX_FANGCHENG_H__028ED53E_68A4_497A_8190_726704CCE047__INCLUDED_)
#defineAFX_FANGCHENG_H__028ED53E_68A4_497A_8190_726704CCE047__INCLUDED_
#if_MSC_VER>1000
#pragmaonce
#endif//_MSC_VER>1000
classfangcheng//定义一个方程类
{
public:
fangcheng(doublea,doubleb,doublec);
virtual~fangcheng();
doublex1();
doublex2();
private:
doublem_a;
doublem_b;
doublem_c;
};
#include"stdafx.h"
#include"fangcheng.h"
#include
fangcheng:
:
fangcheng(doublea,doubleb,doublec)
{
m_a=a;
m_b=b;
m_c=c;
}
fangcheng:
:
~fangcheng()
{
}
doublefangcheng:
:
x1()
{
doublem_x1;
m_x1=(-m_b+sqrt(m_b*m_b-4*m_a*m_c))/(2*m_a);//方程解的求解公式
returnm_x1;
}
doublefangcheng:
:
x2()
{
doublem_x2;
m_x2=(-m_b-sqrt(m_b*m_b-4*m_a*m_c))/(2*m_a);
returnm_x2;
}
#include"stdafx.h"
#include
#include"fangcheng.h"
usingnamespacestd;
intmain()
{
inta,b,c;
cout<<"請輸入abc的值"<cin>>a;//输入参数
cin>>b;
cin>>c;
if(b*b-4*a*c>=0)//有实数解
{
fangchengzhi(a,b,c);//定义一个类,并将参数值传入函数当中
cout<<“.x1=”<cout<<“.x2=”<}
if(b*b-4*a*c<0)//无实数解
{
fangchengzhi(a,b,c);
cout<cout<}
return0;
}
#endif//!
defined(AFX_FANGCHENG_H__028ED53E_68A4_49
【运行结果】
请输入a,b,c的值
121
X1=-1
X2=-2
实习题目五
【需求规格说明】
设计程序,完成两个矩阵的乘法运算。
问题描述:
要实现矩阵的乘法,其关键就在于矩阵的内存的开辟以及乘法运算的实现
问题分析:
利用malloc函数或者new实现。
【算法设计】
(1)设计思想
利用两个双指针分别申请两个二维数组的空间,代表需要计算的两个矩阵,然后用户分别输入第一个矩阵的行和列,第二个矩阵的列数(其行数等于第一个矩阵的列数);然后利用for循环逐个输入第一第二个矩阵的数据,再构造一个双指针代表结果的矩阵,根据矩阵乘法的运算规律,求出结果并输出。
(2)设计表示:
(<五号,宋体>,具体内容:
子模块(过程或函数)的规格说明、关系图(描述类与类之间的关系图、各功能模块之间的关系图等)。
)
【调试报告】
问题的关键在于申请内存的操作,这里有两种方法可实现这个问题,一种是利用new,通过new数组的行数和列数所占的内存来实现。
另一种是利用malloc函数,其大致用法和new差不多。
【附录】
源程序(利用malloc函数):
#include
#include/*malloc函数的函数头*/
#include
usingnamespacestd;
intmain()
{
intm,n,g;
inti,j,k;
cout<<"请输入第一个矩阵的行数和列数"<cin>>m>>n;
cout<<"请输入第二个矩阵的列数(其行数和第一个矩阵的列数相等)"<cin>>g;
double**a;
a=(double**)malloc(m*sizeof(double*));/*这句是动态定义二维数组的行数。
*/
for(i=0;i{
a[i]=(double*)malloc(g*sizeof(double));/*这句是动态定义二维数组的列数。
*/
}
cout<<"请输入第一个矩阵的元素"<for(i=0;i{
for(j=0;j{
cin>>a[i][j];
}
}
double**b;
b=(double**)malloc(g*sizeof(double*));/*同上*/
for(i=0;i{
b[i]=(double*)malloc(n*sizeof(double));/*同上*/
}
cout<<"请输入第二个矩阵的元素"<for(i=0;i{
for(j=0;j{
cin>>b[i][j];
}
}
double**result;/*存放计算结果的二维数组*/
result=(double**)malloc(m*sizeof(double*));
for(i=0;i{
result[i]=(double*)malloc(n*sizeof(double));
}
for(i=0;i{
for(j=0;j{
result[i][j]=0;/*初始化为0*/
}
}
for(i=0;i{
for(j=0;j{
for(k=0;k{
result[i][j]+=a[i][k]*b[k][j];
}
}
}
cout<<"结果是"<for(i=0;i{
for(j=0;j{
cout<if(j==n-1)
cout<}
}
return0;
}
源程序(利用new):
#include
usingnamespacestd;
intmain()
{
intm,n,g;
inti,j,k;
cout<<"请输入第一个矩阵的行数和列数";
cin>>m>>n;
cout<<"请输入第二个矩阵的列数(其行数和第一个矩阵的列数相等)";
cin>>g;
double**a;
a=newdouble*[m];
for(i=0;i{
a[i]=newdouble[n];
}
double**b;
b=newdouble*[n];
for(i=0;i{
b[i]=newdouble[g];
}
cout<<"请输入第一个矩阵的元素"<for(i=0;i{
for(j=0;j{
cin>>a[i][j];
}
}
cout<<"请输入第二个矩阵的元素"<for(i=0;i{
for(j=0;j{
cin>>b[i][j];
}
}
double**result;
result=newdouble*[m];
for(i=0;i{
result[i]=newdouble[m];
}
for(i=0;i{
for(j=0;j{
result[i][j]=0;
}
}
for(i=0;i{
for(j=0;j{
for(k=0;k{
result[i][j]+=a[i][k]*b[k][j];
}
}
}
for(i=0;i{
for(j=0;j{
cout<if(j==g-1)
cout<}
}
return0;
}
【运行结果】
请输入第一个矩阵的行数和列数2
2
请输入第二个矩阵的列数
2
请输入第一个矩阵的元素
1
2
3
4
请输入第二个矩阵的元素
9
6
5
1
198
4722
Pressanykeytocontinue
总结
首先,第一个求素数的程序,我学会了利用sqrt()来判断素数,对for循环语句的使用与理解更近一层;其次,第三个程序就是辗转相除法:
设两个数m,n,假设m>=n,用m除以n,求得余数q。
若q为0,则m为最大公约数;若q不等于0,则进行如下迭代:
m=n,n=q,即原除数变为新的被除数,原余数变为新的除数重复算法,直到余数为0为止。
余数为0时的除数n,即为原始m、n的最大公约数。
学会了这个方法。
第三个学会了利用结构体输出和操作符重载。
要实现操作符重载就要使用操作符重载函数,操作符重载函数用关键字operator实现,其形式为:
返回类型operator操作符(参数列表){}。
操作符重载函数是一个函数,只不过这个函数的函数名为operator再加上后面要重载的操作符而已,比如要重载+号。
第四个就是学会了类的使用在主函数中从新定义一类,并把参数值赋进去,输出结果。
通过本次课程设计,我对本学期面向对象的程序设计C++中的部分内容有了更深刻的理解。
同时将理论知识也转化为实践。
在上机实习的过程中,我深刻理解了多实践的重要性,很多似懂非懂的东西也在实习过程中搞清楚了,这个过程让我受益匪浅。
我的收获主要是了解了函数的调用,参数的传递。
以及算法上的优化。
我收获很多同时也发现由于自己的概念不清,导致在调试中出现了很多错误。
但通过该进,有所纠正。
希望在以后学习计算机高级语言的路上能更顺利!
!