一 . 第一次题目集。

7-1    本题只需导入Scanner类,定义两个float类型的变量身高和体重以接受控制台的输入,然后根据题目BIM=身高/体重的平方,用四个if句型对BIM的范围进行判断即可,题量少,难度较低。

java QueryWrapper 限制条数_字符串

 

 

 需要注意的是错误输入给出的输出 input out of range 需加上 return 以结束程序;BIM应为double型变量。

java QueryWrapper 限制条数_字符串_02

 

 

 

7-2    本题考察调用Scanner类接受控制台的输入和输出的格式,题量少,难度低。需要注意的是输出案例需要将double型变量转变成float型变量,可在输出语句框内的变量前加上 "(类型名) " 对变量进行强制类型转换。

java QueryWrapper 限制条数_构造方法_03

 

 

 

7-3   本题考查for循环的使用,创建一个数组,对数组元素值进行遍历。题量少,难度低。

方法一 :定义一个数组下标 

 

java QueryWrapper 限制条数_System_04

方法二 :用foreach循环遍历

java QueryWrapper 限制条数_System_05

 

 

 用foreach遍历数组较简便。

 

7-4   本题考查不同数据类型变量之间的计算,变量较多,很容易出错。

需要注意的是题目限制需用float输出,可在输出语句框内进行强制类型转换:

java QueryWrapper 限制条数_构造方法_06

 

 

 

7-5   本题考查switch语句的运用。题量较少,只需重复使用 if ... else if 语句即可。

需要注意的是错误输入 Wrong Fomat  需放入 default语句 中

 

 

java QueryWrapper 限制条数_构造方法_07

 

 

 

7-6   本题考查String类及String类中的 substring( ) 方法。

substring() 方法返回字符串的子字符串,语法为 :

public String substring(int beginIndex)  或  String substring(int beginIndex,int endIndex )其中 beginIdex为起始索引(包括),索引从0开始,endIndex为结束索引(不包括)。

创建一个String类的对象 s ,s接受控制台输入后,可用

 

java QueryWrapper 限制条数_字符串_08

分别接受第一第二字符,第三第四字符....

 

 

 

7-7   本题为经典题目判断三角形类型。输入三条边后,可用

java QueryWrapper 限制条数_字符串_09

 将三条边a,b,c设置为依次增大。

 

 

 需要注意的是&、||、!的使用:

java QueryWrapper 限制条数_System_10

 

以及错误输入后需要加上 "return" 退出程序:

java QueryWrapper 限制条数_字符串_11

 

 

 

7-8   本题介绍了用巴比伦求平方根的近似值。公式为 nextGuess = ( lastGuess + n / lastGuess ) / 2 ,程序初始运行时lastGuess可赋予一个最初的猜测值。当由公式求得的nextGuess和lastGuess相差较大时,把nextGuess的值赋给lastGuess,继续以上过程,直至nextGuess和lastGuess几乎相同,此时lastGuess或者nextGuess就是平方根的近似值。要求 nextGuess 和 lastGuess 的差值小于0.00001时认为两者几乎相同。由此可用while循环将题目要求用作表达式:

java QueryWrapper 限制条数_字符串_12

 

 

 要注意题目要求当 nextGuess 和 lastGuess 相差较大时,把 nextGuess 的值赋给 lastGuess,则while循环体需这样写:

 

java QueryWrapper 限制条数_System_13

 

 

 结束循环后输出lastGuess即可。

 

7-9   本题考查String类及String类中的 charAt( ) 方法。

charAt( ) 方法用于返回指定索引处的字符。索引范围为从 0 到 length() - 1 ,语法为:

public char charAt (int index)  index为字符的索引。 返回值是指定索引处的一个字符。

为了判断字符串的一个字符可将charAt ( ) 放入 for 循环中,循环次数为length ( )次。

java QueryWrapper 限制条数_构造方法_14

 

 

 

二 . 第二次题目集

7-1   菜单计价程序 -1

题目给出一份菜单包含菜名和单价,设计点菜计价程序,根据输入的订单,计算并输出总价格。订单由一条或多条点菜记录组成,每条记录一行,最后以"end"结束。

由此首先画出类图:

java QueryWrapper 限制条数_字符串_15

 

 

 

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();

}

 

运行情况:

java QueryWrapper 限制条数_字符串_16

 

 顾客输入不存在菜品时:

java QueryWrapper 限制条数_System_17

 

 

 

BUG情况:

java QueryWrapper 限制条数_System_18

 

 错误原因为:数组越界。

因为创建一个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时,又可以将这个方格划分为小方格,递归下去,最终得到总路径数。

java QueryWrapper 限制条数_System_19

 

 

用函数实现:

java QueryWrapper 限制条数_System_20

 

 

三 . 第三次题目集 

7-2   字符串中重复数据的判断:考查哈希表的运用,和String类中 split( ) 方法的运用

HashSet(哈希表)是基于HashMap的一个不允许有重复元素的集合,但其中允许存在null值。

调用String类中的 split( ) 方法 先对从控制台得到的字符串去除空格:

java QueryWrapper 限制条数_System_21

 

split() 方法根据匹配给定的正则表达式来拆分字符串。语法: public String [ ]  split ( String regex,int  limit ) , regex为正则表达式分隔符,limit为分割的份数。

然后将字符串存入哈希表中:

java QueryWrapper 限制条数_字符串_22

 

判断哈希表set的大小就能判断出是否存在重复字符。

 

7-3   去除重复的数据

用数组接受控制台输入的字符串,然后将字符串存入哈希表中:

java QueryWrapper 限制条数_System_23

 

 再将哈希表存入一个新的数组中最后输出即可。

 

java QueryWrapper 限制条数_System_24

 

 

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类中的方法非常实用。