实训课堂作业

这篇博客包含了多个编程作业的解决方案,涉及数据结构、算法、类的构造和操作。内容包括:数组的最大值、三角形面积计算、十进制转二进制、学生信息管理、复杂算术运算、日期处理、学生类的定义及友元函数应用等。通过这些实例,展示了C++中如何进行数据操作、类的构造与继承、友元函数的使用以及面向对象编程的基本概念。
摘要由CSDN通过智能技术生成

5.22作业一

作业

//五个元素数组
int max(int []);
int *max1(int *p);

/*
函数功能:数组中最大值
函数名:max
函数参数:数组->首地址,元组长度
函数返回值:最大值
*/
int max(int a[], int n)
{
	int b;
	b = a[0];
	for (int i = 1; i < n; i++)
	{
		if (b < a[i])
			b = a[i];
	}
	return b;
}
int max(int *p, int n)
{
	int j = 0;
	for (int i = 1; i < n; i++)
	{
		if (*(p + j) < *(p + i))
			j = i;
	}
	return *(p + j);
}

5.23作业二

求三角形面积,由三个点求面积
p=(a+b+c)/2.0
ss=p(p-a)(p-b)(p-c)
运算符优先级

/*
函数功能:求三角形面积
函数名:area_s
函数参数:数组->首地址,长度为6的数组为三个点的坐标
函数返回值:返回面积大小
*/
double area_s(double p[])
{
	double a, b, c, q, s; //a,b,c为边长,s为面积
	a = sqrt((p[0] - p[2])*(p[0] - p[2]) + (p[1] - p[3])*(p[1] - p[3]));
	b = sqrt((p[0] - p[4])*(p[0] - p[4]) + (p[1] - p[5])*(p[1] - p[5]));
	c = sqrt((p[4] - p[2])*(p[4] - p[2]) + (p[5] - p[3])*(p[5] - p[3]));
	q = (a + b + c) / 2.0;
	s = sqrt((q*(q - a)*(q - b)*(q - c)));
	return s;
}
double area_s(double p[])
{
	//以三角形三个点做平行于轴的线围成长方形,长方形长宽为a,b,即a为三个点横坐标跨度范围,b为三个点纵坐标跨度范围
	//s1, s2, s3分别为三角形两个顶点与长方形一个顶点围成三角形的面积,长方形面积减去三个三角形面积就是所需要求的三角形的面积
	double a, b, s, s1, s2, s3;
	a = p[0] - p[2];
	b = p[1] - p[3];
	//求横坐标跨度范围
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			if (a < p[2 * i] - p[2 * j]) a = p[2 * i] - p[2 * j];
		}
	}
	//求纵坐标跨度范围
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			if (b < p[2 * i + 1] - p[2 * j + 1]) b = p[2 * i + 1] - p[2 * j + 1];
		}
	}
	
	s1 = abs((p[0] - p[2])*(p[1] - p[3]) / 2.0);
	s2 = abs((p[0] - p[4])*(p[1] - p[5]) / 2.0);
	s3 = abs((p[4] - p[2])*(p[5] - p[3]) / 2.0);
	s = a*b - s1 - s2 - s3;
	return s; 
}

5.24作业三

十进制转二进制
判定一个数是够是素数的流程图

//只能0-1023之间
/*
函数功能:十进制转二进制
函数名:test
函数参数:十进制数
函数返回值:二进制类型的十进制数
*/
int test(int a)
{
	int b = 0;
	int c = 1;
	while (a)
	{
		b = b + c * (a % 2);
		c = c * 10;
		a = int(a / 2);
	}
	return b;
}
/*
函数功能:十进制转二进制
函数名:test
函数参数:十进制数,二进制最大位数
函数返回值:无返回值
*/
void test(int a, int N)
{
	char b[N];
	int i = 0, k = 0;
	while (a)
	{
		b[i] = char(a % 2);
		i++;
		a = int(a / 2);
	}
	for (int j = i - 1; j >= 0; j--)
		printf("%d", b[j]);
	printf("\n");
}

在这里插入图片描述

5.25作业四

【程序2】
题目:一个整数,它加上100后是一个完全平方数,
再加上168又是一个完全平方数,请问该数是多少?

int fun()
{
	for (int i = 0; i < 50; i++)
	{
		for (int j = i; j < 50; j++)
		{
			for (int k = 0; k < 1000; k++)
			{
				if (i*i == k + 100 && j*j == k + 268)
				{
					printf("%d\n", k);
					return k;
				}
			}
		}
	}
}

【程序3】
题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

void fun(int sum)
{
	printf("%d=", sum);
	int a = sum, k;
	while (a)
	{
		k = a;
		for (int i = 2; i < a; i++)
		{
			if (a%i == 0)
			{
				if (a == sum)
					printf("%d", i);
				else
					printf("*%d", i);
				a = a / i;
				k = i;
				break;
			}
		}
		if (k == a)
		{		
			if (a == sum)
				printf("%d\n", k);
			else
				printf("*%d\n", k);
			break;
		}
	}
}

