仅为总结作业所用 

第一次作业

7-1 身体质量指数(BMI)测算

体重是反映和衡量一个人健康状况的重要标志之一,过胖和过瘦都不利于健康,BMI(身体质量指数)计算方法:体重(以千克为单位)除以身高(以米为单位)的平方。中国成人正常的BMI应在18.5-24之间,如果小于18.5为体重不足,如果大于等于24为超重,大于等于28为肥胖。请编写程序,测算身体状态。

输入格式:

两个数值:体重(以千克为单位),身高(以米为单位),数值间以空格分隔。例如:65.5 1.75。
注意:体重的世界纪录是727公斤,身高的世界纪录是2.72米。输入数据上限不得超过纪录,下限不得小于等于0;

输出格式:

输入数值超出范围 :输出“input out of range”。例如:-2 3或者125 5。
BMI小于18.5 :输出“thin”。
BMI大于等于18.5小于24 :输出“fit”。
BMI大于等于24小于28 :输出“overweight”。
BMII大于等于28 :输出“fat”。

输入样例0:

在这里给出一组输入。例如:

-2  8

输出样例0:

在这里给出相应的输出。例如:

input out of range

输入样例1:

在这里给出一组输入。例如:

70 1.75

输出样例1:

在这里给出相应的输出。例如:

fit

程序源码:

//package PTA1;
import java.util.Scanner;
public class Main/*pta1*/ {
  public static void main(String[]args){
    Scanner input = new Scanner(System.in);
    double weight = input.nextDouble();
    double height = input.nextDouble();
    if(weight>0&&weight<=727&&height>0&&height<=2.72){
      double BMI =weight/(height*height);
      if(BMI<18.5)
        System.out.println("thin");
      if(BMI>=18.5&&BMI<24)
        System.out.println("fit");
      if(BMI>=24&&BMI<28)
        System.out.println("overweight");
      if(BMI>=28)
        System.out.println("fat");
    }
    else
      System.out.println("input out of range");
  }
}

总结:此题为java的入门题目,练习到了java的输入与输出,由于比较简单就用了面向过程的方法,没有创建类。如果是按照java来的话,应该创建一个“人”类,里面包含的属性为weight和height。将下面的if语句当作类里面的一个方法更为合理。

7-2 长度质量计量单位换算

长度、质量的计量有多重不同的计算体系,有标准的国际单位制:千克与米,也有各个国家自己的计量方法如:磅、英寸;1磅等于0.45359237千克,1英寸等于0.0254米,请编写程序实现国际单位制与英制之间的换算。

输入格式:

两个浮点数,以空格分隔,第一个是质量(以千克为单位)、第二个是长度(以米为单位)。例如:0.45359237 0.0254。

输出格式:

两个浮点数,以空格分隔,第一个是质量(以磅为单位)、第二个是长度(以英寸为单位)。例如:1.0 1.0。

输入样例:

在这里给出一组输入。例如:

0.45359237 0.0254

输出样例:

在这里给出相应的输出。例如:1.0 1.0

程序源码:

//package PTA1;
import java.util.Scanner;
public class Main/*pta2*/ {
  public static void main(String[]args){
    Scanner input = new Scanner(System.in);
    double quality = input.nextDouble();
    double length = input.nextDouble();
    if(quality>=0&&length>=0){
    quality = quality/0.45359237;
    length = length/0.0254;
    }
    System.out.println((float)quality +" "+(float)length);
  }
}

总结:此题练习了浮点数的应用,总体来说和c语言的语法类似。此题依然没有用到类,如果要创建一个类的话,应该创建一个国际单位的类,类里面包含质量与长度。

7-3 NCHU_奇数求和

计算一个数列中所有奇数的和。

输入格式:

十个整数,以空格分隔。例如:1 2 3 4 5 6 7 8 9 0。

输出格式:

输入数列中所有奇数之和。例如:25。

输入样例:

在这里给出一组输入。例如:

1 2 3 4 5 6 7 8 9 0

输出样例:

在这里给出相应的输出。例如:25

程序源码:

//package PTA1;
import java.util.Scanner;
public class Main/*pta3*/ {
  public static void main(String[]args){
    Scanner input = new Scanner(System.in);
    int sum = 0;
    for(int i=1;i<=10;i++){
    int num = input.nextInt();
    if(num%2==1||num%2==-1)
      sum+=num;
    }
    System.out.println(sum);
   }
}

总结:此题为求一组数据中奇数的和,学习到了字符串的输入。

7-4 NCHU_房产税费计算

房屋交易在日常生活中非常常见的事情,房屋交易时要额外支付各种税费,按2022年房产交易新政策的规定买房人应缴纳税费包括:

1、契税:首次购房评估额90平(含)内1%、90平-144平(含)内1.5%,超过144平或非首 次3%,买方缴纳。

2、印花税:房款的0.05%。

3、交易费:3元/平方米。

4、测绘费:1.36元/平方米。

5、权属登记费及取证费:一般情况是在200元内。

输入格式:

四个数据,以空格分隔:
1、第几次购房(整数)
2、房款(整数/单位万元)
3、评估价(整数/单位万元)
4、房屋面积(浮点数/单位平方米)。
例如:1 100 100 90。

输出格式:

契税、印花税、交易费、测绘费(以元为单位),以空格分隔。例如:10000.0 500.0 270.0 122.4

输入样例:

在这里给出一组输入。例如:

1 100 100 90

输出样例:

在这里给出相应的输出。例如:

10000.0 500.0 270.0 122.4

程序源码:

//package PTA1;
import java.util.Scanner;
public class Main/*pta4*/ {
public static void main(String[]args){
Scanner input = new Scanner(System.in);
double tax;
int times = input.nextInt();
int House_payment = 10000*input.nextInt();
int Evaluation_price = 10000*input.nextInt();
double Housing_area = input.nextDouble();
if(times == 1){
if(Housing_area<=90)
tax = Evaluation_price * 0.01;
else if(Housing_area<=144)
tax = Evaluation_price * 0.015;
else
tax = Evaluation_price * 0.03;
}
else
tax = Evaluation_price * 0.03;
double stamp_duty = House_payment * 0.0005;
double Transaction_fee = Housing_area * 3;
double draw_fees = Housing_area * 1.36;
System.out.println((float) tax+" "+(float) stamp_duty+" "+(float) Transaction_fee+" "+(float) draw_fees);
}
}

