学编程,来源栈;先学习,再交钱
当前系列: J&C 修改讲义

复习:强类型:数值 / bool / 字符,数组 / 方法


更严格的语法要求

语句和表达式

必须使用分号(;)结束一条语句,换行不行。

语句,就像一句话一样,是一条完整的对计算机的指示。比如:
3 + 2;
就不完整,3+2=5,但等于5之后呢?是赋值给一个变量,还是把它控制台输出来?得给句话啊!所以,这才是语句:
int sum = 3 + 2;

强类型

条件表达式if后面的结果,只能是bool值,其他类型都不行:

if (1)              /*有点编程语言可以使用1和0表示true和false,Java和C#不行*/
if (name = "yezi")  /*常见错误,混淆了=和==*/


多维数组

复习:强类型的一维数组

多维(multiple dimension),可以是二维、三维、四维……,但我们开发中常用的是二维,偶尔有三维,几乎不会上四维。

形象的描述:

  • 一维是一条线
  • 二维就是行列组成的面
  • 三维就是面组成的立体
  • ……

多维,其实又可以分两种(以二维为例):

  • 行宽度都固定的,真正的,二维数组,可以用矩形表示
  • 行宽度可变的,数组的数组,或者“交错”数组,是一个一边不规则的锯齿状图形

我们先看在Java/C#中都通用的

交错数组

3行不定列的数组 

int[][] mutrix = new int[3][];
使用数组赋值
mutrix[0] = new int[] { 1, 2 }; 
mutrix[1] = new int[]  { 3, 4, 5 } ;
mutrix[2] = new int[4]; 

取值方式如下:

//取出“作为行的”数组
int[] arr1 = mutrix[1];
//取出“行中的列”元素
System.out.println(mutrix[1][0]);

也可以为行,或单个元素赋值

mutrix[1] = new int[10];
mutrix[1][0] = 100;
注意能在该(行)数组实例化之前就赋值。

因为它的底层逻辑是:数组的数组。作为元素的数组必须是实例化之后才能使用。(能懂我的意思么?o(╥﹏╥)o)

二维数组,如果要遍历每一个“基本”元素,就需要

双重循环

for (int i = 0; i < mutrix.length; i++) {
	int[] array = mutrix[i];
	for (int j = 0; j < array.length; j++) {
		System.out.print(array[j] + "  ");
	}
	System.out.println();
}

PS:固定“列宽”的数组Java和C#使用了不同的语法……


枚举(Enum)

为什么需要?

比如我们要在程序中记录“星期几”,用什么类型比较好?整数int吗,或者字符串string?

假设我们有一个方法,可以根据星期几返回bool值,如果是星期三和星期六,就返回true,表示当天不上课,^_^

怎么声明这个方法呢?

        static bool IsRest(int dayofWork)
        {
            return dayofWork == 3 || dayofWork == 6; 
        }

这样写,有两个问题:

  1. 开发人员怎么知道3代表星期三,6代表星期六?最明显的,星期天你怎么表示?0,还是7?不同的文化可能有不同的定义,这就是问题。
  2. 调用这个方法时,有没有可能传入一个参数:8?因为int类型的取值是没有限制的。OK的吗?

@想一想@:如果用string类型呢?

PS:int和string的选择,QQ号、电话号码、只能是阿拉伯数字的密码,用什么类型?

DayOfWork

在Java和C#中都提供了一个DayOfWork的枚举:(演示:F3转到定义)

public enum DayOfWeek {
    MONDAY,
    TUESDAY,

DayOfWeek是枚举名,类似于int、String,代表一种类型。

MONDAY、TUESDAY就是枚举的值,直接枚举名点(.)出即可:

DayOfWeek day = DayOfWeek.FRIDAY;

这样,我们就可以:

        static bool IsRest(DayOfWeek dayofWork)
        {
            return dayofWork == DayOfWeek.Wednesday
                || dayofWork == DayOfWeek.Saturday;
        }

@想一想@:使用枚举的好处

