XX大学
C++上机实验报告(一)
学 院:XX学院
班 级:XXX
姓 名:XXX
学 号:1111111
指导老师:XXX
日 期:年月日
实验三 类的定义和使用
一.实验目的
1.掌握类的概念、类的定义格式、类与结构的关系、类的成员属性和类的封装性;
2.掌握类对象的定义;
3.理解类的成员的访问控制的含义,公有、私有和保护成员的区别;
4.掌握构造函数和析构函数的含义与作用、定义方式和实现,能够根据要求正确定义和重载构造函数。能够根据给定的要求定义类并实现类的成员函数;
5.掌握友元函数的含义,友元函数和成员函数的区别。
二.实验内容及要求
1、定义一个圆类,计算圆的面积和周长。
要求:分别用成员函数和友元函数来求圆的面积和周长。
2、定义一个学生类,其中有3个数据成员有学号、姓名、年龄,以及若干成员函数。同时编写主函数使用这个类,实现对学生数据的赋值和输出。
要求:
1)使用成员函数实现对输出的输入、输出;
2)使用构造函数和析构函数实现对数据的输入、输出。
3、定义日期类型Date。要求有以下面成员:
1)可以设置日期;
2)日期加一天操作;
3)输入函数,输入格式为“XXXX年XX月XX日”。
三.实验要求
1)写出程序,并调试程序,要给出测试数据和实验结果。
2)整理上机步骤,总结经验和体会。
3)完成实验日志和上交程序。
四.算法思想
1.圆类
程序中,用Circle构造函数和Length友元函数分别计算圆的的面积和周长。再通过主函数调用:
Date d;
cout<<"请输入圆半径r:";
cin>>m;
Circle p(m);
Length(p);
实现输入半径r并输出相关计算值。
2.学生类
根据要求分别用构造函数Student(double n,int o,char c[50])和析构函数~Student(),实现学生信息的录入与输出。
于是,当在主程序中,定义学生类Student s(n,o,c)是调用构造函数录入信息,所在作用范围结束时,系统会自动调用析构函数输出信息。
同时外加for循环操作以实现学生信息的多次录入。
3.日期类
根据要求,分别再类中定义以下成员函数实现相应功能:
void Set(int y,int m,int d); //设置时间
void Add(); //日期加一
int Print(); //输出当前日期(年/月/日)
int Isleapyear(); //判断是否为闰年
private: //私有成员
int year,month,day;
其中,比较困难的部分是“日期加一”函数,它需要调用其他的成员函数(如判断闰年函数),同时由于,每个月的日期没有规律,因此只能一一分情况讨论,因此很自然想到利用switch语句。另外,2月份十分特殊,应拿出来单独先讨论。
思路如下:
1. 先建立外部大循环:2月和非2月
2. 2月中:
先判断是否为闰年:若为闰年,则29号为上限,否则28号是上限。到达上限的日期,month+=1,day=1。
3. 非2月中:
类似2月,不用判断闰年,直接根据月末30号,31号和<30号三种情况讨论即可,中间用switch语句,分月份讨论即可。
五.源程序代码
#include<iostream.h>
#include <stdlib.h>
class Circle //1.定义圆类
{
public:
Circle(double x);
friend double Length(Circle &a);
private:
double r;
};
Circle::Circle(double x)
{
r=x;
cout<<"圆的面积为:"<<3.14*r*r<<endl;
}
double Length(Circle &a)
{
cout<<"圆的周长为:"<<a.r*2*3.14<<endl;
return 1;
}
class Student //2.定义学生类
{
public:
Student(double n,int o,char c[50]);
~Student();
private:
int old;
double number;
char name[50];
};
Student::Student(double n,int o,char c[50])
{
number=n;
old=o;
for(int i=0;i<50;i++)
{
name[i]=c[i];
}
}
Student::~Student()
{
cout<<"该生姓名/学号/年龄依次为:"<<name<<' '<<number<<' '<<old<<endl;
}
class Date //3.定义日期类
{
public:
void Set(int y,int m,int d);
void Add();
int Print();
int Isleapyear();
private:
int year,month,day;
};
void Date::Set(int y,int m,int d)
{
year=y;
month=m;
day=d;
}
int Date::Print()
{
cout<<year<<"年"<<month<<"月"<<day<<"日"<<endl;
return 1;
}
int Date::Isleapyear()
{
if((year%4==0&&year%100!=0)||(year%400==0))
{
cout<<"设置时间是闰年!"<<endl;
return 1;
}
else
{
cout<<"设置时间不是闰年!"<<endl;
return 0;
}
}
void Date::Add()
{
if(month==2) //二月最特殊,先拿出来单独考虑
{
if(Isleapyear()==1)
{
if(day==29)
{
month+=1;
day=1;
}
else if(day>29)
{
cout<<"输入错误!"<<endl;
exit(1);
}
else if(day<29)
day+=1;
}
else
{
if(day==28)
{
month+=1;
day=1;
}
else if(day>28)
{
cout<<"输入错误!"<<endl;
exit(1);
}
else if(day<28)
day+=1;
}
}
else
{
if(day==30) //月末特殊,拿出来单独考虑,先考虑30号
{
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
day+=1;
break;
case 4:
case 6:
case 9:
case 11:
month+=1;
day=1;
break;
default:
{
cout<<"输入错误!"<<endl;
exit(1);
}
}
}
else if(day==31) //再考虑31号
{
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
month+=1;
day=1;
break;
case 4:
case 6:
case 9:
case 11:
cout<<"输入错误!"<<endl;
exit(1);
break;
default:
cout<<"输入错误!"<<endl;
exit(1);
}
}
else if((day>30)||(day<0)||(month<0)||(year<0)) //考虑不实际情况
{
cout<<"输入错误!"<<endl;
exit(1);
}
else if(day<30) //最后剩下的情况统一定义
day+=1;
}
}
void main() //主函数
{
double m=0;
int i=0;
int t=0;
double n;
int o;
int a,b,q;
int w=0;
Date d;
cout<<"请输入圆半径r:";
cin>>m;
Circle p(m);
Length(p);
for(;i!=8;)
{
cout<<"欢迎进入,日期设置系统!请输入选择:(输入8结束程序,其余数字继续)"<<endl;
cin>>i;
if(i==8) break;
cout<<"请设置年/月/日:";
cin>>a>>b>>q;
d.Set(a,b,q);
cout<<"设置的时间为:";
d.Print();
d.Add();
cout<<"日期加一后时间为:";
d.Print();
}
for(;t!=8;)
{
int n,o;
char c[50];
cout<<"欢迎进入,学生信息录入系统!请输入选择:(输入8结束程序,其余数字继续)";
cin>>t;
if (t==8)
{
cout<<"程序结束,谢谢!"<<endl;
exit(1);
}
cout<<"设置学生信息——请依次输入学生的姓名/学号/年龄:";
cin>>c>>n>>o;
Student s(n,o,c);
}
}
六.验证结果
六.心得与感想
这次上机实验的过程中,我遇到了许多困难。一方面,这说明了我的上机实践能力还需进一步加强;另一方面,我收到了老师和同学们的帮助。通过交流,我对自己的程序有了更加深刻的理解。同时,对于同一个问题的看法,大家的看法都不相同,在讨论中我们的交换了思想,开拓了思维,提升了技能。
总之,编程不仅考验的是耐心和细心,更是思维和方法。想要提高自己的编程能力,只有通过不断实践才能有进步。通过此次的上机实验,我收获颇丰,会争取下次更快更好地完成任务!
第二篇:C程序设计上机实验报告2
实验二用C语言编写简单程序
实验目的
1. 熟悉C语言编程环境VC++ 6.0,掌握运行一个C程序的基本步骤,包括编辑、编译、连接和运行;
2. 了解并学习简单的程序调试及单步调试方法,掌握简单C程序的查错方法。
3. 初步认识顺序、分支和循环程序设计;
4. 了解各种程序结构的特点,初步建立起程序设计的概念。
实验内容
1. 当n为152时,分别求出n的个位数字(digit1)、十位数字(digit2)和百位数字(digit3)的值。
输出结果如下:
整数152的个位数是2,十位数是5,百位数是1。
提示:n的个位数字digit1的值是n%10,十位数字digit2的值是(n/10) %10,百位数字digit3的值是n/100。
思考:如果n是一个四位数,如何求出它的每一位数字?
2. 编写程序,输入x,计算并输出下列分段函数f(x)的值(保留两位小数),请调用sqrt()函数求平方根,调用pow()函数求幂。
结果示例如下:
Enter x:10
f(10.00) = 3.16
3. 输入一个正整数n,计算1-2/3+3/5-4/7+5/9-6/11+…的前n项之和,输出时保留3位小数。(选做)
结果示例如下:
Enter n:2
sum = 0.333
结果分析及心得体会:
在实验中遇到的问题主要是定义字符型变量易混,以及结果小数点位数的保存。
解决方法:分清楚字符的定义类型。
Int 定义整型变量,用于存放整数;
Float 定义单精度浮点型变量,用于存放实数;
Double 定义双精度浮点型变量,用于存放实数。
保存时,注意路径以及类型。写循环语句时,顺序不要混乱,用数学函数时,要写头文件。
做题时,细心认真,注意小的细节,多多练习。
第一题
#include<stdio.h>
int main()
{
int n=152,digit1,digit2,digit3;
digit1=n%10;
digit2=(n/10)%10;
digit3=n/100;
printf("整数152的个位数是%d,十位数是%d,百位数是%d。\n",digit1,digit2,digit3);
return 0;
}
第二题
#include<stdio.h>
#include<math.h>
int main()
{
double y,x;
printf("Enter x:");
scanf("%lf",&x);
if(x<0)
y=pow((x+1),2)+2*x+1.0/x;
else
y=sqrt(x);
printf("f(%.2f)=%.2f\n",x,y);
return 0;
}
第三题
#include<stdio.h>
int main()
{
int i,n,flag=1;
double sum,a,b;
b=1;
printf("Enter n:");
scanf("%d",&n);
sum=0;
for(i=1;i<=n;i++)
{
a=flag*i;
sum=sum+a/b;
flag=-flag;
b=2*i+1;
}
printf("sum=%.3f\n",sum);
return 0;
}
工业工程11(2)班胡绘娜