一道译码程序,请大家帮忙看看解决方案

一道译码程序,请大家帮忙看看
译密码。为使电文保密,往往按一定规律将电文转换成密码,收报人再按约定的规律将其译回原文。例如,可以按以下规律将电文变成密码:将字母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在试试,你会发现我说的是多么的正确,哈哈,一句话是溢出了,考虑这点。