如何在两个字符之间添加所有Ascii值?

时间:2016-10-02 21:50:31

标签: c++

我的任务是:

  

编写一个名为sumConsonants的函数,它将两个大写字母作为参数。你的函数应该返回起始字符和结束字符之间辅音的所有ascii值的总和。你的main函数应该将两个值传递给函数并输出所有辅音字符值的总和,包括第一个和最后一个

这是我到目前为止所做的:

#include <iostream>
using namespace std;

int sumConsonants(char, char);

int main()
{
  char char1, char2;
  cout << "Enter two upper case chars" << endl;
  cin >> char1 >> char2;

  cout << "The sum of the consonants between the two chars is " << sumConsonants(char1, char2) << endl;


  return 0;
}

int sumConsonants(char first, char last)
{
  char f = first;
  char l = last;

  int first1 = static_cast<int>(f);
  int last2 = static_cast<int>(l);

  return first1 + last2;
}

不确定如何制作它所以它添加了char输入之间的所有值

3 个答案:

答案 0 :(得分:1)

您正在寻找的是A-Z范围内的字符(尽管可以断言,因为它被定义为输入) - 但不是AEIOU

如果你不知道我的意思是什么&#34;断言&#34; - 那么请查阅&#34; c ++断言&#34;。

在那之后,一个for循环从开始到结束检查以查看每个步骤是否(不)其中一个字符应该完成这项工作。

答案 1 :(得分:0)

char f = first;
char l = last;

int first1 = static_cast<int>(f);
int last2 = static_cast<int>(l);

您不需要复制输入或转换为整数。

施法有时会隐藏错误。除非编译器抱怨(将编译器的警告级别设置为4或最大值),否则不要进行转换。然后在应用之前考虑演员正在做什么。

char始终适合int,因此您可以安全地添加字符的整数值。例如:

int sumConsonants(char first, char last)
{
    const std::string vowels = "AEIOU";
    int result = 0;
    for (char ch = first; ch <= last; ch++)
        if (vowels.find(ch) == std::string::npos)
            result += ch;
    return result;
}

在您的作业中,您可能不被允许使用std::string,因此请使用const char *vowels = "AEIOU"并编写您自己的find函数。

答案 2 :(得分:0)

这应该让你开始。您似乎陷入了如何循环char值的问题。 for支持这一点,因为char是整数类型。在ASCII和所有派生字符集中,Basic Latin大写字母是顺序的并且按英文字母顺序排列,因此您可以迭代它们的范围并使用减法来确定距离'A'的距离是多少 - 这些形式自然映射:A↔0,B↔1,......Z↔25。

我对“起始角色和结束角色之间”的含义有一些疑问,所以我写下了我认为答案应该是什么。例如:B和B之间有什么关系? (参见下面的BB_should_equal_B。)这是“单元测试”的形式。

单元测试是一种教授方法太晚了。开始时你不需要了解太多。我使用了Google Test框架。如果您在构建库并在项目中使用包含文件时遇到问题,那么像TA这样的人可能会帮助您。 (他们甚至可能会感谢你向他们展示单元测试。)

在任何情况下,您都可以看到它如何帮助定义您的目标,并为您提供一个写下测试值的地方。除了时髦的语法之外,测试还包括:

  • 描述要求的名称。
  • 测试框架断言,检查实际值与预期(正确)值。

#include  <cassert>
#include "gtest/gtest.h"

using namespace std;

int sumConsonants(char first, char last);

class CharSumTestFixture : public ::testing::Test {
};


TEST_F(CharSumTestFixture, AA_should_equal_zero) {
    ASSERT_EQ(sumConsonants('A', 'A'), 0);
}

TEST_F(CharSumTestFixture, BB_should_equal_B) {
    ASSERT_EQ(sumConsonants('B', 'B'), 'B');
}

TEST_F(CharSumTestFixture, BCD_should_equal_B_plus_C_plus_D) {
    ASSERT_EQ(sumConsonants('B', 'D'), 'B' + 'C' + 'D');
}

TEST_F(CharSumTestFixture, AE_should_equal_B_plus_C_plus_D) {
    ASSERT_EQ(sumConsonants('A', 'E'), 'B' + 'C' + 'D');
}

TEST_F(CharSumTestFixture, AZ_should_equal_A_through_Z_minus_A_minus_E_minus_I_minus_O_minus_U) {
    auto n = 'Z' - 'A' + 1;
    auto gauss = n * (n + 1) / 2;
    auto offset = 'A' - 1;
    auto sumAZ = gauss + n * offset;
    ASSERT_EQ(sumConsonants('A', 'Z'), sumAZ - 'A' - 'E' - 'I' - 'O' - 'U');
}


int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

int sumConsonants(char first, char last)
{
    // Assertions are used to communicate, during development and maintenace, already accepted pre-conditions. 
    // They are not for handling cases where those conditions do not exist.
    assert((first >= 'A') && (first <= 'Z'));
    assert((last >= 'A') && (last <= 'Z'));

    int sum = 0;
    for (auto letter = first; letter <= last; letter++)
    {
        sum += letter; // BUG must not add non-consonants
    }
    return sum;
}

Failing Test Cases