5.26作业五

char str[80];
gets(str) //判断单词数目
int test()
{
	char str[80];
	gets_s(str);
	int sum = 0;
	for (int i = 0; i < sizeof(str)-1; i++)
	{
		if (((str[i] <= 'Z'&&str[i] >= 'A')||(str[i] <= 'z'&&str[i] >= 'a'))&&(str[i + 1] == ' ' || str[i+1] == '\0'))
			sum++;
	}
	return sum;
}

5.31作业六

输入10个名字,进行排序
法一:

void test()
{
	char p[10];
	char a[][10] = { "Mw", "Bo", "Dr", "Ege", "Eef", "Lher", "Ce", "Aa", "Be", "Qb" };
	for (int i = 0; i < 10; i++)
		printf("%s\t", a[i]);
	printf("\n");
	for (int i = 0; i < 9; i++)
	{
		for (int j = i + 1; j < 10; j++)
		{
			if (strcmp(a[i], a[j]) == 1)
			{
				strcpy_s(p, a[i]);
				strcpy_s(a[i], a[j]);
				strcpy_s(a[j], p);
			}
		}
	}
	for (int i = 0; i < 10; i++)
		printf("%s\t", a[i]);
	printf("\n");
}

int main()
{

	test();
	system("pause");
	return 0; 
}
Mw      Bo      Dr      Ege     Eef     Lher    Ce      Aa      Be      Qb
Aa      Be      Bo      Ce      Dr      Eef     Ege     Lher    Mw      Qb

法二:

void test(char a[][10])
{
	char p[10];
	for (int i = 0; i < 9; i++)
	{
		for (int j = i + 1; j < 10; j++)
		{
			if (strcmp(a[i], a[j]) == 1)
			{
				strcpy_s(p, a[i]);
				strcpy_s(a[i], a[j]);
				strcpy_s(a[j], p);
			}
		}
	}
}

int main()
{
	char a[][10] = { "Mw", "Bo", "Dr", "Ege", "Eef", "Lher", "Ce", "Aa", "Be", "Qb" };
	for (int i = 0; i < 10; i++)
		printf("%s\t", a[i]);
	printf("\n");
	test(a);
	for (int i = 0; i < 10; i++)
		printf("%s\t", a[i]);
	printf("\n");
	system("pause");
	return 0; 
}
Mw      Bo      Dr      Ege     Eef     Lher    Ce      Aa      Be      Qb
Aa      Be      Bo      Ce      Dr      Eef     Ege     Lher    Mw      Qb

结构体输入输出函数3个
input output
保存到文件中

#define N 3

struct Students
{
	int num_t;
	char sex_t[5];
	float score_t;
	char name_t[20];
}stu[N];

void input(Students*S)
{
	for (int i = 0; i < N; i++)
	{
		printf("please input %d sex:", i+1);
		scanf_s("%s", &S[i].sex_t, sizeof(S[i].sex_t));
		printf("please input %d num:", i+1);
		scanf_s("%d,%c,%d", &S[i].num_t, &S[i].sex_t, &S[i].score_t);
		printf("please input %d score:", i+1);
		scanf_s("%f", &S[i].score_t);
		printf("please input %d name:", i+1);
		scanf_s("%s", S[i].name_t, sizeof(S[i].name_t));
	}
}

void output(Students*S)
{
	for (int i = 0; i < N; i++)
	{
		printf("%d message:%d\t%s\t%f\t%s\n", i+1, S[i].num_t, S[i].sex_t, S[i].score_t, S[i].name_t);
	}
}

void save(Students*S)
{
	FILE *fp;
	char filename[20] = "a.txt";
	fp = fopen(filename, "a");
	if (fp == NULL)
	{
		printf("there are not file %s\n", filename);
	}
	fwrite(stu, sizeof(struct Students), N, fp);
}

6.9作业七

1.读入下表中值到二维数组,计算并输出数组中既能被3整除又能被5整除的数的个数。

void test()
{
	int a[4][3], sum = 0;
	cout << "请输入二维数组:" << endl;
	for (int i = 0; i < 4; i++)
		cin >> a[i][0] >> a[i][1] >> a[i][2];
	cout << "符合要求的数:";
	for (int i = 0; i < 4; i++)
		for (int j = 0; j < 3; j++)
			if (a[i][j] % 3 == 0 && a[i][j] % 5 == 0)
			{
				cout << a[i][j] << " ";
				sum++;
			}
	cout << endl;
	cout << "符合要求的个数:" << sum << endl;
}
60 32 36
13 15 12
23 42 5
35 8 2
符合要求的数:60 15
符合要求的个数:2
请按任意键继续. . .

