簡體   English   中英

計算字符串中的元音元音和輔音均數的程序

[英]Program to count evens odds vowels and consonants in a string

您好我不知道如何修復我的程序,以查找我的字符串中有多少個均衡,賠率,元音和輔音。

程序編譯並運行,但我從來沒有得到任何元音或輔音,其他一切都添加到平均值或賠率(甚至字符)。

編輯1:由埃文斯和賠率。我的意思是像如果字符串John123在用戶類型我想找到多少個字符在這種情況下1“o”有多少人在這種情況下3“J”輔音'h為元音”,‘N 2’多少在這種情況下的1是找齊‘’和有多少比值在這種情況下的2‘1’‘3’。

#include <iostream>
#include <string>

using namespace std;

int main ()
{
    string s1;
    int evens = 0; //
    int odds = 0; // 
    int vowels = 0; //
    int consonants  = 0; // 
    cout << "Please type in Something: ";
    getline(cin, s1);
    cout << "You typed: " << s1 << endl;

    for(int i = 0; i < s1.size(); ++i)
    {
        if((s1[i] % 2) == 0 ) 
        {
            ++evens;
        }
        else if((s1[i] % 2 ) != 0) // What would an algorithm (formula) be to find when a number is odd without the not-equals != ?
        {
            ++odds;
        }

        else if(s1[i] == 'A' || 'a' || 'E' || 'e' || 'O' || 'o' || 'I' || 'i' || 'U' || 'u')
        {
            ++vowels;
        }
        else if(s1[i] == 'Q' || 'W' || 'R' || 'T' || 'Y' || 'P' || 'S' || 'D' || 'F' || 'G' || 'H' || 'J' || 'K' || 'L' || 'Z' || 'X' || 'C' || 'V' || 'B' || 'N' || 'M'||
                         'q' || 'w' || 'r' || 't' || 'y' || 'p' || 's' || 'd' || 'f' || 'g' || 'h' || 'j' || 'k' || 'l' || 'z' || 'x' || 'c' || 'v' || 'b' || 'n' || 'm')
 //   I specify every letter so that it dosn't pick whitespaces, symbols etc.
        {
            ++consonants;
        }
    }
    cout << "Evens in string are: " << evens << "\nOdds in string are: " << odds << "\nVowels in string are: " << vowels << "\nConsonants in string are: " << consonants;

    return 0;
}
if((s1[i] % 2) == 0 )

此代碼不正確。 你正在調整角色,這不是你想要的。 你想首先使用atoi或類似的東西將字符轉換為整數,我不記得該功能。 (只需查看字符串到int c ++)。 然后,一旦將字符轉換為整數,就可以正確調整它。

另外,你的|| 語法是完全錯誤的,正如Jongware所提到的那樣。 您需要對每個字符進行==比較。

應該看起來像這樣(很長):

(s1[i] == 'A' || s1[i] == 'a' || s1[i] == 'E' || s1[i] == 'e' || s1[i] == 'O' || s1[i] == 'o' || s1[i] == 'I' || s1[i] == 'i' || s1[i] == 'U' || s1[i] == 'u')

您可能希望事先將s1[i]存儲在char中,因此它更簡潔。

並且您應該在奇數/偶數測試之前進行角色測試,這樣您就不會意外地嘗試將h或其他非數字字符轉換為整數。

char是一個數字。 例如, a (在大多數計算機上)是ASCII碼97.因此,您的偶數測試或奇數測試將始終匹配。 您需要重新排列if塊。

此外,你的角色測試不符合你的意圖。 s1[i] == 'A' || 'a' 每當s1[i]等於'A'或每當'a'為數字不為零時, s1[i] == 'A' || 'a'測試為真。 但97永遠不會為零,因此測試總是會產生true 您需要的代碼更像s1[i] == 'A' || s1[i] == 'a' s1[i] == 'A' || s1[i] == 'a' ,每次測試s1[i]值。

(使事情更簡單的一種方法是:一旦你知道這個字符不是元音,就可以用((s1[i] >= 'a' && s1[i] <= 'z') || (s1[i] >= 'A' && s1[i] <= 'Z'))來測試ASCII輔音。 ((s1[i] >= 'a' && s1[i] <= 'z') || (s1[i] >= 'A' && s1[i] <= 'Z')) 。)

你的|| 語法沒有任何意義,你現在擁有的是這樣的

else if(s1[i] == 'A' || 'a' || 'E' || 'e' || 'O' || 'o' || 'I' || 'i' || 'U' || 'u')

