用于 ASCII 的环绕式 C++
wraparound c++ for ASCII
我是马特,第一次发帖。我现在在学校学习 C++,但一直被这个问题困扰。我似乎找不到解决方案,所以我正在寻求帮助。
#include <iostream>
using namespace std;
int main()
{
char ch;
cin >> ch;
if(ch <= 122){
cout << ++ch;
cout << ++ch;
}else if (ch > 122){
cout << static_cast<char>(97)++ch;
cout << static_cast<char>(97)++ch;
}
}
该程序非常基础。它需要做的就是输入一个小写字母,程序只需要吐出接下来的两个字符。我的问题是在 'z' 之后我不知道如何返回到 'a'。我试过 static_cast 但它说我可以'。我试过重新分配变量,但它说我不能。我已经尝试了其他几个基本的东西,但 none 似乎有效。
提前感谢您的帮助!
(假设输入为:'a' - 'z')
保持简单
解决方案 1:
#include <iostream>
int main()
{
char ch = 0;
std::cin >> ch; // "fed a lowercase letter"
// "spit out the next two characters"
if (ch < 'y')
std::cout << ++ch << ++ch;
else if (ch == 'y')
std::cout << "za";
else // (ch=='z')
std::cout << "ab";
}
解决方案 2:
#include <iostream>
int main()
{
const char * lut = "abcdefghijklmnopqrstuvwxyzab";
char ch = 0;
std::cin >> ch; // "fed a lowercase letter"
ch -= 'a'; // lowercase letter to index
// "spit out the next two characters"
std::cout << lut[++ch] << lut[++ch];
}
首先,不要使用像 122 和 97 这样的幻数。使用实际的字符值。
其次,只需声明一个字符串 abcdefghijklmnopqrstuvwxyz
,然后对该字符串进行索引。这消除了对 122、97 或任何其他数字的需要。不仅如此,在处理 0、1、25 等索引而不是 122、97 等索引时,您可能会看到如何更轻松地解决问题。
一旦你这样做了,一点洞察力表明接下来的两个字符将在位置(如果位置从 0 开始),(index + 1) % 26
和 (index + 2) % 26
。 %
是取模运算符,returns 除法后的余数。
例如,如果当前字符是y
,则y
位于字符串的第24位。所以
(24 + 1) % 26 = 25 % 26 = 25
和
(24 + 2) % 26 = 26 % 26 = 0
所以接下来的两个字符位于位置25和位置0,分别是z
和a
。
再举个例子:z
:
(25 + 1) % 26 = 26 % 26 = 0
和
(25 + 2) % 26 = 27 % 26 = 1
因此 z
之后的下一个字符是 a
和 b
。
基本上,当你得到一个数据 "wraps around" 到 0 的赋值时,那么 "remainder" 或 "modulo arithmetic" 这个词应该立即浮现在脑海中。
所以最终的程序应该是这样的:
#include <iostream>
int main()
{
char ch;
const char * alphabet = "abcdefghijklmnopqrstuvwxyz";
std::cin >> ch;
int position1 = ch - 'a'; // get position of input character
int position2 = (position1 + 1) % 26; // get position of next character
int position3 = (position1 + 2) % 26; // get position of next next character
// output results
std::cout << ch << alphabet[position2] << alphabet[position3];
}
这里有一种解决问题的方法,既简洁又优雅。使用查找 table 非常可读,使用一些模运算将大写字母转换为小写字母;它还利用了现代 C++
的一些新功能,例如范围循环。
#include <iostream>
#include <ccytpe> // needed for ::tolower
int main() {
// ascii a-z [97,122]
char alphabet[26] = {}; // 0 initizlize this will be a look up table
int i = 97;
for( auto & c : alphabet ) {
c = static_cast<char>( i );
i++;
}
// check to see if our table is correct
for( auto & c : alphabet ) {
std::cout << c << " ";
std::cout << '\n';
}
std::cout << '\n';
// Alphabet Seems to be fine.
char c = {};
std::cout << "Please enter a lower case character: ";
std::cin >> c;
if( c >= 'A' && c <= 'Z' ) {
::tolower( c ); // make sure that it's not in caps
} else if( c >= 'a' && c <= 'z' ) {
// nothing to do
} else {
std::cout << "Error: input value\n";
return -1;
}
// Now that we have the correct inputs we can show your next two characters.
// Since we know that the ascii table has a range of [97,122] for
// lower case letters and that our array index starts at 0; what we can do
// is a little bit of arithmetic to take the input character and set that
// to the index value of the array above. Then use the array indexing to
// output the next 2 characters. To do this we simply just need to subtract 97 or 'a'
c = c - 'a';
// Now we can print the two lines using the adjusted c value with
// a little bit of modulo arithmetic using the stride, size, or
// length of the alphabet.
int stride = 26;
std::cout << alphabet[++c % stride] << '\n';
std::cout << alphabet[++c % stride] << '\n';
// And we are done!
return 0;
}
这是没有注释和打印整个字母表的代码的样子:
#include <iostream>
#include <cctype>
int main() {
char alphabet[26] = {};
int i = 97;
for( auto & c : alphabet ) {
c = static_cast<char>( i );
i++;
}
char c = {};
std::cout << "Please enter a lower case character: ";
std::cin >> c;
if( c >= 'A' && c <= 'Z' ) {
::tolower( c );
} else if( c >= 'a' && c <= 'z' ) {
// nothing to do
} else {
std::cout << "Error: input value\n";
return -1;
}
c = c - 'a';
int stride = 26;
std::cout << alphabet[++c % stride] << '\n';
std::cout << alphabet[++c % stride] << '\n';
return 0;
}
尝试使用以下代码解决您的问题。
#include <iostream>
using namespace std;
int main()
{
char ch = '[=10=]';
cin >> ch; // "fed a lowercase letter"
char c_next;
c_next = (ch-'a'+1)%26+'a';
cout <<c_next;
c_next = (ch-'a'+2)%26+'a';
cout << c_next;
return 0;
}
我是马特,第一次发帖。我现在在学校学习 C++,但一直被这个问题困扰。我似乎找不到解决方案,所以我正在寻求帮助。
#include <iostream>
using namespace std;
int main()
{
char ch;
cin >> ch;
if(ch <= 122){
cout << ++ch;
cout << ++ch;
}else if (ch > 122){
cout << static_cast<char>(97)++ch;
cout << static_cast<char>(97)++ch;
}
}
该程序非常基础。它需要做的就是输入一个小写字母,程序只需要吐出接下来的两个字符。我的问题是在 'z' 之后我不知道如何返回到 'a'。我试过 static_cast 但它说我可以'。我试过重新分配变量,但它说我不能。我已经尝试了其他几个基本的东西,但 none 似乎有效。
提前感谢您的帮助!
(假设输入为:'a' - 'z')
保持简单
解决方案 1:
#include <iostream>
int main()
{
char ch = 0;
std::cin >> ch; // "fed a lowercase letter"
// "spit out the next two characters"
if (ch < 'y')
std::cout << ++ch << ++ch;
else if (ch == 'y')
std::cout << "za";
else // (ch=='z')
std::cout << "ab";
}
解决方案 2:
#include <iostream>
int main()
{
const char * lut = "abcdefghijklmnopqrstuvwxyzab";
char ch = 0;
std::cin >> ch; // "fed a lowercase letter"
ch -= 'a'; // lowercase letter to index
// "spit out the next two characters"
std::cout << lut[++ch] << lut[++ch];
}
首先,不要使用像 122 和 97 这样的幻数。使用实际的字符值。
其次,只需声明一个字符串 abcdefghijklmnopqrstuvwxyz
,然后对该字符串进行索引。这消除了对 122、97 或任何其他数字的需要。不仅如此,在处理 0、1、25 等索引而不是 122、97 等索引时,您可能会看到如何更轻松地解决问题。
一旦你这样做了,一点洞察力表明接下来的两个字符将在位置(如果位置从 0 开始),(index + 1) % 26
和 (index + 2) % 26
。 %
是取模运算符,returns 除法后的余数。
例如,如果当前字符是y
,则y
位于字符串的第24位。所以
(24 + 1) % 26 = 25 % 26 = 25
和
(24 + 2) % 26 = 26 % 26 = 0
所以接下来的两个字符位于位置25和位置0,分别是z
和a
。
再举个例子:z
:
(25 + 1) % 26 = 26 % 26 = 0
和
(25 + 2) % 26 = 27 % 26 = 1
因此 z
之后的下一个字符是 a
和 b
。
基本上,当你得到一个数据 "wraps around" 到 0 的赋值时,那么 "remainder" 或 "modulo arithmetic" 这个词应该立即浮现在脑海中。
所以最终的程序应该是这样的:
#include <iostream>
int main()
{
char ch;
const char * alphabet = "abcdefghijklmnopqrstuvwxyz";
std::cin >> ch;
int position1 = ch - 'a'; // get position of input character
int position2 = (position1 + 1) % 26; // get position of next character
int position3 = (position1 + 2) % 26; // get position of next next character
// output results
std::cout << ch << alphabet[position2] << alphabet[position3];
}
这里有一种解决问题的方法,既简洁又优雅。使用查找 table 非常可读,使用一些模运算将大写字母转换为小写字母;它还利用了现代 C++
的一些新功能,例如范围循环。
#include <iostream>
#include <ccytpe> // needed for ::tolower
int main() {
// ascii a-z [97,122]
char alphabet[26] = {}; // 0 initizlize this will be a look up table
int i = 97;
for( auto & c : alphabet ) {
c = static_cast<char>( i );
i++;
}
// check to see if our table is correct
for( auto & c : alphabet ) {
std::cout << c << " ";
std::cout << '\n';
}
std::cout << '\n';
// Alphabet Seems to be fine.
char c = {};
std::cout << "Please enter a lower case character: ";
std::cin >> c;
if( c >= 'A' && c <= 'Z' ) {
::tolower( c ); // make sure that it's not in caps
} else if( c >= 'a' && c <= 'z' ) {
// nothing to do
} else {
std::cout << "Error: input value\n";
return -1;
}
// Now that we have the correct inputs we can show your next two characters.
// Since we know that the ascii table has a range of [97,122] for
// lower case letters and that our array index starts at 0; what we can do
// is a little bit of arithmetic to take the input character and set that
// to the index value of the array above. Then use the array indexing to
// output the next 2 characters. To do this we simply just need to subtract 97 or 'a'
c = c - 'a';
// Now we can print the two lines using the adjusted c value with
// a little bit of modulo arithmetic using the stride, size, or
// length of the alphabet.
int stride = 26;
std::cout << alphabet[++c % stride] << '\n';
std::cout << alphabet[++c % stride] << '\n';
// And we are done!
return 0;
}
这是没有注释和打印整个字母表的代码的样子:
#include <iostream>
#include <cctype>
int main() {
char alphabet[26] = {};
int i = 97;
for( auto & c : alphabet ) {
c = static_cast<char>( i );
i++;
}
char c = {};
std::cout << "Please enter a lower case character: ";
std::cin >> c;
if( c >= 'A' && c <= 'Z' ) {
::tolower( c );
} else if( c >= 'a' && c <= 'z' ) {
// nothing to do
} else {
std::cout << "Error: input value\n";
return -1;
}
c = c - 'a';
int stride = 26;
std::cout << alphabet[++c % stride] << '\n';
std::cout << alphabet[++c % stride] << '\n';
return 0;
}
尝试使用以下代码解决您的问题。
#include <iostream>
using namespace std;
int main()
{
char ch = '[=10=]';
cin >> ch; // "fed a lowercase letter"
char c_next;
c_next = (ch-'a'+1)%26+'a';
cout <<c_next;
c_next = (ch-'a'+2)%26+'a';
cout << c_next;
return 0;
}