2022级吉林大学面向对象第三次上机测试

这篇具有很好参考价值的文章主要介绍了2022级吉林大学面向对象第三次上机测试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【注:解答全部为本人所写,仅供同学们学习时参考使用,请勿照搬抄袭!】

运算符重载、动态内存管理
1.已知字符串类MyString的定义为:

class MyString
{
  public:
	MyString(const char* pData= NULL);		// 普通构造函数
	MyString(const MyString &);	        	// 拷贝构造函数
	~ MyString();					// 析构函数
	MyString & operator =(const MyString &);	// 赋值函数
	MyString& operator += (const MyString &);
	operator char* () const;                 	// 自动转换函数 
  private:
	char  	*mpData;				// 用于保存字符串
   };	

全局函数:
const MyString operator + (const MyString &,const MyString &);//字符串连接
ostream& operator<<(ostream& os, const MyString& str); //定向输出

请完整实现MyString类和指定的全局函数。(可以使用new,delete运算以及strcpy,strlen,…等库函数,还可以定义其他辅助函数)。

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

class MyString {
friend ostream& operator<<(ostream& os, const MyString& str);
friend const MyString operator+(const MyString &s1,const MyString &s2); 
public:
	MyString(const char* pData = NULL) {
		this->mpData = new char[5];
		strcpy(this->mpData, pData);
	}	// 普通构造函数
	MyString(const MyString &s) {  
		this->mpData = new char[10];
		strcpy(this->mpData, s.mpData);
	}       	// 拷贝构造函数
	~ MyString() { delete this->mpData;}				// 析构函数
	MyString& operator=(const MyString &s) {
		this->mpData = new char[10];
		strcpy(this->mpData, s.mpData);
		return *this;
	}	// 赋值函数
	MyString& operator+=(const MyString &s) {
		int len=strlen(mpData)+strlen(s.mpData)+1;
		char *tmp = new char[len];
		strcpy(tmp, mpData);
		strcat(tmp, s.mpData);
		strcpy(mpData, tmp);
		delete[] tmp;	
		return *this;
	}
	operator char* () const;                 	// 自动转换函数 
private:
	char* mpData;				// 用于保存字符串
};	

const MyString operator+(const MyString &s1,const MyString &s2) {
	return MyString(s1)+=s2;
}//字符串连接    	  
ostream& operator<<(ostream& os, const MyString& str) {
	os << str.mpData << endl;
	return os;
}		//定向输出

int main()
{
	MyString a1("123");
	MyString a2("456");
	MyString c = a1 + a2;
	cout << c << endl;
	return 0;
} 

2.对任意一个正的实数,总可以唯一地表示成a0+1/(a1+1/(a2+1/(a3+1/…)))的形式,简记为a0+a1+a2+a3+…+ak。(ai为大于0 的正整数,长度为k。若数为无理数,则k为无穷大) ,并称这种形式的数为连分数。

a)请使用类的自关联方式设计并实现连分数类, 此类的每个对象代表一个有理数的连分数形式,且假定连分数的长度均小于MAXLEN(MAXLEN设为数30)。
该类主要功能有:
1)对指定的i,返回ai值;
2)计算连分数的前q项(a0+a1+a2+a3+…+aq)所对应分数的分子和分母;
3)输出此分数的前q项,格式为:a0+a1+a2+a3+…+aq;

b)给出主程序,使用该类计算连分数的前n项对应的分数逼近PI值的程度(计算差即可。PI可用math.h中的M_PI常量)。
(由此可见祖老师给出的约率和密率是多么地精确!连分数的收敛速度多么地快!)

例如主程序的输出可能如下:

PI=3.141592653589793

前1项为3
前1项对应分数为3/1
前1项对应分数的值为3
前1项对应分数与3.141592653589793的差为0.1415926535897931

前2项为3+7
前2项对应分数为22/7
前2项对应分数的值为3.142857142857143
前2项对应分数与3.141592653589793的差为-0.001264489267349741

前3项为3+7+15
前3项对应分数为333/106
前3项对应分数的值为3.141509433962264
前3项对应分数与3.141592653589793的差为8.321962752896503e-005

前4项为3+7+15+1
前4项对应分数为355/113
前4项对应分数的值为3.141592920353983
前4项对应分数与3.141592653589793的差为-2.667641891848736e-007

前5项为3+7+15+1+292
前5项对应分数为103993/33102
前5项对应分数的值为3.141592653011902
前5项对应分数与3.141592653589793的差为5.778905119192823e-010

前6项为3+7+15+1+292+1
前6项对应分数为104348/33215
前6项对应分数的值为3.141592653921421
前6项对应分数与3.141592653589793的差为-3.316279286770529e-010

前7项为3+7+15+1+292+1+1
前7项对应分数为208341/66317
前7项对应分数的值为3.141592653467437
前7项对应分数与3.141592653589793的差为1.223564103768754e-010

前8项为3+7+15+1+292+1+1+1
前8项对应分数为312689/99532
前8项对应分数的值为3.141592653618936
前8项对应分数与3.141592653589793的差为-2.914350748575711e-011

