2016-10-02 93 views
0

我的任務是:如何在兩個字符之間添加所有Ascii值?

寫函數調用sumConsonants,將採取作爲參數的兩個上字母。你的函數應該返回起始字符和結束字符之間輔音的所有ASCII值的總和。你的主要功能應該傳遞給函數輸出所有的輔音字符值,包括第一個和最後的總和兩個值

這是我到目前爲止有:

#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; 
} 

真的不知道如何使它增加字符輸入之間的所有值

+1

的簡單的方法是用'for'環...... – Dmitri

+0

我怕你誤會從分配的東西。我懷疑它的要求如此總結價值觀,但輔音的出現次數。 –

+0

@Dmitri如何做到這一點的任何想法? Im stumped –

回答

1

您正在尋找的是AZ範圍內的字符(雖然可以聲稱,因爲它被定義爲輸入) - 但不是AEIOU

如果你不知道我的意思是「斷言」 - 那麼請查找「c ​​++斷言」。

之後,一個循環從開始要結束檢查,看看每一步都(不)那些字符中的一個應該做的工作。

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功能。

0

這應該讓你開始。你好像被困在如何循環使用char值。 for支持,因爲char是一個整數類型。在ASCII和所有衍生字符集,則基本拉丁語大寫字母是連續的,並在英文字母的順序,這樣你可以遍歷一系列他們用減法來確定一個多遠是從'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

相關問題