[英]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')
你基本上有兩個問題:
考慮到字符代碼,字符被解釋為數字。 當您檢查字符是偶數還是奇數時,您正在檢查其字符代碼,它始終是奇數事件,這就是您的代碼將始終進入第一個或第二個案例的原因。 你必須檢查你的角色是否是數字,如果是,你必須檢查它是否是偶數
您的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.