【问题标题】:using loop for only if statement and then print else statement [closed]仅对 if 语句使用循环,然后打印 else 语句 [关闭]
【发布时间】:2024-06-04 23:40:01
【问题描述】:

检查输入的字符是辅音还是元音?

我几乎得到了结果,但我只需要else 语句脱离循环。 是否可以在循环外使用else?在这里,我尝试添加{},但没有帮助我。我该怎么做 ? 我已经通过多种方式解决了这个程序,但我想清除我对if 和循环的概念。

#include <iostream>
    
using namespace std;

int main(){
    char x ;
    char vowel[10] ={'a','e','i','o','u','A','E','I','O','U'};
    cout<<"Enter ";
    cin>>x ;
    for(int i = 0 ; i<10 ; i++)
    {
        {    
            if(x ==vowel[i])
            {
                cout<<"This is a vowel";
            }
        }   
        else
        {
            cout<<"This is a consonant";
        }   
    }
    return 0 ;
}

【问题讨论】:

  • 顺便说一句,它是“辅音”,而不是“常数”。
  • 习惯于应用缩进,它可以帮助您首先避免错误并正确查看代码。如果结构太长而无法阅读它太复杂(并且您可能会出错)并且可能需要分解成功能块,如果不是,请尝试使用 cmets 标记循环结束,长 if/else 块结束等。
  • 删除 if 语句周围的大括号 {}。 else 必须跟在相应 if 语句的右大括号 (}) 之后。

标签: c++ loops if-statement


【解决方案1】:

你也可以写:

#include <iostream>

int main() {

    std::cout << "\nEnter a character: ";

    if (char c{}; std::cin >> c)
        std::cout << c << " is a " << (((0x208222 >> (c & 0x1f)) & 1) ? "vowel" : "consonant") << '\n';
   return 0;
}

这样更紧凑。


这显示了如何用 C++ 解决奇妙的问题。但是,它需要很多解释。首先,如何检查一个字符是否是元音。

如果我们使用 ASCII 码对字母进行编码,那么我们将看到以下内容:

我们看到大写和小写字母的 ASCII 码只是低 5 位不同。所以,如果我们用 0x1F 屏蔽 ASCII 码,所以char c{'a'}; unsigned int x{c &amp; 0x1F},我们将得到 1 到 26 之间的值。所以,我们可以计算每个字母的 5 位值。如果我们现在用 1 标记所有元音,我们可以构建一个由 32 位(无符号整数)组成的二进制数,并在元音为真的每个位置设置一个位。然后我们得到类似的东西

Bit position
3322 2222 2222 1111 1111 1100 0000 0000  
1098 7654 3210 9876 5432 1098 7654 3210  
Position with vowels:
0000 0000 0010 0000 1000 0010 0010 0010

这个数字可以转换为 0x208222。如果我们现在想知道,如果一个字母(无论是大写还是小写)是一个元音,那么我们从字符中屏蔽掉不必要的位( C & 1F )并将二进制数向右移动尽可能多位置,正如结果字母代码所具有的那样。如果然后该位设置在 LSB 位置,则我们有一个元音。这已经有几十年的历史了。

啊哈。不是那么容易,但适用于 ASCII 编码的字母。

顺便说一句,它也适用于其他字符选择。

结果是:

auto isVowel = [](char c) { return (0x208222 >> (c & 0x1f)) & 1; };

酷。 . .

【讨论】:

    【解决方案2】:

    循环for( statement expression; action ) body 循环只是一个while循环

    {
       statement;
       while ( expression )
       {
         body
    
    label_for_continue:
         action;
       }
    }
    

    因此您可以看到,在内部声明的所有内容都将在for 之外结束生命周期。您可以使用break 提前停止循环并使用continue 在执行action(等于goto label_for_continue)后跳回到循环的开头,这使得它比while 更通用一点,其中continue 跳转直接到“开始”。

    任何或所有部分都可以被省略或以语言语法允许的方式使用,从而导致使用外部计数器、“永久”循环for(;;) 或预增量循环for(int i = MAX; i--&gt;0;)。 for 循环使用的一个特例是range-based loop

    您需要做的是使用一些外部变量来标记您当前的状态。让它默认为false,因为如果你的循环正常退出,则意味着你没有找到匹配项。如果找到匹配项,则在将 flag 设置为 true 后,您将通过 break“短路”循环:

    bool is_vowel = false;
    for (int i = 0 ; i<10 ; i++) {
        if (x == vowel[i]) {
            is_vowel = true;
            break; 
        }
    }
    

    【讨论】:

      【解决方案3】:

      您可以设置一个“标志”:

      #include <iostream> 
      
      int main() {
          char x ;
      
          const char vowel[10] ={'a','e','i','o','u','A','E','I','O','U'};
      
          std::cout<<"Enter ";
          std::cin>>x;
      
          bool is_vowel = false;
      
          for (int i = 0 ; i<10 ; i++) {
              if (x == vowel[i]) {
                  is_vowel = true;
                  break; // break not necessary but faster
              }
          }
      
          if (is_vowel)
              std::cout<<"This is a vowel";
          else
              std::cout<<"This is a constant";
      
          return 0 ;
      }
      

      如果您不介意将逻辑移至函数 一个函数让我们return 在函数中的任何位置:

      const char vowel[10] ={'a','e','i','o','u','A','E','I','O','U'};
      
      def is_vowel(char c) {
          for (int i = 0 ; i<10 ; i++) {
              if (x == vowel[i]) {
                  return true;
              }
          }
      
          return false;
      }
      
      def main() {
      
          char x ;
      
          std::cout<<"Enter ";
          std::cin>>x;
      
      
          if (is_vowel(x))
              std::cout<<"This is a vowel";
          else
              std::cout<<"This is a constant";
      
          return 0 ;
      }
      

      【讨论】:

      • 感谢@darkspine。我不知道旗帜。这真的很有帮助。我试图从过去半小时解决这个问题。
      • 在您给出的第一个示例中。 ``` if (x == vowel[i]) { is_vowel = true;休息; // break 不是必需的,但更快 } ``` 我想使用 i 的值,在循环外它 bool 为真。不调用新函数我该怎么做??
      • 因此,您可以返回i-1,而不是返回truefalse
      【解决方案4】:

      您的代码无法编译,因为您添加了 {} 并将 elseif 分开。 尝试像这样改变这个循环:

      bool isVowel = false;
      
      for(int i = 0 ; i<10 ; i++) {  
          if(x == vowel[i]) {
              isVowel = true;
              break;
          }
      }
      
      if(isVowel)
          cout << "This is a vowel";
      else
          cout<< "This is a consonant";
      

      【讨论】:

      • 这行不通。因为如果我输入 'e' 。它将输出为“这是恒定的”。因为 a[0] 是一个 .它会从这里中断程序。给出错误的输出
      • 确实,这行不通。
      • @Hercules 是的,谢谢,我已经编辑了
      【解决方案5】:

      使用布尔值的简单方法。

      #include <iostream>
      using namespace std;
      
      int main()
      {
        char x;
        char vowel[10] = {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'};
        bool isVowel = false;
      
        cout << "Enter ";
        cin >> x;
      
        for (int i = 0; i < 10; ++i)
        {
          if (vowel[i] == x)
          {
            isVowel=true;
            break;
          }
        }
      
        isVowel ? cout << "This is a vowel" : cout << "This is a consonant";
      
        return 0;
      }
      

      您也可以使用基于范围的 for 循环来执行此操作,因此您不必担心数组大小。

      for (char &a : vowel)
        {
          if (a == x)
          {
            isVowel=true;
            break;
          }
        }
      

      【讨论】: