Forth Week :快速上手一门编程语言

快速上手一门编程语言

概述

图灵完备性语言

图灵完备的语言,有循环执行语句,判断分支语句等。理论上能解决任何算法。但有可能进入死循环而程序崩溃。
Pyhton java php等都是图灵完备的

识别类型

https://blog.csdn.net/sinat_38682860/article/details/86492429?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control
四个概念:
强类型 & 弱类型
动态类型 & 静态类型
因此:
Python是动态强类型语言 编程语言环境帮助我们判断类型
Java是静态强类型的
C是静态弱类型的 char a -> %c显示a %d显示65 人来判断是什么类型 (PHP也是弱类型)
强弱是指本身能够判断这个变量是什么类型
动静是指声明变量时指定变量类型是静态类型(有强制类型转换),不需要指定的是动态类型(可以自动转换)。
Forth Week :快速上手一门编程语言
Forth Week :快速上手一门编程语言

学习路径

一 掌握该语言的背景 - 2h

二 掌握该语言的基本程序逻辑语法 - 1h

1、顺序结构

2、分支结构
1)if语句
if(表达式){
	语句块;
}
else if(表达式){
	语句块;
}
else{
	语句块;
}
 
2)switch … case多分支语句
switch(表达式){
	case 常量1:{
		语句块;
		break;
	}
	case 常量2:{
		语句块;
		break;
	}
	[default:
		{语句块;}
	]
}
3、循环结构

break和continue语句:break是终止本层循环,跳到外层继续执行代码;continue终止本次循环,继续下一次循环;

1)while
public static void main(String args[]){
	int result = 0;
	int i = 0;
	while(i<=100){
		result += i;
		i++;
	}
	System.out.println("result = "+result);
}
2)do…while
public static void main(String args[]){
	int result = 0;
	int i=0;
	do{
		result += i;
		i++;
	}while(i<=100);
	System.out.println("result = "+result);
}
3)for
public static void main(String args[]){
	for (int i=0;i<10;i++){
		if(i==3) break;
		System.out.println("i = "+i);
	}
	System.out.println("Game over!");
}
4)foreach 【java5的新特征之一】
for(元素类型t 元素变量x:遍历对象obj){ 
 	引用了x的java语句;
}
public void test(){
	int arr[] = {2,3,4};
	System.out.println("-----排序前一维数组-----");
	for(int x:arr){
		System.out.println(x);//逐个输出数组元素
	}
	Arrays.sort(arr);
	System.out.println("-----排序后一维数组-----");
	for(int x:arr){
	 	System.out.println(x);
	}
	
	//输出二维数组
	int arr2[][] = {{1,2,3},{4,5,6}};
	System.out.println("二维数组输出测试");
	for(int x[] : arr2){
		for(int e:x){
			System.out.println(e);
		}
	}
	
	//输出三维数组
	int arr3[][][] = {{{1,2},{3,4}},{{5,6},{7,8}}};
	System.out.println("三维数组输出测试");
	for(int[][] a2:arr){
		for(int[] a1:a2){
			for(int x:a1){
				System.out.println(x);
			}
		}
	}
}

三 掌握该语言的变量 - 2h

1 明确语言的类型

静态?动态?
强 or 弱 ?

2 基本类型和封装类型

变量类型是值 or 引用类型?
C、C++ - 值类型(保存地址) Python、Javascrip - 引用类型(保存指针 判断时用equal判断,否则判断指针指的是否是同一个地址了) Java 两者都有

1)基本数据类型
(1)内置数据类型

八种基本类型:六种数字类型(四种整数型、两个浮点型),一种字符类型,一种布尔类型。

byte:8位,有符号
short:16位,有符号
int:32位,有符号
long:64位,有符号
float:单精度、32位
double:双精度、64位
boolean:表示一位的信息,取值true和false
char:单个的16位Unicode字符

(2)引用数据类型

类似于C/C++的指针,引用类型指向一个对象,指向对象的变量是引用变量。这些变量在声明时被指定为一个特定的类型(Employee,Puppy),变量一旦声明后,类型就不能改变了。

  • 对象、数组都是引用数据类型。
  • array.clone() 否则传过去的是地址
  • 所有引用类型的默认值都是null。
  • 一个引用类型可以用来引用任何与之兼容的类型。
Site site = new Site("Jacob")
(3)常量

常量在程序运行时不能被修改,使用final关键字来修饰,声明方式和变量类似,变量名常使用大写字母:

final double PI = 3.14159;
(4)特殊转义字符
(5)类型转换

运算符

1)算数运算符
符号 含义
-
*
/
% 求余
++ 自增
自减
2)关系运算符
符号 含义
== 判断是否相等
!= 判断是否不等
> 大于?
< 小于?
>= 大于等于?
<= 小于等于?
3)位运算符
符号 含义
&
^
~ 按位取反
<< 按位左移
>> 按位右移
4)逻辑运算符
符号 含义
&& 逻辑与
逻辑非
5)赋值运算符
6)其他运算符