总结:此题练习了if else的语句以及强制转换类型。

7-5 游戏角色选择

一款网游中包括4个种族:人类、精灵、兽人、暗精灵,每个种族包含三种角色:战士、法师、射手。玩家新建人物时需要选择种族和角色。请编写角色选择程序。

输入格式:

两个整数:游戏种族、角色的选项,以空格分隔。例如:1 2。
种族选项设定为:1、人类 2、精灵 3、兽人 4、暗精灵
角色选项设定为:1、战士 2、法师 3、射手

输出格式:

所选择的种族、角色的名称,以空格分隔。例如:人类 法师
若输入数值超出选项范围,输出“Wrong Format”

输入样例1:

在这里给出一组输入。例如:

1 2

输出样例1:

在这里给出相应的输出。例如:

人类 法师

输入样例2:

在这里给出一组输入。例如:

1 6

输出样例2:

在这里给出相应的输出。例如:

Wrong Format

程序源码:

//package PTA1;
import java.util.Scanner;
public class Main/*pta5*/ {
public static void main(String[]args) {
Scanner input = new Scanner(System.in);
int choose1 = input.nextInt();//种族的选择
int choose2 = input.nextInt();//角色的选择
String race, role;
switch (choose1) {
case 1: {
race = "人类";
break;
}
case 2: {
race = "精灵";
break;
}
case 3: {
race = "兽人";
break;
}
case 4: {
race = "暗精灵";
break;
}
default: {
System.out.println("Wrong Format");
return;
}
}
switch (choose2) {
case 1: {
role = "战士";
break;
}
case 2: {
role = "法师";
break;
}
case 3: {
role = "射手";
break;
}
default: {
System.out.println("Wrong Format");
return;
}
}
System.out.print(race+" "+role);
}
}

总结:此题练习了switch case语句,如果用类的话,应该会简单,刚学java的时候,思想没有转变过来导致编程的时候总是面向过程编程。

7-6 NCHU_学号识别

学校的学号由8位数字组成,前两位是入学年份(省略了20);第3、4位是学院编号,01代表材料学院,02代表机械学院,03代表外语学院,20代表软件学院;第5、6位是学院内部班级编号,最后两位是班级内部学号。如:18011103,入学年份是2018年,材料学院,11班,03号

输入格式:

8位数字组成的学号。例如:18011103
注意:输入学号不是8位或者学院编号不是01、02、03、20其中之一,属于非法输入

输出格式:

学号每一项的完整说明。例如:
入学年份:2018年
学院:材料学院
班级:11
学号:03

注意:如非法输入,输出“Wrong Format"

输入样例:

在这里给出一组输入。例如:

18011103

输出样例:

在这里给出相应的输出。例如:

入学年份:2018年
学院:材料学院
班级:11
学号:03

输入样例1:

在这里给出一组输入。例如:

18013

输出样例1:

在这里给出相应的输出。例如:Wrong Format

程序源码:

//package PTA1;
import java.util.Scanner;
public class Main/*pta6*/ {
public static void main(String[]args){
Scanner input = new Scanner(System.in);
String StudentID = input.next();
String grade, college, class1, code,xue_yuan;
if(StudentID.length()!=8){
System.out.println("Wrong Format");
return ;
}
grade = StudentID.substring(0,2);
college = StudentID.substring(2,4);
class1 = StudentID.substring(4,6);
code = StudentID.substring(6,8);
if(college.equals("01") )
xue_yuan = "材料学院";
else if(college.equals("02"))
xue_yuan = "机械学院";
else if(college.equals("03"))
xue_yuan = "外语学院";
else if(college.equals("20"))
xue_yuan = "软件学院";
else{
System.out.println("Wrong Format");
return;
}
System.out.printf("入学年份:20"+grade+"年\n"+"学院:"+xue_yuan+"\n"+"班级:"+class1+"\n"+"学号:"+code);

}
}

总结:此题练习了字符串的一些基本操作。

7-8 NCHU_巴比伦法求平方根近似值

巴比伦法求n的近似值可以用以下公式:

nextGuess = (lastGuess+n/lastGuess)/2
程序初始运行时lastGuess可赋予一个最初的猜测值。当由公式求得的nextGuess和lastGuess相差较大时,把nextGuess的值赋给lastGuess,继续以上过程,直至nextGuess和lastGuess几乎相同,此时lastGuess或者nextGuess就是平方根的近似值。
本题要求:nextGuess和lastGuess的差值小于0.00001时认为两者几乎相同

输入格式:

1、两个浮点数,以空格分隔,第一个是n,第二个是lastGuess最初的猜测值。例如:2 1。
2、若输入的两个数中包含负数或者lastGuess初始输入为0,认定为非法输入

输出格式:

1、输出n的平方根近似值:lastGuess。例如:1.4142157
2、非法输入时输出:"Wrong Format"

输入样例:

在这里给出一组输入。例如:

2 1

输出样例:

在这里给出相应的输出。例如:

1.4142157

输入样例1:

在这里给出一组输入1。例如:

2 -1

输出样例:

在这里给出相应的输出。例如:

Wrong Format

 程序源码:

//package PTA1;
import java.util.Scanner;
public class Main/*pta7*/ {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
float n = input.nextFloat();
float lastGuess = input.nextFloat();
float nextGuess;
if (n > 0 && lastGuess > 0) {
nextGuess = (lastGuess + n / lastGuess) / 2;
while ((nextGuess-lastGuess)>=0.00001||(nextGuess-lastGuess)<=-0.00001) {
lastGuess = nextGuess;
nextGuess = (lastGuess + n / lastGuess) / 2;
}
System.out.println(lastGuess);
} else
System.out.println("Wrong Format");
}
}

总结:此题比较常规。

7-9 二进制数值提取

在一个字符串中提取出其中的二进制数值序列,。

输入格式:

一个由0、1构成的序列,以-1为结束符,非0、1字符视为正常输入,但忽略不计,未包含结束符的序列视为非法输入。例如:abc00aj014421-1

输出格式:

将输入的序列去掉非0、1字符以及结尾符的数据内容,
注:结束符-1之后的0\1字符忽略不计。
例如:00011。

输入样例:

在这里给出一组输入。例如:

abc00aj014421-1

输出样例:

在这里给出相应的输出。例如:

00011

输入样例1:

在这里给出一组输入。例如:

a0571-1k001y

输出样例1:

在这里给出相应的输出。例如:

01

程序源码:

//package PTA1;
import java.util.Scanner;
public class Main/*pta9*/ {
public static void main(String[]args){
Scanner input = new Scanner(System.in);
String sequence = input.nextLine();
String input1="";//创建一个用于接收的字符串

for(int i=0;i<sequence.length();i++){
if(sequence.charAt(i)=='0'||sequence.charAt(i)=='1'){//charAt()方法用于返回指定索引处的字符。
input1 += sequence.charAt(i);
}
else if(sequence.charAt(i)=='-'){
if(sequence.charAt(i+1)=='1'){
System.out.println(input1);//判断如果是-1字符串就输出input1。
return;
}
}

}
System.out.println("Wrong Format");//如果没有终止符,返回Wrong Format。
return;
}
}

总结:字符串的判断。

7-7 判断三角形类型

输入三角形三条边,判断该三角形为什么类型的三角形。

输入格式:

在一行中输入三角形的三条边的值(实型数),可以用一个或多个空格或回车分隔,其中三条边的取值范围均为[1,200]。

输出格式:

(1)如果输入数据非法,则输出“Wrong Format”;
(2)如果输入数据合法,但三条边不能构成三角形,则输出“Not a triangle”;
(3)如果输入数据合法且能够成等边三角形,则输出“Equilateral triangle”;
(3)如果输入数据合法且能够成等腰直角三角形,则输出“Isosceles right-angled triangle”;
(5)如果输入数据合法且能够成等腰三角形,则输出“Isosceles triangle”;
(6)如果输入数据合法且能够成直角三角形,则输出“Right-angled triangle”;
(7)如果输入数据合法且能够成一般三角形,则输出“General triangle”。

输入样例1:

在这里给出一组输入。例如:

50 50 50.0

输出样例1:

在这里给出相应的输出。例如:

Equilateral triangle

输入样例2:

在这里给出一组输入。例如:

60.2 60.2 80.56

输出样例2:

在这里给出相应的输出。例如:

Isosceles triangle

输入样例3:

在这里给出一组输入。例如:

0.5 20.5 80

输出样例3:

在这里给出相应的输出。例如:

Wrong Format

程序源码:

//package PTA1;
import java.util.Scanner;
public class Main/*pta8*/ {
public static void main(String[]args){
Scanner input = new Scanner(System.in);
double side1 = input.nextDouble();
double side2 = input.nextDouble();
double side3 = input.nextDouble();
if(side1<1||side2<1||side3<1||side1>200||side2>200||side3>200){
System.out.println("Wrong Format");
return;
}//数据不合法
else if(side1+side2<=side3||side1+side3<=side2||side3+side2<=side1){
System.out.println("Not a triangle");
return;
}//不能构成三角形
else if(side1==side2&&side1==side3&&side2==side3){
System.out.println("Equilateral triangle");
return;
}//等边三角形
else if(Math.abs(side1*side1+side2*side2-side3*side3)<0.00001||Math.abs(side1*side1+side3*side3-side2*side2)<0.00001||Math.abs(side3*side3+side2*side2-side1*side1)<0.00001){
if(side1==side2||side1==side3||side2==side3){
System.out.println("Isosceles right-angled triangle");
return;
}
System.out.println("Right-angled triangle");
return;
}//等腰直角三角形或直角三角形的判断
else if(side1==side2||side1==side3||side2==side3){
System.out.println("Isosceles triangle");
return;
}//等腰三角形
else{
System.out.println("General triangle");//普通三角形
return;
}
}
}

总结:没有用到类,以及判断语句过于复杂。应该在类里创建各种属性,将if语句写成函数,当作方法封装到类里。

 

第二次作业

7-1 成绩计算-1-类、数组的基本运用

创建学生类,包含

属性:学号(String)、姓名(String)、语文成绩(int)、数学成绩(int)、物理成绩(int)

方法:计算总分、计算平均分

输入5个学生的信息,将每个学生的信息封装在一个学生对象中。

按输入顺序依次输出5个学生的总分、平均分(精确到小数点后两位,舍去部分按四舍五入规则计入最后一位)。

浮点数保留小数的相关知识可参考:
https://blog.csdn.net/huaishuming/article/details/17752365

注意:未用学生类对象封装数据的,本题计0分

输入格式:

5个学生信息,每个学生信息格式:

学号+英文空格+姓名+英文空格+语文成绩+英文空格+数学成绩+英文空格+物理成绩
例如:
22201311 张琳 80 80 80

22201312 黄昊 66 82 81

22201313 李少辰 77 76 80

22201314 袁婷 62 79 90

22201315 朱哲一 74 98 94

输出格式:

5个学生信息,每个学生信息格式:

学号+英文空格+姓名+英文空格+总成绩+英文空格+平均分

例如:

22201311 张琳 240 80.00

22201312 黄昊 229 76.33

22201313 李少辰 233 77.67

22201314 袁婷 231 77.00

22201315 朱哲一 266 88.67

输入样例:

在这里给出一组输入。例如:

22201311 张琳 80 80 80
22201312 黄昊 66 82 81
22201313 李少辰 77 76 80
22201314 袁婷 62 79 90
22201315 朱哲一 74 98 94

输出样例:

在这里给出相应的输出。例如:

