黑马程序员技术交流社区

标题: 面试碰到的一个问题,我的思路有问题,求正解 [打印本页]

作者: 再起来    时间: 2014-1-2 22:30
标题: 面试碰到的一个问题,我的思路有问题,求正解
本帖最后由 再起来 于 2014-1-8 21:14 编辑

  1.    /*   编写一个应用程序用来输入的字符串进行加密,对于字母字符串加密规则如下:
  2.   ‘a’→’d’ ‘b’→’e’  ‘w’→’z’   ……    ‘x’→’a’    ‘y’→’b’   ‘z’→’c’

  3.   ‘A’→’D’    B’→’E’  ‘W’→’Z’ ……    ‘X’→’A’   ‘Y’→’B’    Z’→’C’
  4.   对于其他字符,不进行加密。*/
  5.         static void Main(string[] args)
  6.         {
  7.             Console.WriteLine("请输入一个字符串");
  8.             string str = "";
  9.             ConsoleKeyInfo cki;//定义一个描述按下控制台键的变量
  10.             while (true)
  11.             {
  12.                 cki = Console.ReadKey(true);//按下键的时候,不显示键值
  13.                 if (cki.KeyChar == '\r')//当按下enter键的时候,表示字符串已经完成输入
  14.                 {
  15.                     break;//输入完成,跳出循环
  16.                 }
  17.                 else if ((cki.KeyChar >= 65 && cki.KeyChar <= 87) || (cki.KeyChar >= 97 && cki.KeyChar <= 119))//表示按下的键是在a-w,A-W的范围
  18.                 {
  19.                     Console.Write((Convert.ToChar(cki.KeyChar + 3)));//字符加密a-d b-e...往后推三个字符
  20.                 }
  21.                 else if ((cki.KeyChar >87&& cki.KeyChar <= 91) || (cki.KeyChar > 119 && cki.KeyChar <= 122))//x-z,X-Z的字符加密
  22.                 {
  23.                     Console.Write(Convert.ToChar(cki.KeyChar + 3 - 26));
  24.                 }
  25.                 else if (cki.KeyChar != '\b')//其他字符不处理,直接输出
  26.                 {
  27.                     Console.Write(cki.KeyChar);
  28.                 }
  29.                 else//按下退格键的情况
  30.                 {
  31.                     Console.Write("\b \b");//'\b"表示光标往前挪一位,然后将光标所在的位置替换为空格,这样就删除了,然后"\b"再将光标往前挪一位,以使得下一次输入紧跟其后
  32.                     if (str.Length == 0)//如果将字符串删除完了的话,则取不到str了,因为str变量长度为0,所以继续跳到循环的开始处
  33.                     {
  34.                         continue;//跳到while循环的开始处
  35.                     }
  36.                     else
  37.                     {
  38.                         str = str.Substring(0, str.Length - 1);//截取字符串,将我们已经删除的字符舍弃掉
  39.                         continue;
  40.                     }
  41.                 }
  42.                 str += cki.KeyChar;//用字符串str变量保存我们输入的字符;
  43.             }
  44.             Console.WriteLine("\n\n您刚才输入的字符串为:{0}", str);//我们真正输入的字符
  45.             Console.ReadKey();
  46.         }
  47.     }
复制代码

