zoukankan      html  css  js  c++  java
  • 课后作业4

    古罗马皇帝凯撒在打仗时曾经使用过以下方法加密军事情报:

     请编写一个程序,使用上述算法加密或解密用户输入的英文字串要求设计思想、程序流程图、源代码、结果截图。

    设计思想:编写一个类,调用这个类的静态方法,两个静态方法编入字符串,一个用来翻译原文,另一个用来翻译密码。利用循环对字符串中每个字符作+3的操作(在这里需要用到强制类型转换,对于字母表结尾的xyz和开头的abc分别在转为密码和转为原文中特殊处理,即a---x,b---y,c---z),同时把这些字符加到一个准备输出的空字符串的后面

    程序流程图:

    源代码:

    import java.util.Scanner;

    public class JiaMi

    {

    public static void main(String[]args)

    {

    Scanner s = new Scanner(System.in);

    System.out.print("输入一串原始字符串:");

    String str = s.next();

    System.out.println("对应密码为:"+Psw.lock(str));

    System.out.print("输入一串密码字符串:");

    str = s.next();

    System.out.println("对应原文为:"+Psw.unlock(str));

    s.close();

    }

    }

    class Psw

    {
    private String original = "";

    private String psw = "";

    public Psw(String original)

    {

    this.original = original;

    }

    public void lock()

    {

    int len = original.length();

    for(int i = 0;i<len;++i)

    {

    if(original.charAt(i)>='a'&&original.charAt(i)<='w')

    psw+=(char)(original.charAt(i)+3);

    else if(original.charAt(i)=='x')psw+='a';

    else if(original.charAt(i)=='y')psw+='b';

    else if(original.charAt(i)=='z')psw+='c';

    else if(original.charAt(i)>='A'&&original.charAt(i)<='W')psw+=(char)(original.charAt(i)+3);

    else if(original.charAt(i)=='X')psw+='A';

    else if(original.charAt(i)=='Y')psw+='B';

    else if(original.charAt(i)=='Z')psw+='C';

    else

    {

    System.out.println("有异常字符,直接退出");

    break;

    }

    }

    }

    public String getPsw()

    {

    return psw;

    }

    public static String lock(String str)

    {

    String str1 = "";

    int len = str.length();

    for(int i = 0;i<len;++i)

    {

    if(str.charAt(i)>='a'&&str.charAt(i)<='w')

    str1+=(char)(str.charAt(i)+3);

    else if(str.charAt(i)=='x')str1+='a';

    else if(str.charAt(i)=='y')str1+='b';

    else if(str.charAt(i)=='z')str1+='c';

    else if(str.charAt(i)>='A'&&str.charAt(i)<='W')str1+=(char)(str.charAt(i)+3);

    else if(str.charAt(i)=='X')str1+='A';

    else if(str.charAt(i)=='Y')str1+='B';

    else if(str.charAt(i)=='Z')str1+='C';

    else

    {

    System.out.println("有异常字符,直接退出");

    break;

    }

    }

    return str1;

    }

    public static String unlock(String str)

    {

    String str1 = "";

    int len = str.length();

    for(int i = 0;i<len;++i)

    {

    if(str.charAt(i)>='d'&&str.charAt(i)<='z')

    str1+=(char)(str.charAt(i)-3);

    else if(str.charAt(i)=='a')str1+='x';

    else if(str.charAt(i)=='b')str1+='y';

    else if(str.charAt(i)=='c')str1+='z';

    else if(str.charAt(i)>='D'&&str.charAt(i)<='Z')str1+=(char)(str.charAt(i)-3);

    else if(str.charAt(i)=='A')str1+='X';

    else if(str.charAt(i)=='B')str1+='Y';

    else if(str.charAt(i)=='C')str1+='Z';

    else

    {

    System.out.println("有异常字符,直接退出");

    break;

    }

    }

    return str1;

    }

    }

    结果截图:

    动手动脑:

    请运行以下示例代码StringPool.java,查看其输出结果。如何解释这样的输出结果?从中你能总结出什么?

    在Java中,内容相同的字串常量(“Hello”)只保存一份以节约内存,所以s0,s1,s2实际上引用的是同一个对象。 编译器在编译s2一句时,会去掉“+”号,直接把两个字串连接起来得一个字串(“Hello”)。这种优化工作由Java编译器自动完成。 当直接使用new关键字创建字符串对象时,虽然值一致(都是“Hello”),但仍然是两个独立的对象。

    为什么会有上述的输出结果?从中你又能总结出什么?

    给字串变量赋值意味着:两个变量(s1,s2)现在引用同一个字符串对象“a”! String对象的内容是只读的,使用“+”修改s1变量的值,实际上是得到了一个新的字符串对象,其内容为“ab”,它与原先s1所引用的对象”a”无关,所以,s1==s2返回false; 代码中的“ab”字符串是一个常量,它所引用的字符串与s1所引用的“ab”对象无关。

    动手动脑:请查看String.equals()方法的实现代码,注意学习其实现方法。

    代码:

    public boolean equals(Object anObject)

    {
    if (this == anObject) {
    return true;
    }
    if (anObject instanceof String) {
    String anotherString = (String) anObject;
    int n = value.length;
    if (n == anotherString.value.length) {
    char v1[] = value;
    char v2[] = anotherString.value;
    int i = 0;
    while (n-- != 0) {
    if (v1[i] != v2[i])
    return false;
    i++;
    }
    return true;
    }
    }
    return false;
    }

    (1)String类中的equals首先比较地址,如果是同一个对象的引用,可知对象相等,返回true。

     (2)若果不是同一个对象,equals方法挨个比较两个字符串对象内的字符,只有完全相等才返回true,否则返回false

     

    动手动脑之Stringequals()方法:

    String类型当比较不同对象内容是否相同时,应该用equals,因为“==”用于比较引用类型和比较基本数据类型时具有不同的功能。

    1:当对象不同,内容相同,"=="返回false,equals返回true

    String s1=new String(“java”);

    String s2=new String(“java”);

    System.out.println(s1==s2);//false

    System.out.println(s1.equals(s2));//true

    2:当同一对象,"=="和equals结果相同

    String s1=new String(“java”);

    String s2=s1;

    System.out.println(s1==s2);//true

    System.out.println(s1.equals(s2));//true

    3:如果值不相同,对象就不相同,所以"==" 和equals结果一样

    String s1=”java”;

    String s2=”java”;

    System.out.println(s1==s2);//true

    System.out.println(s1.equals(s2));//true

    整理String类的Length(),charAt(),getChars(),replace(),toUpperCase(),toLowerCase(),trim(),toCharArray()使用说明

    length():public int length()//求字符串长度

             String s=”dwfsdfwfsadf”;

             System.out.println(s.length());

    charAt():public charAt(int index)//index 是字符下标,返回字符串中指定位置的字符

            String s=”Hello”;

            System.out.println(s.charAt(3));

    getChars():public int getChars()//将字符从此字符串复制到目标字符数组

            String str = "abcdefghikl";

            Char[] ch = new char[8];

            str.getChars(2,5,ch,0);

    replace():public int replace()//替换字符串

            String s=”\”;

            System.out.println(s.replace(“\”,”///”));

            结果///;

    toUpperase():public String toUpperCase()//将字符串全部转换成大写

             System.out.println(new String(“hello”).toUpperCase());

    toLowerCse():public String toLowerCase()//将字符串全部转换成小写

             System.out.println(new String(“HELLO”).toLowerCase());

    trim():public String trim()

             String x=”ax  c”;

             System.out.println(x.trim());//是去两边空格的方法

    toCharArray(): String x=”abcd”;// 将字符串对象中的字符转换为一个字符数组

               char myChar[]=x.toCharArray();

              System.out.println(“myChar[1]”+myChar[1]);

  • 相关阅读:
    串口通信中接收数据时延迟处理与缓存处理的解决方案(C#)
    串口通讯接收数据的处理
    在C#程序设计中使用Win32类库
    C# Mutex对象学习经验
    我眼中的C# 3.0 Written by Allen Lee
    利用C#鼠标拖动TreeView节点
    richtextbox内文字自动滚动的例子
    在十六进制字符串与数值类型之间转换 C# 编程指南
    如何:指定符号位置和加载行为
    杂记20110321
  • 原文地址:https://www.cnblogs.com/tianzeyangblog/p/7742950.html
Copyright © 2011-2022 走看看