一 . 第一次题目集。
7-1 本题只需导入Scanner类,定义两个float类型的变量身高和体重以接受控制台的输入,然后根据题目BIM=身高/体重的平方,用四个if句型对BIM的范围进行判断即可,题量少,难度较低。
需要注意的是错误输入给出的输出 input out of range 需加上 return 以结束程序;BIM应为double型变量。
7-2 本题考察调用Scanner类接受控制台的输入和输出的格式,题量少,难度低。需要注意的是输出案例需要将double型变量转变成float型变量,可在输出语句框内的变量前加上 "(类型名) " 对变量进行强制类型转换。
7-3 本题考查for循环的使用,创建一个数组,对数组元素值进行遍历。题量少,难度低。
方法一 :定义一个数组下标
方法二 :用foreach循环遍历
用foreach遍历数组较简便。
7-4 本题考查不同数据类型变量之间的计算,变量较多,很容易出错。
需要注意的是题目限制需用float输出,可在输出语句框内进行强制类型转换:
7-5 本题考查switch语句的运用。题量较少,只需重复使用 if ... else if 语句即可。
需要注意的是错误输入 Wrong Fomat 需放入 default语句 中
7-6 本题考查String类及String类中的 substring( ) 方法。
substring() 方法返回字符串的子字符串,语法为 :
public String substring(int beginIndex) 或 String substring(int beginIndex,int endIndex )其中 beginIdex为起始索引(包括),索引从0开始,endIndex为结束索引(不包括)。
创建一个String类的对象 s ,s接受控制台输入后,可用
分别接受第一第二字符,第三第四字符....
7-7 本题为经典题目判断三角形类型。输入三条边后,可用
将三条边a,b,c设置为依次增大。
需要注意的是&、||、!的使用:
以及错误输入后需要加上 "return" 退出程序:
7-8 本题介绍了用巴比伦求平方根的近似值。公式为 nextGuess = ( lastGuess + n / lastGuess ) / 2 ,程序初始运行时lastGuess可赋予一个最初的猜测值。当由公式求得的nextGuess和lastGuess相差较大时,把nextGuess的值赋给lastGuess,继续以上过程,直至nextGuess和lastGuess几乎相同,此时lastGuess或者nextGuess就是平方根的近似值。要求 nextGuess 和 lastGuess 的差值小于0.00001时认为两者几乎相同。由此可用while循环将题目要求用作表达式:
要注意题目要求当 nextGuess 和 lastGuess 相差较大时,把 nextGuess 的值赋给 lastGuess,则while循环体需这样写:
结束循环后输出lastGuess即可。
7-9 本题考查String类及String类中的 charAt( ) 方法。
charAt( ) 方法用于返回指定索引处的字符。索引范围为从 0 到 length() - 1 ,语法为:
public char charAt (int index) index为字符的索引。 返回值是指定索引处的一个字符。
为了判断字符串的一个字符可将charAt ( ) 放入 for 循环中,循环次数为length ( )次。
二 . 第二次题目集
7-1 菜单计价程序 -1
题目给出一份菜单包含菜名和单价,设计点菜计价程序,根据输入的订单,计算并输出总价格。订单由一条或多条点菜记录组成,每条记录一行,最后以"end"结束。
由此首先画出类图:
Dish(菜品)类包含 菜品的菜名name 和 菜品的价格price。
Menu(菜单)类包含一系列菜品信息,它们被存放在集合allDishs中。Menu类包含两个构造方法。
构造方法 "Menu(ArrayLisy<Dish> all)"用于商家自己将个菜品存放进菜单中;
showMenu( )方法用于向顾客展示菜单内容;
searchDish( )方法用于查找顾客所点的菜品,若不存在该菜品,则向顾客输出does not exist this dish的信息;
getPrice( )方法用于当顾客所点的菜品存在时,返回该菜品的单价。
Record(单条记录)类包含顾客所点的某道菜品的信息和顾客所点的份额。
无参构造方法Record( );
setRecord( ) 方法用于将顾客所点的一道菜的菜名及份额记入一条记录中;
getEachRecord( ) 方法用于计算顾客所点一道菜的价格,计算公式为:该菜品单价 * 份额;
Order(订单)类包含所有点菜记录,它们被存放在集合records中。
无参构造方法 Order( ) ;
setOnerecord(Record onerecord) 方法用于往定单中存入一条点菜记录;
getTotalprice( ) 方法用于计算顾客点的所有菜的总价。
商家将菜品信息 (菜品名 及 单价 ) 存入菜单的语句:
String[] AllDishs_names = new String[] {"番茄炒蛋","酸辣土豆丝","红烧牛蛙","油淋生菜","虫草花排骨汤"}; //设置菜单
int[] AllDishs_price = new int[] {15,10,35,10,35}; //设置单价 , 在两个数组中菜品名及单价一 一对应
ArrayList<Dish> AllDishs = new ArrayList<Dish>();
for(int i = 0; i < AllDishs_names.length; i++) {
Dish dish_ = new Dish();
dish_.name = AllDishs_names[i];
dish_.price = AllDishs_price[i];
AllDishs.add(dish_); // 调用了ArrayList类中的add( ) 方法
}
主函数获取顾客输入菜品名及份额的语句:
Dish dish = new Dish( );
dish.name = input.next(); //用户输入菜名
while(true) {
if(dish.name.equals("end")) {
System.out.println("总价为: " + order.getTotalprice());
break;
}
else {
if(menu.searchDish(dish.name) == 1) {
portion = input.nextInt(); //用户输入份额
dish.price = menu.getPrice(dish.name);
record.setRecord(dish, portion);
order.setOnerecord(record);
}
else if(menu.searchDish(dish.name) == 0) {
System.out.println("菜单里没有" + "“" + dish.name + "”" + ",请继续输入。"); // 当菜单不存在菜品时输出
}
}
dish.name = input. Next();
}
运行情况:
顾客输入不存在菜品时:
BUG情况:
错误原因为:数组越界。
因为创建一个ArrayList列表arr后为空时,arr便没有所谓的 arr.get(0) 这个元素,而空表示不存在,也即数组越界了。
解决方案就是先调用ArrayLisy类中的add.( )方法,往arr列表里面添加数据。
源码:
package 点菜程序;
import java.util.Scanner;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
String[] AllDishs_names = new String[] {"番茄炒蛋","酸辣土豆丝","红烧牛蛙","油淋生菜","虫草花排骨汤"}; //设置菜单
int[] AllDishs_price = new int[] {15,10,35,10,35}; //设置单价
ArrayList<Dish> AllDishs = new ArrayList<Dish>();
for(int i = 0; i < AllDishs_names.length; i++) {
Dish dish_ = new Dish();
dish_.name = AllDishs_names[i];
dish_.price = AllDishs_price[i];
AllDishs.add(dish_);
}
//设置菜品信息(包含菜名及其单价)
Scanner input = new Scanner(System.in);
Dish dish = new Dish();
Menu menu = new Menu(AllDishs); //将菜品信息放入菜单中
System.out.println("菜名及单价:");
menu.showMenu();
System.out.println("请输入菜名和份额:");
Record record = new Record();
Order order = new Order();
int portion = 0; //份额
dish.name = input.next(); //用户输入菜名
while(true) {
if(dish.name.equals("end")) {
System.out.println("总价为: " + order.getTotalprice());
break;
}
else {
if(menu.searchDish(dish.name) == 1) {
portion = input.nextInt();
dish.price = menu.getPrice(dish.name);
record.setRecord(dish, portion);
order.setOnerecord(record);
}
else if(menu.searchDish(dish.name) == 0) {
System.out.println("菜单里没有" + "“" + dish.name + "”" + ",请继续输入。");
}
}
dish.name = input.next();
}
}
}
class Dish{ //一道菜类
String name;
int price = 0;
}
class Menu{ //菜单类
ArrayList<Dish> alldishs = new ArrayList<Dish>();
Menu(ArrayList<Dish> all){ //构造方法(带参构造)
alldishs = all;
}
void showMenu(){ //展示菜单界面
for(int i = 0; i < alldishs.size();i++) {
System.out.print(alldishs.get(i).name + " ");
System.out.println(alldishs.get(i).price);
}
}
int searchDish(String name) { //在菜单查找菜品
for(Dish adish : alldishs) {
if(adish.name.equals(name))
return 1;
}
return 0;
}
int getPrice(String name) {
for(Dish d : alldishs) {
if(d.name.equals(name))
return d.price;
}
return 0;
}
}
class Record{ //记录类
Dish ADish = new Dish(); //记录菜名
int num; //记录份额
void setRecord(Dish oneDish, int n) { //写一条记录
this.ADish = oneDish;
this.num = n;
}
int getEachprice() { //得到一条记录的价格
int Eachprice = 0;
if(this.num == 1) Eachprice = (int)Math.round(this.ADish.price);
if(this.num == 2) Eachprice = (int)Math.round(this.ADish.price * 1.5);
if(this.num == 3) Eachprice = (int)Math.round(this.ADish.price * 2);
return Eachprice;
}
}
class Order{ //订单类
ArrayList<Record> records = new ArrayList<Record>();
void setOnerecord(Record oneRecord){ //将一条记录放入订单
records.add(oneRecord);
}
int getTotalprice() { //得到总价
int sum = 0;
for(int i = 0; i < this.records.size(); i++) {
sum += this.records.get(i).getEachprice();
}
return sum;
}
}
7-4 本题考查利用算法解决数学问题:从A点到B点有n个格子,小明现在要从A点到B点,小明吃了些东西,补充了一下体力,他可以一步迈一个格子,也可以一步迈两个格子,也可以一步迈3个格子,也可以一步迈4个格子。请编写程序计算小明从A点到B点一共有多少种走法。
解题思路:由题意分析得知,当n=1,m>=1或者n>=1,m=1时,其走方格的总路径数为n+m,当n>1,m>1时,又可以将这个方格划分为小方格,递归下去,最终得到总路径数。
用函数实现:
三 . 第三次题目集
7-2 字符串中重复数据的判断:考查哈希表的运用,和String类中 split( ) 方法的运用
HashSet(哈希表)是基于HashMap的一个不允许有重复元素的集合,但其中允许存在null值。
调用String类中的 split( ) 方法 先对从控制台得到的字符串去除空格:
split() 方法根据匹配给定的正则表达式来拆分字符串。语法: public String [ ] split ( String regex,int limit ) , regex为正则表达式分隔符,limit为分割的份数。
然后将字符串存入哈希表中:
判断哈希表set的大小就能判断出是否存在重复字符。
7-3 去除重复的数据
用数组接受控制台输入的字符串,然后将字符串存入哈希表中:
再将哈希表存入一个新的数组中最后输出即可。
7-4 面向对象编程(封装性)
根据主函数定义Student类中应该拥有的属性:
String sid;
String name;
int age;
String major; 无参构造方法:
Main(){
} 带参构造方法:
Main(String sid_, String name_, int age_, String major_){
this.sid = sid_;
this.name = name_;
if(age_ > 0) this.age = age_;
this.major = major_;
}相应的set方法:
void setSid(String sid_){
this.sid = sid_;
}
void setName(String name_){
this.name = name_;
}
void setAge(int age_){
if(age_ > 0) this.age = age_;
}
void setMajor(String major_){
this.major = major_;
}相应的get方法:
String getSid(){
return sid;
}
String getName(){
return name;
}
int getAge(){
return age;
}
String getMajor(){
return major;
}控制台打印的方法:
void print(){
System.out.println("学号: " + sid + ", 姓名: " + name + ", 年龄:" + age + ", 专业: " + major);
}
}
三次题目集的综合性总结:
熟练掌握Scanner类的控制台输入输出函数,体会面向对象的思想:分工与和合作,体验面向对象的特性:封装性。
String类中的方法非常实用。