雖然應該是這樣的:

else if(s1[i]=='A' || s1[i]=='a' || s1[i]=='E' || s1[i]=='e' || s1[i]=='O' || s1[i]=='o' || s1[i]=='I' || s1[i]=='i' || s1[i]=='U' || s1[i]=='u')

你基本上有兩個問題:

  1. 考慮到字符代碼,字符被解釋為數字。 當您檢查字符是偶數還是奇數時,您正在檢查其字符代碼,它始終是奇數事件,這就是您的代碼將始終進入第一個或第二個案例的原因。 你必須檢查你的角色是否是數字,如果是,你必須檢查它是否是偶數

  2. 您的OR不正確,請參閱Ruby van Soelen的回答

建議的,未經測試的代碼:

for(int i = 0; i < s1.size(); ++i)
{
    if (isdigit(s1[i])) {
        if ((s1[i] == '0') || (s1[i] == '2') || (s1[i] == '4') || (s1[i] == '6') || (s1[i] == '8')) 
        {
            ++evens;
        }
        else // What would an algorithm (formula) be to find when a number is odd without the not-equals != ?
        {
            ++odds;
        }
    }
    else 
    {

        if(s1[i]=='A' || s1[i]=='a' || s1[i]=='E' || s1[i]=='e' || s1[i]=='O' || s1[i]=='o' || s1[i]=='I' || s1[i]=='i' || s1[i]=='U' || s1[i]=='u')
        {
            ++vowels;
        }
        else if(s1[i]=='B' || s1[i]=='b' || s1[i]=='C' || s1[i]=='c' || s1[i]=='D' || s1[i]=='d' || s1[i]=='F' || s1[i]=='f' || s1[i]=='G' || s1[i]=='g' || s1[i]=='H' || s1[i]=='h' || s1[i]=='J' || s1[i]=='j' || s1[i]=='K' || s1[i]=='k' || s1[i]=='L' || s1[i]=='l' || s1[i]=='M' || s1[i]=='m' || s1[i]=='N' || s1[i]=='n' || s1[i]=='P' || s1[i]=='p' || s1[i]=='Q' || s1[i]=='q' || s1[i]=='R' || s1[i]=='r' || s1[i]=='S' || s1[i]=='s' || s1[i]=='T' || s1[i]=='t' || s1[i]=='V' || s1[i]=='v' || s1[i]=='X' || s1[i]=='x' || s1[i]=='Y' || s1[i]=='y' || s1[i]=='Z' || s1[i]=='z')
 //   I specify every letter so that it dosn't pick whitespaces, symbols etc.
        {
            ++consonants;
        }
    }
}

else-if語句中的表達式將始終等於true

else if(s1[i] == 'A' || 'a' || 'E' || 'e' || 'O' || 'o' || 'I' || 'i' || 'U' || 'u')

因為它相當於

( s1[i] == 'A'  ) || 'a' || 'B' /*...*/

其中'a',因為它不等於零,評估為真。

所以你必須寫至少像

s1[i] == 'A' || s1[i] == 'a' || s1[i] == 'B' /*...*/

還要考慮到例如字符'B'雖然不是數字但其代碼是偶數。 因此,如果從語句開始檢查,您將得到錯誤的結果

if((s1[i] % 2) == 0 ) 

您應該首先檢查字符是否是數字。 您還可以定義元音和輔音數組,並使用標准函數strchr來檢查字符是元音還是輔音。

例如

#include <iostream>
#include <string>
#include <cctype>

//...

const char *alpha_vowels = "AEIOU";
const char &alpha_consonants = "BCD...";

//...

if ( std::isdigit( s[i] ) )
{
    s[i] % 2 == 0 ? ++evens : ++odds;
}
else if ( std::strchr( alpha_vowels, std::toupper( ( unsigned char )s[i] ) ) != nullptr )
{
    ++vowels;
}
else if ( std::strchr( alpha_consonants, std::toupper( ( unsigned char )s[i] ) ) != nullptr )
{
    ++consonants;
}

除了其他答案,這里有一個更簡單的方法來完成同樣的事情。

std::set<char> vs{'a', 'o', 'u', 'e', 'i'};
for (auto&& c : s1) {
    if (std::isdigit(c))
        if ((c - '0') % 2 == 0) // Trick to convert numeric char -> int.
            ++evens;
        else
            ++odds;
    else if (std::isalpha(c))
        if (vs.count(std::tolower(c)))
            ++vowels;
        else
            ++consonants;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM