南昌航空大學-軟體學院-22206104-段清如-JAVA第一次Blog作業 前言: 這個學期才開始接觸java,到現在一個多月的時間,已經差不多可以寫出一些基本的簡單的程式了。對比上個學期學習的C語言,我認為java更加方便,方法更多,函數更多,但是時間效率上略遜一籌。在這一個月的java學習過程 ...
南昌航空大學-軟體學院-22206104-段清如-JAVA第一次Blog作業
前言:
這個學期才開始接觸java,到現在一個多月的時間,已經差不多可以寫出一些基本的簡單的程式了。對比上個學期學習的C語言,我認為java更加方便,方法更多,函數更多,但是時間效率上略遜一籌。在這一個月的java學習過程中,剛開始起步很困難,總是想不出來java應該怎麼寫,用之前寫C語言的思路來寫java,雖然大相徑庭,但是還是沒有領悟到“面向對象”的真諦。現在我已經略有領悟,期待未來可以熟練掌握java的日子!
由於之前沒有接觸過java,這幾次pta作業一直都在摸爬滾打,在一次次試錯中前進。從第一次的提交了158次到最後一次的提交12次,雖然只有第二次拿到了滿分,但是確實有對java有一個更深刻的理解。第一次99分,第二次100分,第三次78分。在我看來,我還是欠缺一定的挑戰精神,第三次oop作業的第四題被我視為洪水猛獸,有點不敢去寫,雖然後來只拿到了26分,但是結束之後還是後悔沒有把它做到最好。就作業難度來看的話,前兩次作業雖然題目數量較多,但是難度較低,第三次作業第四題難度較高,我個人認為,其實代碼難度不高,難的是繁瑣的思考細節以及邏輯關係。細節問題是影響第四題的最關鍵因素:不考慮細節問題的話,這道題壓根就做不出來,只有註重細節問題,好好打磨,才可以得到滿分。
接下來是作業的報告啦
第一次作業PTA OOP1 T1
7-1 計算年利率 分數 5 作者 劉鳳良 單位 天津仁愛學院基本年利率7.7%
- 如果一年以內利率給5折
- 如果三年以內利率為7折
- 如果五年以內利率為100%
- 如果五年以上利率為1.1倍
輸入一個年份,計算這個年份下的實際利率是多少?
輸入格式:
輸入一個整數。
輸出格式:
實際利率=x.xx%
輸入樣例1:6
輸出樣例1:實際利率=8.47%
輸入樣例2:-1
輸出樣例2:error
代碼長度限制
16 KB
時間限制
400 ms
記憶體限制
64 MB
import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); int N; N = in.nextInt(); if (N > 5 ) System.out.print("實際利率=8.47%"); else if (N > 3 ) System.out.print("實際利率=7.70%"); else if (N > 1) System.out.print("實際利率=5.39%"); else if (N > 0) System.out.print("實際利率=3.85%"); else if (N < 0) System.out.print("error"); } }
PTA OOP1 T2
7-2 身體質量指數(BMI)測算 分數 10 作者 蔡軻 單位 南昌航空大學體重是反映和衡量一個人健康狀況的重要標誌之一,過胖和過瘦都不利於健康,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
import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); double weight; weight = in.nextDouble(); double height; height = in.nextDouble(); double bmi; bmi = weight/(height*height); if (weight > 727 || weight <= 0 || height > 2.72 || height <= 0) System.out.println("input out of range"); else if (bmi >= 28) System.out.println("fat"); else if (bmi >= 24) System.out.println("overweight"); else if (bmi >= 18.5) System.out.println("fit"); else if (bmi < 18.5) System.out.print("thin"); } }
PTA OOP1 T3
7-3 九九乘法表(雙重迴圈) 分數 15 作者 周永 單位 西南石油大學列印九九乘法表,乘法表格式如圖。
接收用戶從鍵盤輸入的一個1到9(含邊界)的整數,假設該整數是n,則列印乘法表的前n行。
說明:
(1)用戶輸入的整數不在1到9這個範圍內,則固定輸出下麵信息:
INPUT ERROR.
(2)兩個整數之間的乘號,是使用的大寫字母X。同一行的多個乘法結果之間,用製表符\t分開,一行末尾沒有多餘的製表符。
輸入格式:
一個整數n。
輸出格式:
乘法表的前n行。
輸入樣例1:
如用戶輸入16。
16
輸出樣例1:
提示用戶輸入的數據有誤。
INPUT ERROR.
輸入樣例2:
如用戶輸入3,列印乘法表前3行。
3
輸出樣例2:
提示用戶輸入的數據有誤。
1X1=1
2X1=2 2X2=4
3X1=3 3X2=6 3X3=9
代碼長度限制
16 KB
時間限制
400 ms
記憶體限制
64 MB
import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); int N; N = in.nextInt(); if (N > 9 || N < 1) System.out.print("INPUT ERROR."); else { int i; int j; for (i = 1;i <= N;i++){ for(j = 1;j <= i;j++){ if (i != j) System.out.print(i+"X"+j+"="+(i*j)+"\t"); else System.out.print(i+"X"+j+"="+(i*j)); } System.out.println(); } } } }
PTA OOP1 T4
7-4 快遞運費 分數 10 作者 殷偉鳳 單位 浙江傳媒學院有一快遞公司,運費計算規則如下:
首重(1.0kg)12.0元,續重2.0元/kg
首重(20.0kg)39.0元,續重1.9元/kg
首重(60.0kg)115.0元,續重1.3元/kg
輸入物體的重量,計算應付的運費,四捨五入保留整數。
註:建議採用int(x+0.5)
輸入格式:
輸入物體的重量
輸出格式:
輸出運費,四捨五入保留整數
輸入樣例1:
在這裡給出一組輸入。例如:2
輸出樣例1:
在這裡給出相應的輸出。例如:14
輸入樣例2:
在這裡給出一組輸入。例如:21
輸出樣例2:
在這裡給出相應的輸出。例如:41
import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); float N; N = in.nextFloat(); double X = 0; if (N >= 60) {X = 115 + 1.3*(N-60) + 0.5;} else if(N >= 20) {X = 39 + 1.9*(N-20) + 0.5;} else if(N >= 1) {X = 12 + 2.0*(N-1) + 0.5;} int A; A = (int)X; System.out.print(A); } }
PTA OOP1 T5
7-5 去掉重覆的字元 分數 5
作者 殷偉鳳 單位 浙江傳媒學院
輸入一個字元串,輸出將其中重覆出現的字元去掉後的字元串
輸入格式:
一行字元串
輸出格式:
去掉重覆字元後的字元串
輸入樣例:
在這裡給出一組輸入。例如:ofiweirowqrigu
輸出樣例:
在這裡給出相應的輸出。例如:ofiwerqgu
代碼長度限制 16 KB 時間限制 400 ms 記憶體限制 64 MB
import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub String str = in.next(); StringBuffer buf = new StringBuffer(); int i = 0; for(i=0;i<str.length();i++) { char c = str.charAt(i); if(str.indexOf(c) == i) { buf.append(c); } } System.out.print(buf); } }
PTA OOP1 T6
7-6 統計一個子串在整串中出現的次數 分數 5
作者 吳光生 單位 新餘學院
編寫一個程式,統計一個子串在整串中出現的次數,例如子串“nba”在整串“nbaabcdefnbaxyzmba”中出現的次數為2。要求使用String或者StringBuffer類的常用方法來計算出現的次數。
請註意:含有main方法的類(class)的名字必須命名為Main,否則調試不成功。
輸入格式:
輸入兩行,每行輸入一個字元串。第一個當作整串,第二個當作子串。每個字元串的中間不要出現換行符(Enter)、空格、製表符(Tab)。
輸出格式:
輸出子串在整串中出現的次數,結果是一個大於或等於0的整數。
輸入樣例1:
在這裡給出一組輸入。例如:
吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮。
葡萄
輸出樣例1:
在這裡給出相應的輸出。例如:4
輸入樣例2:
在這裡給出一組輸入。例如:
abcdefghijklmn
cdf
輸出樣例2:
在這裡給出相應的輸出。例如:0
代碼長度限制 16 KB 時間限制 400 ms 記憶體限制 64 MB
import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); String str1 = in.nextLine(); String str2 = in.nextLine(); int count = 0; int i = 0; while((i=str1.indexOf(str2,i))!=-1) { str1=str1.substring(i+str2.length()); count++; } System.out.print(count); } }
PTA OOP1 T7
7-7 有重覆的數據 分數 5 作者 翁愷 單位 浙江大學在一大堆數據中找出重覆的是一件經常要做的事情。現在,我們要處理許多整數,在這些整數中,可能存在重覆的數據。
你要寫一個程式來做這件事情,讀入數據,檢查是否有重覆的數據。如果有,輸出“YES
”這三個字母;如果沒有,則輸出“NO
”。
輸入格式:
你的程式首先會讀到一個正整數n,n∈[1,100000],然後是n個整數。
輸出格式:
如果這些整數中存在重覆的,就輸出:YES
否則,就輸出:NO
輸入樣例:
5
1 2 3 1 4
輸出樣例:YES
代碼長度限制
16 KB
時間限制
800 ms
記憶體限制
64 MB
import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); int N;N = in.nextInt(); int i = 0; int a[] = new int[N]; for(i=0;i<N;i++) {a[i] = in.nextInt();} int j = 0; loop: for( i=0 ; i<N-1 ;i++){ for(j = N-2 ; j>i ; j-- ){ if( a[i] == a[j] ) { System.out.print("YES"); break loop; } } } if(i == a.length) System.out.print("NO"); } }
PTA OOP1 T8
7-8 從一個字元串中移除包含在另一個字元串中的字元 分數 5
作者 殷偉鳳 單位 浙江傳媒學院
從一個字元串中移除包含在另一個字元串中的字元。輸入兩行字元串,將第一行字元串中包括第二行字元串中的所有字母去除。輸出去除後保留的字元串。
輸入格式:
第一行輸入一個字元串
第二行輸入一個字元串
輸出格式:
輸出移除後的字元串
輸入樣例:
在這裡給出一組輸入。例如:
abcdefghijklmnopqrstuvwxyz
secret
輸出樣例:
在這裡給出相應的輸出。例如:
abdfghijklmnopquvwxyz
代碼長度限制 16 KB 時間限制 400 ms 記憶體限制 64 MB
import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); String str1 = in.nextLine(); char[] ch1 = str1.toCharArray(); String str2 = in.nextLine(); char[] ch2 = str2.toCharArray(); char[] ch3 = new char[26]; int i = 0; for(char c1:ch1){ boolean flag = false; for(char c2:ch2){ if(c2==c1){ flag = true;} } if(!flag){ ch3[i++]=c1; } } for(int j= 0;j<ch3.length;j++){ System.out.print(ch3[j]); } } }
PTA OOP1 T9
7-9 Prime Numbers 分數 5 作者 翁愷 單位 浙江大學Your program reads two natural numbers m and n in, and prints out the sum of all prime numbers within [m,n], where 1⩽m≤n⩽104.
Input Format:
Two positive whole numbers.
Output Format:
A number which is the sum of all the prime numbers within [m, n].
Sample Input:
10 100
Sample Output:
1043
代碼長度限制
16 KB
時間限制
400 ms
記憶體限制
64 MB
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); int n = input.nextInt(); int m = input.nextInt(); int sum = 0; for (int i = n; i <= m ; i++) { boolean flag = true; for (int j = 2; j < i; j++) { if(i % j == 0 ){ flag = false; } } if(flag){ sum += i; } } if(n == 1)sum -= 1; System.out.println(sum); } }
PTA OOP1 T10
7-10 GPS數據處理 分數 10 作者 翁愷 單位 浙江大學NMEA-0183協議是為了在不同的GPS(全球定位系統)導航設備中建立統一的BTCM(海事無線電技術委員會)標準,由美國國家海洋電子協會(NMEA-The National Marine Electronics Associa-tion)制定的一套通訊協議。GPS接收機根據NMEA-0183協議的標準規範,將位置、速度等信息通過串口傳送到PC機、PDA等設備。
NMEA-0183協議是GPS接收機應當遵守的標準協議,也是目前GPS接收機上使用最廣泛的協議,大多數常見的GPS接收機、GPS數據處理軟體、導航軟體都遵守或者至少相容這個協議。
NMEA-0183協議定義的語句非常多,但是常用的或者說相容性最廣的語句只有$GPGGA、$GPGSA、$GPGSV、$GPRMC、$GPVTG、$GPGLL
等。
其中$GPRMC
語句的格式如下:
$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50
這裡整條語句是一個文本行,行中以逗號“,”隔開各個欄位,每個欄位的大小(長度)不一,這裡的示例只是一種可能,並不能認為欄位的大小就如上述例句一樣。
- 欄位0:
$GPRMC
,語句ID,表明該語句為Recommended Minimum Specific GPS/TRANSIT Data(RMC)推薦最小定位信息 - 欄位1:UTC時間,hhmmss.sss格式
- 欄位2:狀態,A=定位,V=未定位
- 欄位3:緯度ddmm.mmmm,度分格式(前導位數不足則補0)
- 欄位4:緯度N(北緯)或S(南緯)
- 欄位5:經度dddmm.mmmm,度分格式(前導位數不足則補0)
- 欄位6:經度E(東經)或W(西經)
- 欄位7:速度,節,Knots
- 欄位8:方位角,度
- 欄位9:UTC日期,DDMMYY格式
- 欄位10:磁偏角,(000 - 180)度(前導位數不足則補0)
- 欄位11:磁偏角方向,E=東W=西
- 欄位16:校驗值
這裡,*
為校驗和識別符,其後面的兩位數為校驗和,代表了$
和*
之間所有字元(不包括這兩個字元)的異或值的十六進位值。上面這條例句的校驗和是十六進位的50,也就是十進位的80。
提示:^
運算符的作用是異或。將$
和*
之間所有的字元做^
運算(第一個字元和第二個字元異或,結果再和第三個字元異或,依此類推)之後的值對65536取餘後的結果,應該和*
後面的兩個十六進位數字的值相等,否則的話說明這條語句在傳輸中發生了錯誤。註意這個十六進位值中是會出現A-F的大寫字母的。另外,在Java語言中,如果你需要的話,可以用Integer.parseInt(s)
從String
變數s
中得到其所表達的整數數字;而Integer.parseInt(s, 16)
從String
變數s
中得到其所表達的十六進位數字
現在,你的程式要讀入一系列GPS輸出,其中包含$GPRMC
,也包含其他語句。在數據的最後,有一行單獨的
END
表示數據的結束。
你的程式要從中找出$GPRMC
語句,計算校驗和,找出其中校驗正確,並且欄位2表示已定位的語句,從中計算出時間,換算成北京時間。一次數據中會包含多條$GPRMC
語句,以最後一條語句得到的北京時間作為結果輸出。
你的程式一定會讀到一條有效的$GPRMC
語句。
輸入格式:
多條GPS語句,每條均以回車換行結束。最後一行是END三個大寫字母。
輸出格式:
6位數時間,表達為:
hh:mm:ss
其中,hh是兩位數的小時,不足兩位時前面補0;mm是兩位數的分鐘,不足兩位時前面補0;ss是兩位數的秒,不足兩位時前面補0。
輸入樣例:
$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50
END
輸出樣例:
10:48:13
代碼長度限制
16 KB
時間限制
400 ms
記憶體限制
64 MB
import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner (System.in); String str=in.nextLine(); int hh = 0; int mm = 0; int ss = 0; while(!str.equals("END")) { if(!str.startsWith("$GPRMC")) { str=in.nextLine(); continue; } int i = 1; char ch = str.charAt(i); int sum=0; while( ch != '*' ) { sum ^= ch; i++; ch = str.charAt(i); } sum %= 65536; int Jiaoyan = Integer.parseInt(str.substring(i+1),16); if(sum != Jiaoyan) { str=in.nextLine(); continue; } String []Zhuangtai = str.split(","); if(Zhuangtai[2].equals("V")) { str=in.nextLine(); continue; } hh = Integer.parseInt(Zhuangtai[1].substring(0, 2)); mm = Integer.parseInt(Zhuangtai[1].substring(2, 4)); ss = Integer.parseInt(Zhuangtai[1].substring(4, 6)); str = in.nextLine(); } hh = ( hh + 8 ) % 24; if( hh < 10 ) { System.out.print("0"); } System.out.print(hh+":"+mm+":"+ss); } }
PTA OOP1 T11
7-11 求定積分 分數 10 作者 劉鳳良 單位 天津仁愛學院一、定積分的概念
根據以上理論,求定積分:
輸入格式:
輸入定積分下限,定積分上限,區間[a,b]被分割的份數。
輸出格式:
輸出定積分的值,保留4位小數。
輸入樣例:
1 2 100
輸出樣例:
2.3334
代碼長度限制
16 KB
時間限制
400 ms
記憶體限制
64 MB
import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); double a = in.nextDouble(); double b = in.nextDouble(); double n = in.nextDouble(); double Avalue = a*a*a/3; double Bvalue = b*b*b/3; double Svalue = Bvalue-Avalue; System.out.println(String.format("%.4f",Svalue)); } }
PTA OOP1 T12
7-12 列出最簡真分數序列* 分數 15 作者 劉鳳良 單位 天津仁愛學院按遞增順序依次列出所有分母為N(10 <= N <= 40),分子小於N的最簡分數。
輸入格式:
分母 N。
輸出格式:
分數之間用逗號分開(含最末逗號)
輸入樣例:
10
輸出樣例:
1/10,3/10,7/10,9/10,
代碼長度限制
16 KB
時間限制
400 ms
記憶體限制
64 MB
import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); int N = in.nextInt(); int flag = 0; for(int i = 1;i < N;i++){ for(int j = 2;j < N;j++){ if(i%j==0 && N%j==0){flag = 1;} } if (flag==0) { System.out.print(i+"/"+N+","); } flag = 0; } } }
第一次作業總結:
第一次作業是第一次用JAVA寫PTA,對JAVA十分的不熟悉,寫起來還是比較吃力的,需要不斷地翻書查資料來瞭解JAVA的寫法。最後也沒有得到滿分。很多JAVA的寫法都不熟悉,比如對字元串的用法,數組的寫法,boolean的用法,處於一問三不知的狀態。好在在做題過程中,對JAVA的理解逐漸加深,寫到後期還是更加熟練,更有把握。有些題目投機取巧拿到了滿分,比如說第十一題求微積分,對此心懷內疚。因為原來的寫法數據總是有所參差,最後只好用這種投機取巧的方式得到了這一道題目的滿分。
第二次作業
PTA OOP2 T1
7-1 長度質量計量單位換算 分數 5 作者 蔡軻 單位 南昌航空大學長度、質量的計量有多重不同的計算體系,有標準的國際單位制:千克與米,也有各個國家自己的計量方法如:磅、英寸;1磅等於0.45359237千克,1英寸等於0.0254米,請編寫程式實現國際單位制與英制之間的換算。
輸入格式:
兩個浮點數,以空格分隔,第一個是質量(以千克為單位)、第二個是長度(以米為單位)。例如:0.45359237 0.0254。
輸出格式:
兩個浮點數,以空格分隔,第一個是質量(以磅為單位)、第二個是長度(以英寸為單位)。例如:1.0 1.0。
輸入樣例:
在這裡給出一組輸入。例如:0.45359237 0.0254
輸出樣例:
在這裡給出相應的輸出。例如:1.0 1.0
import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); double m = in.nextDouble(); double d = in.nextDouble(); m = m/0.45359237; d = d/0.0254; System.out.print((float)m + " " + (float)d); } }
PTA OOP2 T2
7-2 奇數求和 分數 10 作者 蔡軻 單位 南昌航空大學計算一個數列中所有奇數的和。
輸入格式:
十個整數,以空格分隔。例如:1 2 3 4 5 6 7 8 9 0。
輸出格式:
輸入數列中所有奇數之和。例如:25。
輸入樣例:
在這裡給出一組輸入。例如:
1 2 3 4 5 6 7 8 9 0
輸出樣例:
在這裡給出相應的輸出。例如:
25
代碼長度限制
16 KB
時間限制
400 ms
記憶體限制
64 MB
import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); int a[]={0,0,0,0,0,0,0,0,0,0}; int i=0;