目录
- 一、基础问答15题
- 二、编程基础30题
-
- 1、【回文数】
- 2、【键盘录入-switch-求星期】
- 3、【if多分支-求成绩】
- 4、【水仙花数】
- 5、【求素数】
- 6、【嵌套for循环-杨辉三角形】
- 7、【嵌套for循环-九九乘法表】
- 8、【求完数】
- 9、【求不重复数字】
- 10、【根据输入求输出-求位数、逆序输出】
- 11、【数列的前n项和】
- 12、【累加】
- 13、【累乘】
- 14、【求最大值】
- 15、【根据条件求数-加100/268是完全平方】
- 16、【求奇数/偶数和】
- 17、【自由落体】
- 18、【被几个9整除】
- 19、【判断奇偶数】
- 20、【分解质因数】
- 21、【三个数由小到大排序】
- 22、【交换值】
- 23、【求自守数】
- 24、【循环练习-买饮料】
- 25、【循环练习-蜗牛爬井】
- 26、【键盘录入-求各位数之和】
- 27、【求和-去除7倍数和包含7】
- 28、【分数累加】
- 29、【switch练习-某月天数】
- 30、【三目运算符-点餐优惠方式】
- 三、扩展5题
一、基础问答15题
1、【基本概念问答】
请问Java语言是跨平台的吗?JVM是跨平台的吗?为什么?
答:
Java语言是跨平台的,JVM是不跨平台的。
Java能跨平台正是以JVM不跨平台为代价的。
Java的跨平台性由JVM实现,即JVM用于保证java的跨平台的特性。
原理分析:
JVM是在机器和编译程序之间加入的一层抽象的虚拟机器,
这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口。
编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由 解释器 来将虚拟机代码转换为特定系统的机器码执行。
在Java中,这种供虚拟机理解的代码叫做字节码(即Java源代码经过虚拟机编译器编译后产生的文件,扩展为.class的文件),它不面向任何特定的处理器,只面向虚拟机,使Java程序无须重新编译便可在多种不同的计算机上运行。
每一种平台的解释器是不同的,但是实现的虚拟机是相同的。
Java源代码---->编译器---->jvm可执行的Java字节码(即虚拟指令)---->jvm(字节码由虚拟机解释执行)---->jvm中解释器(虚拟机将每一条要执行的字节码送给解释器)----->机器可执行的二进制机器码---->程序运行。
2、【环境变量配置问答】
为什么要配置Java环境变量?
不配置环境变量可不可以命令行编译执行Java代码?
请尝试配置环境变量,达到在命令行(cmd)窗口输入qq 命令就能启动qq的效果。(效果截图)
答:
(1)path环境变量的配置:
path是配置Windows可执行文件的搜索路径,即扩展名为.exe的程序文件所在的目录,
用于指定DOS窗口命令的路径。
告诉操作系统到哪里去找javac可执行程序配置。
① 永久配置方式:
JAVA_HOME=%安装路径%\Java\jdk
path=%JAVA_HOME%\bin
② 临时配置方式:
set path=路径;
(2)classpath的配置:
classpath是配置class文件所在的目录,用于指定类搜索路径,JVM就是通过它来寻找该类的class类文件的。
给jvm用,告诉jvm到哪里加载字节码文件配置。
如果没有定义环境变量classpath,java启动jvm后,会在当前目录下查找要运行的类文件;
如果指定了classpath,那么会在指定的目录下查找要运行的类文件。(3)配置环境变量,达到在命令行(cmd)窗口输入wechat 命令就能启动 微信 的效果。:
注:因为 qq 启动 涉及到账号 和 密码位数,故将 启动qq,改成启动 微信。两者操作 完全一样。
① 设置 Path 环境变量之前:
② 设置 Path 环境变量之后
在Path变量中添加wechat启动程序的路径,即可以在任意目录下,通过命令行执行。
3、【命令行编程】
新建一个Java文件, 然后手写Hello World程序。
(要求记事本完成,该题目提交 Helloworld程序的代码及命令行cmd运行截图即可)
答:
4、【进制转换】
将67转换为二进制、八进制、十六进制。
再将0b0100101(二进制)、0345(八进制)、0Xef(十六进制) 转换为十进制。
注:该题无需写代码,在纸上手算一下过程,拍照附在文档中提交作业。
答:
(1)相应知识点:
十进制数:在数字的右下角标注10或D。默认是十进制。
二进制数:在数字的右下角标注2或B。
Java语言中0b开头。
八进制数:在数字的右下角标注8或字母O。
Java语言中数字0开头。
十六进制:在数字的右下角标注16或H。
Java语言中0X开头。
进制之间的转换:
① 二进制 --> 十进制
将二进制数写成按权展开式,并将式中各乘积项的积相加,即得对应十进制数。
② 十进制 --> 二进制 / 八进制等
分为整数部分转换和小数部分转换
在十进制的小数部分转换中,有时连续乘以2不一定能使小数部分等于0,这说明该十进制小数不能用有限位二进制小数表示。这时,只要取足够多的位数,使其误差达到所要求的精度就可以了。
示例:十进制转换成二进制
③ 二进制 --> 八进制
④ 八进制 --> 二进制
⑤ 二进制 --> 十六进制
⑥ 十六进制 --> 二进制
(2)67转换为二进制、八进制、十六进制。
① (67)10 转换成二进制
67 / 2 = 33 (a0 = 1) 最低整数位
33 / 2 = 16 (a1 = 1)
16 / 2 = 8 (a2 = 0)
8 / 2 = 4 (a3 = 0)
4 / 2 = 2 (a4 = 0)
2 / 2 = 1 (a5 = 0)
1 / 2 = 0 (a6 = 1) 最高整数位
故 (67)10 = (1000011)2
② (67)10 转换成八进制
67 / 8 = 8 (a0 = 3) 最低整数位
8 / 8 = 1 (a1 = 0)
1 / 2 = 0 (a2 = 1) 最高整数位
故 (67)10 = (103)O
③ (67)10 转换成十六进制
67 / 16 = 4 (a0 = 3) 最低整数位
4 / 16 = 0 (a1 = 4) 最高整数位
故 (67)10 = (43)H(3)将0b0100101(二进制)、0345(八进制)、0Xef(十六进制) 转换为十进制。
(0100101)B = 0 × 26 + 1 × 25 + 0 × 24 + 0 × 23 + 1 × 22 + 0 × 21 + 1 × 20 = (37)B
(0345)O = 0 × 83 + 3 × 82 + 4 × 81 + 5 × 80 = (229)B
(ef)H = 14 × 161 + 15 × 160 = (239)B
5、【原码补码反码】
对于一个8位原码,01101010和11000110, 求它们的补码。
已知补码01101010和11000110,求它们的原码。(要求如题4)
注:进制和原码等概念属于计算机编程基础知识,建议了解并熟悉它。
答:
(1)相应知识点:
正数的原码 = 补码
负数原码 --> 补码:符号位不变,其余位取反,末位 + 1。
补码的补码(补码求补)= 补码对应的原码。
(2)练习
正数原码 01101010 = 补码
负数原码 11000110 补码是 10111010 (符号位不变,其余位取反,末位 + 1)
正数补码 01101010 = 原码
负数补码 11000110 原码是 10111010 (符号位不变,其余位取反,末位 + 1)
6、【数据类型转换】
语句 byte b = 300; 编译能通过吗?
如果不能为什么呢?怎样让它通过编译呢?
(作为简答题说明一下即可)
答:
1)编译结果如下:
编译不通过。
2)编译不通过的原因如下:
①相应知识点
精度从高到低 double float long int short(char) byte
自动类型转换(隐式转换):低精度–>高精度
boolean 类型的值不能直接转化为其它数据类型的值。
short、char、byte相互之间不转换,他们参与运算会首先转换为 int 类型。
强制类型转换(显示转换): 高精度–>低精度(精度会下降)
②具体原因:
byte的表示范围是 -128~127,300超出byte表示范围,故无法完成赋值。
3)通过编译的解决方法:
进行强制类型转换
byte b = (byte)300; // 此时,输出的b为44
或者将变量b定义成int类型,或者将byte类型的b变量的赋值,改为 -128~127内的一个数。
7、【算术运算符】
以int a = 0; 语句为前提, a = a + 0.1; 和a += 0.1; 两条语句都能正常运行吗?两者有什么区别?
(仍作为简答题回答)
答:
a+=b 和 a=a+b 的区别:
① a += b执行过程:先计算出a的值,然后用一个temp对象存储,之后和b进行相加,然后将值赋值给a引用。
+= 如果两边的操作数的精度不一样时会自动向低转化。
② a = a+b 执行过程:先计算 a + b,然后再赋值给a引用,给a引用的时候如果 引用a 有计算过程,则会再次计算。
a = a+b则不会自动转化,需要手动进行强制类型转化。
练习:
int a = 0; a = a + 0.1;(x)与 int a = 0; a += 0.1;(√)
对于 int a = 0; a = a + 0.1;由于 0.1 是 double 类型,因此 a + 0.1 运算结果也是 double 型,需要强制转换类型才能赋值给 int 型。
而 int a = 0; a += 0.1; 可以正确编译,因为 a += 0.1; 相当于 a = (int(a + 0.1);其中有隐含的强制类型转换。
8、【浮点数】
float a = 0.1F; 和double b = 0.1;
这两条语句定义的浮点数a和b,请问它们相等嘛?为什么?
答:不相等。
float 是32位的单精度,double 是64位的双精度。
浮点数都是近似值,位数越多,表示的就越精确。
9、【位运算符】
给出任意一个int 类型的正整数,如何快速判断该整数的值,是否是2的整数次幂?
(简答题,考虑位运算符)
public class Test {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("请输入一个数:");
int num = input.nextInt();
/*
//输入的数用二进制来表示,若只有1个1,其余位全部为0,则是 2 的整数次幂,反之,则不是。
//比如 8 = 1000 ,8&7 为 1000 & 0111 = 0000 ,是 2 的整数次幂。
//与 二进制的 满2进1 有关
if ((int)(num & (num - 1) )== 0)
System.out.print("您输入的数是2的整数次幂");
else
System.out.print("您输入的数不是2的整数次幂");
*/
//不采用位运算
boolean flag = true;
while (num != 1)
if (num % 2 != 0) {
flag = false;
System.out.print("您输入的数不是2的整数次幂");
break;
}
else
num /= 2;
if (flag)
System.out.print("您输入的数是2的整数次幂");
input.close();
}
}
运行结果:
10、【表达式】
对于一个变量a,给出一个表达式a + “hello” ,结果的数据类型是什么?
答:
(1) “+” 运算符:
① 可表示加法运算;
② 可表示正数;
③ 可表示字符串拼接;
操作数1 + 操作数2 + … 在多个操作数中,只要有一个是字符串,"+“操作执行的就是字符串拼接。
举例:
System.out.println(“hello” + ‘a’ + 1); // helloa1
System.out.println(‘a’ + 1 + “hello”); // 98hello (‘a’的ascii码是97)
System.out.println(“5+5=”+5+5); //5+5=55
System.out.println(5+5+”=5+5"); //10=5+5
(2)练习答案:
对于一个变量a,给出一个表达式a + “hello” ,结果的数据类型是 字符串类型,输出的是变量a的值和hello组成的字符串。
11、【读程序题】
读下列代码,指出输出结果以及原因。
int a = 10;
int b;
System.out.println(b = a + 10);
答:
输出结果是 20
b = a + 10;表示将a + 10 的结果赋值给b,于是b的结果是20 ,这个表达式的值是赋值后b的值。
12、【标识符命令规范】
分析以下标识符的字符串组成,哪些是符合语法的标识符,哪些不合法?
请在这道题下面附上符合语法的标识符命名规范。
1) 1myName ×
2.)你好% ×
3.)My_name √
4.)Points √
5.)$point √
6.)_sys_ta √
7) OK123 √
8)_23b# ×
9)_3_ √
10)main √
11)class ×
答:
标识符的命名规则:
由字母、数字、下划线“_”、美元符号“$”或者“¥”组成,首字符不能是数字。
大小写敏感。
不能是关键字。
13、【标识符命令规范】
标识符的命名除了语法要求外,更重要的是符合约定俗成的规范。
下列标识符的字符串组成,都是符合语法要求的,请问哪些是符合约定俗成命名规范的?哪些不符合?
请在这道题下面附上符合约定俗成规范的Java标识符命名规范。(根据不同语法结构给出)
类名:
1)demo ×
2)test ×
3) Student √
4) Student_ ×
5) program1 ×
6) MYDemo ×
7) myDemo ×
8) XueSheng √
变量名:
9)age √
10) nianLing √
11)myName √
12)_name ×
13)Variable ×
包名:
14)com.baidu √
15)Com.Baidu ×
16)bao.ceshi ×
注:标识符命名规范相当重要。
答:
命名规则:
(1)包:
包类似于操作系统中以文件夹的形式组织文件。
在JAVA语言中,以包来组织JAVA中的类,不同包下可以包含同名的类名。
为了包名的唯一,通常以域名反转的方式来命名包,例:com.baidu.www。
多级包: 以域名(是唯一的)反转的方式来命名包,单词全部小写。
单极包: 一个全部小写的单词。如 test
(2)类和接口:
单个:首字母大写,其余字母全部小写。如 Student
多个单词:多个单词的首字母均大写,其余字母全部小写 。如:JavaBasic 、MaxAge
(3)变量和方法:
单个:所有字母小写。 如:value
多个单词:第一个单词首字母小写,从第二个开始,每个单词首字母大写。 如:intValue
(4)常量:
所有单词字母都大写。如MAX
多个单词:单词之间用_来分割,如MAX_AGE
具体的Java开发规范文档:阿里巴巴Java开发手册(嵩山版)
14、【注释】
注释的作用是什么?
注释会对程序的运行产生影响嘛?
注释的内容会存在于Java代码编译执行的哪一部分?
答:
(1)知识点
- 单行注释
格式:// 注释文字
- 多行注释
格式:/* 注释文字 */
- 文档注释
格式:/** 注释文字 */
可用来生成网页格式的帮助文档。
多行和文档注释都不能嵌套使用。
(2)练习答案
① 注释的作用:对程序语言进行说明,有助于开发者和用户之间的交流,方便理解程序。
② 注释会对程序的运行产生影响嘛?
注释不是编程语句,因此被编译器忽略。不会对程序的运行产生影响。
③ 注释的内容会存在于Java代码编译执行的哪一部分?
注释只存在于.java文件中,编译的时候会将注释全部自动删除。
如果通过反编译工具由.class得到的.java文件是没有注释内容的。
15、【键盘输入】
如果我想在Java程序中进行键盘输入,提升程序的扩展性。
需要按几个步骤进行?请写出步骤。
答:
① 创建 扫描器 对象,获取用户的输入
② 读取数据,读取数据的方法见下面的详细知识点
③ 关闭
下面以int型数组为例:
public static void main(String[] args) {
//Scanner类用于获取键盘输入,是一个基于正则表达式的文本扫描器
//创建 扫描器 对象,获取用户的输入
//System.in输入、System.out输出
Scanner input = new Scanner(System.in);
System.out.println("输入数据:");
int n = input.nextInt();
int[] arr = new int[n];
//int等基本数据类型的数组,读取用nextInt()
for(int i=0; i<n; i++) {
arr[i] = input.nextInt();
}
//输出arr数组
System.out.println(Arrays.toString(arr));
//使用I/O流的类,若不关闭会一直占用资源。用完要及时关闭。
input.close();
}
详细知识点:
hasNextXxx()
:判断下一个输入是否是某种类型的元素
如:hasNextInt(),hasNextFloat()、hasNextDouble()等
hasNest()
:判断下一个输入是否是字符串
nextXxx()
:用于获取下一个输入项
如:nextInt、nextFloat、nextDouble等
next()
:用于读取String字符串数组,以空格划分(只读取输入直到空格),在读取后将光标指向本行
nextLine()
:用于读取String字符串数组,读取包括单词之间的空格和除回车以外的所有符号,在读取后将光标指向下一行
小技巧:
既要读取普通数据,又要读取nextLine(读取一行字符串):使用两个Scanner对象
举例如下:
public class Test {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
Scanner strInput = new Scanner(System.in);
int i = input.nextInt();
boolean b = input.nextBoolean();
String s = strInput.nextLine();
System.out.println(i);
System.out.println(b);
System.out.println(s);
}
}
运行结果:
二、编程基础30题
1、【回文数】
打印5位数中的所有回文数,每行打印10个数。最后统计一下一共有多少个5位回文数。
注:回文数即正反读都是一个数,5位数的话,只要个位与万位相同,十位与千位相同就是一个回文数。
public class JavaBasic01 {
public static void main(String[] args) {
/*
//打印所有的5位回文数 ≠ 判断一个数是否是回文数
int count = 0;
//Dig_1表示个位数字,Dig_2表示十位数字,Dig_3表示百位数字
for (int Dig_1 = 1;Dig_1 < 10;Dig_1 ++)
for (int Dig_2 = 0;Dig_2 < 10;Dig_2 ++)
for (int Dig_3 = 0;Dig_3 < 10;Dig_3 ++){
System.out.print(Dig_1 + "" + Dig_2 + "" + Dig_3 + "" + Dig_2 + "" +Dig_1 + " ");
count ++;
if (count % 10 == 0)
System.out.println();
}
System.out.print("5位回文数的个数是:" + count + "个");
*/
//另外给出 判断输入的数是否是回文数的算法
Scanner input = new Scanner(System.in);
System.out.print("请输入需要判断的数(位数不限):");
int n = input.nextInt();
boolean flag = true;
//或者采用num%10、num/10的循环方式,将其存入int型数组
String s = Integer.toString(n); //将输入的正整数转换成字符串
char arr[] = s.toCharArray(); //将字符串存入字符数组
for (int i = 0;i < arr.length / 2 ; i ++)
if (arr[i] != arr[arr.length - i - 1]) {
//数组中从左向右数第i个数对应从左向右数第arr.length - i - 1个数(从右向左为第i个数)
flag = false;
System.out.print("您输入的数不是回文数!");
break;
}
if (flag)
System.out.print("您输入的数是回文数!");
input.close();
}
}
运行结果:
1)输出所有的5位回文数
中间部分省略
2)判断是否是回文数
2、【键盘录入-switch-求星期】
根据键盘录入的数值1、2、3、4,…7输出对应的星期一、星期二、星期三…星期日。
(考虑使用switch)
public class JavaBasic02 {
public static void main(String[] args) {
System.out.print("请输入星期一、星期二、星期三、星期四。。。代表的数字:");
Scanner input = new Scanner(System.in);
int num = input.nextInt();
switch (num){
case 1:
System.out.print("星期一");
break;
case 2:
System.out.print("星期二");
break;
case 3:
System.out.print("星期三");
break;
case 4:
System.out.print("星期四");
break;
case 5:
System.out.print("星期五");
break;
case 6:
System.out.print("星期六");
break;
case 7:
System.out.print("星期七");
break;
default:
System.out.print("您输入的数字有误!");
}
input.close();
}
}
运行结果:
3、【if多分支-求成绩】
键盘录入一个学生成绩(用int表示),自动输出该同学的成绩评级。
学生的分数取值范围[0,100]
分数大于等于90的,评级"优秀";
分数大于等于80,小于90的,评级"良好";
分数大于等于70,小于80的,评级"中等";
分数大于等于60,小于70的,评级"及格";
分数小于60的,评级"不及格";
public class JavaBasic03 {
public static void main(String[] args) {
System.out.print("请输入该学生的成绩:");
Scanner input = new Scanner(System.in);
double score = input.nextDouble();
/*
//采用 if多分支方法求求解
if(score < 60)
System.out.print("该同学的成绩评级为:不及格");
else if (score < 70)
System.out.print("该同学的成绩评级为:及格");
else if (score < 80)
System.out.print("该同学的成绩评级为:中等");
else if (score < 90)
System.out.print("该同学的成绩评级为:良好");
else if (score <= 100)
System.out.print("该同学的成绩评级为:优秀");
else
System.out.print("您输入的学生成绩有误!");
*/
//采用switch来做
switch ((int) (score / 10)) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
System.out.print("该同学的成绩评级为:不及格");
break;
case 6:
System.out.print("该同学的成绩评级为:及格");
break;
case 7:
System.out.print("该同学的成绩评级为:中等");
break;
case 8:
System.out.print("该同学的成绩评级为:良好");
break;
case 9:
System.out.print("该同学的成绩评级为:优秀");
break;
default:
if (score == 100) //只有100是优秀,101则是输入错误,故不可以用case 10来判断
System.out.print("该同学的成绩评级为:优秀");
else
System.out.print("您输入的学生成绩有误!");
}
input.close();
}
}
运行结果:
4、【水仙花数】
请打印出所有的水仙花数。
注:所谓的"水仙花数"是指一个三位数,其各位数字的立方和等于该数本身。例如153是一个"水仙花数",因为153 = 1的三次方 + 5的三次方 + 3的三次方。(使用for循环遍历一下就出来了)
public class JavaBasic04 {
public static void main(String[] args) {
//打印所有的三位水仙花数 ≠ 判断一个数是否是水仙花数
//与 JavaBasic01 打印所有的五位回文数相类似
for (int Dig_1 = 0;Dig_1 < 10;Dig_1 ++)
for (int Dig_2 = 0 ;Dig_2 <10 ;Dig_2 ++)
for (int Dig_3 = 1 ;Dig_3 <10 ;Dig_3 ++)
if (Math.