我的任务是:
编写一个名为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输入之间的所有值
答案 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;
}