西安交大C程序设计第七章作业.docx
《西安交大C程序设计第七章作业.docx》由会员分享,可在线阅读,更多相关《西安交大C程序设计第七章作业.docx(27页珍藏版)》请在冰豆网上搜索。
西安交大C程序设计第七章作业
西安交通大学实验报告
课程__计算机程序设计__实验名称_类与对象___第1页共18页
系别___________实验日期2014年5月2日
专业班级_____组别_____________实验报告日期2014年5月2日
姓名_________学号_**********_报告退发(订正、重做)
同组人_________________________________教师审批签字
一、实验目的
理解类与对象的概念,掌握类的定义方法和使用方法。
二、实验内容
(一)第一题:
定义一个Dog类,包含name、age、sex、weight等属性以及对这些属性操作的方法。
实现并测试这个类。
1.源程序代码:
#include
usingnamespacestd;
classDog//狗类
{
private:
//私有成员
charname[20];//字符型数组用于存储名字
intage;//年龄,整型数
charsex;//性别
doubleweight;//体重,定义为双精度型
public:
//公有成员
voidRegister(char*Name,intAge,charSex,doubleWeight);//输入函数
voidprint();//输出函数
};
voidDog:
:
Register(char*Name,intAge,charSex,doubleWeight)//输入函数,将各个参数导入到定义的类中相应元素
{
strcpy(name,Name);
age=Age;
sex=(Sex=='m'?
'm':
'f');
weight=Weight;
}
voidDog:
:
print()//输出函数
{
cout<<"名字:
"<"<"<"<}
intmain()
{
Dogdog1,dog2,dog;
charName1[20],Sex1,Name2[20],Sex2;
intAge1,Age2;
doubleWeight1,Weight2;
cout<<"请输入第一只小狗的名字、年龄、性别、体重:
\n";//信息录入
cin>>Name1>>Age1>>Sex1>>Weight1;
dog1.Register(Name1,Age1,Sex1,Weight1);
cout<<"请输入第二只小狗的名字、年龄、性别、体重:
\n";
cin>>Name2>>Age2>>Sex2>>Weight2;
dog2.Register(Name2,Age2,Sex2,Weight2);
cout<<"第一条狗的信息如下:
\n";//信息显示
dog1.print();
cout<<"第二条狗的信息如下:
\n";
dog2.print();
dog=dog1;//交换dog1和dog2的内容
dog1=dog2;
dog2=dog;
cout<<"二者交换以后信息为:
\n";//通过输出交换结果检验类的定义有作用
cout<<"第一条狗:
\n";
dog1.print();
cout<<"第二条狗:
\n";
dog2.print();
return0;
}
2.实验结果:
3.问题分析:
设计思路:
首先输入两个狗的信息,然后显示输入的信息,然后交换二者再次输出,通过再次输出的结果表明对其操作有效,从而表明类的定义是有效的。
(二)第二题:
设计并测试一个名为Ellipse的椭圆类,其属性为外接矩形的左上角与右下角两个点的坐标,并能计算出椭圆的面积。
1.源程序代码:
#include
#include
usingnamespacestd;
classEllipse//定义椭圆类
{
private:
doublex1,x2,y1,y2,S;
public:
voidRegister(doublea,doubleb,doublec,doubled);//输入函数
doublearea();//面积计算函数
voidfeedback();//输出函数
};
voidEllipse:
:
Register(doublea,doubleb,doublec,doubled)//输入函数
{
x1=a;
x2=c;
y1=b;
y2=d;
}
doubleEllipse:
:
area()//面积计算函数,用公式:
S=pi*a*b(a、b为半长轴、半短轴长)
{
S=3.1415*fabs(x1-x2)*fabs(y1-y2)/4;
returnS;//返回面积值
}
voidEllipse:
:
feedback()//输出函数,反馈输入值
{
cout<<"您输入的点的坐标为:
("<}
voidmain()
{
doublea,b,c,d;
cout<<"请依次输入外接矩形的两对角顶点的横纵坐标:
\n";
cin>>a>>b>>c>>d;
Ellipseellipse;
ellipse.Register(a,b,c,d);
ellipse.feedback();
cout<<"椭圆面积为:
"<}
2.实验结果:
(1)中心在原点:
(2)中心不在原点:
(三)第三题:
仿照Date类设计一个Time类,按照各种可能的格式输出时间。
1.源程序代码:
#include
usingnamespacestd;
classTime
{
inth,m,s;
public:
voidinit(int,int,int);//输入函数
voidprint_hms();//时分秒
voidprint_hsm();//时秒分
voidprint_msh();//分秒时
voidprint_mhs();//分时秒
voidprint_shm();//秒时分
voidprint_smh();//秒分时
};
voidTime:
:
init(inta,intb,intc)
{
h=(a>=0&&a<24)?
a:
0;
m=(b>=0&&b<60)?
b:
0;
s=(c>=0&&c<60)?
c:
0;
}
voidTime:
:
print_hms()
{
cout<<"时分秒:
"<}
voidTime:
:
print_hsm()
{
cout<<"时秒分:
"<}
voidTime:
:
print_msh()
{
cout<<"分秒时:
"<}
voidTime:
:
print_mhs()
{
cout<<"分时秒:
"<}
voidTime:
:
print_shm()
{
cout<<"秒时分:
"<
}
voidTime:
:
print_smh()
{
cout<<"秒分时:
"<
}
voidmain()
{
inta,b,c;
cout<<"请输入时间,按照时分秒格式:
";
cin>>a>>b>>c;
Timetime;
time.init(a,b,c);
time.print_hms();
time.print_hsm();
time.print_mhs();
time.print_msh();
time.print_shm();
time.print_smh();
}
2.实验结果:
对多种超出范围的情况进行了检测:
(1)正常输入:
(2)24点会被作为0点:
(3)分超过60:
(4)秒超过60:
(5)时超过24:
(四)实验题目四:
(必做题)设计定义一个三角形类,成员函数应有输入三角形初始数据函数、求三角形面积函数、输出面积函数。
并编写主函数加以测试。
1.程序源代码:
#include
usingnamespacestd;
classtriangle
{
doubleh,l,S;
public:
voidRegister(doublea,doubleb);//输入函数
intexamine();//检验是否合理的函数
voidarea();//计算面积
voidprint();//输出计算结果函数
};
voidtriangle:
:
Register(doublea,doubleb)
{
h=a;
l=b;
}
inttriangle:
:
examine()
{
if(h<=0||l<=0)
return0;
return1;
}
voidtriangle:
:
area()
{
S=h*l/2;
}
voidtriangle:
:
print()
{
cout<<"面积为:
"<
}
intmain()
{
triangles;
doublea,b;
cout<<"请输入三角形的长和高:
";
cin>>a>>b;
s.Register(a,b);
while(s.examine()==0)
{
cout<<"输入有误,重新输入!
\n";
cin>>a>>b;
s.Register(a,b);
}
s.area();
s.print();
return0;
}
2.实验结果:
(1)输入有误时:
(2)输入合理:
五、第五题:
(必做题)定义一个二元一次方程组类,成员函数应有输入6个系数的函数、求二元一次方程组的根的函数,输出该方程组的函数,即输出格式如下:
AX+BY=C
DX+EY=F
并编写主函数加以测试。
1.源程序代码:
#include
usingnamespacestd;
classequation//定义方程类
{
doublea,b,c,d,e,f;
doublex,y;
public:
voidRegister(doubleA,doubleB,doubleC,doubleD,doubleE,doubleF);//输入函数
intexamine();//检验函数,检查系数是否能够确定唯一解
voidresult();//计算函数
voidprint();//输出函数
};
voidequation:
:
Register(doubleA,doubleB,doubleC,doubleD,doubleE,doubleF)
{
a=A;
b=B;
c=C;
d=D;
e=E;
f=F;
}
intequation:
:
examine()
{
if(a*e-b*d==0)
return0;
return1;
}
voidequation:
:
result()
{
x=(c*e-b*f)/(a*e-b*d);
y=(a*f-c*d)/(a*e-b*d);
}
voidequation:
:
print()
{
cout<<"计算结果为:
x="<}
intmain()
{
doubleA,B,C,D,E,F;
equationtest;
cout<<"请输入系数A,B,C,D,E,F:
\n";
cin>>A>>B>>C>>D>>E>>F;
test.Register(A,B,C,D,E,F);
while(test.examine()==0)//若系数不符合要求,提示重新输入
{
cout<<"输入错误,请重新输入:
\n";
cin>>A>>B>>C>>D>>E>>F;
test.Register(A,B,C,D,E,F);
}
test.result();
test.print();
return0;
}
2.实验结果:
(1)正常输入:
(2)输入有误:
六、第六题:
6、(必做题)定义一个计算器类,成员函数有加法、减法、除法、乘法、SIN(doublex)共5个功能性函数,当然还必须有初始化数据成员的函数、修改数据成员的函数、输出数据成员的函数。
并编写主函数加以测试。
1.源程序代码:
//6、(必做题)定义一个计算器类,成员函数有加法、减法、除法、乘法、SIN(doublex)共个功能性函数,
//当然还必须有初始化数据成员的函数、修改数据成员的函数、输出数据成员的函数。
并编写主函数加以测试。
#include
#include
usingnamespacestd;
classcalculate
{
private:
doublea,b,s;
public:
voidRegister(doublex,doubley);
voidplus();
voidminus();
voidchufa();
voidchengfa();
voidSIN();
voidprint();
};
voidcalculate:
:
Register(doublex,doubley)
{
a=x;
b=y;
}
voidcalculate:
:
plus()
{
s=a+b;
}
voidcalculate:
:
minus()
{
s=a-b;
}
voidcalculate:
:
chufa()
{
s=a/b;
}
voidcalculate:
:
chengfa()
{
s=a*b;
}
voidcalculate:
:
SIN()
{
s=sin(a);
}
voidcalculate:
:
print()
{
cout<
}
intmain()
{
charm;
doublex,y;
cout<<"输入x:
";
cin>>x;
cout<<"输入y:
";
cin>>y;
calculatecal;
cal.Register(x,y);
cout<<"请输入要进行的计算类型:
\n";
cin>>m;
switch(m)
{
case'+':
cal.plus();
break;
case'-':
cal.minus();
break;
case'*':
cal.chengfa();
break;
case'/':
cal.chufa();
break;
case's':
cal.SIN();
break;
default:
cout<<"ERROR!
!
\n";
break;
}
cal.print();
return0;
}
2.实验结果:
(1)加法:
(2)减法:
(3)乘法:
(4)除法:
(5)sin:
(6)输入有误:
3.问题分析:
本程序的优点:
①能够实现对计算类型的选择;
②对于输入不符合要求的能够输出error并结束程序;
③对sin的计算,能够实现与直接计算进行对比以检测是否正确。
七、第七题:
(选做题)设计定义100位的十进制正整数类,成员函数至少应有输入初始数据函数、加法函数和输出函数,并编写主函数加以测试。
(提示:
在类中定义int num[100]。
输入一个大正整数字符串,如"23112333298789876559998",再将该字符串转换成大整数放入num数组中)
1.源程序代码:
#include
#include
usingnamespacestd;
classnumber//定义number类
{
intnum[100];//私有成员整型数组
intl;//整型数l,为输入的字符的长度
public:
//公有成员
voidRegister(chara[100]);//用于将输入的字符转换为整型数组元素并储存的函数
voidplus(charb[100]);//加法函数,将b所储存的数加到a上
voidprint();//输出函数
};
voidnumber:
:
Register(chara[100])//转换函数
{
inti;
l=strlen(a);
for(i=0;i{
num[l-i-1]=a[i]-'0';
}
}
voidnumber:
:
plus(charb[100])//加法函数
{
inti;
intnumb[100];
intlb=strlen(b);
for(i=0;i{
numb[lb-i-1]=b[i]-'0';
}
if(l>lb)
{
for(i=lb;inumb[i]=0;
}
if(l{
for(i=l;inum[i]=0;
}
num[l]=0;
numb[lb]=0;
intm=0;
for(i=0;i<=l||i<=lb;i++)
{
num[i]=num[i]+numb[i]+m;
m=num[i]/10;
num[i]=num[i]%10;
}
num[i]=m;
l++;
}
voidnumber:
:
print()//输出函数
{
inti=l-1;
while(num[i]==0)
i--;
for(;i>=0;i--)
cout<}
intmain()
{
numberw;
chara[100],b[100];
cout<<"输入正整数a:
\n";
cin>>a;
w.Register(a);//检验程序具有输入功能
cout<<"输入要加上的数b:
\n";
cin>>b;
cout<<"计算结果是:
\n";
w.plus(b);//程序具有加法功能
w.print();//程序具有输出功能
cout<return0;
}
2.实验结果:
(1)位数相同,不进位:
(2)位数不同,无进位:
(3)进位:
(4)开头含0:
(5)能处理长数字:
3.问题分析:
(1)需要解决的主要问题:
①将字符转换为数组储存下来,在储存的时候,为了便于解决进位的问题,故将其个位为num[0],以便在最高位置后再加元素。
②开头0的处理:
输出的时候将开头的0避开。
③进位的处理:
将低一位的两个对应数字以及上一个m加起来之后求其除以10的商,然后加到高位数字上;将所得的余数作为低位的结果。
④考虑到最高位位数会变化,所以将最高位之上的一位初始为0,若最后结果没有导致最高位进位,则由于是0,输出时被避开。
(2)不足:
仍有一些问题没有完善,存在一些漏洞。