  • 首先,DayOfWeek.Wednesday表义非常清楚;
  • 然后,参数是枚举类型,所以你没办法传入一个不存在的枚举值的。

这些,都极大的提高了代码的可读性和健壮性(少bug)。

自定义枚举

我们还可以定义枚举,可以把枚举当做一种内置类型。

enum Score{    //枚举名
	excellent,    //枚举值
	passed,
	failed
}

枚举通常和 switch...case 配合使用:

static void reward(Grade grade) {
	switch (grade) {
		case Excellent:  //和C#不同,没有Grade.前缀


方法重载(overload)

演示:F3转到定义System.out.println()

(同一个类中)同一个方法名,可以使用配以不同的参数“组合”(个数/类型/次序);调用的时候,编译器根据传入的参数,自动的找到相应的方法:这就是方法的重载。

但注意:

  • 仅是参数名不同
  • 仅是返回值不同

不能认为是方法的重载。

        static void grow(){}
        //static int grow(){return -1;}         //不能通过返回类型区分
        static void grow(int age){}
        static void grow(string name){}
        //static void grow(string sname) { }    //不能通过参数名区分
        static void grow(string name, int age){}
        static void grow(int age, string name){}

@想一想@:为什么需要方法的重载?

  1. 多个方法使用同一个方法名,直观清晰,减少方法命名(命名很难很累的)
  2. 实现默认(default)参数值的效果。
    static void exam(int bonus) {
    	System.out.println(90 + bonus);
    }
    
    static void exam() {
    	exam(5);
    }

    生活场景:“老程,帮我买瓶水”

    • 默认500ml瓶装矿泉水,不需要每次都说;
    • 但有时候想换个口味或者其他原因,需要的是380ml矿泉水或者大罐装肥宅快乐水

    开发中的例子:生成一个随机数组,默认:10个元素,以0开头,元素值最大间距5以内。


作业

说明:J&C中的所有作业,都可以/应该在完成相应的Java/C#部分后完成。

  1. 观察一起帮的用户等级,定义一个枚举Rank,可以标明用户的等级
  2. 声明一个方法encourage(),传入两个参数:
    • origin:用户原有的积分(帮帮点)
    • rank:用户的等级
    方法能使用switch...case和枚举:
    • 根据用户的等级,在用户原有积分上给予不同的加分,
    • 输出“一起帮周年庆,系统根据你的等级为你自动奖励X分”,
    • 返回加分后的结果
  3. 修改encourage()方法,“单叶”和“双叶”都加一样的分
  4. 定义若干个publish()方法,可以发布求助,参数包括:
    • title:标题,必填
    • body:正文,可选,如果不填的话等同于title
    • reward:悬赏帮帮币,可选,如果不填的话默认为10
    方法最后控制台输出:
    • 发布文章:<title>
    • 内容为:<body>
    • 设置悬赏:<reward>枚帮帮币
  5. 声明方法GetAverage(),该方法能够接收任意多个float值,比如:GetAverage(98.5, 78.4, 65, 88.3),返回参数之和的平均值
  6. 将源栈同学姓名,按座位装入二维数组students。
  7. 定义一个方法showMutrix(),用它能:
    1. 按行输出存储在二维数组里的元素
    2. 返回数组中共有多少个元素
    调用该方法,传入输出作业6中的数组,输出源栈同学姓名
  8. 用for循环创建一个n行m列的二维数组,元素值等于下标之和,如下所示:
    0 1 2 3 4
    1 2 3 4 5
    2 3 4 5 6
    3 4 5 6 7
    并将其按行列输出到控制台。
学习笔记
源栈学历
键盘敲烂,月薪过万作业不做,等于没学

作业

觉得很 ,不要忘记分享哟!

任何问题,都可以直接加 QQ群:273534701

在当前系列 J&C 中继续学习:

上一课: 已经是第一课了……

多快好省!前端后端,线上线下,名师精讲

  • 先学习,后付费;
  • 不满意,不要钱。
  • 编程培训班,我就选源栈

更多了解 加:

QQ群:273534701

答疑解惑,远程debug……

B站 源栈-小九 的直播间

写代码要保持微笑 (๑•̀ㅂ•́)و✧

公众号:源栈一起帮

二维码