22201311 张琳 240 80.00
22201312 黄昊 229 76.33
22201313 李少辰 233 77.67
22201314 袁婷 231 77.00
22201315 朱哲一 266 88.67

程序源码:

import java.util.Scanner;
class Student{
String stuID ;
String sutName;
int chinese_score;
int math_score;
int physics_score;
int FinalScoring( int chinese_score,int math_score,int physics_score){
int final_score ;
final_score = chinese_score+math_score+physics_score;
return final_score;
}
double CalculateAverageScore(int final_score){

return final_score/3.0;
}
}
public class Main {
public static void main(String[]args){
Scanner input = new Scanner(System.in);
Student[] stu = new Student[5];
for(int i=0;i<5;i++){
Student stu1 = new Student();
stu1.stuID = input.next();
stu1.sutName = input.next();
stu1.chinese_score = input.nextInt();
stu1.math_score = input.nextInt();
stu1.physics_score = input.nextInt();
stu[i] = stu1;
}
for(int i=0;i<5;i++) {
int sum = stu[i].FinalScoring(stu[i].chinese_score, stu[i].math_score, stu[i].physics_score);
double average1 =stu[i].CalculateAverageScore(sum);
System.out.println(stu[i].stuID + " " + stu[i].sutName + " " + sum + " " + String.format("%.2f", average1));
}

}
}

总结:第一次尝试用类写java,过程非常简洁,将方法写到类的里面大大减少了主函数的长度。

7-2 成绩计算-2-关联类

创建成绩类,包含:

属性:平时成绩(int)、期末成绩(int)

方法:计算总成绩(计算规则:平时成绩*0.4+期末成绩*0.6,保留整数部分,小数部分直接丢弃)

创建学生类,包含:

属性:学号(String)、姓名(String)、语文成绩(成绩类)、数学成绩(成绩类)、物理成绩(成绩类)

方法:计算总分、计算平均分

输入3个学生的信息,将每个学生的信息封装在一个学生对象中。

按输入顺序依次输出3个学生的总分、平均分(精确到小数点后两位,舍去部分按四舍五入规则计入最后一位)。

浮点数保留小数的相关知识可参考:https://blog.csdn.net/huaishuming/article/details/17752365

注意:未用学生类对象封装数据的,本题计0分

输入格式:

依次输入3个学生的每门课成绩,每个学生成绩信息格式:

学号+英文空格+姓名+英文空格+课程名+英文空格+平时成绩+英文空格+期末成绩
注:3个学生的课程顺序可能会不一致

例如:
22201311 张琳 语文 70 80

22201311 张琳 数学 85 89

22201311 张琳 物理 75 83

22201312 黄昊 语文 66 78

22201312 黄昊 数学 76 82

22201312 黄昊 物理 83 82

22201313 李少辰 语文 86 76

22201313 李少辰 数学 78 76

22201313 李少辰 物理 87 76

输出格式:

3个学生信息,每个学生信息格式:

学号+英文空格+姓名+英文空格+总成绩+英文空格+平均分

例如:

22201311 张琳 242 80.67

22201312 黄昊 234 78.00

22201313 李少辰 236 78.67

输入样例:

在这里给出一组输入。例如:

22201311 张琳 语文 70 80
22201311 张琳 数学 85 89
22201311 张琳 物理 75 83
22201312 黄昊 语文 66 78
22201312 黄昊 数学 76 82
22201312 黄昊 物理 83 82
22201313 李少辰 语文 86 76
22201313 李少辰 数学 78 76
22201313 李少辰 物理 87 76

输出样例:

在这里给出相应的输出。例如:

22201311 张琳 242 76.67 84.00 80.67
22201312 黄昊 234 75.00 80.67 78.00
22201313 李少辰 236 83.67 76.00 78.67

程序源码:

import java.util.Scanner;

class Score{
int Usual_grades;//平时成绩
int Final_grades;//期末成绩
double FinalScoring( int Usual_grades,int Final_grades){
double final_score;
final_score = Usual_grades*0.4+Final_grades*0.6;
return Math.floor(final_score);
}
}

