前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OJ题之彩票复制(拷贝构造)return value 3221225477一类问题

OJ题之彩票复制(拷贝构造)return value 3221225477一类问题

作者头像
叶茂林
发布2023-07-30 09:47:19
1590
发布2023-07-30 09:47:19
举报
文章被收录于专栏:叶子的开发者社区

题目描述

假设每组彩票包含6个号码,设计一个彩票类lottery,数据成员包括第一组号码、其他组数、其他组号码,描述如下

1、第一组号码group1,整数数组,长度为6

2、其他组数num,表示以第一组号码为样本,创建num组其他号码

3、其他组号码groupn,整数指针(int **),,该数据将动态创建二维整数数组,共9行,每行包含6个号码。

彩票类的成员函数包括:构造函数、拷贝构造函数、打印,描述如下:

1、打印函数,输出彩票的所有组的号码

2、构造函数,两个参数,第一个参数为整数数组,对应第一组号码,第二个参数为整数,表示其他组数(不超过9)。注意在构造函数中,其他组号码groupn不动态分配空间,仍然为指针

3、拷贝构造函数,其他组号码groupn动态创建二维数组,根据其他组数创建其他组的号码,创建规则为:

a)第i组的第j个号码等于上一组第j-1个号码加1,首个号码等于上一组最后一个号码加1

例如第一组号码group1的号码是1、3、5、7、9、11,且其他组数为2

则groupn的第0组号码是12、2、4、6、8、10,第1组号码是11、13、3、5、7、9,以此类推

输入

第一行输入t表示有t个样例,每个样例对应一行数据

接着一行输入7个参数,前6个参数表示首张彩票的第一组6个号码,第7个参数表示其他组数,这时使用使用构造函数

然后采用拷贝构造方法生成第二张彩票,其中复制了首张彩票的第一组号码和其他组数,并且生成其他组号码

依此类推

输出

调用Print方法,输出每个样例中第二张彩票的所有组的号码

输入样例1 

2 1 3 5 7 9 11 2 22 44 66 88 100 122 3

输出样例1

1 3 5 7 9 11 12 2 4 6 8 10 11 13 3 5 7 9 22 44 66 88 100 122 123 23 45 67 89 101 102 124 24 46 68 90 91 103 125 25 47 69

思路分析

题目很长,这里讲讲我调试的时候遇见的一些问题。

第一次测试样例的时候,只能输出一个测试组的,不管我输入的2还是20 ,都只能输出第一个测试组的,然后开始调试,发现循环只做了一次,同时我注意到之前每次程序正常运行出结果,都会有这么些文字:

-------------------------------- Process exited after 1.454 seconds with return value 0 请按任意键继续. . .

但是这次是这样的文字:

-------------------------------- Process exited after 7.728 seconds with return value 3221225477 请按任意键继续. . .

首先时间很长,最奇怪的是这个主函数返回值很大。

于是我感觉应该是指针出了问题。

然后去看看指针那块代码,一开始类定义里面定义了二级指针groupn为空指针,然后在拷贝构造函数里面分配内存,最后在析构函数里面释放,最初的析构函数是这样的:

代码语言:javascript
复制
		~lottery()
		{
			for(int i=0;i<9;i++)
			delete[] groupn[i];
			delete[] groupn;	
		}

而我们在主函数里面用带参数构造函数定义了一个类对象,之后用拷贝函数定义了一个类对象,

但是,只有拷贝函数里面分配了内存,但是析构函数是都会进行的,也就是未分配的内存的那个类对象也会自动调用析构函数,但是它的groupn还是空指针,所以系统会找不到groupn[i],所以,出事了。

赶紧修改,是空指针就不执行了:

代码语言:javascript
复制
		~lottery()
		{
			if(groupn)
			{
			for(int i=0;i<9;i++)
			delete[] groupn[i];
			delete[] groupn;	
			}
		}

后来又去搜了一下发现还有几种情况也会return 3221225477:

① 向常量区写入了内容;

② 使用 scanf 时,输入数值或字符时没加 & ;

③ 链表末尾的next没有指向NULL,即访问越界,一般是读或写了野指针指向的内存

多说几句:

return value 3221225725:可能是数组过大,栈溢出。 return value 3221225620: 除以0了。

AC代码

代码语言:javascript
复制
#include <iostream>
using namespace std;
class lottery
{
	private:
		int group1[6];
		int num;
		int ** groupn=NULL;
	public:
		void print()
		{
			int i,j;
			for(i=0;i<5;i++)
			cout<<group1[i]<<' ';
			cout<<group1[i]<<endl;
			for(i=0;i<num;i++)
			{
				for(j=0;j<5;j++)
				cout<<groupn[i][j]<<' ';
				cout<<groupn[i][j]<<endl;
			}
		}
		lottery(int g1[],int n):num(n)
		{
			for(int i=0;i<6;i++)
			group1[i]=g1[i];			
		}
		lottery(lottery & lot)
		{
			int i,j;
			for(i=0;i<6;i++)
			group1[i]=lot.group1[i];
			num=lot.num;
			groupn=new int*[9];
			for(i=0;i<9;i++)
			groupn[i]=new int[6];
			groupn[0][0]=group1[5]+1;
			for(i=1;i<6;i++)
			groupn[0][i]=group1[i-1]+1;
			for(i=1;i<num;i++)
			{
				groupn[i][0]=groupn[i-1][5]+1;
				for(j=1;j<6;j++)
				groupn[i][j]=groupn[i-1][j-1]+1;
			}
		}
		~lottery()
		{
			if(groupn)
			{
			for(int i=0;i<9;i++)
			delete[] groupn[i];
			delete[] groupn;	
			}
		}
};
int main()
{
	int t,num,i,group1[6];
	cin>>t;
	while(t--)
	{
		for(i=0;i<6;i++)
		cin>>group1[i];
		cin>>num;
		lottery lot1(group1,num);
		lottery lot2(lot1);
		lot2.print();
	}
	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
  • 思路分析
  • AC代码
相关产品与服务
腾讯云服务器利旧
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档