C++面向对象实验
C++对C的扩充
一、实验目的
1.掌握C++程序的基本格式与规范,学会编写简单的C++程序。
2.理解C++程序结构的特点。
3.熟悉C++程序基本的输入输出操作。
4.掌握C++数据类型常量和变量以及修饰符的使用方法。
5.掌握函数定义、函数调用和函数说明的方法。
6.熟悉作用域运算符的功能和基本使用方法。
7.掌握C++内存的动态分配和释放方法。
8.理解引用的概念,掌握引用的使用方法。
二、实验任务
1.编写一个简单程序,输出“Welcome you”,并给程序加一行注释“First C++ program”。
2.编制一个完整的包含输入与输出的简单C++程序。(只要一个主函数即可)
3.编制内置函数求解2X2+4X+5的值,X为整数,并用主函数调用该函数。
4.利用函数重载,重载上面的函数,X为浮点数。
5.编写一个C++程序,对—个整数数组求和,求和的结果使用全局变量sum存储,同时对整数中的奇数求和,结果使用局部变量sum存储,在主程序中将两个结果输出。本题要求体会和理解作用域运算符的概念与基本使用方法。
三、实验步骤
实验任务一:
#include <iostream>
using namespace std;
int main()
{
cout<<"Welcome you";//First C++ program
return 0;
}
实验任务二:
#include <iostream>
#include <vector>//超int范围整数反转
using namespace std;
int main()
{
string a;
cin>>a;
vector<int> A;
for(int i = a.size()-1;i >= 0;i -- )A.push_back(a[i]-'0');
while(A.size()>1&&A.back()==0)A.pop_back();//去掉反转后前导零
for(int i = 0;i < a.size();i ++ )printf("%d",A[i]);
return 0;
}
实验任务三:
主函数:
主函数:
#include <iostream>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int getans(int x);
int main() {
int x;
cin>>x;
int y=getans(x);
cout<<y<<endl;
return 0;
}
求解函数:
int getans(int x)
{
int ans;
ans=2*x*x+4*x+5;
return ans;
}
实验项目四:
主函数:
主函数:
#include <iostream>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
double getans(double x);
int main() {
double x;
cin>>x;
double y=getans(x);
cout<<y<<endl;
return 0;
}
项目下求解函数:
double getans(double x)
{
double ans;
ans=2*x*x+4*x+5;
return ans;
}
实验项目五:
#include <iostream>
using namespace std;
int a[10]={0,1,2,3,4,5,6,7,8,9};
int sum=0;//全局变量
int main()
{
int sum = 0;//main函数当中的局部变量
for(int i = 0;i <= 9;i ++ )
{
::sum+=a[i];//::代表着全局变量累计所有数组数值求和
}
cout<<::sum<<endl;
for(int i = 0;i <= 9;i ++ )
{
if(a[i]&1)sum+=a[i];//局部变量奇数和
}
cout<<sum<<endl;
}
C++新特性
一、实验目的
- 理解C++提供的新的特性
- 掌握引用的含义
- 掌握const修饰的含义
- 初步掌握模板的作用
- 初步掌握new/delete的作用
- 掌握string的使用方法
二、实验任务
- 设计一个函数,使用new开辟10个整型大小的空间,输入10个整数,然后将输入的10个数排序输出,输出之后,使用delete将开辟的空间删除。
- 将上题中的函数模板化,要求可以接受输入10个浮点数,或10个字符串排序。
- 设计一个函数,能将输入的字符串倒置。例入输入的是“LIGHT”,输出“THGIL”。
- 设计一个函数int& count(char c),作用为统计一个字符串当中所有字符出现的个数(只考虑英文26个字符),比如在字符串“abcadad”中,字符a出现了3次,而字符b、c出现了1次,字符d出现了2次。其他的字符出现了0次。(提示,使count函数返回引用)。
三、实验步骤
#include <iostream>
#include <algorithm>
using namespace std;
void quick_sort(int q[],int l,int r)//快速排序
{
if(l>=r)return;
int x=q[l+r>>1],i=l-1,j=r+1;
while(i<j)
{
do i++;while(q[i]<x);
do j--;while(q[j]>x);
if(i<j)swap(q[i],q[j]);
}
quick_sort(q,l,j);
quick_sort(q,j+1,r);
}
int main()
{
new int[10];
int *p=new int[10];
for(int i = 0;i < 10;i ++ )cin>>p[i];
quick_sort(p,0,10);//快排
for(int i = 0;i < 10;i ++ )cout<<p[i]<<" ";
delete [] p;
return 0;
}
#include <iostream>
#include <algorithm>
using namespace std;
template <class T>
void deal()
{
new T[10];
T *p=new T[10];
for(int i = 0;i < 10;i ++ )cin>>p[i];
sort(p+0,p+10);
for(int i = 0;i < 10;i ++ )cout<<p[i]<<" ";
delete [] p;
}
int main()
{
deal<double>();//double类型数据
//deal<string>();或者字符串类型数据皆可使用模板
return 0;
}
#include <iostream>
#include <vector>//动态数组反向存储并输出
using namespace std;
void reverse(string a)
{
vector<char> A;
for(int i = a.size()-1;i >= 0;i -- )A.push_back(a[i]);
for(int i = 0;i < A.size();i ++ )cout<<A[i];
}
int main()
{
string a;
getline(cin,a);
reverse(a);
return 0;
}
方法二:
#include <iostream>//双指针算法
using namespace std;
int main()
{
string a;
getline(cin,a);
for(int i = 0,j = a.size()-1;i<j;i ++ ,j -- )
{
if(i<j)swap(a[i],a[j]);
}
for(int i = 0;i < a.size();i ++ )
{
cout<<a[i];
}
return 0;
}
方法三:
#include <iostream>//STL库
#include <algorithm>
using namespace std;
int main()
{
string a;
getline(cin,a);
reverse(a.begin(),a.end());
for(int i = 0;i < a.size();i ++ )cout<<a[i];
return 0;
}
#include <iostream>
using namespace std;
const int N = 1000000+10;
int A[N]={0};
string a;
int &count(char c)
{
return A[(c-'a')];
}
int main()
{
getline(cin,a);
for(int i = 0;i < a.size();i ++ )
{
if(a[i]>='a'&&a[i]<='z')
{
count(a[i])++;
}
}
for(int i = 0;i <= 25;i ++ )
{
if(A[i]!=0)
{
char o=i+'a';
cout<<o<<":"<<A[i]<<endl;
}
}
return 0;
}
类与对象(一)
一、实验目的
- 理解类和对象的概念,掌握类的定义和对象的使用方法,理解成员的访问权限。
- 掌握成员函数的定义与使用方法。
二、实验任务
- 定义一个关于日期的类,然后声明对象,判断该日期是否为闰年并输出。
- 设计一个学生类,完成输入/输出的功能,要求:(1)其属性有:学号、姓名、pu专业、班级、性别、成绩等;(2)成员函数要实现信息的录入和显示。
- 在完成一个学生类的基础之上,设置一个教师类,要求:(1)有教师的工号、姓名、所教授课程的名字(最多3门课程)以及该教师所指导的学生。(2)成员函数实现教师信息的录入;(3)打印出教师的相关信息以及该教师所指导的学生的相关信息。
三、实验步骤
#include <iostream>
using namespace std;
class Date
{
private:
int year;
int month;
int day;
public:
void setdata()
{
cout<<"请输入年份:";
cin>>year;
cout<<"请输入月份:";
cin>>month;
cout<<"请输入天数:";
cin>>day;
}
bool leap()
{
if((year%4==0&&year%100!=0)||(year%400==0))
{
return true;
}
else return false;
}
};
int main()
{
Date time;
time.setdata();
if(time.leap())cout<<"此年数为闰年"<<endl;
else cout<<"此年份不是闰年"<<endl;
return 0;
}
#include <iostream>
#include <iomanip>
using namespace std;
class student
{
private:
string num;
string name;
string zhuanye;
string banji;
string sex;
double score;
public:
void setdata()
{
cout<<"请输入学生学号:";//202110900000
cin>>num;
cout<<"请输入学生姓名:";//朱奕锦
cin>>name;
cout<<"请输入学生专业:";//计算机与技术
cin>>zhuanye;
cout<<"请输入学生班级:";//2142
cin>>banji;
cout<<"请输入学生性别:";//男
cin>>sex;
cout<<"请输入学生成绩:";//99.99,浮点数并保留两位小数
cin>>score;
}
void dispaly()
{
cout<<name<<"的信息如下所示"<<endl;
cout<<"学生学号:"<<num<<endl;
cout<<"学生姓名:"<<name<<endl;
cout<<"学生专业:"<<zhuanye<<endl;
cout<<"学生班级:"<<banji<<endl;
cout<<"学生性别:"<<sex<<endl;
cout<<"学生成绩:"<<setiosflags(ios::fixed)<<setprecision(2)<<score<<endl;
}
};
int main()
{
student zyj;
zyj.setdata();
zyj.dispaly();
return 0;
}
#include <iostream>
#include <iomanip>
using namespace std;
class student
{
private:
string num;
string name;
string zhuanye;
string banji;
string sex;
double score;
public:
void setdata()
{
cout<<"请输入学生学号:";//202110900000
cin>>num;
cout<<"请输入学生姓名:";//朱奕锦
cin>>name;
cout<<"请输入学生专业:";//计算机与技术
cin>>zhuanye;
cout<<"请输入学生班级:";//2142
cin>>banji;
cout<<"请输入学生性别:";//男
cin>>sex;
cout<<"请输入学生成绩:";//99.99,浮点数并保留两位小数
cin>>score;
}
void display()
{
cout<<name<<"的信息如下所示"<<endl;
cout<<"学生学号:"<<num<<endl;
cout<<"学生姓名:"<<name<<endl;
cout<<"学生专业:"<<zhuanye<<endl;
cout<<"学生班级:"<<banji<<endl;
cout<<"学生性别:"<<sex<<endl;
cout<<"学生成绩:"<<setiosflags(ios::fixed)<<setprecision(2)<<score<<endl;
}
};
class teacher
{
private:
string num;
string name;
string text;
student stu[3];//假设黄老师带了3个学生
public:
void setdata()
{
cout<<"请输入教师工号:";
cin>>num;
cout<<"请输入教师姓名:";
cin>>name;
cout<<"请输入教师所教授课程的名字:";
cin>>text;
cout<<"请输入教师所指导学生的名字以及信息:";
cout<<endl;//调换行无实际意义仅仅为了好看
for(int i = 0;i < 3;i ++ )
{
stu[i].setdata();
}
}
void dispaly()
{
cout<<name<<"的信息如下所示:"<<endl;
cout<<"教师工号:"<<num<<endl;
cout<<"教师姓名:" <<name<<endl;
cout<<"教师所教授课程的名字:"<<text<<endl;
cout<<"教师所指导学生的信息:";
cout<<endl;//调换行无实际意义仅仅为了好看
for(int i = 0;i < 3;i ++ )
{
stu[i].display();
cout<<endl;
}
}
};
int main()
{
teacher zzg;
zzg.setdata();
cout<<endl;//调换行无实际意义仅仅为了好看
zzg.dispaly();
return 0;
}
类与对象(二)
一、实验目的
-
掌握对象成员的引用;
-
理解类的封装和信息的隐藏
二、实验任务
- 定义一个rectangle的类,然后声明对象,完成:
(a)用对象名和成员运算符(.)访问对象成员
(b)用指向对象的指针访问对象成员
- 设计rectangle类,完成类声明和成员函数定义的分离,实现公用接口与私有实现的分离。
三、实验步骤
#include <iostream>
using namespace std;
class rectangle
{
private:
void cicum();//私有实现
void area();//私有实现
public:
int lenth;
int wide;
rectangle(int a=6,int b=6):lenth(a),wide(b){}//参数表构造函数赋初值
void display();
};
int main()
{
//用.来访问类中的成员
rectangle item1;
cout<<"此时为未输入数据时构造函数默认初始化的长为6宽为6的情况:" <<endl;
item1.display();//公用接口
cout<<"此时为输入数据时的长为8宽为8的情况:"<<endl;
item1.lenth=8;
item1.wide=8;
cout<<"-----------------------------------------------------"<<endl;
//用指针针来访问类中的成员
rectangle item2;
rectangle *p=&item2;
cout<<"此时为未输入数据时构造函数默认初始化的长为6宽为6的情况:" <<endl;
p->display();//公用接口
cout<<"此时为输入数据时的长为8宽为8的情况:"<<endl;
p->lenth=8;
p->wide=8;
return 0;
}
inline void rectangle::cicum()//在类外定义类的内置函数
{
cout<<"该长方形的周长是:"<<(lenth+wide)*2<<endl;
}
inline void rectangle::area()//在类外定义类的内置函数
{
cout<<"该长方形的面积是:"<<lenth*wide<<endl;
}
inline void rectangle::display()//在类外定义类的内置函数
{
cicum();
area();
}
第一次电子作业
函数
一、实验目的
- 掌握函数的定义和调用方法。
- 掌握函数实参和形参间的值传递关系。
- 掌握重载函数的使用。
- 掌握函数调用时,形参、实参之间的“值传递”和“地址传递”的区别。
- 掌握函数递归调用的方法。
二、实验内容
- 编写函数判断一个数是否是素数,在主程序中实现输入、输出。可设置带默认形参值为203。
- 给定某个年、月、日的值,例如,2005年7月11日,计算出这一天属于该年的第几天,要求写出计算闰年的函数和计算日期的函数。
- 求出2~100之间的完全数。所谓完全数,是指除了自身之外,其所有因子之和是其自身的数,如:6是一个完全数,因为其因子是:1, 2, 3,而1+2+3 = 6.
实现代码
1.
函数参数的默认值就是说在声明函数或者定义函数的时候直接在参数后给赋值,这样在函数调用的时候调用方可以不用再给传值,它会默认使用它的默认值
#include <iostream>
#include <cmath>
using namespace std;
bool prime(int x=203)
{
if(x==1)return false;
if(x==2)return true;
else
{
for(int i = 2;i <= sqrt(x);i ++ )
{
if(x%i==0)return false;
}
}
return true;
}
int main()
{
int n;
cin>>n;
if(prime(n))cout<<"Yes";
else cout<<"No";
return 0;
}
2.
#include <iostream>
#include <cmath>
using namespace std;
int a[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int b[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool leap(int year)
{
if((year%4==0&&year%100!=0)||(year%400==0))return true;
else return false;
}
int getday(int year,int month,int day)
{
int sum=0;
if(leap(year))
{
for(int i = 1;i < month;i ++ )sum+=a[i];
}
else
{
for(int i = 1;i < month;i ++ )sum+=b[i];
}
sum=sum+day;
return sum;
}
int main()
{
int year,month,day;
cin>>year>>month>>day;
cout<<getday(year,month,day);
return 0;
}
3.
#include <iostream>
using namespace std;
bool judge(int n)
{
int sum=0;
for(int i = 1;i < n;i ++ )
{
if(n%i==0)sum+=i;
}
if(sum==n)return true;
else return false;
}
int main()
{
for(int i = 2;i <= 100;i ++ )
{
if(judge(i))cout<<i<<" ";
}
return 0;
}
第二次电子作业
一、实验内容
1.要求:求一个长方柱的体积,请编写一个基于对象的程序,数据成员包括length(长)、width(宽)、height(高)。要求用成员函数实现以下功能:
(1)由键盘输入一个长方柱的长、宽、高;
(2)计算一个长方柱的体积;
(3)输出一个长方柱的体积。
2.定义一个学生类,其中有3个数据成员有学号、姓名、年龄,以及若干成员函数。同时编写主函数使用这个类,实现对学生数据的赋值和输出。要求:
(1)使用成员函数实现对输出的输入、输出
(2)使用构造函数和析构函数实现对数据的输入、输出。
3.定义日期类型Date。要求有以下面成员:
(1)可以设置日期;
(2)日期加一天操作;
(3)输出函数,输出格式为“XXXX年XX月XX日”。
4.Distance类就是组合类,可以计算两个点的距离,它包含了Point类的两个对象p1和p2,实现:(1)录入两点p1、p2基本信息;
(2)实现两点距离的计算并输出基本信息。
二、实现代码
1.
#include <iostream>
#include <iomanip>
using namespace std;
class cft
{
private:
double length;
double width;
double height;
double V;
public:
void input()//输入数据
{
cin>>length>>width>>height;
}
void calv()//计算体积
{
V=length*width*height;
}
void output()//输出体积
{
cout<<setiosflags(ios::fixed)<<setprecision(2)<<V<<endl;
}
};
int main()
{
cft n;
n.input();
n.calv();
n.output();
return 0;
}
2.
#include <iostream>
using namespace std;
class Student
{
private:
string num;
string name;
string sex;
public:
Student(string,string,string);//构造函数赋初值
~Student()//析构函数执行末尾指令
{
cout<<num<<" "<<name<<" "<<sex<<endl;
}
};
Student::Student(string a,string b,string c)
{
num=a;
name=b;
sex=c;
}
int main()
{
Student("202110913226","朱奕锦","男");
Student("202110913140","吴星","女");
Student("202110913205","王嘉隆","男");
}
3.
#include <iostream>
#include <iomanip>
using namespace std;
class Date
{
private:
int year;
int month;
int day;
public:
void setdata()
{
cin>>year>>month>>day;
}
void add1()
{
day++;
if((year%4==0&&year%100!=0)||(year%400==0))
{
if(month==2)//闰年2月进位
{
if(day==30)
{
day=1;
month=3;
}
}
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)//31天月份进位
{
if(day==32)
{
day=1;
month++;
if(month==13)//年份进位
{
month=1;
year++;
}
}
}
if(month==4||month==6||month==9||month==11)//30天月份进位
{
if(day==31)
{
day=1;
month++;
if(month==13)//年份进位
{
month=1;
year++;
}
}
}
}
else//非闰年
{
if(month==2)//二月进位
{
if(day==29)
{
day=1;
month=3;
}
}
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)//31天月份进位
{
if(day==32)
{
day=1;
month++;
if(month==13)
{
month=1;
year++;
}
}
}
if(month==4||month==6||month==9||month==11)//30天月份进位
{
if(day==31)
{
day=1;
month++;
if(month==13)
{
month=1;
year++;
}
}
}
}
}
void output()
{
printf("%4d年%02d月%02d日",year,month,day);//格式化输出
}
};
int main()
{
Date n;
n.setdata();
n.add1();
n.output();
return 0;
}
4.
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
class Point
{
private:
double x;
double y;
public:
void setdata()
{
cin>>x>>y;
}
int getx()
{
return x;
}
int gety()
{
return y;
}
};
class Distance
{
private:
Point a;
Point b;
int x1,y1,x2,y2;
public:
void input()
{
cout<<"请输入a点的坐标:";
a.setdata();
cout<<"请输入b点的坐标:";
b.setdata();
x1=a.getx();
y1=a.gety();
x2=b.getx();
y2=b.gety();
}
void output()
{
cout<<"两点之间的距离为:"<<setiosflags(ios::fixed)<<setprecision(2)<<sqrt(pow(x1-x2,2)+pow(y1-y2,2))<<endl;
}
void outputpointdata()
{
cout<<"a点的数据为:"<<setiosflags(ios::fixed)<<setprecision(2)<<"("<<x1<<","<<y1<<")"<<endl;
cout<<"b点的数据为:"<<setiosflags(ios::fixed)<<setprecision(2)<<"("<<x2<<","<<y2<<")"<<endl;
}
};
int main()
{
Distance s;
s.input();
s.output();
s.outputpointdata();
return 0;
}