對於初學者來說,這絕對不是嵌套循環的情況。事實上, 整個代碼歸結爲:
pass = initialPattern();
while (isValidPattern(pass)) {
nextPattern(pass);
std::cout << pass << std::endl;
}
(但我不知道,如果你真的不意味着 增量之前來做輸出。)
現在,所有你需要做的就是定義合格的類型和相關的功能;你甚至可以考慮 把所有的東西都放在一個類中,因爲所有的函數都在 相同的數據實例上運行。
從您的代碼判斷,pass
應該是std::string
與8 個字符;初始化可寫成:
std::string pass(8, 'A');
isValidPattern
顯然只看第一個字符。 (我不 確定這是正確的,但是這是你的代碼做什麼。)喜歡的東西:
bool
isValidPattern(std::string const& pattern)
{
return pattern[0] != '[';
}
根據你的代碼,但這樣的:
struct NotIsUpper
{
bool operator()(char ch) const
{
return ! ::isupper(static_cast<unsigned char>(ch));
}
};
bool
isValidPattern(std::string const& pattern)
{
return pattern.size() == 8
&& std::find_if(pattern.begin(), pattern.end(), NotIsUpper())
== pattern.end();
}
似乎更合適。 (當然,如果你做任何形式的 文字編碼,你已經有NotIsUpper
和它的兄弟姐妹在 你的工具包。)
最後,nextPattern
似乎沒有什麼比一個多位數以上 增量,其中數據以big-endian順序存儲。所以 以下(經典)算法似乎適當:
void
nextPattern(std::string& pattern)
{
static char const firstDigit = 'A';
static char const lastDigit = 'Z';
static std::string const invalidPattern(1, '[');
std::string::reverse_iterator current = pattern.rbegin();
std::string::reverse_iterator end = pattern.rend();
while (current != end && *current == lastDigit) {
*current = firstDigit;
++ current;
}
if (current != end) {
++ *current;
} else {
pattern = invalidPattern;
}
}
形式上,有標準不能保證這些字母將 在連續的升序進行編碼,所以最大的可移植性, 你應該在實際上使用的值爲std::vector<int>
,其值爲 ,範圍爲[0, 26)
,並將這些值映射到輸出的字母。如果您將所有這些操作放在一個類中,則此 將會變得微不足道,因爲 內部表示形式對客戶端代碼不可見。 喜歡的東西:
class PatternGenerator
{
std::vector<int> myData;
public:
explicit PatternGenerator()
: myData(8, 0)
{
}
void next()
{
static int const lastDigit = 26;
std::vector<int>::reverse_iterator current = pattern.rbegin();
std::vector<int>::reverse_iterator end = pattern.rend();
while (current != end && *current == lastDigit - 1) {
*current = 0;
++ current;
}
if (current != end) {
++ *current;
} else {
myData.front() = lastDigit;
}
}
bool isValid() const
{
return myData.front() < lastDigit;
}
friend std::ostream& operator<<(
std::ostream& dest, PatternGenerator const& obj)
{
static char const characterMap[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for (std::vector<int>::iterator current = obj.myData.current();
current != obj.myData.end():
++ current) {
dest << characterMap[*current];
}
return dest;
}
};
(注意,之類的東西isValid
變得更簡單,因爲他們可以依賴的類不變)
考慮到這一點,你必須寫的是:
int
main()
{
PatternGenerator pass;
while (pass.isValid()) {
std::cout << pass << std::endl;
pass.next();
}
return 0;
}
這是功課嗎?如果是這樣,請標記爲這樣。 –
我不明白你的代碼,你想做什麼? –
關於你的第二個問題,把你的初始化改爲'{'A','A','A','A','A','A','A','A','\ 0'}' ,它會起作用。打印時您將該數組視爲C字符串。因此預計會以''\ 0''結尾。 –