Bus 簡介 Spring Cloud Bus 是 Spring Cloud 體系內的消息匯流排,支持 RabbitMQ 和 Kafka 兩種消息中間件。所謂消息匯流排,簡單理解就是一個消息中心,眾多微服務實例都可以連接到匯流排上,實例可以往消息中心發送或接收信息,例如:實例 A 發送一條消息到匯流排上,總 ...
僅為總結作業所用
第一次作業
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-日期類的基本使用- 給定一個日期,判定是否為合法日期。如果合法,判斷該年是否閏年,該日期是當年第幾天、當月第幾天、當周第幾天、。
- 給定起始日期與結束日期,判定日期是否合法且結束日期是否早於起始日期。如果均合法,輸出結束日期與起始日期之間的相差的天數、月數、念書。
輸入格式:
第一行輸入一個日期字元串,格式為"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;
}
}