2.试着做如下题目:输入两个学生的学号、姓名和成绩,输出成绩较高学生的学号、姓名和成绩(如果字符串strcmp()-》cstring
解题思路:
(1)定义两个结构相同的结构体变量student1和student2;
(2)分别输入两个学生的学号、姓名和成绩;
(3)比较两个学生的成绩,如果学生1的成绩高于学生2,就输出学生1的全部信息,如果学生2的成绩高于学生1,就输出学生2的全部信息。如果二者相等,输出2个学生的全部信息

#include<iostream>
#include<stdlib.h>
#include<string>
using namespace std;
//结构体
class stu{
	int num;  //学号
	string name; //姓名
	int score;  //得分
public:
	void Set(); //输入数据
	int Get_num();//获取学号
	string Get_name();//获取姓名
	int Get_score(); //获取分数
};

void stu::Set()//输入数据
{
	cin >> num >> name >> score;
}
int stu::Get_num()//获取学号
{
	return num;
}
string stu::Get_name()//获取姓名
{
	return name;
}
int stu::Get_score()//获取分数
{
	return score;
}
//函数声明
void test();
int Max(int, int); //返回最大值
//主函数
int main()
{
	test();

	system("pause");
	return 0;
}

void test()
{
	stu S[2];
	S[0].Set();
	S[1].Set();
	cout << "The higher score is:" << endl;
	if (S[0].Get_score() > S[1].Get_score())
		cout << S[0].Get_num() << " " << S[0].Get_name() << " " << S[0].Get_score() << endl;
	else
		cout << S[1].Get_num() << " " << S[1].Get_name() << " " << S[1].Get_score() << endl;
}

int Max(int a, int b)
{
	return a > b ? a : b;
}
12 李明 89
23 张三 90
The higher score is:
23 张三 90
请按任意键继续. . . 

1、有3个候选人,每个选民只能投票(5个)选一人,要求编一个统计选票的程序,先后输入被选人的名字,最后输出各人得票结果。
确定:姓名,票数

#include<iostream>
#include<stdlib.h>
#include<string>
using namespace std;
// 结构体
class stu{
	string name; // 姓名
	int score;   // 票数
public:
	void Set(string, int); // 输入数据
	string Get_name();     // 获取姓名
	int Get_score();       // 获取票数
	void Add_score();      // 投票
}; 

void stu::Set(string na,int sc)//输入数据
{
	name = na;
	score = sc;
}
string stu::Get_name()  // 获取姓名
{
	return name;
}
int stu::Get_score()    // 获取分数
{
	return score;
}
void stu::Add_score()   // 投票
{
	score++;
}
// 函数声明
void test();
// 主函数
int main()
{
	test();

	system("pause");
	return 0;
}

void test()
{
	stu S[3];
	S[0].Set("李兴", 0);
	S[1].Set("刘翔", 0);
	S[2].Set("方宇", 0);
	string name;
	for (int i = 0; i < 5; i++)  // 投票
	{
		cin >> name;
		if (name == S[0].Get_name())
			S[0].Add_score();
		else if (name == S[1].Get_name())
			S[1].Add_score();
		else if (name == S[2].Get_name())
			S[2].Add_score();
	}
	for (int i = 0; i < 3; i++) // 输出
	{
		cout << S[i].Get_name() << ", " << S[i].Get_score() << endl;
	}
}
李兴
方宇
李兴
刘翔
方宇
李兴, 2
刘翔, 1
方宇, 2

2、有一个学生情况如表所示。编写程序,对该学生情况表按成绩(grade)从低到高进行排序。
(要求:用多函数分别实现数据的输入,输出,排序,在主函数中调用这些函数完成操作。)

#include<iostream>
#include<stdlib.h>
#include<string>
using namespace std;
const int N = 20;
// 结构体
class stu{
	int sum;   // 学号
	string name; // 姓名
	string sex;  // 性别
	int age;     // 年龄
	int score;   // 成绩
public:
	void Get();
	void Get_sum(int su);
	void Get_name(string na);
	void Get_sex(string se);
	void Get_age(int ag);
	void Get_score(int sco);
	void Set();
	int Set_sum();
	string Set_name();
	string Set_sex();
	int Set_age();
	int Set_score();
}; 
void stu::Get()//输入
{
	cin >> sum >> name >> sex >> age >> score;
}
void stu::Get_sum(int su)
{
	sum = su;
}
void stu::Get_name(string na)
{
	name = na;
}
void stu::Get_sex(string se)
{
	sex = se;
}
void stu::Get_age(int ag)
{
	age = ag;
}
void stu::Get_score(int sco)
{
	score = sco;
}
void stu::Set()//输出
{
	cout << sum << " " << name << " " << sex << " " << age << " " << score << endl;
}
int stu::Set_sum()
{
	return sum;
}
string stu::Set_name()
{
	return name;
}
string stu::Set_sex()
{
	return sex;
}
int stu::Set_age()
{
	return age;
}
int stu::Set_score()
{
	return score;
}

void change(stu *S, int m);

int main()
{
	int m;
	cout << "输入学生数:";
	cin >> m;
	stu S[N];
	cout << "输入学生情况 学号 姓名 性别 年龄 成绩" << endl;
	for (int i = 0; i < m; i++)//输入
	{
		S[i].Get();
	}
	change(S, m); //排序

	cout << "按成绩高低顺序排序:输出排序后成绩" << endl;
	for (int i = 0; i < m; i++)//输出
	{
		S[i].Set();
	}
	system("pause");
	return 0;
}

void change(stu *S, int m)
{
	int sum;   // 学号
	string name; // 姓名
	string sex;  // 性别
	int age;     // 年龄
	int score;   // 成绩
	for (int i = 0; i < m - 1; i++)
	{
		for (int j = i + 1; j < m; j++)
		{
			if (S[i].Set_score() > S[j].Set_score())
			{
				sum = S[i].Set_sum();
				S[i].Get_sum(S[j].Set_sum());
				S[j].Get_sum(sum);

				name = S[i].Set_name();
				S[i].Get_name(S[j].Set_name());
				S[j].Get_name(name);

				sex = S[i].Set_sex();
				S[i].Get_sex(S[j].Set_sex());
				S[j].Get_sex(sex);

				age = S[i].Set_age();
				S[i].Get_age(S[j].Set_age());
				S[j].Get_age(age);

				score = S[i].Set_score();
				S[i].Get_score(S[j].Set_score());
				S[j].Get_score(score);
			}
		}
	}
}
输入学生数:5
输入学生情况 学号 姓名 性别 年龄 成绩
02 李兴 男 16 89
05 张鸣 男 17 90
03 刘翔 男 16 86
06 方宇 女 17 69
07 夏瑜 女 17 96
按成绩高低顺序排序:输出排序后成绩
6 方宇 女 17 69
3 刘翔 男 16 86
2 李兴 男 16 89
5 张鸣 男 17 90
7 夏瑜 女 17 96

3.下面给出此题用结构类型实现的程序,现要求仿照着此程序,再用类完成。

#include<iostream>
#include<stdlib.h>
#include<string>
#include<iomanip>
using namespace std;

class complex{
	double re;
	double im;
public:
	void Get();
	void Get_re(double);
	void Get_im(double);
	double Set_re();
	double Set_im();
}; 
void complex::Get()
{
	cin >> re >> im;
}
void complex::Get_re(double r)
{
	re = r;
}
void complex::Get_im(double i)
{
	im = i;
}
double complex::Set_re()
{
	return re;
}
double complex::Set_im()
{
	return im;
}

int main()
{
	complex a, b, c;
	char oper;
	cout << "输入复数a的实部和虚部:";
	a.Get();
	cout << "输入复数b的实部和虚部:";
	b.Get();
	cout << "输入运算符:";
	cin >> oper;
	switch (oper)
	{
	case '+':
		c.Get_re(a.Set_re() + b.Set_re());
		c.Get_im(a.Set_im() + b.Set_im());
		break;
	case '-':
		c.Get_re(a.Set_re() - b.Set_re());
		c.Get_im(a.Set_im() - b.Set_im());
		break;
	default:
		cout << "input error" << endl;
		return 0;
	}
	cout << "c=" << c.Set_re();
	cout << setiosflags(ios::showpos);
	cout << c.Set_im() << "i" << endl;

	system("pause");
	return 0;
}

输入复数a的实部和虚部:2 3
输入复数b的实部和虚部:1 2
输入运算符:+
c=3+5i

6.10作业八

Date类,添加重载构造函数,私有数据成员年月日,有一个默认参数值为2021年6月10日
通过对象实现输出

DateTime数据成员为Date对象成员非常量类型的对象成员,且对象成员所在的类,只有带参的构造函数此类的对象成员必须通过成员初始化列表进行初始化,有设置和输出

class Data{
	int year;
	int month;
	int day;
	
public:
	Data(int a, int b, int c){ year = a; month = b; day = c; }
	Data(int a, int b = 6) :Data(a, b, 10){}

	void setDate(int a, int b, int c){ year = a; month = b; day = c; }
	void output(){ cout << year << ":" << month << ":" << day << endl; }

	//~Data(){ cout << year << ":" << month << ":" << day << endl; }
};

class DataTime{
	Data d;

public:
	DataTime(int c=10) :d(c){}
	void output(){ d.output(); }
};


int main()
{
	DataTime d;
	d.output();


	//system("pause");
	return 0;
}

1、定义三角形类,完成:为三边置值、取三边的值并输出、求三角形周长、求三角形面积、输出三角形周长和面积。要求使用构造函数为三边赋值。提示:可以定义一个无参的构造函数,在此构造函数中通过键盘输入的方法输入三边的值。

class Triangle{
	int a;
	int b;
	int c;
public:
	Triangle();  //输入
	void output(){ cout << "三边:" << a<< " " << b << " " << c << endl; }//边长
	int outT(){ return a + b + c; }//周长
	float outS();//面积
};
Triangle::Triangle()
{
	cin >> a >> b >> c;
}
float Triangle::outS()
{
	float p, s;
	p = (a + b + c) / 2.0;
	s = p*(p - a)*(p - b)*(p - c);
	return sqrt(s);
}

int main()
{
	Triangle T;
	T.output();
	cout << "面积:" << T.outS() << endl;
	cout << "周长:" << T.outT() << endl;

	return 0;
}

定义计数器类Counter。要求具有以下成员:计数器值;可进行增值和减值记数;可提供记数值。要求使用有参构造函数为计数器赋初值。编写主函数对这个类进行测试

class Counter{
	int cout;
public:
	Counter(int a){ cout = a; }
	int add(){ cout++; return cout; }
	int del(){ cout--; return cout; }
};

int main()
{
	Counter T(5);
	cout << "加一:" << T.add() << endl;
	cout << "加一:" << T.add() << endl;
	cout << "减一:" << T.del() << endl;
	cout << "减一:" << T.del() << endl;

	return 0;
}

定义一个阶乘类Cfactorial实现阶乘的计算和显示。

class Cfactorial{
public:
	int cout(int);
};

int Cfactorial::cout(int a)
{
	int sum = 1;
	while (a) 
	{
		sum = sum*a;
		a--;
	}
	return sum;
}

int main()
{
	Cfactorial T;
	cout << "1的阶乘:" << T.cout(1) << endl;
	cout << "5的阶乘:" << T.cout(5) << endl;
	cout << "9的阶乘:" << T.cout(9) << endl;

	return 0;
}

设计一个时间类,其中数据成员:年 月 日;成员函数有三个:
(1)设置年月日的具体值;
(2)判断该年是否为闰年;
(3)将年月日输出。编写主函数,实现并测试这个类。

class Time{
	int year;
	int mon;
	int day;
public:
	Time(int, int, int);
	bool tim();
	void output(){cout << year << "-" << mon << "-" << day << endl; }
};

Time::Time(int a, int b, int c)
{
	year = a;
	mon = b;
	day = c;
}

bool Time::tim()
{
	if (year % 4 == 0)
		return true;
	else
		return false;
}


int main()
{
	Time T(2021, 6, 10);
	if (T.tim())
		cout << "润年" << endl;
	else
		cout << "平年" << endl;
	T.output();

	return 0;
}

定义一个dog类,包含age、weight属性,以及对这些属性的操作方法。实现并测试这个类

class dog{
	int age;
	int weight;
public:
	dog(int a, int b){ age = a; weight = b; }
	int set_age(){ return age; }
	int set_weight(){ return weight; }
};

int main()
{
	dog D(2, 3);
	cout << "年龄:" << D.set_age() << "  体重:" << D.set_weight() << endl;

	return 0;
}

定义一个Book(图书)类,在该类定义中包括以下数据成员和成员函数。
数据成员:bookname(书名)、price(价格)和number(存书数量)。
成员函数:display()显示图书的情况;borrow()将存书数量减1,并显示当前存书数量;restore()将存书数量加1,并显示当前存书数量。
在main函数中,要求创建某一种图书对象,并对该图书进行简单的显示、借阅和归还管理。

class Book{
	string bookname;
	float price;
	int number;
public:
	Book(string name, float b, int c){ bookname = name, price = b; number = c; }
	void display(){ cout << "书名:" << bookname << "   价格:" << price << "   数量:" << number << endl; };
	void borrow(){ number--; cout << "书籍数量:" << number << endl; }
	void restore(){ number++; cout << "书籍数量:" << number << endl; }
};

int main()
{
	Book B("数学", 7.99, 10);
	B.display();
	B.borrow();
	B.display();
	B.restore();
	B.display();
	
	return 0;
}

2.改写以下程序。要求定义类student,封装三个数据成员和两个成员函数intpt和output,使程序得到相同的运行效果。需要加入构造函数给其参数默认初始化值为:( “\0”, 0, 0 )。

class student{
	string name;
	int score;
	int num;
public:
	student(string na="\0", int sc=0, int nu=0){ name = na; score = sc; num = nu; }
	void intput(string na = "\0", int sc = 0, int nu = 0){ name = na; score = sc; num = nu; }
	void output(){ cout << "name:" << name << "   score:" << score << "   num:" << num << endl; }
};

int main()
{
	student S;
	S.intput();
	S.output();
	
	return 0;
}

创建一个函数f1(),返回其参数的平方根。重载f1()三次,让它返回整数、长整数与双精度的平方根(计算平方根可以使用标准库函数sqrt())。

class Base{
public:
	int f1(int a){ return sqrt(a); }
	long int f1(long int a){ return sqrt(a); }
	float f1(double a){ return sqrt(a); }
};

int main()
{
	Base a;
	cout << a.f1(4) << endl;
	cout << a.f1(8.6) << endl;
	cout << a.f1(10000) << endl;
	
	return 0;
}

建立一个Student类,含有私有的学号(字符型)、姓名(字符型)、年龄(整型)数据成员。用new自动为Student的对象分配内存,并将学号“0504020101”,姓名“张三”,年龄20存入内存的相应域中,把该生的信息显示出来。提示:用new创建对象并调用的是有参构造函数的格式为:类名 *指针变量=new 类名(实参1,实参2,…);(根据自己掌握的情况,需要的话可借助课件复习此知识点)

class Student{
	char *num;
	char *name;
	int age;
public:
	Student(char *s = "0504020101", char*a = "张三", int ag = 20);
	void output(){ cout << "num:" << num << "  name:" << name << "  age:" << age << endl; }
};

Student::Student(char *s, char*a, int ag)
{
	num = new char[strlen(s) + 1];
	num = s;
	name = new char[strlen(a) + 1];
	name = a;
	age = ag;
}

int main()
{
	Student S("0504020101", "张三",20);
	S.output();
	
	return 0;
}

定义学生类,属性包括:学生姓名、语文成绩、数学成绩。完成:置学生信息、输出学生信息、求每个学生的平均成绩、求每个学生的总分、输出每个学生的平均成绩和总分。(要求用对象数组、构造函数完成)提示:考虑学生人数不定的情况,可用new建立动态对象数组(用new创建动态对象数组同用new创建其它数据类型的动态数组的操作相同)。

class Student{
	char *name;
	int chin;
	int math;
public:
	void Set(char *a, int b, int c){ name = a; chin = b; math = c; }
	void Output(){ cout << name << "  " << chin << "  " << math; }
	void aver(){ cout << "  " << (chin + math) / 2.0; }
	void sum(){ cout << "  " << chin + math << endl; }
};

int main()
{
	Student *p = new Student[3];
	(*p).Set("李明", 75, 80);
	(*(p + 1)).Set("张三", 90, 86);
	(*(p + 2)).Set("李四", 84, 76);
	for (int i = 0; i < 3; i++)
	{
		(*(p + i)).Output();
		(*(p + i)).aver();
		(*(p + i)).sum();
	}
	return 0;
}

定义一个圆类(Circle),属性为半径(radius)、圆周长和面积,操作为输入半径并计算周长、面积,输出半径、周长和面积。要求定义构造函数(以半径为参数、默认值为0,周长和面积在构造函数中生成)和复制(拷贝)构造函数。在主函数中进行测试。

class Circle{
	int radius;
	double t;//周长
	double s;//面积
public:
	Circle(double a = 0){ radius = a; t = 3.14 * 2 * a; s = 3.14*a*a; }
	void Output(){ cout << "radius:" << radius << "  t:" << t << "  s:" << s << endl; }
};

int main()
{
	Circle C(5);
	C.Output();

	return 0;
}

7.设计一个学校在册人员类,数据成员包括身份证号(id,可定义成字符串类型)、姓名(name)、性别(sex)、生日(birth,可定义成结构体类型)和家庭住址(homeadd)。成员函数包括人员信息的录入和显示,还包括构造函数和拷贝构造函数。在主函数中进行测试。

class student{
	char*id;
	char*name;
	char*sex;
	char*birth;
	char*homeadd;
public:
	student(){}
	~student(){}
	void set(char*id, char*name, char*sex, char*birth, char*homeadd);
	void out(student);
}stu[10];

void student::set(char*id,char*name,char*sex,char*birth,char*homeadd)
{
	this->id = id;
	this->name = name;
	this->sex = sex;
	this->birth = birth;
	this->homeadd = homeadd;
}
void student::out(student d)
{
	cout << "id:" << d.id << "   name: " << d.name << "   sex:" << d.sex << "   birth:" << d.birth << "   homeadd:" << d.homeadd << endl;
}

int main()
{
	stu[0].set("1001", "李明", "男", "2001-1-12", "江西");
	stu[1].set("1002", "张三", "男", "2000-10-1", "上海");
	stu[2].set("1003", "小红", "女", "2003-5-21", "江苏");
	for (int i = 0; i < 3;i++)
		stu[i].out(stu[i]);

	return 0;
}

1、设计包含静态数据成员的类
某商店经销一种货物,货物成箱进,成箱卖出,购进和卖出都是以重量为单位(每箱的重量不同),商店需要记录下存货的总重量。
分析:
定义一个货物类,类中包含
私有成员 weight
一个静态数据成员total_weight;
在构造函数中,修改total_weight的值
在析构函数中,修改total_weight的值
在主函数中进行测试

class cargo
{
	int weight;
	static int total_weight;
public:
	cargo(int a){ total_weight = total_weight + a; weight = 0; cout << "初始:" << total_weight << endl; }
	~cargo(){ total_weight = total_weight + weight; cout << "结束:" << total_weight << endl; }
	void set(int a){ weight = weight + a;}
};
int cargo::total_weight = 0;

int main()
{
	cargo p(5);
	p.set(2);
	p.set(6);
	p.set(-5);
	return 0;
}
初始:5
结束:8

2、写出类A的定义,通过类的静态成员来记录已经创建的A类的实例(对象)的个数,使得下面的程序:
void main()
{A *pa=new A[10];
cout<<“there are”<GetObjCount()<<“objects”<<endl;
delete []pa;
cout<<“there are”<<A::GetObjCount()<<“objects”<<endl;
}
得到的输出为:
there are 10 objects
there are 0 objects
定义一个boat类,含有weight数据成员。
定义该类的一个友元函数, 该函数能输出一个boat对象的重量。

class A
{
public:
	static int count;
	A(){ count++; }
	static int GetObjCount();
	~A(){ count--; }
};
int A::GetObjCount()
{
	return count;
}
int A::count = 0;

int main()
{
	A *pa = new A[10];
	cout << "there are " << pa->GetObjCount() << " objects" << endl;
	delete[]pa;
	cout << "there are " << A::GetObjCount() << " objects" << endl;

	return 0;
}

3、写完整程序。
定义一个Boat类和Car类,均含有weight数据成员。
定义一个友元函数, 该函数能输出一个Boat对象和一个Car对象的重量和。
提示:(1)友元函数可以定义成如下形式: (注意形参)
void display_weight(Boat &boat, Car &car)
(2)如果先定义Boat类,类中用friend对友元函数声明,friend void display_weight(Boat &boat ,Car &car);
这里会出现还未定义的Car类,因此,需要在定义Boat类之前需用class Car;对Car类进行声明
类似,如果先定义Car类,则需要对Boat类先进行声明

class Car;

class Boat{
	int weight;
	
public:
	Boat(int a){ weight = a; }
	friend void display_weight(Boat &, Car&);
};

class Car{
	int weight;
	
public:
	Car(int a){ weight = a; }
	friend void display_weight(Boat &, Car&);
};

void display_weight(Boat&a, Car&b)
{
	cout << a.weight + b.weight << endl;
}

int main()
{
	Boat a(10);
	Car b(5);
	display_weight(a, b);

	return 0;
}

4、编写函数, 计算两个点之间的距离
定义一个point类。
定义该类的一个友元函数,该函数能计算两个点之间的距离(该函数有两个point类型的形参)。

//法一:普通函数作为类中友元函数
class point{
	int x, y;
public:
	point(int a, int b){ x = a; y = b; }
	friend int sqr(point&,point&);
};

int sqr(point&a, point&b)
{
	return sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y));
}