前9项为3+7+15+1+292+1+1+1+2
前9项对应分数为833719/265381
前9项对应分数的值为3.141592653581078
前9项对应分数与3.141592653589793的差为8.715344852056051e-012

前10项为3+7+15+1+292+1+1+1+2+1
前10项对应分数为1146408/364913
前10项对应分数的值为3.141592653591404
前10项对应分数与3.141592653589793的差为-1.610862485068587e-012

#include <iostream>
#include <vector>
using namespace std;
const int MAXLEN = 30;

class CFraction {
private:
	vector<int> ai; // 存储a0,a1,a2,...,ak
public:
	
	int length() { // 返回连分数的长度
		return ai.size();
	}
	
	void add(int a) { // 添加下一个ai
		ai.push_back(a);
	}
	
	void print(int q) { // 输出连分数的前q项
		cout << ai[0];
		for (int i = 1; i < q; i++) {
			cout << "+" << ai[i];
		}
		cout << endl;
	}
	
	void fraction(int q, int& num, int& den) { // 计算连分数的前q项所对应的分数
		num = ai[q - 1];
		den = 1;
		for (int i = q - 2; i >= 0; i--) {
			int tmp = num;
			num = ai[i] * num + den;
			den = tmp;
		}
	}
};

CFraction getCFraction(double x, int maxLen) { // 将实数转化为连分数
	CFraction cf;
	int a = int(x);
	cf.add(a);
	double r = x - a;
	while (r > 0 && cf.length() < maxLen) {
		r = 1 / r;
		a = int(r);
		cf.add(a);
		r -= a;
	}
	return cf;
}

int main() 
{
	double pi = 3.14159265358979323;
	for (int i = 1; i <= 10; i++) {
		CFraction cf = getCFraction(pi, i);
		int num = 0, den = 0;
		cf.fraction(i, num, den);
		double approx = double(num) / den;
		cout << "前" << i << "项为";
		cf.print(i);
		cout << "前" << i << "项对应分数为" << num << "/" << den << endl;
		cout << "前" << i << "项对应分数的值为" << approx << endl;
		cout << "前" << i << "项对应分数与" << pi << "的差为" << pi - approx << endl << endl;
	}
	return 0;
}

3、在全局函数void f(int n,int m)中动态建立一个大小为nxm的二维整数数组,并对每个数组元素依次赋值为1,2,3,…,m*n, 再输出每行和每列元素的和,退出函数前释放此数组。

#include <bits/stdc++.h>
using namespace std;

void f(int n, int m) {
	int ** array = new int* [n];
	for (int i = 0; i < n; i++) {
		array[i] = new int [m];
	}
	int count = 1;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			array[i][j] = count;
			count++;
		}
	}
	for (int i = 0; i < n; i++) {
		int sum = 0;
		for (int j = 0; j < m; j++) {
			sum += array[i][j];
		}
		cout << "Row " << i + 1 << " : sum = " << sum << endl;
	}
	puts("");
	for (int j = 0; j < m; j++) {
		int sum = 0;
		for (int i = 0; i < n; i++) {
			sum += array[i][j];
		}
		cout << "Col " << j + 1 << " : sum = " << sum << endl;
	}
	for (int i = 0; i < n; i++) {
		delete[] array[i];
	}
	delete[] array;
} 

int main()
{
    f(3, 4);
    return 0;
}

4、已有类A声明如下:
class A
{
public:
A(int n):data(n) {}
int Data() const {return data;}
private:
int data;
};
在全局函数void g(int n) 中动态建立一个大小为n的一维指针数组, 数组元素指向A类对象,各对象的data数据成员各不相同, 分别为1,2,3,…,n。创建数组后,使用(例如输出)各对象的data值,最后释放此数组。

#include <bits/stdc++.h>
using namespace std;

class A {
public:
    A(int n) : data(n) {}
    int Data() const { 
		return data; 
	}
private:
    int data;
};

void g(int n) {
	A** array = new A*[n];
	for (int i = 0; i < n; i++) {
		array[i] = new A(i + 1);
		cout << array[i]->Data() << endl;
	}
	
	for (int i = 0; i < n; i++) {
		delete[] array[i];
	}
	delete[] array;
}

int main()
{
	g(5);
	return 0;
} 

5、如何建立一个二维整数数组类,使得其大小可动态决定,并且访问时,可像普通数组一样使用。如 建立这个二维整数数组类的一个对象obj后, 访问其第二行、第三列元素,可写成:
obj[1][2] = 5;
cout<<obj[1][2];文章来源地址https://www.toymoban.com/news/detail-456610.html

#include <bits/stdc++.h>
using namespace std;

class Array{
public:
	Array(int row, int col) {
		m_row = row;
		m_col = col;
		m_data = new int* [m_row];
		for (int i = 0; i < m_row; i++) {
			m_data[i] = new int [m_col];
		}
	}
	
	~Array() {
		for (int i = 0; i < m_row; i++) {
			delete[] m_data[i];
		}
		delete[] m_data;
	}
	
