【问题标题】:logical operators in if statements c++ [closed]if语句c ++中的逻辑运算符[关闭]
【发布时间】:2016-09-12 06:24:12
【问题描述】:

底部的当前代码有效,但如果不将 ascii 值移动到我不希望它们出现的位置,我无法组合 if 语句。加密应该只是字母值。大写和小写的 z 应该循环到 A。我有一位老师,但她不知道,所以我会很感激任何帮助。谢谢

这行不通……

if (sentence[i] == 'z' || 'Z')
{
sentence[i] = sentence[i] - 26;
}

这不起作用

if (sentence[i] == 'z' || sentence[i] == 'Z')
{
sentence[i] = sentence[i] - 26;
}

这行得通。

if (sentence[i] == 'z')
{
sentence[i] = sentence[i] - 26;
}
if (sentence[i] == 'Z')
{
sentence[i] = sentence[i] - 26;
}

完整代码。

#include <iostream>
#include <string>

using namespace std;

class EncryptionClass
{
    string sentence;

public:

    //constructors
    EncryptionClass(string sentence)
        {setString(sentence);}
    EncryptionClass()
        {sentence = "";}

    //get and set
    string getString()
        {return sentence;}
    void setString(string sentence)
        {this-> sentence = sentence;}

    //encrypt
    void encryptString()
    {
        for(int i = 0; i < sentence.length(); i++)
        {
            if (isalpha(sentence[i]))
            {

                if (sentence[i] == 'z')
                {
                    sentence[i] = sentence[i] - 26;
                }
                if (sentence[i] == 'Z')
                {
                    sentence[i] = sentence[i] - 26;
                }

                sentence[i] = sentence[i] + 1;
            }
        }
    }
};

int main()
{
    string sentence;
    cout << "Enter a sentence to be encrypted. ";
    getline(cin, sentence);
    cout << endl;

    EncryptionClass sentence1(sentence);
    cout << "Unencrypted sentence." << endl;
    cout << sentence1.getString() << endl << endl;
    sentence1.encryptString();
    cout << "Encrypted sentence." << endl;
    cout << sentence1.getString() << endl;


    cin.get();
    return 0;
}

【问题讨论】:

  • 您声称第二个“不起作用”doesn't hold water
  • 当您尝试if (sentence[i] == 'z' || sentence[i] == 'Z') 时会发生什么让您说它不起作用?
  • @slawekwin 我在编译器上尝试时遇到错误。 “赋值时需要左值作为左操作数。”
  • 即使我将 if 替换为您发布的 second 示例,您发布的完整代码也可以为我正确编译和运行。

标签: c++ string if-statement logical-operators


【解决方案1】:

在您的情况下,两个 If 语句都应该相等。

if (sentence[i] == 'z' || sentence[i] == 'Z')
{
    sentence[i] = sentence[i] - 26;
}

还有:

if (sentence[i] == 'z')
{
    sentence[i] = sentence[i] - 26;
}
if (sentence[i] == 'Z')
{
    sentence[i] = sentence[i] - 26;
}

情况并非总是如此

片段 2:如果您更改 isentence[i] 的值,则第二个 if 的行为会有所不同。 如果你将值递减 32,那么两个 sn-ps 的行为将不同

char myChar = 'z'
if (myChar == 'z' || myChar == 'Z')
{
    myChar = myChar - 32;
}
// myChar is now 'Z'

还有:

char myChar = 'z'
if (myChar == 'z')
{
    myChar = myChar - 32;
}
// myChar is now 'Z'
if (myChar == 'Z')
{
    myChar = myChar - 32;
}
// myChar is now ':' 

【讨论】:

  • @DavidSchwartz 我说的是一般的 if 语句。显然,如果你改变 i... 的值,它的行为会有所不同。
  • @DavidSchwartz 正确改变句子[i] 与改变 i 的效果相同。在这种情况下,OP 将值递减 26。这会将值 z 更改为 `。很明显,这对他的场景没有影响。我已经用陷阱更新了我的答案。
  • 是的,我认为它们的行为会相同,但是当我使用组合 if 语句时,我会得到一些随机的 ascii 值。通常{不管我减少多少。或者我会得到一个错误“左操作数需要左值”,所以我猜有更好的方法来进行比较,但我不知道它是什么?
【解决方案2】:

问题是你应该从你的价值中扣除 25,而不是 26!那是因为字母表中有26个字母,相对编号从025(含)。要从最后一个字母(数字25)得到第一个字母(数字0),您需要减去25

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 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

但是除了第一个版本之外的每个版本都应该给出相同的结果。

#include <iostream>

int main()
{
    char sentance[] = "Zz";

    for(int i = 0; i < 2; ++i)
    {
        if(sentance[i] == 'Z' || sentance[i] == 'z')
        {
            sentance[i] = sentance[i] - 25;
            std::cout << "letter " << i << " = " << sentance[i] << '\n';
        }
    }
}

Run it here

【讨论】:

  • 这假设编译器编码中字母表的表示是连续的并且增加的。有些字符编码不正确。
  • @PeteBecker 非常正确。但是这些编码不太可能用于像这样的基本学生练习。所以我不想让这个例子复杂化。此外,问题确实指定了ASCII 编码。
  • 教人们基本的错误知识是没有帮助的。当然,还有更复杂的事情需要简化,但了解字符集的基础知识并不是其中之一。可移植地编写此代码并不难。旁白:我怀疑传递“ascii”不是要求的一部分,而是编码人员的假设。
  • @PeteBecker 没有帮助的是将初学者与他们没有要求的无关信息混淆,并且可能远远超出他们的水平。问题不在于各种字符编码。这是加密ASCII 数据的基本练习。我要花上 1000 字才能向几乎不懂 ASCII 的人解释字符集。鉴于老师已尝试解决此问题,我确信ASCII要求 的一部分。这是所有学生在某个时候都会进行的基本练习。
  • 不,这很简单,“请注意,这假定程序正在使用 ASCII 字符编码。虽然这很常见,但请注意还有其他字符编码,并且在没有的系统上” t 使用 ASCII 您的代码可能无法正常工作。”
猜你喜欢
  • 2017-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多