int main()
{
	point p(3, 5), q(3, 4);
	cout << sqr(p, q) << endl;
	
	return 0;
}
//法二:成员函数作为另一个类的友元函数
class point;
class C{  //C类
public:
	int sqr(point&, point&);
};

class point{  //point类
	int x, y;
public:
	point(int a, int b){ x = a; y = b; }
	friend int C::sqr(point&, point&);   //友元
};

int C::sqr(point&a, point&b)  //C类函数
{
	return sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y));
}

int main()
{
	point p(3, 5), q(3, 4);
	C c;
	cout << c.sqr(p, q) << endl;

	return 0;
}
//法三:一个类称为另一个类的友元
class point;
class C{  //C类
public:
	int sqr(point&, point&);
};

class point{  //point类
	int x, y;
public:
	point(int a, int b){ x = a; y = b; }
	friend class C;   //友元
};

int C::sqr(point&a, point&b)  //C类函数
{
	return sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y));
}

int main()
{
	point p(3, 5), q(3, 4);
	C c;
	cout << c.sqr(p, q) << endl;
	
	return 0;
}

6.18作业九——实验六~七

1、编写一个程序设计一个汽车类vehicle,包含的数据成员有车轮个数wheels和车重weight。小车类car是它的私有派生类,其中包含载人数passenger_load。卡车类truck是vehicle的私有派生类,其中包含载人数passenger_load和载重量payload。每个类都有一个公有成员函数输出汽车的相关的信息。用主函数进行测试。
要求:
(1)数据成员的访问权限不能设为public
(2)定义有参构造函数。

