一个高中哥们,拜托我帮他写程序,鉴于他面临的挂科的风险,又加上他老师教的也不是很好。就重操旧业,来了段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了,这么说是让大家容易懂)
代码如下:
#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