3 时间和日期的类型和处理

保存时间1970年格林威治到现在的时间戳
Date类

public static void main(String[] args) {
  Date date = new Date(); //初始化Date对象
  System.out.println(date.toString());
  
  /*日期比较
  1. getTime()方法获取两个时间,然后比较
  2. before() after() equals()方法
     eg:new Date(99,2,12).before(new Date(99,2,18)) 返回true
  3. 使用compareTo()方法
  */
  /*
   * 解析字符串为时间
   * SimpleDateFormat类
   * */
  SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
  
  String input = args.length == 0? "1818-11-11 " : args[0];
  System.out.print(input + "Parse as ");
  Date t;
  try {
   t = ft.parse(input);
   System.out.println(t);
  }catch(ParseException e) {
   System.out.println("Unparseable using"+ft);
  }
  
  /*
   * Sleep休眠 阻塞当前进程
   * */
  
  try {
   System.out.println(new Date() +"\n");
   Thread.sleep(3*1000);
   System.out.println(new Date() + "\n");
  }catch (Exception e) {
   System.out.println("GOT an exception!");
  }
 
 }

Calendar类

4 字符串的实现和种类

可变 or 不可变?
字符串常量池 :String创建的字符串存储在公共池中,而new创建的字符串对象在堆上

//初始化方式
String s1 = "runoob";  //String直接创建
String s2 = "runoob";
String s3 = s2;//相同引用

String s4 = new String("runoob");//对象创建
String s5 = new String("runoob");

//也可以提供字符数组
char[] helloArray = new char[] {'h','e','l','l','o'};
String helloSrting = new String(helloArray);

//字符串也可以直接转换成字符数组
char[] arr = helloString.toCharArray();

//内置字符串函数
1.连接concat()或者+
2.equals() compareTo(Object o) 
equalsIgnoreCase()//忽略大小写
compareTo(String otherstring)
contentEquals(StringBuffer sb)  //与stringbuffer有相同顺序的字符时,返回真 
length()
replace(oldChar, newChar) replaceAll() replaceFirst()
split() trim()
startsWith() endsWith()
toUpperCase() toLowerCase()
indexOf() contains() subString()
isEmpty()

StringBuffer类、StringBuilder比StringBuffer速度快
使用stringBuffer类时,每次都会对Stringuffer对象本身进行操作,而不是生成新的对象,要求线程安全的情况下,必须使用StringBuffer类

StringBuffer sBuffer = new StringBuffer("cainiaoguanwang:");
sBuffer.append("www");
sBuffer.append(".runoob");
sBuffer.append(".com");
System.out.println(sBuffer);

StringBuilder sb = new StringBuilder(10);
sb.append("Runoob....");
System.out.println(sb);
sb.append("!");
sb.insert(8,"java");
sb.delete(5,8);
System.out.println(sb);

正则表达式函数 Matcher类
特殊点:
在 Java 中,\ 表示:我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义。正常反斜杠表示:\\

String line = "This line is a test!";
String pattern = "(\\D*)(\\d+)(.*)";

Pattern r = Pattern.compile(pattern);
Match m = r.matcher(line);
if(m.find()){
	System.out.println(m.group(0));
	System.out.println(m.group(1));
   	System.out.println(m.group(2));
  }else {
  	 System.out.println("No match!");
  }
/*
   * ^ 开始位置
   * $ 结束位置
   * * 零次或多次匹配
   * + 一次或多次匹配
   * ? 零次或一次匹配
   * {n} 正好匹配n次
   * {n,} 至少匹配n次
   * {n,m} 至少n次,至多m次
   * (pattern) 匹配pattern并捕获该匹配的子表达式
   * x|y  匹配x或者y
   * [xyz] 字符集,匹配集合中的任意一个字符
   * [a-z] 字符范围
   * \d 数字字符 \D非数字字符
   * */

四 容器对象学习 - 1h

Hash map、字典、数组等等
Java -
C++ 导入模板库
1、容器对象的种类和实现原理
2、遍历
3、深浅复制
4、序列化和反序列化
5、查阅手册,了解全部容器支持的函数并掌握常用容器操作函数