class vehicle{
	int wheels;
	int weight;
public:
	void set(int a, int b){ wheels = a; weight = b; }
	int get_wheels(){ return wheels; }
	int get_weight(){ return weight; }
};

class car :private vehicle{
	int passenger_load;
public:
	car(int a, int b, int c){ vehicle::set(a, b); passenger_load = c; }
	void print(){ cout << "轮子:" << vehicle::get_wheels() << "  重量:" << vehicle::get_weight() << "  载人" << passenger_load << endl; }
};

class truck :private vehicle{
	int passenger_load;
	int payload;
public:
	truck(int a, int b, int c, int d){ vehicle::set(a, b); passenger_load = c; payload = d; }
	void print(){ cout << "轮子:" << vehicle::get_wheels() << "  重量:" << vehicle::get_weight() << "  载人:" << passenger_load << "  载重:" << payload << endl; }
};

int main()
{
	car a(4, 3, 5);
	a.print();
	truck b(8, 7, 2, 4);
	b.print();
	return 0;
}

2.student类包含的数据成员(私有)有姓名name,学号id和成绩score,分别有构造函数,拷贝构造函数,把input和output函数写为友元函数,用主函数通过对象进行测试。

class student{
	string name;
	string id;
	int score;
public:
	student(string name, string id, int score){ this->name = name; this->id = id; this->score = score; }
	student(student& a){ name = a.name; id = a.id; score = a.score; }
	friend void input(){}
	friend void output(student&d){ cout << "name:" << d.name << " id:" << d.id << " score:" << d.score << endl; }
};

int main()
{
	student a("Jake", "1001", 90);
	student b(a);
	output(b);
	return 0;
}

3.第2题中的student类添加一个date类数据成员birthday,date类包含三个数据成员:year、month、day,以及用于初始化的构造函数,用于输入数据的input和输出数据的output成员函数。student类构造函数需要完成birthday的数据初始化,并且完成birthday数据的输入/输出。用main函数测试这个类。

class student{
	string name;
	string id;
	int score;
public:
	void input(string d, string e, int f){ name = d; id = e; score = f; }
	void output(){ cout << "name:" << name << " id:" << id << " score:" << score; }
};
class data:public student{
	int year;
	int month;
	int day;
public:
	data(int a, int b, int c, string d, string e, int f){ 
		input(d, e, f); year = a; month = b; day = c;
		output(); cout << " " << year << "-" << month << "-" << day << endl;
	}
	
};

int main()
{
	data a(2001, 1, 1, "jake", "1001", 90);

	return 0;
}

4.义一个Box(盒子)类,在该类定义中包括以下数据成员和成员函数。
数据成员:length(长)、width(宽)和height(高)。
成员函数:构造函数Box,设置盒子的长、宽和高三个初始数据;成员函数setBox对数据成员置值;成员函数volume计算盒子的体积。
在main函数中,要求创建Box对象,输入长、宽、高,输出盒子的体积。

