C++比较两个数组并显示重复代码-代码现在工作 最后,下面是有效的代码:
我正在练习一个教科书上的问题,要求用户输入10个字符进入一个数组,然后将该数组与硬编码字母表数组进行比较。输出应显示每个字母的重复数(如果有)。例如: 有两个a。 有0个b。 有三个c。。。。。等等 我的代码正确计算了两个数组之间的重复数。但是,问题是每次循环迭代时它都会显示计数。我只需要它来显示总数。 我试着将cout语句移到循环下面,但这不起作用,因为它需要[I]和[j]从那里循环通过数组。 请指出我的错误所在,提前谢谢C++比较两个数组并显示重复代码-代码现在工作 最后,下面是有效的代码:,c++,arrays,C++,Arrays,我正在练习一个教科书上的问题,要求用户输入10个字符进入一个数组,然后将该数组与硬编码字母表数组进行比较。输出应显示每个字母的重复数(如果有)。例如: 有两个a。 有0个b。 有三个c。。。。。等等 我的代码正确计算了两个数组之间的重复数。但是,问题是每次循环迭代时它都会显示计数。我只需要它来显示总数。 我试着将cout语句移到循环下面,但这不起作用,因为它需要[I]和[j]从那里循环通过数组。 请指出我的错误所在,提前谢谢 #include <iostream> // usin
#include <iostream> // using DevCPP editor
#include <iomanip>
#include <string>
#include <algorithm>
#include <Windows.h>
using namespace std;
void parseBuffer( char buffArray[], char alphaArray[], int sizeOne, int sizeTwo );
int main()
{
// precode alphabet into an array with null terminating character
char alphabetArray[]={'a','b','c','d','e','f','g','h','i','j','k','l','m',n',
'o','p','q','r','s','t','u','v','w','x','y','z','\0'};
char buffer[11];
cout << "Enter the string up to 10 letters." << endl;
cin.get(buffer, 11);
parseBuffer(buffer, alphabetArray, 11, 11);
system("Pause");
return 0;
}
void parseBuffer(char buffArray[], char alphaArray[], int sizeOne, int sizeTwo)
{
int countFreq = 0;
cout << "This is buffer array: " << buffArray << endl;
cout << "This is alphabet array: " << alphaArray << endl<< endl;
for(int i = 0; i < (sizeTwo - 1); i++)
{
alphaArray[i];
for(int j = 0; j < (sizeOne -1); j++)
{
buffArray[j];
if(alphaArray[i] == buffArray[j] )
{
countFreq = countFreq + 1;
}
else
{
countFreq = 0;
}
cout << "It's a match. " << alphaArray[i] << " shows up " << countFreq << " times." << endl << endl;
}
}
} // end "parseBuffer"
您的代码有几个主要问题 循环顺序不正确。如果希望对alphaArray中的每个字符重复使用countFreq,则需要切换内部循环和外部循环 必须为每个字母数组字符初始化countFreq=0 必须为buffArray中的每个匹配字符递增countFreq,即++countFreq、countFreq++或countFreq+=1,而不是通过countFreq=1指定1。您现在所做的是在有匹配项时重置countFreq=1 您的循环次数减少了1,即,您最多检查10个字符而不是11个字符,并且您似乎对alphaArray使用了错误的大小限制
请格式化您的代码并正确使用for循环。i、 e.forint j=0;j
#include <string>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int main()
{
string s;
char c;
char alphabetArray[] =
{'a','b','c','d','e','f','g','h','i','j','k','l','m',
'n','o','p','q','r','s','t','u','v','w','x','y','z','\0'};
int count = 0;
cout << "Enter a string : ";
getline(cin, s);
for(int j = 0 ; j < strlen(alphabetArray); j++) {
for(int i = 0 ; i < s.size(); i++) {
if(s[i]==alphabetArray[j]) {
count++;
cout<<alphabetArray[j]<<" shows up "<<count<<" times"<<endl;
}
count=0;
}
}
system("pause");
return 0;
}
看看这个
#include <string>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int main()
{
string s;
char c;
char alphabetArray[] =
{'a','b','c','d','e','f','g','h','i','j','k','l','m',
'n','o','p','q','r','s','t','u','v','w','x','y','z','\0'};
int count = 0;
cout << "Enter a string : ";
getline(cin, s);
for(int j = 0 ; j < strlen(alphabetArray); j++) {
for(int i = 0 ; i < s.size(); i++) {
if(s[i]==alphabetArray[j]) {
count++;
cout<<alphabetArray[j]<<" shows up "<<count<<" times"<<endl;
}
count=0;
}
}
system("pause");
return 0;
}
我有一个更简单的解决方案,虽然这可能不是您想要的,但它更快、更小。 首先,您不需要一个字符数组,字符有int值'A'=65'F'=70,等等。因此,有了这些信息,您应该清楚,您可以按时执行此任务 以下是伪代码:
for(int i=0 to size of your string i++)
{
char ch is string.at(i);
ch equal to upper case of ch
short j = (convert ch to int);
if( j is between A and Z) then
{
count at j ++;
}
}
for(A to Z)
{
display frequency
}
以下是实际代码:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string data;
int count[26]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
const int BASE=65;
cout<<"string: ";
getline(cin,data);
int dataSize=data.length();
for(int i=0; i<dataSize; i++)
{
char ch=data.at(i);
ch=toupper(ch);
short j=(int)ch;
if(j>=BASE && j<=BASE+25)
{
count[j-BASE]++;
}
}
for(int i=0; i<26; i++)
{
char ch=i+BASE;
cout<<"There are "<<count[i]<<" "<<ch<<"'s."<<endl;
}
}
我有一个更简单的解决方案,虽然这可能不是您想要的,但它更快、更小。 首先,您不需要一个字符数组,字符有int值'A'=65'F'=70,等等。因此,有了这些信息,您应该清楚,您可以按时执行此任务 以下是伪代码:
for(int i=0 to size of your string i++)
{
char ch is string.at(i);
ch equal to upper case of ch
short j = (convert ch to int);
if( j is between A and Z) then
{
count at j ++;
}
}
for(A to Z)
{
display frequency
}
以下是实际代码:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string data;
int count[26]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
const int BASE=65;
cout<<"string: ";
getline(cin,data);
int dataSize=data.length();
for(int i=0; i<dataSize; i++)
{
char ch=data.at(i);
ch=toupper(ch);
short j=(int)ch;
if(j>=BASE && j<=BASE+25)
{
count[j-BASE]++;
}
}
for(int i=0; i<26; i++)
{
char ch=i+BASE;
cout<<"There are "<<count[i]<<" "<<ch<<"'s."<<endl;
}
}
如果这是家庭作业,它需要家庭作业标签。我在把它放入字符数组时停止了阅读。如果在C++课程中这是一个严肃的要求,那就换个工作或者换学校。这是一个家庭作业,不是吗?@克雷克斯伯:我同意你对实际编写C++代码的评论。改变学校或工作对大多数人来说可能不是一件容易的或可行的选择,因为对某些人来说,这可能不是为什么要指出编写C++代码的真正方法,并帮助解决问题,我们都知道你比其他人更有能力。如果你被教在C或C++课程中使用,你绝对应该换学校或者至少换老师。我的电脑有一个“暂停”命令,可以发射核导弹。幸好我没有在我的机器上测试你的代码。如果这是家庭作业,它需要家庭作业标签。我在把它放入字符数组时停止了阅读。如果在C++课程中这是一个严肃的要求,那就换个工作或者换学校。这是一个家庭作业,不是吗?@克雷克斯伯:我同意你对实际编写C++代码的评论。改变学校或工作对大多数人来说可能不是一件容易的或可行的选择,因为对某些人来说,这可能不是为什么要指出编写C++代码的真正方法,并帮助解决问题,我们都知道你比其他人更有能力。如果你被教在C或C++课程中使用,你绝对应该换学校或者至少换老师。我的电脑有一个“暂停”命令,可以发射核导弹。幸好我没有在我的机器上测试你的代码。你的代码不能解决所描述的问题。您缺少alphabetArray上的一个循环,并且使用了错误的运算符,=而不是==,进行比较。@魔鬼,我遗漏了一个等号。@ddacot,运算符是一个小错误是的,但逻辑仍然错误。你为什么不运行你的程序,给我们看输入字符串z的输出?好吧,那是错的,什么
关于新计划?我现在可以给你看输出。它仍然是错误的,但几乎是正确的。你把一份声明放错地方了。很可能是因为缺少压痕。我不认为OP在这方面的描述不太清楚。你需要为s的增量中的每个字符打印一条语句,而是为alphabetArray中的每个字母打印一条语句。你的代码并不能解决描述的问题。您缺少alphabetArray上的一个循环,并且使用了错误的运算符,=而不是==,进行比较。@魔鬼,我遗漏了一个等号。@ddacot,运算符是一个小错误是的,但逻辑仍然错误。为什么不运行您的程序并向我们显示输入字符串z的输出?@好的,那是错误的,新程序呢?我现在可以给你看输出。它仍然是错误的,但几乎是正确的。你把一份声明放错地方了。很可能是因为缺少压痕。我不认为OP在这方面的描述不太清楚,你需要为s的增量中的每个字符打印一条语句,而是为alphabetArray中的每个字母打印一条语句。您好devil And ddacot,谢谢您帮助我。现在加州是晚上10点,我需要早起。让我看一下你回复的细节,然后再发一次。你好,魔鬼和达科特,谢谢你帮我做这件事。现在加州是晚上10点,我需要早起。让我看一下你回复的细节,然后再发一次。嗨,马尔卡维,谢谢你的代码示例。我需要检查一下,看看它和我的逻辑有什么不同。之后我会再发。@codechick不客气,如果你有任何问题,请告诉我。马尔卡维!你是全力以赴的编码员!我对你提供全能的回答表示充分的尊重和感谢!我刚刚运行了你的代码,它运行得非常好。现在,我需要将它与我的进行比较,看看是否可以相应地调整我的,然后再发布一次。我会很快回复你,再次感谢你。更新:马尔卡维,我正在逐行检查你的代码,因为我需要学习。现在,我不太明白:short j=intch;如果j>=基准和j@codechick谢谢:让我试着逐行向您解释,首先,为了理解字符int转换,您必须熟悉ASCII表,您看到每个字符都有一个值'a'=65,'B'=66;所以如果你把一个字符转换成int,你会得到它的值。例如:int'A'是65,J将保存字符的ascii值。例:如果ch='C',那么j=67Hi Malkavian,谢谢你的代码示例。我需要检查一下,看看它和我的逻辑有什么不同。之后我会再发。@codechick不客气,如果你有任何问题,请告诉我。马尔卡维!你是全力以赴的编码员!我对你提供全能的回答表示充分的尊重和感谢!我刚刚运行了你的代码,它运行得非常好。现在,我需要将它与我的进行比较,看看是否可以相应地调整我的,然后再发布一次。我会很快回复你,再次感谢你。更新:马尔卡维,我正在逐行检查你的代码,因为我需要学习。现在,我不太明白:short j=intch;如果j>=基准和j@codechick谢谢:让我试着逐行向您解释,首先,为了理解字符int转换,您必须熟悉ASCII表,您看到每个字符都有一个值'a'=65,'B'=66;所以如果你把一个字符转换成int,你会得到它的值。例如:int'A'是65,J将保存字符的ascii值。例:如果ch='C',则j=67