作者: 浮出一个美    时间: 2014-1-2 22:41
看到你的代码我都怕了,看了题目我有一个思路,希望对你有帮助
‘a’→’d’ ‘b’→’e’  ‘w’→’z’
把这些一个个存入map中
遍历字符串的每一个字符,根据键get到值不就行了?
作者: 甘昌德    时间: 2014-1-2 22:47
面试的题?什么面试会考这个{:soso_e103:}
作者: 熊丽    时间: 2014-1-2 23:53
用正则表达式和遍历,如果字符是英文字母,ascii码加4
作者: u010209195    时间: 2014-1-3 08:25
论坛前段时间的活动就有这个问题,我当时写的程序,你参考下
  1. namespace 数据加密
  2. {
  3.     class Program
  4.     {
  5.         static void Main(string[] args)
  6.         {
  7.             //定义一个动态字符串,用来存放加密后的字符串
  8.             StringBuilder sb = new StringBuilder();
  9.             //显示提示信息,提示用户进行输入
  10.             Console.WriteLine("请输入一串字符串!我们将对其进行加密!");
  11.             //接收用户输入的信息
  12.             string s = Console.ReadLine();
  13.             //加密前的字符串
  14.             Console.Write("加密前的字符串为:" + s + "\n");
  15.             //遍历用户输入的字符串,进行加密
  16.             foreach (char c in s)
  17.             {
  18.                 //对符合要求的小写英文字母进行加密
  19.                 if ((c >= 'a' && c <= 'z'))
  20.                 {
  21.                     //使用三元表达式(条件表达式)
  22.                     //先转换为其ASCII码再加3,并且判断是否已经查过'z'所对应的ASCII码,之后转换为字符
  23.                     Int32 change = Convert.ToInt32(c) + 3 > Convert.ToInt32('z') ? (Convert.ToInt32(c) + 3) - 26 : Convert.ToInt32(c) + 3;
  24.                     char mystr = Convert.ToChar(change);
  25.                     //添加到动态字符串中
  26.                     sb.Append(mystr);
  27.                 }
  28.                 else if ((c >= 'A' && c <= 'Z'))
  29.                 {
  30.                     //使用三元表达式(条件表达式)
  31.                     //先转换为其ASCII码再加3,并且判断是否已经查过'Z'所对应的ASCII码,之后转换为字符
  32.                     Int32 change = Convert.ToInt32(c) + 3 > Convert.ToInt32('Z') ? (Convert.ToInt32(c) + 3) - 26 : Convert.ToInt32(c) + 3;
  33.                     char mystr = Convert.ToChar(change);
  34.                     //添加到动态字符串中
  35.                     sb.Append(mystr);
  36.                 }
  37.                 else
  38.                 {
  39.                     //若用户输入的不是英文字母,则直接添加到动态字符串中
  40.                     sb.Append(c);
  41.                 }
  42.             }
  43.             //显示加密后的字符串
  44.             Console.Write("加密后的字符串为:" + sb + "\n");
  45.             Console.ReadKey();
  46.         }
  47.     }
  48. }
复制代码

作者: yuanlianxi03    时间: 2014-1-3 17:48
思路没有错,我运行了你的代码,出意外的原因在于你的判断条件有一个出了错误:判断X-Z的那个条件<=91应该改成<=90
作者: 再起来    时间: 2014-1-3 20:36
yuanlianxi03 发表于 2014-1-3 17:48
思路没有错,我运行了你的代码,出意外的原因在于你的判断条件有一个出了错误:判断X-Z的那个条件 ...

思路有问题呢.应该是计算机存储到的我输入的字符就是加密的 比如我输入a但是计算机存储的缺失e这样子.而我的是代码是:输入a,存储a,但是显示的是e
作者: 再起来    时间: 2014-1-3 20:40
u010209195 发表于 2014-1-3 08:25
论坛前段时间的活动就有这个问题,我当时写的程序,你参考下

是这样子么.我还是觉得思路不对.你这个就是把输入的字符串修改了一下,可是我们输入的字符串不还是没有加密的原封不动的存储在计算机内存中么.难道只要将我们输入的字符串str指向修改后的字符串对象.可是这样子怎么可以算的上加密呀
作者: 如远行客    时间: 2014-1-4 12:23
本帖最后由 如远行客 于 2014-1-4 12:29 编辑

贴上代码,说明一下,char类型是可以作为整数进行加减的。这是我入学考试时碰到的题目,代码如下:
  1. namespace Test10
  2. {
  3.     class Program
  4.     {
  5.         //编写一个应用程序用来输入的字符串进行加密,对于字母字符串加密规则如下:
  6.         //‘a’→’d’ ‘b’→’e’ ‘w’→’z’ …… ‘x’→’a’ ‘y’→’b’ ‘z’→’c’
  7.         //‘A’→’D’ ‘B’→’E’ ‘W’→’Z’ …… ‘X’→’A’ ‘Y’→’B’ ‘Z’→’C’
  8.         //对于其他字符,不进行加密。

  9.         static void Main(string[] args)
  10.         {
  11.             Console.WriteLine("请输入一段需要加密的字符串:");
  12.             string origStr = Console.ReadLine();
  13.             Console.WriteLine("加密前的字符串是:{0}",origStr);
  14.             char[] chs = origStr.ToCharArray(); //拆解字符串
  15.             for (int i = 0; i < chs.Length; i++)    //逐个字符加密
  16.             {
  17.                 if ((chs[i] >= 65 && chs[i] <= 87) || (chs[i] >= 97 && chs[i] <= 119))
  18.                 {   //字符范围为A~W和a~w之间时的加密方式
  19.                     chs[i] =(char)(chs[i]+ 3);
  20.                 }
  21.                 else if((chs[i] > 87 && chs[i] <= 90)||(chs[i] >= 119 && chs[i] <= 122))
  22.                 {   //字符范围为X~Z和x~z之间时的加密方式
  23.                     chs[i] =(char)(chs[i]-23);
  24.                 }
  25.                 //其余字符不加密
  26.             }
  27.             Console.WriteLine("加密后的字符串是:{0}",new string(chs));
  28.             Console.WriteLine("请按任意键结束程序...");
  29.             Console.ReadKey();
  30.         }
  31.     }
  32. }