class Box{
	int length;
	int width;
	int height;
public:
	Box(int a, int b, int c){ length = a; width = b; height = c; }
	void setBox(int a, int b, int c){ length = a; width = b; height = c; }
	int volume(){ return length*width*height; }
};

int main()
{
	Box a(3, 4, 5);
	cout<<a.volume()<<endl;

	return 0;
}

5.设计一个圆类circle和一个桌子类table,另设计一个圆桌类roundtable,它是从前两个类派生的,要求输出一个圆桌的高度、面积和颜色等数据。(每个类都要定义带参的构造函数)

class circle{
	int r;
public:
	void setr(int a){ r = a; }
	float getr(){ return 3.14*r; }
};
class table{
	int height;
public:
	void seth(int a){ height = a; }
	float geth(){ return height; }
};
class roundtable :public circle, public table{
	string color;
public:
	roundtable(int a, int b, string c){ setr(a); seth(b); color = c; }
	void get(){ cout << "R:" << getr() << "  height:" << geth() << "  color:" << color; }
};

int main()
{
	roundtable a(1, 1, "blue");
	a.get();

	return 0;
}

1、定义一个计数器类Counter,对其重载运算符“+”。此计数器类中只包含“计数的数值”一个数据成员。

class Counter{
	int count;
public:
	void operator++();
};
void Counter::operator++()
{
	++count;
}

