西安交通大学实验报告
课程__计算机程序设计__实验名称_类与对象___第 1 页 共 18 页
系 别____ _____ __ 实 验 日 期 2014 年 5 月 2 日
专业班级__ ___组别_____________ 实 验 报 告 日 期 2014 年 5 月 2日 姓 名___ ______学号_2130405034_ 报 告 退 发 ( 订正 、 重做 ) 同 组 人_________________________________ 教 师 审 批 签 字
一、 实验目的
理解类与对象的概念,掌握类的定义方法和使用方法。 二、实验内容
(一)第一题:定义一个Dog类,包含name、age、sex、weight等属性以及对这些属性操作的方法。实现并测试这个类。 1.源程序代码:
#include private://私有成员 char name[20];//字符型数组用于存储名字 int age;//年龄,整型数 char sex;//性别 double weight;//体重,定义为双精度型 public://公有成员 void Register(char *Name,int Age,char Sex,double Weight);//输入函数 void print();//输出函数 }; void Dog::Register(char *Name, int Age, char Sex, double Weight)//输入函数,将各个参数导入到定义的类中相应元素 { strcpy(name,Name); age=Age; 精心整理 学习帮手 word完美格式 sex=(Sex=='m'?'m':'f'); weight=Weight; } void Dog::print()//输出函数 { cout<<\"名字:\"< Dog dog1,dog2,dog; char Name1[20],Sex1,Name2[20],Sex2; int Age1,Age2; double Weight1,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(); return 0; } 2.实验结果: 精心整理 学习帮手 word完美格式 3.问题分析: 设计思路: 首先输入两个狗的信息,然后显示输入的信息,然后交换二者再次输出,通过再次输出的结果表明对其操作有效,从而表明类的定义是有效的。 (二)第二题:设计并测试一个名为Ellipse的椭圆类,其属性为外接矩形的左上角与右下角两个点的坐标,并能计算出椭圆的面积。 1.源程序代码: #include using namespace std; class Ellipse//定义椭圆类 { private: double x1,x2,y1,y2,S; public: 精心整理 学习帮手 word完美格式 void Register(double a,double b,double c,double d);//输入函数 double area();//面积计算函数 void feedback();//输出函数 }; void Ellipse::Register(double a,double b,double c,double d)//输入函数 { x1=a; x2=c; y1=b; y2=d; } double Ellipse::area()//面积计算函数,用公式:S=pi*a*b(a、b为半长轴、半短轴长) { S=3.1415*fabs(x1-x2)*fabs(y1-y2)/4; return S;//返回面积值 } void Ellipse::feedback()//输出函数,反馈输入值 { cout<<\"您输入的点的坐标为:(\"< double a,b,c,d; cout<<\"请依次输入外接矩形的两对角顶点的横纵坐标:\\n\"; cin>>a>>b>>c>>d; Ellipse ellipse; ellipse.Register(a,b,c,d); ellipse.feedback(); cout<<\"椭圆面积为:\"< 精心整理 学习帮手 word完美格式 (2)中心不在原点: (三)第三题:仿照Date类设计一个Time类,按照各种可能的格式输出时间。 1.源程序代码: #include int h,m,s; public: void init(int,int,int);//输入函数 void print_hms();//时分秒 void print_hsm();//时秒分 void print_msh();//分秒时 void print_mhs();//分时秒 void print_shm();//秒时分 void print_smh();//秒分时 精心整理 学习帮手 word完美格式 }; void Time::init(int a,int b,int c) { h=(a>=0&&a<24)?a:0; m=(b>=0&&b<60)?b:0; s=(c>=0&&c<60)?c:0; } void Time::print_hms() { cout<<\"时分秒:\"< cout<<\"时秒分:\"< cout<<\"分秒时:\"< cout<<\"分时秒:\"< cout<<\"秒时分:\"< cout<<\"秒分时:\"< int a,b,c; cout<<\"请输入时间,按照时分秒格式:\"; cin>>a>>b>>c; Time time; time.init(a,b,c); time.print_hms(); time.print_hsm(); time.print_mhs(); time.print_msh(); time.print_shm(); time.print_smh(); 精心整理 学习帮手 word完美格式 } 2.实验结果:对多种超出范围的情况进行了检测: (1)正常输入: (2)24点会被作为0点: (3)分超过60: 精心整理 学习帮手 word完美格式 (4)秒超过60: (5)时超过24: 精心整理 学习帮手 word完美格式 (四)实验题目四:(必做题)设计定义一个三角形类,成员函数应有输入三角形初始数据函数、求三角形面积函数、输出面积函数。并编写主函数加以测试。 1.程序源代码: #include double h,l,S; public: void Register(double a,double b);//输入函数 int examine();//检验是否合理的函数 void area();//计算面积 void print();//输出计算结果函数 }; void triangle::Register(double a,double b) { h=a; l=b; } int triangle::examine() { if(h<=0||l<=0) return 0; return 1; } 精心整理 学习帮手 word完美格式 void triangle::area() { S=h*l/2; } void triangle::print() { cout<<\"面积为:\"< triangle s; double a,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(); return 0; } 2.实验结果: (1)输入有误时: (2)输入合理: 精心整理 学习帮手 word完美格式 五、第五题: (必做题)定义一个二元一次方程组类,成员函数应有输入6个系数的函数、求二元一次方程组的根的函数,输出该方程组的函数,即输出格式如下: AX + BY = C DX + EY = F 并编写主函数加以测试。 1.源程序代码: #include class equation//定义方程类 { double a,b,c,d,e,f; double x,y; public: void Register(double A,double B,double C,double D,double E,double F);//输入函数 int examine();//检验函数,检查系数是否能够确定唯一解 void result();//计算函数 void print();//输出函数 }; void equation::Register(double A,double B,double C,double D,double E,double F) { 精心整理 学习帮手 word完美格式 a=A; b=B; c=C; d=D; e=E; f=F; } int equation::examine() { if(a*e-b*d==0) return 0; return 1; } void equation::result() { x=(c*e-b*f)/(a*e-b*d); y=(a*f-c*d)/(a*e-b*d); } void equation::print() { cout<<\"计算结果为:x=\"< double A,B,C,D,E,F; equation test; 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(); return 0; } 2.实验结果: (1)正常输入: 精心整理 学习帮手 word完美格式 (2)输入有误: 六、第六题:6、(必做题)定义一个计算器类,成员函数有加法、减法、除法、乘法、SIN(double x)共5个功能性函数,当然还必须有初始化数据成员的函数、修改数据成员的函数、输出数据成员的函数。并编写主函数加以测试。 1.源程序代码: //6、(必做题)定义一个计算器类,成员函数有加法、减法、除法、乘法、SIN(double x)共个功能性函数, //当然还必须有初始化数据成员的函数、修改数据成员的函数、输出数据成员的函数。并编写主函数加以测试。 #include using namespace std; class calculate { private: double a,b,s; public: 精心整理 学习帮手 word完美格式 void Register(double x,double y); void plus(); void minus(); void chufa(); void chengfa(); void SIN(); void print(); }; void calculate::Register(double x,double y) { a=x; b=y; } void calculate::plus() { s=a+b; } void calculate::minus() { s=a-b; } void calculate::chufa() { s=a/b; } void calculate::chengfa() { s=a*b; } void calculate::SIN() { s=sin(a); } void calculate::print() { cout< char m; double x,y; cout<<\"输入x:\"; cin>>x; cout<<\"输入y:\"; 精心整理 学习帮手 word完美格式 } cin>>y; calculate cal; 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(); return 0; 2.实验结果: (1)加法: (2)减法: 精心整理 学习帮手 word完美格式 (3)乘法: (4)除法: (5)sin: 精心整理 学习帮手 word完美格式 (6)输入有误: 3.问题分析: 本程序的优点:①能够实现对计算类型的选择; ②对于输入不符合要求的能够输出error并结束程序; ③对sin的计算,能够实现与直接计算进行对比以检测是否正确。 七、第七题:(选做题)设计定义100位的十进制正整数类,成员函数至少应有输入初始数据函数、加法函数和输出函数,并编写主函数加以测试。(提示:在类中定义int num[100]。输入一个大正整数字符串,如\"23112333298789876559998\",再将该字符串转换成大整数放入num数组中) 1.源程序代码: 精心整理 学习帮手 word完美格式 #include using namespace std; class number//定义number类 { int num[100];//私有成员整型数组 int l;//整型数l,为输入的字符的长度 public://公有成员 void Register(char a[100]);//用于将输入的字符转换为整型数组元素并储存的函数 void plus(char b[100]);//加法函数,将b所储存的数加到a上 void print();//输出函数 }; void number::Register(char a[100])//转换函数 { int i; l=strlen(a); for(i=0;i void number::plus(char b[100])//加法函数 { int i; int numb[100]; int lb=strlen(b); for(i=0;i if(l>lb) { for(i=lb;i 精心整理 学习帮手 word完美格式 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++; } void number::print()//输出函数 { int i=l-1; while(num[i]==0) i--; for(;i>=0;i--) cout< number w; char a[100],b[100]; cout<<\"输入正整数a:\\n\"; cin>>a; w.Register(a);//检验程序具有输入功能 cout<<\"输入要加上的数b:\\n\"; cin>>b; cout<<\"计算结果是:\\n\"; w.plus(b);//程序具有加法功能 w.print();//程序具有输出功能 cout< (1)位数相同,不进位: 精心整理 学习帮手 word完美格式 (2)位数不同,无进位: (3)进位: 精心整理 学习帮手 word完美格式 (4)开头含0: (5)能处理长数字: 精心整理 学习帮手 word完美格式 3.问题分析: (1)需要解决的主要问题: ①将字符转换为数组储存下来,在储存的时候,为了便于解决进位的问题,故将其个位为num[0],以便在最高位置后再加元素。 ②开头0的处理:输出的时候将开头的0避开。 ③进位的处理:将低一位的两个对应数字以及上一个m加起来之后求其除以10的商,然后加到高位数字上;将所得的余数作为低位的结果。 ④考虑到最高位位数会变化,所以将最高位之上的一位初始为0,若最后结果没有导致最高位进位,则由于是0,输出时被避开。 (2)不足:仍有一些问题没有完善,存在一些漏洞。 精心整理 学习帮手 因篇幅问题不能全部显示,请点此查看更多更全内容void Time::print_smh() {void main() {int main() {int main() {numb[lb-i-1]=b[i]-'0'; }
for(i=l;i