public static void main(String args[]) {
  //枚举  一次获得一个元素  很少使用
  Enumeration<String> days;
  Vector<String> dayNames = new Vector<String>();
  dayNames.add("Sunday");
  dayNames.add("Monday");
  dayNames.add("Tuesday");
  dayNames.add("Wednesday");
  days = dayNames.elements();
  while (days.hasMoreElements()) {
   System.out.println(days.nextElement());
  }
  
  //位集合测试
  BitSet bits1 = new BitSet(16);
  BitSet bits2 = new BitSet(16);
  
  for(int i=0;i<16;i++) {
   if((i%2) == 0) bits1.set(i);
   if((i%5) != 0) bits2.set(i);
  }
  System.out.println("bits1: "+bits1);
  System.out.println("bits2: "+bits2);
  
  //Vector类  动态数组和arraylist类似,但两者不同
  //1.四种构造方法
  Vector v = new Vector(3,2);
  System.out.println("Initial Size:"+v.size());
  v.addElement(new Integer(1));
  v.addElement(new Integer(2));
  v.addElement(new Integer(3));
  System.out.println(v);
  System.out.println("Initial capacity:"+v.capacity());
  
  //栈stack 本质是vector 除此之外自己也定义了一些方法
  Stack st = new Stack();
  st.push(new Integer(1));
  st.push(new Integer(2));
  st.push(new Integer(3));
  st.push(new Integer(4));
  Integer x = (Integer) st.pop();
  System.out.println(x);
  x = (Integer) st.pop();
  System.out.println(x);
  x = (Integer) st.pop();
  System.out.println(x);
  x = (Integer) st.pop();
  System.out.println(x);
  
  //MAP接口 提供了键映射到值,可以通过键来获取值
  Map m1 = new HashMap();
  m1.put("zhang",18);
  m1.put("gao", 22);
  m1.put("li",23);
  m1.put("han",31);
  System.out.println(m1.size());
  System.out.println(m1.get("gao"));
  System.out.println(m1.hashCode());
  System.out.println(m1.remove("gao"));
  System.out.println(m1.values());
//  for(int i=0;i<m1.size();i++) {
//   System.out.println(m1.get(i));
//  }
  
  //迭代器  通常情况下使用迭代器遍历一个集合的元素
  //可以使用Iterator接口或者ListIterator接口
  List<String> list = new ArrayList<String>();
  //1.使用foreach遍历list
  list.add("hello");
  list.add("world");
  list.add("hahahah");
  
  for(String str:list) {
   System.out.println(str);
  }
  
  //2.把链表变为数组相关的内容进行遍历
  String[] strArray = new String[list.size()];
  list.toArray(strArray);
  for(int i=0;i<strArray.length;i++) {
   System.out.println(strArray[i]);
  }
  
  //3.使用迭代器进行相关遍历
  Iterator<String> ite = list.iterator();
  while(ite.hasNext())//判断下一个元素之后有值
  {
   System.out.println(ite.next());
  }
 }
深浅复制
序列化和反序列化

五 实现抽象的方法、类、接口与函数的实现、使用 - 2h - coder

1、函数的定义与调用
2、参数使用与传递方式
3、类和对象的实现方式 - 封装继承多态
4、多继承还是接口
5、常见的设计模式的实现,单例模式、代理模式(委托),观察者模式

六 函数式编程的支持

1、高阶函数对象
2、语法特性与编程习惯(如链式语法、闭包等)

七 依赖与项目管理工具与生态支持 - developer

java的maven、gradle

八 内置高级功能 - professional

并发模型、多线程,多进程,系统调用,磁盘管理,数据库管理,网络支持等特性
至少要会查看手册

任务:
1、完成一个支持消息循环的交互程序
开始运行之后不结束 while循环之类的 通过输入某个命令,再退出
rpg小程序 完成六步以上的剧情??
精细的控制 二进制位进行操作
交互应用程序 凯撒密码对数据进行加密
加密前选择位移的序号 在输入一串字符串 回车后输出加密字符串 放到文本 在解密程序 导入标准输入流 输入一个序号
破解 不知道加密序号 导入文本中数据 找到加密序号 找出加密前的 正确的字符串需要人为判断 机器只是工具 人才知道要的是什么

九 文件读取和写入

1、文件类继承关系
Forth Week :快速上手一门编程语言
2、文件读取
(2)按行读取
使用BufferedReader中的readLine()方法。无参数,返回包含改行的内容字符串,不包含任何行终止符,如果已经到达流末尾,则返回null。

int position=0;
String[] bufstring = new String[1024];
//打开带读取的文件
BufferedReader br = new BufferedReader(new FileReader("text.txt"));
String line = null;
while((line=br.readLine())!=null){
        bufstrig[position]=line;
        positon++;
}
br.close(); //关闭文件
for(int i;i<position;i++){
        System.out.println(bufstring[i]);
}

(3)自动换行写入
利用OutputStream中的Println()方法

int number = 1;
OutputStream os = new FileOutputStream("output.txt");
PrintWriter pw = new PrintWriter(os);
for(int i=0;i<10;i++){
        String s = ""+number;
        pw.println(s);//每输入一个数据,自动换行
        //pw.println(s+",");//不会自动换行,必要时可自己添加分隔符
        number++;
}
pw.close();
os.close();
上一篇:获取以当天开头的一周的时间


下一篇:C++编程学习笔记 week 6