判断两个字符串内数字是否相同,向量相同的C++程序。

一个高中哥们,拜托我帮他写程序,鉴于他面临的挂科的风险,又加上他老师教的也不是很好。就重操旧业,来了段C++。今天发这个博客主要是把代码贴出来纪念下,同时也供写这作业的同学参考下。

程序的题目了,可高大上了,厉害的紧啊!全英文,这把我吓的,看了半天懂了,人家说有一种向量什么什么的,厉害的很,让你比较俩向量是否相等。厉害了,这是干啥呀?

看了一会懂了,从DOS界面让用户输入俩字符串,字符串内是数字,两个数字间用非数字符号隔开。也就是类似于这样的"1,2,3,1,4,5,12,154,12"。搜噶,这不就是普通的表示方法吗。当然复杂的也有"1a1s1x2s5#5^6"反正他俩数字间不是数字呗。瞧瞧,瞧瞧人家老师出的题,我们景大佬出题只会出英雄联盟人物去干嘛干嘛。渍渍渍,差距!然后嘞,你把数字提出来,如"1a1s2d5s8"就成了整型{1,1,2,5,8},变成整型了,然后比较A数组和B数组元素的映射是否相同(不计顺序)。映射不懂的话,也就是A集合和B集合是否相同。注意,集合啊!还不懂,高一重修。

欧,人家老师还说了,我要两种解决方法。渍渍渍,高大上。赶上景大佬和秦大佬了(我们江科大最好的计算机老师)。不过问题在于,你没把你的学生教会啊,这是老师最大的悲哀。渍渍渍~我这巴掌打的太重了吧。

下面讲思路:

第一种:

1. 提取出整型数组。

2.遍历检查A数组的元素是否都在B数组中。

3.遍历检查B数组的元素是否都在A数组中。

4.若以上2,3条都成立,则返回正确,否则返回错误。(其实若2,3中有一处不成立,当场就return false了,这么说是让大家容易懂)

代码如下:

扫描二维码关注公众号,回复: 5928542 查看本文章
#include<iostream>
using namespace std;

//从这里往下是处理字符串的函数,主要是把字符串转化为整型数组 
//判断是否是数字的函数
bool IsNum(char str)
{
	if (int(str) >= 48 && int(str) <= 57)return true;
	else return false;
}
//计算数组长度的函数
int Clen(string x)
{
	int n=0;
	for(int i=0;x[i]!='\0';i++)
	{
		if(!IsNum(x[i]))
		{
			n++;
		}
	}
	return n+1;
}
//将字符转化为整型
int chaToInt(char a)
{
	return int(a)-48;
} 
//将字符串转化为整数
int strToInt(string str,int n)
{
	int num=0;
	int ten=1;
	for(int i=n-1;i>=0;i--)
	{
		num=num+chaToInt(str[i])*ten;
		ten=ten*10;
	}
	return num;
} 
//将字符串转换成整型数组的函数
void str_To_Int(string str,int *answer)
{
	int start = 0;
	int end = 0;
	int n=0;

	for (int i = 0; str[i] != '\0'; i++)
	{
		if (IsNum(str[i]))
		{
			end++;
		}
		else
		{
			answer[n]=strToInt(&str[start],end-start);
			n++;
			end++;
			start=end;
		}
	}
	answer[n]=strToInt(&str[start],end-start);
}

//这是用于比较两个整型数组的函数。
/*
函数实现的功能有:
1. 判断A数组内的元素是不是都在B数组上,是则继续进行,否则返回错误
2. 判断B数组内的元素是不是都在A数组上,是返回正确,否则返回错误 

*/
//整型数组元素查找函数
int findNum(int *a,int len,int num,int pass=-1)
//a为数组地址。len为数组长度,num为查找数组,pass为屏蔽位,默认值为-1不屏蔽
//若查找到,则返回位置,否则返回-1 
{
	for(int i=0;i<len;i++)
	{
		if(a[i]==num&&i!=pass)return i;
	}
	return -1;
}
bool same_vec(int *a, int *b,int &len_a,int &len_b)
{
	for(int i=0;i<len_a;i++)
	{
		if(findNum(b,len_b,a[i])==-1)
		{
			return false;
		}
	}
	for(int i=0;i<len_b;i++)
	{
		if(findNum(a,len_a,b[i])==-1)
		{
			return false;
		}
	}
	return true;
}

int main()
{
	//生成两个字符串指针
	string a;
	string b;
	//要求用户输入字符串
	std::cout << "请输入向量A:" << endl;
	std::cin >> a;
	std::cout << "请输入向量B:" << endl;
	std::cin >> b;
	//对字符串进行处理
	
	int len_a = Clen(a);
	int * answer_a = new int[len_a];
	str_To_Int(a,answer_a);
	
	int len_b = Clen(b);
	int * answer_b = new int[len_b];
	str_To_Int(b,answer_b);
	
	bool x=same_vec(answer_a,answer_b,len_a,len_b);
	if(x)
	{
		cout<<"两向量相同"<<endl;
	}
	else
	{
		cout<<"两向量不同"<<endl;
	}
	delete answer_a;
	delete answer_b;
	return 0;
}