class Student{
String stuID;
String sutName;
Score Chinese_score = new Score();
Score Math_score = new Score();
Score Physics_score = new Score();

int Final( int chinese_score,int math_score,int physics_score){
int final_score ;
final_score = chinese_score+math_score+physics_score;
return final_score;
}
double CalculateAverageScore(int final_score){

return final_score/3.0;
}
}
public class Main {
public static void main(String[]args) {
Scanner input = new Scanner(System.in);
Student[] stu = new Student[3];
Student stu1 = new Student();
for (int j = 0; j < 3; j++) {

//stu[0] = stu1;
stu1.stuID = input.next();
stu1.sutName = input.next();
String xue_ke = input.next();
if (xue_ke.equals("语文")) {
stu1.Chinese_score.Usual_grades = input.nextInt();
stu1.Chinese_score.Final_grades = input.nextInt();
//stu[0] = stu1;
}
if (xue_ke.equals("数学")) {
stu1.Math_score.Usual_grades = input.nextInt();
stu1.Math_score.Final_grades = input.nextInt();
//stu[0] = stu1;
}
if (xue_ke.equals("物理")) {
stu1.Physics_score.Usual_grades = input.nextInt();
stu1.Physics_score.Final_grades = input.nextInt();
//stu[0] = stu1;
}
//
}stu[0] = stu1;
Student stu2 = new Student();
for (int j = 0; j < 3; j++) {

//stu[0] = stu1;
stu2.stuID = input.next();
stu2.sutName = input.next();
String xue_ke = input.next();
if (xue_ke.equals("语文")) {
stu2.Chinese_score.Usual_grades = input.nextInt();
stu2.Chinese_score.Final_grades = input.nextInt();
stu[1] = stu2;
}
if (xue_ke.equals("数学")) {
stu2.Math_score.Usual_grades = input.nextInt();
stu2.Math_score.Final_grades = input.nextInt();
stu[1] = stu2;
}
if (xue_ke.equals("物理")) {
stu2.Physics_score.Usual_grades = input.nextInt();
stu2.Physics_score.Final_grades = input.nextInt();
stu[1] = stu2;
}
//
}stu[1] = stu2;
Student stu3 = new Student();
for (int j = 0; j < 3; j++) {

//stu[0] = stu1;
stu3.stuID = input.next();
stu3.sutName = input.next();
String xue_ke = input.next();
if (xue_ke.equals("语文")) {
stu3.Chinese_score.Usual_grades = input.nextInt();
stu3.Chinese_score.Final_grades = input.nextInt();
stu[2] = stu3;
}
if (xue_ke.equals("数学")) {
stu3.Math_score.Usual_grades = input.nextInt();
stu3.Math_score.Final_grades = input.nextInt();
stu[2] = stu3;
}
if (xue_ke.equals("物理")) {
stu3.Physics_score.Usual_grades = input.nextInt();
stu3.Physics_score.Final_grades = input.nextInt();
stu[2] = stu3;
}
//
}stu[2] = stu3;
for(int i=0;i<3;i++){
System.out.println(stu[i].stuID+" "+stu[i].sutName+" "+(int)(stu[i].Chinese_score.FinalScoring(stu[i].Chinese_score.Usual_grades,stu[i].Chinese_score.Final_grades)+stu[i].Math_score.FinalScoring(stu[i].Math_score.Usual_grades,stu[i].Math_score.Final_grades)+stu[i].Physics_score.FinalScoring(stu[i].Physics_score.Usual_grades,stu[i].Physics_score.Final_grades))+" "+String.format("%.2f",(stu[i].Chinese_score.Usual_grades+stu[i].Math_score.Usual_grades+stu[i].Physics_score.Usual_grades)/3.0)+" "+String.format("%.2f",(stu[i].Chinese_score.Final_grades+stu[i].Math_score.Final_grades+stu[i].Physics_score.Final_grades)/3.0)+" "+String.format("%.2f", (stu[i].Chinese_score.FinalScoring(stu[i].Chinese_score.Usual_grades,stu[i].Chinese_score.Final_grades)+stu[i].Math_score.FinalScoring(stu[i].Math_score.Usual_grades,stu[i].Math_score.Final_grades)+stu[i].Physics_score.FinalScoring(stu[i].Physics_score.Usual_grades,stu[i].Physics_score.Final_grades))/3.0));
}
}
}

 总结:在上一题的基础上进行修改。

7-3 有重复的数据

在一大堆数据中找出重复的是一件经常要做的事情。现在,我们要处理许多整数,在这些整数中,可能存在重复的数据。

你要写一个程序来做这件事情,读入数据,检查是否有重复的数据。如果有,输出“YES”这三个字母;如果没有,则输出“NO”。

输入格式:

你的程序首先会读到一个正整数n,n[1,100000],然后是n个整数。

输出格式:

如果这些整数中存在重复的,就输出:

YES

否则,就输出:

NO

输入样例:

5
1 2 3 1 4

输出样例:

YES

程序源码:

//package PTA2;
//import java.util.Scanner;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;
class Input{
StringTokenizer token;
BufferedReader buffer;
public Input() {
buffer = new BufferedReader(new InputStreamReader(System.in));
}
boolean hasNext() {
while(token==null||!token.hasMoreElements())
{
try {
token = new StringTokenizer(buffer.readLine());
} catch (Exception e) {
return false;
}
}
return true;
}
String next() {
if(hasNext())
return token.nextToken();
return null;
}
int nextInt() {
return Integer.parseInt(next());
}
}
public class Main{
public static void main(String[]args){
Input in= new Input();
int n = in.nextInt();
Set<Integer> data = new HashSet<>();

for(int i=0;i<n;i++)
data.add(in.nextInt());
if(data.size()==n)
System.out.println("NO");
else
System.out.println("YES");
}
}

总结:此题用到了哈希表的知识,调用哈希表的相关函数可以达到此题的目的

7-4 去掉重复的数据

 

在一大堆数据中找出重复的是一件经常要做的事情。现在,我们要处理许多整数,在这些整数中,可能存在重复的数据。

你要写一个程序来做这件事情,读入数据,检查是否有重复的数据。如果有,去掉所有重复的数字。最后按照输入顺序输出没有重复数字的数据。所有重复的数字只保留第一次出现的那份。

输入格式:

你的程序首先会读到一个正整数 n,1≤n≤100000。
然后是 n 个整数,这些整数的范围是 [1, 100000]。

输出格式:

在一行中按照输入顺序输出去除重复之后的数据。每两个数据之间有一个空格,行首尾不得有多余空格。

输入样例:

5
1 2 2 1 4

输出样例:

1 2 4

程序源码:

//package PTA2;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int flag=0;
String xishou = input.nextLine();//少了这条语句会直接结束
String str = "";//赋初值为空
str += input.nextLine();//赋值

String[] arr = str.split(" ");//把str根据空格来分成数组
LinkedHashSet<String> list = new LinkedHashSet<String>();//创建一个链表
for (int i = 0; i < arr.length; i++) {
list.add(arr[i]);
}
for (String bianli : list) { //从list里遍历
if(flag==0)
{
System.out.print(bianli);
flag = 1;
}
else System.out.print(" "+bianli);
}
}
}

总结:注意吸收一个空格字符,否则程序会直接结束。创建一个链表来保存数据。最后没有得到满分=。=

7-5 面向对象编程(封装性)

Student类具体要求如下:

私有成员变量:学号(sid,String类型),姓名(name,String类型),年龄(age,int类型),专业(major,String类型) 。
提供无参构造和有参构造方法。(注意:有参构造方法中需要对年龄大小进行判定)
普通成员方法:print(),输出格式为“学号:6020203100,姓名:王宝强,年龄:21,专业:计算机科学与技术”。
普通成员方法:提供setXxx和getXxx方法。(注意:setAge()方法中需要对年龄进行判定)
注意:
年龄age不大于0,则不进行赋值。
print()中的“:”和“,”为均为中文冒号和逗号。

