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模板网!

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

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

相关文章

  • 吉林大学 计算机网络常见的名词解释

    API (Application Programming Interface)应用程序编程接口 HTTP (Hyper Text Transfer Protocol) 超文本传输协议 CDN (Content Delivery Network)内容分发网络 SMTP (Simple Mail Transfer Protocol)即简单邮件传输协议 POP3 (Post Office Protocol),即第三版的邮局协议,用于电子邮件的接收。本协议主要用

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    301、Windows10各版本中,功能最少的是() A.家庭版 B.专业版 C.企业版 D.教育版 正确答案:A 解析:功能从少到多∶家庭版——专业版——教育版——企业版(教育版和企业版功能基本相同) 302、漏洞扫描技术是一类重要的网络安全技术。它和防火墙、入侵检测系统互相配合,能够有

    2024年02月05日
    浏览(47)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包