第二种思路:

1. 还是把字符串整理成数组。

2. 去除数组中重复的元素。

3. 将各自数组中元素排序。

4. 比较两个数组是否相同。

#include<iostream>
using namespace std;

//从这里往下是处理字符串的函数,主要是把字符串转化为整型数组 
//判断是否是数字的函数
bool IsNum(char str)
{
	if (int(str) >= 48 && int(str) <= 57)return true;
	else return false;
}
//计算数组长度的函数
int Clen(string x)
{
	int n=0;
	for(int i=0;x[i]!='\0';i++)
	{
		if(!IsNum(x[i]))
		{
			n++;
		}
	}
	return n+1;
}
//将字符转化为整型
int chaToInt(char a)
{
	return int(a)-48;
} 
//将字符串转化为整数
int strToInt(string str,int n)
{
	int num=0;
	int ten=1;
	for(int i=n-1;i>=0;i--)
	{
		num=num+chaToInt(str[i])*ten;
		ten=ten*10;
	}
	return num;
} 
//将字符串转换成整型数组的函数
void str_To_Int(string str,int *answer)
{
	int start = 0;
	int end = 0;
	int n=0;

	for (int i = 0; str[i] != '\0'; i++)
	{
		if (IsNum(str[i]))
		{
			end++;
		}
		else
		{
			answer[n]=strToInt(&str[start],end-start);
			n++;
			end++;
			start=end;
		}
	}
	answer[n]=strToInt(&str[start],end-start);
}

//这是用于比较两个整型数组的函数。
/*
函数实现的功能有:
1. 将两个整型数组进行去重(删去本数组内重复值)
2. 对去重后的两个数组做长度比较,如果长度相同,进行如下步骤,否则返回错误。
3. 将两个数组内元素从小到大排序。
4. 依次判断两个数组相同位置上的元素是否相同,否则报错。
*/
//整型数组元素查找函数
int findNum(int *a,int len,int num,int pass=-1)
//a为数组地址。len为数组长度,num为查找数组,pass为屏蔽位,默认值为-1不屏蔽
//若查找到,则返回位置,否则返回-1 
{
	for(int i=0;i<len;i++)
	{
		if(a[i]==num&&i!=pass)return i;
	}
	return -1;
}
//删除数组某一元素 
void delNum(int *a,int len,int n)
{
	for(int i=n;i<len-1;i++)
	{
		a[i]=a[i+1];
	}
}
//整型数组去重函数
void IntClear(int *num,int &len)
{
	int x=0;
	for(int ii=0;ii<=len;ii++)
	{
		for(int i=0;i<len;i++)
	    {
		  x=findNum(num,len,num[i],i);
		  if(x!=-1)
		  {
			 delNum(num,len,x);
			 len--;
		  }
	    }
	}
} 
//数组排序函数
void rankNum(int *a,int len)
{
	int x=0;
	for(int i=0;i<len;i++)
	{
		for(int ii=0;ii<len-1;ii++)
		{
			if(a[ii]>a[ii+1])
			{
				x=a[ii];
				a[ii]=a[ii+1];
				a[ii+1]=x;
			}
		}
	}
}
//判断两个数组内容是否相同
bool NumSame(int *a,int *b,int len)
{
	for(int i=0;i<len;i++)
	{
		if(a[i]!=b[i])
		{
			return false;
		}
	}
	return true;
}
bool same_vec(int *a, int *b,int &len_a,int &len_b)
{
	IntClear(a,len_a);
	IntClear(b,len_b);
	
	if(len_a!=len_b)return false;
	
	rankNum(a,len_a);
	rankNum(b,len_b);

	if(NumSame(a,b,len_a))return true;
	else
	{
		return false;
	}
}

int main()
{
	//生成两个字符串指针
	string a;
	string b;
	//要求用户输入字符串
	std::cout << "请输入向量A:" << endl;
	std::cin >> a;
	std::cout << "请输入向量B:" << endl;
	std::cin >> b;
	//对字符串进行处理
	
	int len_a = Clen(a);
	int * answer_a = new int[len_a];
	str_To_Int(a,answer_a);
	
	int len_b = Clen(b);
	int * answer_b = new int[len_b];
	str_To_Int(b,answer_b);
	
	bool x=same_vec(answer_a,answer_b,len_a,len_b);
	if(x)
	{
		cout<<"两向量相同"<<endl;
	}
	else
	{
		cout<<"两向量不同"<<endl;
	}
	delete answer_a;
	delete answer_b;
	return 0;
}

power by 天域至尊

转载请注明出处及作者。

环境:DEV C++ 5.4.0

猜你喜欢

转载自blog.csdn.net/qq_39091354/article/details/79662056