public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //调用无参构造方法,并通过setter方法进行设值
        String sid1 = sc.next();
        String name1 = sc.next();
        int age1 = sc.nextInt();
        String major1 = sc.next();
        Student student1 = new Student();
        student1.setSid(sid1);
        student1.setName(name1);
        student1.setAge(age1);
        student1.setMajor(major1);
        //调用有参构造方法
        String sid2 = sc.next();
        String name2 = sc.next();
        int age2 = sc.nextInt();
        String major2 = sc.next();
        Student student2 = new Student(sid2, name2, age2, major2);
        //对学生student1和学生student2进行输出
        student1.print();
        student2.print();
    }
}

/* 请在这里填写答案 */

输入格式:

输出格式:

学号:6020203110,姓名:王宝强,年龄:21,专业:计算机科学与技术
学号:6020203119,姓名:张三丰,年龄:23,专业:软件工程

输入样例:

在这里给出一组输入。例如:

6020203110 王宝强 21 计算机科学与技术
6020203119 张三丰 23 软件工程

输出样例:

在这里给出相应的输出。例如:

学号:6020203110,姓名:王宝强,年龄:21,专业:计算机科学与技术
学号:6020203119,姓名:张三丰,年龄:23,专业:软件工程

程序源码:

import java.util.Scanner;
class Student{
private String sid;
private String name;
private int age;
private String major;
Student(){

}
Student(String sid,String name,int age,String major){
if(age<=0){
return;
}
else{
this.sid = sid;
this.name = name;
this.major = major;
this.age = age;
}
}
public void setSid(String sid){
this.sid = sid;
}
public void setName(String name){
this.name = name;
}
public void setMajor(String major){
this.major = major;
}
public void setAge(int age) {
// 对年龄进行限制
if (age<=0) {
return;
} else {
this.age = age;
}
}
public void print(){
System.out.println("学号:"+this.sid+","+"姓名:"+this.name+","+"年龄:"+this.age+","+"专业:"+this.major);
}

}
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//调用无参构造方法,并通过setter方法进行设值
String sid1 = sc.next();
String name1 = sc.next();
int age1 = sc.nextInt();
String major1 = sc.next();
Student student1 = new Student();
student1.setSid(sid1);
student1.setName(name1);
student1.setAge(age1);
student1.setMajor(major1);
//调用有参构造方法
String sid2 = sc.next();
String name2 = sc.next();
int age2 = sc.nextInt();
String major2 = sc.next();
Student student2 = new Student(sid2, name2, age2, major2);
//对学生student1和学生student2进行输出
student1.print();
student2.print();
}
}

 总结:学习到了java里的封装,比如private,此方法可以让java的安全性提高。

7-6 GPS测绘中度分秒转换

在测绘中,获取经度和纬度信息的时候,可以是度分秒格式,也可以是小数点格式。例如一个北纬的纬度信息,30°41′52.37″ ,可以转换为 30.697881。

规则:
(1)度和分都是整数,秒可以含有小数。将用户输入的第一个整数,加上第二个整数除以60,再加上第三个浮点数除以3600,就是最终结果。

(2)在输出结果时,保留6位小数。

(3)题目假定用户输入的数据,一定是合法的数据。

输入格式:

三个数值,数之间用空格分开。

输出格式:

见输出样例。

输入样例:

两个整数后,跟上一个小数。数据之间用空格分开。三个数分别代表度、分、秒。

30 41 52.37

输出样例:

输出经纬度信息的小数点格式,保留6位小数。
注意等号的前后有且仅有一个空格,建议复制下面输出到你的代码中,再进行修改。

30°41′52.37″ = 30.697881

 程序源码:

//package PTA2;
import java.util.Scanner;

public class Main{
public static void main(String[]args){
Scanner input = new Scanner(System.in);
int du = input.nextInt();
int fen = input.nextInt();
double miao = input.nextDouble();
double result =du + fen/60.0 + miao/3600.0;
System.out.println(du+"°"+fen+"′"+miao+"″"+" "+"="+" "+String.format("%.6f",result));

}
}

总结:此题比较常规。

7-7 菜单计价程序-1

某饭店提供4种菜,每种菜品的基础价格如下:
西红柿炒蛋 15
清炒土豆丝 12
麻婆豆腐 12
油淋生菜 9

设计点菜计价程序,根据输入的订单,计算并输出总价格。
订单由一条或多条点菜记录组成,每条记录一行,最后以"end"结束
每条点菜记录包含:菜名、份额两个信息。
份额可选项包括:1、2、3,分别代表小、中、大份)

不同份额菜价的计算方法:
小份菜的价格=菜品的基础价格。
中份菜的价格=菜品的基础价格1.5。
小份菜的价格=菜品的基础价格
2。
如果计算出现小数,按四舍五入的规则进行处理。

参考以下类的模板进行设计:
菜品类:对应菜谱上一道菜的信息。
Dish {
String name;//菜品名称
int unit_price; //单价
int getPrice(int portion)//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份)
}

菜谱类:对应菜谱,包含饭店提供的所有菜的信息。
Menu {
Dish[] dishs ;//菜品数组,保存所有菜品信息
Dish searthDish(String dishName)//根据菜名在菜谱中查找菜品信息,返回Dish对象。
}

点菜记录类:保存订单上的一道菜品记录
Record {
Dish d;//菜品
int portion;//份额(1/2/3代表小/中/大份)
int getPrice()//计价,计算本条记录的价格
}

订单类:保存用户点的所有菜的信息。
Order {
Record[] records;//保存订单上每一道的记录
int getTotalPrice()//计算订单的总价
Record addARecord(String dishName,int portion)
//添加一条菜品信息到订单中。
}

输入格式:

每条点菜记录的格式:
菜名+空格(英文)+份额
注:份额可输入(1/2/3), 1代表小份,2代表中份,3代表大份。
最后一条记录以“end”结束。

输出格式:

订单上所有菜品的总价(整数数值),每份菜
如果订单中包含不能识别的菜名,则在总价之前输出“** does not exist”,**是不能识别的菜名

输入样例:

在这里给出一组输入。例如:

麻婆豆腐 2
西红柿炒蛋 3
end

