C++比较两个数组并显示重复代码-代码现在工作 最后,下面是有效的代码:

C++比较两个数组并显示重复代码-代码现在工作 最后,下面是有效的代码:,c++,arrays,C++,Arrays,我正在练习一个教科书上的问题,要求用户输入10个字符进入一个数组,然后将该数组与硬编码字母表数组进行比较。输出应显示每个字母的重复数(如果有)。例如: 有两个a。 有0个b。 有三个c。。。。。等等 我的代码正确计算了两个数组之间的重复数。但是,问题是每次循环迭代时它都会显示计数。我只需要它来显示总数。 我试着将cout语句移到循环下面,但这不起作用,因为它需要[I]和[j]从那里循环通过数组。 请指出我的错误所在,提前谢谢 #include <iostream> // usin

我正在练习一个教科书上的问题,要求用户输入10个字符进入一个数组,然后将该数组与硬编码字母表数组进行比较。输出应显示每个字母的重复数(如果有)。例如: 有两个a。 有0个b。 有三个c。。。。。等等

我的代码正确计算了两个数组之间的重复数。但是,问题是每次循环迭代时它都会显示计数。我只需要它来显示总数。 我试着将cout语句移到循环下面,但这不起作用,因为它需要[I]和[j]从那里循环通过数组。 请指出我的错误所在,提前谢谢

#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 循环顺序不正确。如果希望对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