2、有两个矩阵a和b,均为2行3列,求两个矩阵之和。重载运算符“+”使之能用于矩阵相加,如c=a+b。(要求:建立矩阵类)

class array
{
private:
	int mat[2][3];
public:
	array(int a, int b, int c, int d, int e, int f){
		mat[0][0] = a; mat[0][1] = b; mat[0][2] = c;
		mat[1][0] = d; mat[1][1] = e; mat[1][2] = f;
	}
	friend array operator + (array&, array&);
	void display();
};
array operator + (array&c1, array&c2)
{
	array c(0,0,0,0,0,0);
	for (int i = 0; i<2; i++)
		for (int j = 0; j<3; j++)
			c.mat[i][j] = c1.mat[i][j] + c2.mat[i][j];
	return c;
}
void array::display()
{
	for (int i = 0; i<2; i++)
	{
		for (int j = 0; j<3; j++)
			cout << mat[i][j] << "  ";
		cout << endl;
	}
	cout << endl;
}
int main()
{
	array a(1,1,1,1,1,1), b(1,1,1,1,1,1), c(0,0,0,0,0,0);
	c = a + b;
	c.display();
	return 0;
}

3、定义复数类,用成员函数重载+,- 运算符。并编写主函数进行测试。

class array
{
private:
	int a;
	int b;
public:
	array(int a, int b){ this->a = a; this->b = b; }
	friend array operator + (array&, array&);
	void display();
};
array operator + (array&c1, array&c2)
{
	array c(0,0);
	c.a = c1.a + c2.a;
	c.b = c1.b + c2.b;
	return c;
}
void array::display()
{
	cout << a << "+" << b << "i" << endl;
}
int main()
{
	array a(1,1), b(3,2), c(0,0);
	c = a + b;
	c.display();
	return 0;
}

4、定义point类,分别用成员函数和友元函数重载前置–和后置的–运算符。

class point{
	int count;
public:
	point(int a){ count = a; }
	void operator--();
	friend point operator--(point&, int a);
};
void point::operator--()
{
	--count;
}
point operator--(point &p, int a)
{
	point q(1);
	q = p;
	--p.count;
	return q;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值