【问题标题】:Pangram function in c++C++ 中的 Pangram 函数
【发布时间】:2015-11-12 07:10:02
【问题描述】:

我现在浏览了两天,但没有找到符合我的解决方案的解决方案。 我正在尝试编写一个 Pangram 函数。我尝试了很多方法,但都没有成功。 我的函数 IsPangram 总是给it is not Pangram 建议我一些方法。

void isPangram()
{
    int i;
    int count = 0;
    char str[26];
    cout << "Enter a string to check if its Pangram or not: ";
    for (i = 0; i < 26; i++) {
        cin >> str[i];

        if (i >= 97 && i <= 122) {

            cout << "It is Pangram" << endl;
            break;
        } else {
            cout << "it is not Pangram" << endl;
            break;
        }

    }
}

int main()
{
    isPangram();
    system("pause");
}

【问题讨论】:

  • 您希望 i 何时设置为大于 97?
  • @– James Root 这是 ascii 表中从 a 到 z 的字符范围。这就是我尝试的原因。
  • 顺便说一下,pangram是名词,不是形容词,所以应该是“check if it is a pangram”,而不是“check if its Pangram”。

标签: c++ pangram


【解决方案1】:

您的代码中有 3 个问题 -

(i) 你试图检查每个字符是否是一个 pangram,这是错误的。

(ii) 为了检查,您正在检查索引i,而不是读取的字符str[i]

(iii) 这条语句 if ( i &gt;= 97 &amp;&amp; i &lt;= 122 ) 将始终计算为 false,因为 i 的值只能介于 0 和 26 之间。因此,您始终不会得到一个 pangram。

试试这个 -

void isPangram() {
    int i;
    int count = 0;
    char str[27];
    cout << "Enter a string to check if its Pangram or not: ";

    // Read the string
    cin >> str;

    short flagArr[26]; // Array to flag the characters used
    memset(flagArr, 0, sizeof(flagArr));
    bool panGramFlag = true;

    // Loop through the string and mark the characters read
    for (int i = 0; i < 27; i++) {
        if (str[i] >= 'A' && str[i] <= 'Z') {
            flagArr[str[i]-'A'] = 1;
        }
    }

    // Loop through flag array and check if any character is not used.
    for (int i = 0; i < 26; i++) {
        if (flagArr[i] == 0) {
           panGramFlag = false;
           cout << "It is not Pangram" << endl;
           break;             
        }
    }   

    if (panGramFlag)
        cout << "it is Pangram" << endl;

}

int main() {

    isPangram();

    system("pause");
}  

【讨论】:

  • flagArr[str[i]-'A'] = 1; 我听不懂这句话?你能解释一下吗? @buchipper
  • @QasimAli 也许你应该先从一个更简单的程序开始,然后学习一些基本的 C++。
  • @QasimAli - str[i] 是用户输入的字符。字符'A' 的值为65。如果str[i] 处的字符是“B”,那么flagArr[str[i]-'A'] 将转换为flagArr['B'-'A'],即flagArr[66-65],即flagArr[1]。因此,如果str[i] 是'B',那么flagArr[1] 将被设置为1——这意味着句子包含字符'B'。希望这能回答您的问题。
【解决方案2】:

这是一个简单的,逻辑思考

#include<iostream.h>
#include<string.h>
#include<conio.h>
void isPangram()
{
    int i;
    char str[26];
    cout << "Enter a string to check if its Pangram or not: ";
    for (i = 0; i < 26; i++) {
    cin >> str[i];

    if ((str[i] >= 97 && str[i] <= 122)||((str[i] >= 65 && str[i] <= 91))
    {

        cout << "It is Pangram" << endl;
        break;
    } else {
        cout << "it is not Pangram" << endl;
        break;
    }

    }
}

int main()
{
    isPangram();
    getch();
    return 0;
}

【讨论】:

    【解决方案3】:
    #include<iostream>
    using namespace std;
    
    bool chkpangram(string &str)
    {
        int m[26] = {0}, i, index;
        for(i = 0; i < str.length(); i++)
        {
            if (str[i] >= 65 && str[i] <= 90)
                index = str[i] - 65;
            else if(str[i] >= 97 && str[i] <= 122)
                index = str[i] - 97;
    
            m[index] = m[index]++;
        }
        for (int i=0; i<=25; i++)
            if (m[i] == 0)
                return (false);
    
        return true;
    }
    
    int main()
    {
        string str = "The quick brown fox jumps over the lazy dog";
        if(str.length() < 26)
            cout<<"Not a Pangram";
        else
        {
            if(chkpangram(str) == true)
                cout<<"Is a Pangram";
            else
                cout<<"Not a Pangram";
        }
        return 0;
    }
    

    【讨论】:

    • 由于这可能是对 OP 问题的回答,因此请尝试提供更多上下文,而不仅仅是粘贴一些代码。请参考How do I write a good answer?尝试解释错误原因和原因,以便其他有相同问题的用户能够理解您的答案
    • 不鼓励仅使用代码的答案。总是试着用你自己的话来解释你的答案是什么!
    【解决方案4】:

    //使用散列优化代码

    string str;
    int i,h1[26]={0},flag=0;
    
    for(i=0;str[i]!='\0';i++)
    {
        h1[str[i]-'a']++;
    }
    for(i=0;i<26;i++)
    {
        if(h1[i]!=1){
            flag=1;
            break;
        }
    }
    flag==1?cout<<"No"<<endl:cout<<"Yes"<<endl;
    

    } //希望对你有帮助

    【讨论】:

    • strchar,那么您如何/为什么使用str[i] 对其进行索引?你的意思是std::string
    • 对不起..使用字符串
    猜你喜欢
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多