输出样例:

在这里给出相应的输出。例如:

48

输入样例1:

订单中包含不存在的菜品记录。例如:

麻婆豆腐 2
炒脆肚 2
西红柿炒蛋 3
end

输出样例1:

在这里给出相应的输出。例如:

炒脆肚 does not exist
48

程序源码:

//package PTA2;
import java.util.Scanner;
import java.util.ArrayList;
import java.util.List;
class Menu {
private Dish[] dishs;//菜品数组,保存所有菜品信息

Menu(Dish[] dishs) {
this.dishs = dishs;
}

Dish searthDish(String dishName) {
for (Dish dish : dishs) {
if (dish.getName().equals(dishName)) {
return dish;
}
}
return null;
}
}

class Dish {
String name;//菜品名称
int unit_price; //单价

public String getName() {
return name;
}
public Dish(String name, int unit_price) {
this.name = name;
this.unit_price = unit_price;
}

//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份)
int getPrice(int portion)
{
float b[] = {1, 1.5f, 2};
return Math.round((unit_price * b[portion - 1]));
}
}

class Record {
Dish d;//菜品
int portion;//份额(1/2/3代表小/中/大份)

public Record(Dish d, int portion) {
this.d = d;
this.portion = portion;
}

//计价,计算本条记录的价格
int getPrice()
{
return d.getPrice(portion);
}
}

class Order {
//计算订单的总价
private List<Record> records = new ArrayList<>();//保存订单上每一道的记录

int getTotalPrice() {
int sum = 0;
for(Record record : records){
sum+=record.getPrice();
}
return sum;
}

//添加一条菜品信息到订单中。
Record addARecord(Dish dish, int portion) {
Record record = new Record(dish, portion);
records.add(record);
return record;
}

}

public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
Menu menu = new Menu(new Dish[]{
new Dish("西红柿炒蛋", 15),
new Dish("清炒土豆丝", 12),
new Dish("麻婆豆腐", 12),
new Dish("油淋生菜", 9)
});
Order order = new Order();
List<String> notFounds = new ArrayList<>();
while (input.hasNextLine()) {
String diancan = input.nextLine();
if (diancan.equals("end")) {
break;
}
String[] s = diancan.split(" ");
String dishname = s[0];
int portion = Integer.parseInt(s[1]);
Dish dish = menu.searthDish(dishname);
if (dish == null) {
notFounds.add(dishname);
} else {
order.addARecord(dish, portion);
}
}
for (String dishname : notFounds) {
System.out.println(dishname + " does not exist");
}
System.out.println(order.getTotalPrice());
}
}

总结:此题比较重要,是一个系列的题目,其中定义了四个类,分别对应菜单类,菜品类,订单类,总价类。菜单类的主要功能是给用户提供一个可视化的菜单方便用户的选择,菜品类是为了得到菜品的名字以及计算价格,订单类是为了保存用户每次的点餐,总价类就是把所有菜品的价格加到一起,主函数里用了两个表,一个来记录菜单中拥有的菜品,一个记录没有的菜品,方便后续的输出。

7-8 jmu-java-日期类的基本使用
  1. 给定一个日期,判定是否为合法日期。如果合法,判断该年是否闰年,该日期是当年第几天、当月第几天、当周第几天、。
  2. 给定起始日期与结束日期,判定日期是否合法且结束日期是否早于起始日期。如果均合法,输出结束日期与起始日期之间的相差的天数、月数、念书。

输入格式:

第一行输入一个日期字符串,格式为"YYYY-MM-dd"
第二行输入两个日期字符串,中间使用空格隔开。分别代表开始日期与结束日期。

输出格式:

如果第一行日期字符串非法,输出自定义的错误信息。
如果第一行日期有效,输出相关信息,如果是闰年要输出是闰年。
如果第二行两个日期,只要有一个无效。就输出相关错误信息。
如果第二行两个日期有效且结束日期不早于开始日期,输出相关信息。

输入样例1:

第一行日期非法、第二行有日期非法

2020-02-30
2020-02-30 2020-01-02

输出样例1:

2020-02-30无效!
2020-02-30或2020-01-02中有不合法的日期.

输入样例2:

均有效且合法

2021-02-28
2019-08-01 2020-01-02

输出样例2:

2021-02-28是当年第59天,当月第28天,当周第7天.
2020-01-02与2019-08-01之间相差154天,所在月份相差-7,所在年份相差1.

输入样例3:

日期均有效,但结束日期早于开始日期

2020-02-28
2020-02-02 2020-02-01

输出样例3:

2020-02-28是闰年.
2020-02-28是当年第59天,当月第28天,当周第5天.
2020-02-01早于2020-02-02,不合法!

程序源码:

