实验一 Java编程基础
实验1-1 变量的自动类型转换
一、实验描述
1、 考核知识点
名 称:变量的类型转换
2、 练习目标
- 了解变量进行自动类型转换的条件
3、 需求分析
变量的自动类型转换,指的是两种数据类型在转换的过程中不需要显式地进行声明。为了明确哪些数据类型可以实现自动转换,本实验演示的是将一种数据类型的值赋给另外一种数据类型变量的情形。
4、 设计思路(实现原理)
1) 编写一个类Example01。
2) 在类Example01中,定义byte类型的变量a,int类型的变量b,float类型的变量f,double类型的变量d,其中,变量a的初始值为10,变量f的初始值为12.5f。
3) 将变量a的值赋给变量b,变量a、b、f相加后的结果值赋给变量d。
4) 使用println语句打印出变量b和变量d的值。
二、实验实现
定义Example01类:
package cn.itcast.Example01;
public class Example01 {
public static void main(String[] args) {
byte a=10;
int b;
float f=12.5f;
double d;
b=a;
d=a+b+f;
System.out.printf("b="+b+" "+"d="+d);
}
}
运行结果截图为图1-1
图1-1 运行结果
三、实验总结
1、要实现自动类型转换,必须同时满足两个条件,第一是两种数据类型彼此兼容,第二是目标类型的取值范围大于源类型的取值范围。
2、列出三种可以进行自动类型转换的情况,具体如下:
(1)整数类型之间可以实现转换,如byte类型的数据可以赋值给short、int、long类型的变量,short、char类型的数据可以赋值给int、long类型的变量,int类型的数据可以赋值给long类型的变量。
(2)整数类型转换为float类型,如byte、char、short、int类型的数据可以赋值给float类型的变量。
(3)其它类型转换为double类型,如byte、char、short、int、long、float类型的数据可以赋值给double类型的变量。
实验1-2 变量的强制类型转换
一、实验描述
1、 考核知识点
名 称:变量的类型转换
2、 练习目标
- 掌握不同数据类型间的强制类型转换
3、 需求分析
强制类型转换也叫显式类型转换,指的是两种数据类型之间的转换需要进行显式地声明。例如,两种类型彼此不兼容,或者目标类型取值范围小于源类型,都需要进行强制类型转换。
4、 设计思路(实现原理)
1) 编写一个类Example02
2) 在Example02中的main()方法中定义一个int类型的变量i和byte类型的变量b,并将变量i的值赋给变量b
3) 使用println语句打印出变量b的值
二、实验实现
定义Example02类:
package cn.itcast.Example02;
public class Example02 {
public static void main(String[] args) {
int i=10;
byte b;
b=(byte)i;
System.out.println("b="+b);
}
}
运行结果截图为图1-2:
图1-2 运行结果
三、实验总结
1、强制类型转换,具体格式如下:
目标类型 变量 = (目标类型)值
2、在对变量进行强制类型转换时,会发生取值范围较大的数据类型向取值范围较小的数据类型的转换,如将一个int类型的数转为byte类型,这样做极容易造成数据精度的丢失。int在内存中占用4个字节。byte类型的数据在内存中占用1个字节,当将变量i的数据在内存中占的内存大于1个字节时,前面3个高位字节的数据会丢失,数值也会发生改变。
实验1-3 运算符的优先级
一、实验描述
1、 考核知识点
名称:运算符的优先级
2、 练习目标
- 掌握运算符之间的优先级
3、 需求分析
当使用不同的运算符进行运算时,应该按照一定的顺序进行运算,即根据运算符的优先级进行运算。
4、 设计思路(实现原理)
1) 编写一个类Example03
2) 在main方法中定义两个int型变量x和y
3) 将表达式3>2*x?x++:--x赋值给y
4) 用输出语句分别输出变量x和y的值
二、实验实现
定义Example03类:
package cn.itcast.Example03;
public class Example03 {
public static void main(String[] args) {
int x=1,y;
y=3>2*x?x++:--x;
System.out.println("x="+x+" "+"y="+y);
}
}
运行结果截图为图1-3:
图1-3 运行结果
三、实验总结
1、本实验中表达式的运算过程如下所示:
1) 在表达式y=3>2*x?x++:--x;中赋值运算符=的优先级最低,所以要先运算=右侧的表达式;
2) ?:为三元运算符,该运算符的优先级较低,要先运算?前面的表达式。
3) *的优先级比>的高,所以3>2*1为true。按照三元运算符的运算规则表达式等价于y=x++
4) x++的++在后面,所以要先进行其它运算再自增,最后结果为x=2,y=1
2、下表列举了Java中运算符的优先级,数字越小优先级越高。
优先级 |
运算符 |
1 |
. [] () |
2 |
++ -- ~ ! (数据类型) |
3 |
* / % |
4 |
+ - |
5 |
<< >> >>> |
6 |
< > <= >= |
7 |
== != |
8 |
& |
9 |
^ |
10 |
| |
11 |
&& |
12 |
|| |
13 |
?: |
14 |
= *= /= %= += -= <<= >>= >>>= &= ^= |= |
3、其实没有必要去刻意记忆运算符的优先级。由于运算符“()”的优先级最高,编写程序时,尽量使用括号“()”来实现想要的运算顺序,以免产生歧义。
实验1-4 if条件语句
一、实验描述
1、 考核知识点
名称:if条件语句
2、 练习目标
- 掌握if条件语句的语法格式
- 了解if条件语句的执行流程
3、 需求分析
if…else if…else语句用于对多个条件进行判断,进行多种不同的处理。本实验使用if…else if…else语句实现判断某月是哪个季节的功能。
设计思路(实现原理)
1)编写一个类Example04
2)定义一个变量month用于存储月份。
3)用if条件语句,判断这个月份在哪一个季节并输出结果,如:春季是3、4、5月,夏季是6、7、8月,秋季是9、10、11月,冬季是12、1、2月
4)由于一年只有12个月,所以要过滤除1-12以外的月份值
二、实验实现
定义Example04类:
package cn.itcast.Example04;
public class Example04 {
public static void main(String[] args) {
int month=5;
if(month<1||month>12)
System.out.println("月份输入不合理!");
else
{
if (month==3||month==4||month==5)
System.out.println(month+"月是春季");
else if (month==6||month==7||month==8)
System.out.println(month+"月是夏季");
else if (month==9||month==10||month==11)
System.out.println(month+"月是秋季");
else if (month==12||month==1||month==2)
System.out.println(month+"月是冬季");
}
}
}
运行结果截图为图1-4:
图1-4 运行结果
三、实验总结
1、f…else if…else语句用于对多个条件进行判断,进行多种不同的处理。if…else if…else语句具体语法格式如下:
if (判断条件1) {
执行语句1
} else if (判断条件2) {
执行语句2
}
...
else if (判断条件n) {
执行语句n
} else {
执行语句n+1
}
if…else if…else语句的执行流程如图1-5所示。
图1-5 流程图
2、因为一年只有12个月,所以当month>12时是不符合逻辑的数据,这时会打印“没有这个月份”。在编程过程中,经常要考虑程序在实际环境下是否符合逻辑需求。
3、“||”表示或操作,当运算符两边的操作数任何一边的值为true时,其结果为true,当两边的值都为false时,其结果才为false。所以只要符合三个条件中的一个就会被判断为这个季节。
实验1-5 switch条件语句
一、实验描述
1、 考核知识点
名称:switch条件语句
2、 练习目标
- 熟悉switch条件语句的语法格式
- 了解switch条件语句的特点
3、 需求分析
switch 条件语句也是一种很常用的选择语句,和if条件语句不同,它只能针对某个表达式的值作出判断,从而决定程序执行哪一段代码。本实验使用switch 条件语句实现判断选择题对错的功能。
4、 设计思路(实现原理)
1)编写一个类Example05
2)定义一个变量answer用于存储答案选项
3)用switch条件语句判断如果变量answer为B则正确,其它则错误
4)如果变量answer不等于ABCD四个选择则打印“不存在此选项”
二、实验实现
定义Example05类:
package cn.imust.Example05;
public class Example05 {
/**
* @param args
*/
public static void main(String[] args) {
char answer='C';
switch(answer)
{
case 'A':
System.out.println("A答案错误");
break;
case 'B':
System.out.println("B答案正确");
break;
case 'C':
System.out.println("C答案错误");
break;
case 'D':
System.out.println("D答案错误");
break;
default:
System.out.println("不存在此选项");
}
}
}
运行结果截图为图1-6:
图1-6 运行结果
三、实验总结
1、switch语句的执行流程是:根据表达式的值查找与其匹配的项,如果有匹配项,则执行该匹配项下面的语句。如果没有匹配项,就会执行default后面的语句。
2、switch关键字后括号内的表达式可以是byte,short,int,char四种类型;在JDK5以后表达式可以是枚举;在.JDK7以后表达式可以是字符串。
3、switch语句只适合判断若干值的情况,不适合判断范围。
4、if和switch都可以判断值的情况,这时应该使用switch语句,因为switch的效率比if语句高。
实验1-6 while循环语句
一、实验描述
1、 考核知识点
名称:while循环语句
2、 练习目标
- 掌握while循环语句的语法格式和使用
- 了解while循环语句的特点
3、 需求分析
while语句会反复地进行条件判断,只要条件成立,{}内的执行语句就会执行,直到条件不成立,while循环才会结束。本实验使用while语句实现统计1-10以内奇数的功能。
4、 设计思路(实现原理)
1)编写一个类Example06
2)定义一个变量x为1,用while语句循环条件为x<=10
3)在while循环中,使用表达式x%2判断是否为奇数,如果为奇数,则变量count的值加1。
二、实验实现
package cn.imust.Example06;
public class Example06 {
public static void main(String[] args) {
int x=1,count=0;
while(x<=10)
{
if(x%2!=0)
count++;
x++;
}
System.out.println("10以内奇数有"+count+"个");
}
}
运行结果截图为图1-7:
图1-7 运行结果
三、实验总结
1、while循环语句和条件判断语句有些相似,都是根据条件判断来决定是否执行大括号内的执行语句。区别在于,while语句会反复地进行条件判断,只要条件成立,{}内的执行语句就会执行,直到条件不成立,while循环结束。
2、while循环的执行流程如图1-8所示。
图1-8 流程图
实验1-7 for循环语句
一、实验描述
1、 考核知识点
名称:for循环语句
2、 练习目标
- 掌握for循环语句的语法格式和使用
- 了解for循环语句的特点
3、 需求分析
for循环语句是最常用的循环语句,一般用在循环次数已知的情况下。本实验使用for循环语句计算1+2+3+4+5...+100表达式的结果
4、 设计思路(实现原理)
1)编写一个类Example07
2)在该类中定义一个变量sum来存储每次循环整数相加的和。
3)在for循环语句中定义变量x,循环条件为x<=100
二、实验实现
定义Example07类:
package Example07;
public class Example07 {
/**
* @param args
*/
public static void main(String[] args) {
int i,sum=0;
for(i=1;i<=100;i++){
sum+=i;
}
System.out.println("1~100相加为"+sum);
}
}
运行结果截图为图1-9:
图1-9
三、实验总结
1、在for循环中,for关键字后面()中包括了三部分内容:初始化表达式、循环条件和操作表达式,它们之间用“;”分隔,{}中的执行语句为循环体。
2、通过序号来具体分析for循环的执行流程。具体如下:
for(① ; ② ; ③){
④
}
第一步,执行①
第二步,执行②,如果判断结果为true,执行第三步,如果判断结果为false,执行第五步
第三步,执行④
第四步,执行③,然后重复执行第二步
第五步,退出循环
实验1-8 for循环嵌套
一、实验描述
1、 考核知识点
名称:循环嵌套
2、 练习目标
- 掌握循环嵌套的使用和执行顺序
3、 需求分析
在编程过程中,经常需要双重循环或多重循环,这就需要循环语句的嵌套。最常见的循环嵌套就是在for循环中嵌套for循环。为了让初学者熟悉for循环嵌套的使用,本实验将演示如何用for循环嵌套打印由“*”组成的直角三角形。具体要求如下:
l 第一个三角形为倒直角三角形,共5行,第一行5个 “*”,一行减少一个,第5行一个“*”
l 将倒直角三角形上下翻转为正直角三角形,第一行1一个“*”,第5行5个“*”
4、 设计思路(实现原理)
1) 分析第一个三角形的打印,外层for循环控制行数,初始化表达式从0开始,循环条件为小于5;第一行是5个“*”所以应该内层循环打印5次,初始化表达式从0开始,循环条件为小于5。同理,内层的循环初始化和条件如下所示:
0 1 2 3 4
1 2 3 4
2 3 4
3 4
4
由此可见内层循环的初始化表达式y 与外层的x是相等的,循环条件都是小于5。
2) 分析第二个三角形的打印,第一行1个“*”,第二行2个“*”...由此可见,内层循环的循环次数与行数是相等的,所以内层循环的y小于或等于外层的x。
二、实验实现
定义Example08类:
package Example08;
public class Example08 {
/**
* @param args
*/
public static void main(String[] args) {
int i,j;
for(i=5;i>0;i--)
{
for(j=i;j>0;j--)
System.out.print("*");
System.out.println();
}
//System.out.println();
for(i=1;i<=5;i++)
{
for(j=i;j>0;j--)
System.out.print("*");
System.out.println();
}
}
}
运行结果截图为图1-10:
1-9运行结果
三、实验总结
由于嵌套循环程序比较复杂,下面分步骤进行讲解,具体如下:
第一个三角形:
1、 当x=0时,y=0且y<5,循环5次,完成后返回到外层循环进行换行。
2、 当x=1时,y=1且y<5,循环4次,完成后返回到外层循环换行。
3、 当x=2时,y=2,循环3次,完成后返回到外层循环换行。
4、 当x=3时,y=3,循环2次,完成后返回到外层循环换行。
5、 当x=4时,y=4,循环1次,完成后返回到外层循环换行。由于x<5所以循环终止,打印结束。
第二个三角形:
1、 当x=0时,y=0且y<=0,循环1次,完成后返回到外层循环进行换行。
2、 当x=1时,y=0且y<=1,循环2次,完成后返回到外层循环进行换行。
3、 当x=2时,y=0且y<=2,循环3次,完成后返回到外层循环进行换行。
4、 当x=3时,y=0且y<=3,循环4次,完成后返回到外层循环进行换行。
5、 当x=4时,y=0且y<=4,循环5次,完成后返回到外层循环进行换行。由于x<5所以循环终止,打印结束。
实验1-9 方法的定义
一、实验描述
1、 考核知识点
名称:方法的定义
2、 练习目标
- 掌握方法的定义
3、 需求分析
为了减少重复代码编写的问题,Java中可以将具有相同功能的重复代码提取出来,封装成方法。本实验定义一个方法,该方法能够实现四则运算的功能。
4、 设计思路(实现原理)
1) 编写一个类Example09
2) 定义一个方法siZe,设置三个参数,两个数字为int型,一个符号为char型
3) 在方法中,用if选择语句根据传入的符号参数进行不同的运算
4) 如果传入的符号不包含在加减乘除四个符号中则输出“符号错误”
5) 在main方法中调用方法计算3*0的结果,测试方法是否成功运算出正确结果
二、实验实现
定义Example09类:
package cn.imust.Example010;
public class Example010 {
/**
* @param args
*/
int a=3,c=0;
char b='+';
static int sum;
static int setsize(int a,char b,int c)
{
if(b=='+')
sum=a+c;
else if(b=='-')
sum=a-c;
else if(b=='*')
sum=a*c;
else if(b=='/')
sum=a/c;
System.out.println(sum);
return 0;
}
public static void main(String[] args) {
int a=3,c=0;
char b='*';
if(b=='*'||b=='/'||b=='+'||b=='-')
setsize(a,b,c);
else
System.out.println("符号错误!");
//System.out.println(sum);
}
}
运行结果截图为图1-11:
图1-9 运行结果
三、实验总结
1、在Java中,声明一个方法的具体语法格式如下:
修饰符 返回值类型 方法名([参数类型 参数名1,参数类型 参数名2,......]){
// 执行语句
return 返回值;
}
2、需要特别注意的是,方法中的“参数类型 参数名1,参数类型 参数名2”被称作参数列表,它用于描述方法在被调用时需要接收的参数,如果方法不需要接收任何参数,则参数列表为空,即()内不写任何内容。方法的返回值必须为方法声明的返回值类型,如果方法中没有返回值,返回值类型要声明为void,此时,方法中return语句可以省略。
实验1-10 方法的重载
一、实验描述
1、 考核知识点
名称:方法的重载
2、 练习目标
- 了解重载的定义
- 掌握方法重载的用法
3、 需求分析
方法重载指的是方法名相同,参数类型或个数不同。本实验通过方法重载的方式实现九九乘法表的打印
4、 设计思路(实现原理)
1) 编写一个类Example10
2) 在Example10中定义一个带参数的方法print99,该参数用于指定乘法表打印的行数
3) 在Example10中定义一个方法print99,此方法没有参数。
4) 在main方法中分别调用无参方法print99()和有参方法print99(6),测试两个重载的方法print99能否成功打印出符合要求的乘法表。
二、实验实现
定义Example10类,代码如下所示:
package cn.imust.Example09;
class print99{
private int b;
public print99()
{
}
public print99(int B)
{
b=B;
}
void setchen()
{
int i,j;
for(i=1;i<=b;i++)
{
for(j=1;j<=i;j++)
{
System.out.print(j+"*"+i+"="+(i*j)+" ");
}
System.out.println();
}
}
}
//import java.util.Scanner;
public class Example09 {
/**
* @param args
*/
public static void main(String[] args) {
print99 p1=new print99();
print99 p2=new print99(6);
p2.setchen();
}
}
运行结果截图为图1-12:
图1-10 运行结果
三、实验总结
1、方法的重载是在一个程序中定义多个名称相同的方法,但是参数的类型或个数必须不同。
2、值得注意的是,方法的重载与返回值类型无关,它只有两个条件,一是方法名相同,二是参数个数或参数类型不相同。
实验1-11 一维数组的定义
一、实验描述
1、 考核知识点
名称:数组的定义
2、 练习目标
- 掌握一维数组的定义
3、 需求分析
数组是指一组数据的集合,数组中的每个数据被称作元素。在数组中可以存放任意类型的元素,但同一个数组里存放的元素类型必须一致。请定义一个数组,将序列{0,1,2,3,4}赋值给数组,并写一个方法用来访问数据的每一个元素。
4、 设计思路(实现原理)
1) 定义一个数组,在初始化数组时有一种方式叫做静态初始化,就是在定义数组的同时就为数组的每个元素赋值。可以在定义数组时将序列{0,1,2,3,4}赋值给数组。
2) 定义一个方法输出数组的元素,可以用for循环语句依次输出数组的元素,各元素用“,”间隔可以更清楚的输出元素。
3) 在最后一个元素输出时,后面就不需要加“,”了,所以循环到length-1时不打印“,”。
二、实验实现
定义Example11类:
package cn.imust.Example111;
public class Example11 {
static int a[]={0,1,2,3,4};
static void print()
{
int i;
System.out.print(a[0]);
for(i=1;i<5;i++)
{
System.out.print(","+a[i]);
}
}
/**
* @param args
*/
public static void main(String[] args) {
print();
}
}
运行结果截图为图1-13:
图1-11 运行结果
三、实验总结
1、每个数组的索引都有一个范围,即0~length-1。在访问数组的元素时,索引不能超出这个范围,否则程序会报数组越界异常ArrayIndexOutOfBoundsException。所谓异常指程序中出现的错误,它会报告出错的异常类型、出错的行号以及出错的原因。
2、在使用变量引用一个数组时,变量必须指向一个有效的数组对象,如果该变量的值为null,则意味着没有指向任何数组,此时通过该变量访问数组的元素会出现空指针异常NullPointerException。
实验1-12 数组最值
一、实验描述
1、 考核知识点
名称:数组的常见操作-数组的最值
2、 练习目标
- 掌握如何获取一维数组的最值
3、 需求分析
在操作数组时,经常需要获取数组中元素的最值。定义一个数组,并获取该数组中值最小的元素。
4、 设计思路(实现原理)
1) 定义一个数组。
2) 定义一个方法,用来获取最小值。该方法应返回一个int型的数值,参数为数组类型。在方法中,定义一个临时变量min,用于记住数组的最小值。首先假设数组中第一个元素arr[0]为最小值,然后使用for循环对数组进行遍历,在遍历的过程中只要遇到比min值还小的元素,就将该元素赋值给min。这样一来,变量min就能够在循环结束时记住数组中的最小值。
3) 在main方法中调用该方法,将定义的数组作为参数传给方法,获取该数组的最小值。
二、实验实现
定义Example12类:
package cn.imust.Example12;
public class Example12 {
public static int setmix(int []a)
{
int mix=a[0];
for(int i=1;i<a.length;i++){
if(a[i]<mix)
mix=a[i];
}
return mix;
}
/**
* @param args
*/
public static void main(String[] args) {
int [] a={1,9,7,0,2,5};
int mix=setmix(a);
System.out.print("最小值是"+mix);
}
}
运行结果截图为图1-14:
图1-12 运行结果
三、实验总结
getMin()方法用于求数组中的最小值,该方法中定义了一个临时变量min,用于记住数组的最小值。需要注意的是,在for循环中的变量i是从1开始的,这样写的原因是程序已经假设第一个元素为最小值,for循环中只需要从第二个元素开始比较,从而提高程序的运行效率。
实验1-13 数组排序
一、实验描述
1、 考核知识点
名称:数组的常见操作-数组的排序
2、 练习目标
- 掌握一维数组中元素的排序
3、 需求分析
在操作数组时,经常需要对数组中元素进行排序。常用的排序算法有选择排序,冒泡排序等。请定义一个数组,用选择排序算法将数组中的元素进行从小到大的排序。
4、 设计思路(实现原理)
选择排序法的原理是:首先找到数组中的最值,将最小值(最大值)的下标与第一个元素
的下标交换,再在剩下的元素中找最小值(最大值)的下标与第二个元素的下标交换,以此类推,完成所有元素的排序。
对数组元素进行选择排序的设计思路是:
1) 定义排序方法,在方法中,用for循环嵌套实现排序。第一层循环是从数组的第一个元
素开始循环。第二层循环用于与第一层循环中的元素比较找出最值,并将最小值的下标跟第一个元素的下标进行互换。
2) 为了方便观察排序结果,输出排序前和排序后的数组元素。
二、实验实现
定义Example13类:
package cn.imust.Example13;
public class Example13 {
static void setpx(int []a){
int i,j,temp;
for(i=0;i<4;i++)
for(j=i+1;j<5;j++)
if(a[i]>a[j])
{
temp=a[j];
a[j]=a[i];
a[i]=temp;
}
//System.out.print(" "+a[j]);
System.out.println("排序后的数组:");
for(int k=0;k<5;k++)
System.out.print(a[k]+" ");
}
/**
* @param args
*/
public static void main(String[] args) {
int []a={1,9,7,0,5};
System.out.println("排序前的数组:");
for(int k=0;k<5;k++)
System.out.print(a[k]+" ");
System.out.println();
setpx(a);
}
}
运行结果截图为图1-15:
图1-13 运行结果
三、实验总结
常用的排序算法除了选择排序外,还有冒泡排序。在冒泡排序的过程中,不断地比较数组中相邻的两个元素,较小者向上浮,较大者往下沉,整个过程和水中气泡上升的原理相似。
接下来通过几个步骤来具体分析一下冒泡排序的整个过程,具体如下:
1、 从第一个元素开始,将相邻的两个元素依次进行比较,直到最后两个元素完成比较。如果前一个
元素比后一个元素大,则交换它们的位置。整个过程完成后,数组中最后一个元素自然就是最大值,这样也就完成了第一轮比较。
2、 除了最后一个元素,将剩余的元素继续进行两两比较,过程与第一步相似,这样就可以将数组中
第二大的数放在了倒数第二个位置。
3、 以此类推,持续对越来越少的元素重复上面的步骤,直到没有任何一对元素需要比较为止。