复制代码


作者: yuanlianxi03    时间: 2014-1-8 00:27
再起来 发表于 2014-1-3 20:40
是这样子么.我还是觉得思路不对.你这个就是把输入的字符串修改了一下,可是我们输入的字符串不还是没有加 ...

这个看实际的用途了,如果要是就向客户展示加密后的密文,这个思路是可以的,如果要把密文存储起来,就用个变量把它存起来就可以了;
其实思路没有问题,只是你想的太复杂了
作者: 再起来    时间: 2014-1-8 21:14
yuanlianxi03 发表于 2014-1-8 00:27
这个看实际的用途了,如果要是就向客户展示加密后的密文,这个思路是可以的,如果要把密文存储起来,就用 ...

老师说我的思路有问题.我觉得我的这个看起来还有点意义.按照以上同学们的代码那有什么意义呵
作者: yuanlianxi03    时间: 2014-1-8 22:33
再起来 发表于 2014-1-8 21:14
老师说我的思路有问题.我觉得我的这个看起来还有点意义.按照以上同学们的代码那有什么意义呵 ...

说实话,我搞不清你想要问的究竟是什么,加密就是把原始文本加工成密文,密文在没有对应的解密方法前,是无法正确阅读其原始内容的,楼上那几位说了几种思路,加密其实就是一种明文和密文之间的一种转换规则,但还有一点就是加密和解密是可逆的;

你说的把输入加密,是不是把输入的字符直接加密,而不存储接收到的原始文本呢?如果这样的直接把存储原始文本的步骤去掉,就好了,下面是我给出的代码,我存储了原始文本,同时存储了密文,不知道是不是你想要的结果

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;

  5. namespace encryptionsample
  6. {
  7.     class Program
  8.     {
  9.         static void Main(string[] args)
  10.         {
  11.             ConsoleKeyInfo cki; //用来接收键盘按键
  12.             StringBuilder sbOriginal = new StringBuilder(); //存储键盘的原始输入
  13.             StringBuilder sbEncryption = new StringBuilder(); //存储密文
  14.             bool isEnd = false;// 如果用户按下回车,表示结束
  15.             while (!isEnd)
  16.             {
  17.                 cki = Console.ReadKey(true);//不显示原始输入的字符
  18.                
  19.                
  20.                 if (cki.KeyChar >= 65 && cki.KeyChar <= 90) //加密A-Z的字符
  21.                 {
  22.                     int c = (cki.KeyChar - 64 + 3) % 26;
  23.                     Console.Write(Convert.ToChar((c == 0) ? 90 : (c + 64))); //打印加密后的密文字符
  24.                     sbEncryption.Append(Convert.ToChar((c == 0) ? 90 : (c + 64))); // 存储密文
  25.                     
  26.                 }
  27.                 else if (cki.KeyChar >= 97 && cki.KeyChar <= 122)//加密a-z的字符
  28.                 {
  29.                     int c = (cki.KeyChar - 96 + 3) % 26;
  30.                     Console.Write(Convert.ToChar((c == 0) ? 122 : (c + 96))); //打印加密后的密文字符
  31.                     sbEncryption.Append(Convert.ToChar((c == 0) ? 122 : (c + 96))); // 存储密文
  32.                 }
  33.                 else if (cki.KeyChar == '\b') //如果输入的字符为退格则消去前一个密文字符
  34.                 {

  35.                     if (sbOriginal.Length == 0)
  36.                     {
  37.                         continue;
  38.                     }
  39.                     else
  40.                     {
  41.                         
  42.                         Console.Write("\b \b");//退格

  43.                         sbOriginal.Remove(sbOriginal.Length - 1, 1); //将原始文本移除一个字符
  44.                         sbEncryption.Remove(sbEncryption.Length - 1, 1);    //将加密后的文本移除一个字符
  45.                         continue;
  46.                     }
  47.                 }
  48.                 else if (cki.KeyChar != '\n' && cki.KeyChar != '\r') //如果不为回车则直接输出字符否则退出
  49.                 {
  50.                     Console.Write(cki.KeyChar);
  51.                     sbEncryption.Append(Convert.ToChar(cki.KeyChar.ToString())); // 存储密文
  52.                 }
  53.                 else
  54.                 {
  55.                     Console.WriteLine();
  56.                     break;
  57.                 }

  58.                 sbOriginal.Append(cki.KeyChar.ToString());//存储原始输入字符
  59.             }

  60.             Console.WriteLine(sbOriginal);//打印原始文本
  61.             Console.WriteLine(sbEncryption);//打印密文
  62.             Console.ReadKey();

  63.         }
  64.     }
  65. }
复制代码

作者: 官方    时间: 2014-10-6 15:49
路过学习~~~~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2