一道译码程序,请大家帮忙看看解决方案
一道译码程序,请大家帮忙看看
译密码。为使电文保密,往往按一定规律将电文转换成密码,收报人再按约定的规律将其译回原文。例如,可以按以下规律将电文变成密码:将字母A变成字母E,a变成e,即变成其后的第4个字母,W变成A,X变成B,Y变成C,Z变成D。字母按上述规律转换,非字母字符不变。如″Wonderful!″转换为″Asrhivjyp!″。输入一行字符,要求输出其相应的密码。程序如下:
#include <iostream>
using namespace std;
int main()
{
char c;
int k;
cout<<"please input k:"<<endl;
cin>>k;
getchar();
while ((c=getchar())!='\n')
{if((c>='a' && c<='z') || (c>='A' && c<='Z'))
{c=c+k;
if(c>'Z' && c<='Z'+k || c>'z') c=c-26;
}
cout<<c;
}
cout<<endl;
return 0;
}
如果K的值取1~5,程序正常执行.但是取大于5的值时,无法对小写字母"z"进行译码,大写"Z"可以,而且其他字母也都正常,想不明白是什么原因
------解决方案--------------------
学会调试很重要.
------解决方案--------------------
if(c > 'Z ' && c <= 'Z '+k ¦ ¦ c > 'z ') c=c-26;
是不是少了个括号? if((c > 'Z ' && c <= 'Z '+k) ¦ ¦ c > 'z ') c=c-26;
------解决方案--------------------
#include <iostream>
using namespace std;
int main()
{
char c;
char s[] = "abcdefghijklmnopqrstuvwxyz";
int k;
unsigned int i;
cout << "please input k:" << endl;
cin >> k;
getchar();
#if 0
while ((c=getchar())!= '\n') {
#else
for(i = 0; i < 26; i++) {
c = s[i];
#endif
if (c >= 'a' && c <= 'z')
c = ((c - 'a') + k)%26 + 'a';
else if (c >= 'A' && c <= 'Z')
c += ((c - 'A') + k)%26 + 'A';
cout << c;
}
cout << endl;
return 0;
}
------解决方案--------------------
译密码。为使电文保密,往往按一定规律将电文转换成密码,收报人再按约定的规律将其译回原文。例如,可以按以下规律将电文变成密码:将字母A变成字母E,a变成e,即变成其后的第4个字母,W变成A,X变成B,Y变成C,Z变成D。字母按上述规律转换,非字母字符不变。如″Wonderful!″转换为″Asrhivjyp!″。输入一行字符,要求输出其相应的密码。程序如下:
#include <iostream>
using namespace std;
int main()
{
char c;
int k;
cout<<"please input k:"<<endl;
cin>>k;
getchar();
while ((c=getchar())!='\n')
{if((c>='a' && c<='z') || (c>='A' && c<='Z'))
{c=c+k;
if(c>'Z' && c<='Z'+k || c>'z') c=c-26;
}
cout<<c;
}
cout<<endl;
return 0;
}
如果K的值取1~5,程序正常执行.但是取大于5的值时,无法对小写字母"z"进行译码,大写"Z"可以,而且其他字母也都正常,想不明白是什么原因
------解决方案--------------------
学会调试很重要.
------解决方案--------------------
if(c > 'Z ' && c <= 'Z '+k ¦ ¦ c > 'z ') c=c-26;
是不是少了个括号? if((c > 'Z ' && c <= 'Z '+k) ¦ ¦ c > 'z ') c=c-26;
------解决方案--------------------
#include <iostream>
using namespace std;
int main()
{
char c;
char s[] = "abcdefghijklmnopqrstuvwxyz";
int k;
unsigned int i;
cout << "please input k:" << endl;
cin >> k;
getchar();
#if 0
while ((c=getchar())!= '\n') {
#else
for(i = 0; i < 26; i++) {
c = s[i];
#endif
if (c >= 'a' && c <= 'z')
c = ((c - 'a') + k)%26 + 'a';
else if (c >= 'A' && c <= 'Z')
c += ((c - 'A') + k)%26 + 'A';
cout << c;
}
cout << endl;
return 0;
}
------解决方案--------------------
- C/C++ code
#include <iostream > using namespace std; int main() { char c; int k; cout <<"please input k:" <<endl; cin >>k; getchar(); while ((c=getchar())!= '\n') { if(c>='a' && c<='z') { ((int)(c+k)>(int)'z') ? c=(c+k)%(26+(int)'a')+(int)'a' : c=c+k; } else if(c>='A' && c<='Z') { ((int)(c+k)>(int)'Z') ? c=(c+k)%(26+(int)'A')+(int)'A' : c=c+k; } cout << c; } cout << endl; return 0; }
------解决方案--------------------
唔……才发现帖子里可以指定代码格式……
谢谢楼上的示范……
test一下:
- C/C++ code
#include <iostream> using namespace std; int main() { char c; char s[] = "abcdefghijklmnopqrstuvwxyz"; int k; unsigned int i; cout << "please input k:" << endl; cin >> k; getchar(); #if 0 while ((c=getchar())!= '\n') { #else for(i = 0; i < 26; i++) { c = s[i]; #endif if (c >= 'a' && c <= 'z') c = ((c - 'a') + k)%26 + 'a'; else if (c >= 'A' && c <= 'Z') c += ((c - 'A') + k)%26 + 'A'; cout << c; } cout << endl; return 0; }
------解决方案--------------------
没有考虑溢出问题,ASCII码只到127,z + 6 = 128了,char 只有一个字节,存放符号数为-128~+127,你查看下ASCII码就会明白了
接分,哈哈!!!
------解决方案--------------------
如果K的值取1~5,程序正常执行.但是取大于5的值时,无法对小写字母"z"进行译码,大写"Z"可以,而且其他字母也都正常,想不明白是什么原因
如果k大到一程度,大Z也是有问题的,不信楼主可以试试,把k = 50在试试,你会发现我说的是多么的正确,哈哈,一句话是溢出了,考虑这点。