//package first;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Year;
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;
import java.io.*;
/*class Time{
int year;
int month;
int day;
}*/
public class Main {
public static void main(String[] args)throws IOException {
//Scanner input = new Scanner(System.in);
BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
//Time time = new Time();
String line = buffer.readLine();
String line4 = buffer.readLine();
String[] arrs = line4.split(" ");
String line2="";
String line3="";
line2 +=arrs[0];
line3 += arrs[1];
if(geshi(line)==false){
System.out.println(line+"无效!");
}
else{
String[] arr = line.split("-");
int year = Integer.parseInt(arr[0]);
int month = Integer.parseInt(arr[1]);
int day = Integer.parseInt(arr[2]);
/*time.year = year;
time.month = month;
time.day = day;*/
if(geshi(line)&& geshi1(year, month, day)){

Calendar c = Calendar.getInstance();
//这里有bug必须减1
c.set(year, month-1, day); // 设置年月日,时分秒将默认采用当前值
int weekDay = c.get(Calendar.DAY_OF_WEEK);
int monthDay = c.get(Calendar.DAY_OF_MONTH);
int yearDay = c.get(Calendar.DAY_OF_YEAR);
if (weekDay == 1) {
weekDay = 7;
} else {
weekDay = weekDay - 1;
}
Year firstYear = Year.of(year);
if (firstYear.isLeap()){
System.out.println(line+"是闰年.");
}
System.out.println(line+"是当年第"+yearDay+"天" +",当月第"+monthDay+
"天,当周第"+weekDay+"天.");

}
else
System.out.println(line+"无效!");
}
/*Time time2 = new Time();
Time time3 = new Time();*/
if(geshi(line2)==false||geshi(line3)==false){
System.out.println(line2+"或"+line3+"中有不合法的日期.");
}
else{
String[] arr2 = line2.split("-");
String[] arr3 = line3.split("-");
int year2 = Integer.parseInt(arr2[0]);
int month2 = Integer.parseInt(arr2[1]);
int day2= Integer.parseInt(arr2[2]);

/* time2.year = year2;
time2.month = month2;
time2.day = day2;*/
int year3 = Integer.parseInt(arr3[0]);
int month3 = Integer.parseInt(arr3[1]);
int day3 = Integer.parseInt(arr3[2]);

/* time3.year = year3;
time3.month = month3;
time3.day = day3;*/
if(geshi(line2)&& geshi1(year2, month2, day2)&&geshi(line3)&&geshi1(year3, month3, day3)){
if((year2<year3)||((year2==year3)&&(month2<month3))||((year2==year3)&&(month2==month3)&&(day2<=day3))){
System.out.println(line3+"与"+line2+"之间相差"+(getCday(line2,line3))+"天,所在月份相差"+(month3-month2) +",所在年份相差"+(year3-year2)+".");
}
else
System.out.println(line3+"早于"+line2+",不合法!");
}
else
System.out.println(line2+"或"+line3+"中有不合法的日期.");
}

}
public static int getCday(String a,String b){
DateFormat dft = new SimpleDateFormat("yyyy-MM-dd");
try {
Date star = dft.parse(a);//开始时间
Date endDay=dft.parse(b);//结束时间
Date nextDay=star;
int i=0;
while(nextDay.before(endDay)){//当明天不在结束时间之前是终止循环
Calendar cld = Calendar.getInstance();
cld.setTime(star);
cld.add(Calendar.DATE, 1);
star = cld.getTime();
//获得下一天日期字符串
nextDay = star;
i++;
}
return i;
} catch (ParseException e) {
e.printStackTrace();
}
return 0;
}
public static boolean geshi(String s){
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
try{
Date date = formatter.parse(s);
return true;
}catch(Exception e){
return false;
}
}
public static boolean geshi1(int year,int month ,int day){
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12){
if(day<=0||day>31)
return false;
else
return true;
}
if(month==4||month==6||month==9||month==11){
if(day<=0||day>30)
return false;
else
return true;
}
if(month == 2){
if(judge_year(year)){
if(day<0||day>29)
return false;
else
return true;
}
else{
if(day<0||day>28)
return false;
else
return true;
}
}
return true;
}
public static boolean judge_year(int year){
if((year%4==0&&year%100!=0)||(year%400==0)){
return true;
}
return false;
}

}

总结:此题没有拿到满分,倒在了复杂度的上面,此题总体来说比较简单,如果用了Java日期类的函数的话,笔者用的if函数过于多,过于复杂,导致复杂度直线上升,让运行时间变得很长,超出了题目的要求限制。

第三次作业

7-4 判断两个日期的先后,计算间隔天数、周数

从键盘输入两个日期,格式如:2022-06-18。判断两个日期的先后,并输出它们之间间隔的天数、周数(不足一周按0计算)。

预备知识:通过查询Java API文档,了解Scanner类中nextLine()等方法、String类中split()等方法、Integer类中parseInt()等方法的用法,了解LocalDate类中of()、isAfter()、isBefore()、until()等方法的使用规则,了解ChronoUnit类中DAYS、WEEKS、MONTHS等单位的用法。

输入格式:

输入两行,每行输入一个日期,日期格式如:2022-06-18

输出格式:

第一行输出:第一个日期比第二个日期更早(晚)
第二行输出:两个日期间隔XX天
第三行输出:两个日期间隔XX周

输入样例1:

2000-02-18
2000-03-15

输出样例1:

第一个日期比第二个日期更早
两个日期间隔26天
两个日期间隔3周

输入样例2:

2022-6-18
2022-6-1

输出样例2:

第一个日期比第二个日期更晚
两个日期间隔17天
两个日期间隔2周

程序源码:

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class Main {
public static void main(String[]args){
Scanner input = new Scanner(System.in);
String line1 = input.nextLine();
String line2 = input.nextLine();
Integer i=line1.compareTo(line2);
if(i>0){
System.out.println("第一个日期比第二个日期更晚");
DateFormat dft = new SimpleDateFormat("yyyy-MM-dd");
try {
Date star = dft.parse(line2);//开始时间
Date endDay = dft.parse(line1);//结束时间
Long starTime = star.getTime();
Long endTime = endDay.getTime();
Long num = endTime - starTime;//时间戳相差的毫秒数
System.out.println("两个日期间隔" + num / 24 / 60 / 60 / 1000 + "天");//除以一天的毫秒数
System.out.println("两个日期间隔"+num / 24 / 60 / 60 / 1000/7+"周");
} catch (ParseException e) {
e.printStackTrace();
}
}

else {
System.out.println("第一个日期比第二个日期更早");
DateFormat dft = new SimpleDateFormat("yyyy-MM-dd");
try {
Date star = dft.parse(line1);//开始时间
Date endDay = dft.parse(line2);//结束时间
Long starTime = star.getTime();
Long endTime = endDay.getTime();
Long num = endTime - starTime;//时间戳相差的毫秒数
System.out.println("两个日期间隔" + num / 24 / 60 / 60 / 1000 + "天");//除以一天的毫秒数
System.out.println("两个日期间隔"+num / 24 / 60 / 60 / 1000/7+"周");
} catch (ParseException e) {
e.printStackTrace();
}
}
}
}

总结:调用了java中的库函数,让题目变得更加简单。

此作业中的第一题与上一次作业的最后一题相同

此作业的第二题完全没有写出来

此作业的第三题是第二次作业的7-5