	int* operator[] (int index) {
		return m_data[index];
	}
	
private:
	int m_row;
	int m_col;
	int** m_data;	
};

int main()
{
	Array obj(2, 3);
	obj[1][2] = 2;
	cout << obj[1][2];
	return 0;
}

到了这里,关于2022级吉林大学面向对象第三次上机测试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 校企联盟-触觉智能正式成为吉林大学实习实践基地

    近日,触觉智能与吉林大学正式达成了实习实践基地合作,这个合作的达成标志着双方在教育与企业之间搭建了一座连接的桥梁,让高校老师科研项目更贴近市场需要,让优秀的科研成果得到有效转化,让优秀应届大学生获得更多理论实践锻炼机会,也为触觉智能注入了新的

    2024年01月24日
    浏览(36)
  • 常用math.h数学函数以及其他函数(吉林大学 孙立鑫)

    目录   1.math.h 头文件的常用函数    a.signbit(求浮点数是否含有符号)    b.三角函数汇总    c.双曲函数    d.指数函数对数函数    e.分解浮点数(详解如下)frexp    f.取浮点数的指数部分ilogb    g.反分解浮点数(详解如下)ldexp    h.浮点数的取整和取小 modf    i.四舍

    2024年02月05日
    浏览(41)
  • 每章一篇博客带你拿下吉林大学JAVAEE期末(一)

    1)JDBC(Java Database Connectivity) 是一种用于执行SQL语句的JavaAPI,可为访问不同的关系型数据库提供一种统一的途径。 2) JNDI(Java Name and Directory Interface,Java 命名和目录接口) 被用于执行名字和目录服务。它提供了一致的模型来存取和操作企业级的资源,如DNS,LDAP,本地文件系统或应

    2024年02月12日
    浏览(27)
  • [保研/考研机试] KY180 堆栈的使用 吉林大学复试上机题 C++实现

    堆栈的使用_牛客题霸_牛客网     堆栈是一种基本的数据结构。堆栈具有两种基本操作方式,push 和 pop。其中 push一个值会将其压入栈顶,而 pop 则会将栈顶的值弹出。现在我们就来验证一下堆栈的使用。 输入描述:     对于每组测试数据,第一行是一个正整数 n(0 n = 1

    2024年02月13日
    浏览(37)
  • 每章一篇博客带你拿下吉林大学JAVAEE期末(七:会话Bean)

    1) 无状态 会话Bean 无状态会话Bean 不维持 和客户端的 会话状态 。 当方法结束的时候,客户端特定的状态就不会被保持。 允许EJB容器将一个实例分配给任意一个客户端。 2) 有状态 会话Bean 有状态会话Bean是一种保持会话状态的服务,每个实例都与特定的客户端相关联,在与

    2024年02月13日
    浏览(59)
  • 面向对象程序设计第三次bolg

    本次博客针对面向对象程序设计的课程所发的PTA作业7,8以及期末考试中的面向对象编程题的分析和总结,重点介绍课程成绩统计程序系列题目以及期末考试的编程题。 在这次作业中7-1、7-2内容和考点相同,在此我分析一下7-2Hashmap的排序这个问题。 7-2 容器-HashMap-排序 分数

    2024年02月05日
    浏览(43)
  • 面向对象java前三次pta作业

    1、前言 2、设计与分析 3、踩坑心得 4、主要困难及改进建议 5、总结   面向对象程序设计(Object-Oriented Programming,简称OOP)是一种编程范式,它以对象作为程序的基本单元,将数据和操作封装在一起。面向对象程序设计的基本概念包括类、对象、继承、多态等。 类(Class)是

    2024年02月08日
    浏览(29)
  • C++面向对象程序设计-北京大学-郭炜【课程笔记(四)】

    开始课程:P11 1_1. this指针 课程链接:程序设计与算法(三)C++面向对象程序设计 北京大学 郭炜 课程PPT:github提供的对应课程PPT C++是没有自身编译器的,需要使用C语言的编译器,所以C++在编译时需要把语言转换为对应的C语言。 实例1: C++程序到C程序的翻译:(下图好理解,

    2024年02月22日
    浏览(44)
  • C++面向对象程序设计-北京大学-郭炜【课程笔记(三)】

    开始课程:P7 2_2. 构造函数 课程链接:程序设计与算法(三)C++面向对象程序设计 北京大学 郭炜 课程PPT:github提供的对应课程PPT 1、成员函数的一种 名字与类名相同,可以有参数,不能有返回值(void 也不行) 作用是对对象进行初始化,如给成员变量赋初值 如果定义类时没

    2024年02月19日
    浏览(37)
  • 2022第三届全国大学生网络安全精英赛练习题(9)

    801、近年来,我国面临日趋严峻的网络安全形势,党和国家高度重视信息安全建设,关于网络安全形势的描述中,理解错误的是(() A.我国的网络安全形势差,但在党和国家高度重视的情况下,面临各种攻击、威胁都能解决,发展稳定 B.持续性威胁常态化,我国面临的攻击十

    2023年04月08日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包