JAVA在OJ上提交程序的注意事項


1. Main類與Scanner

1.1 Main類

你提交的所有程序都應該以如下形式出現

public class Main{
    public static void main(String[] args){
           //其他代碼
    }
}

即,代碼中必須存在一個public class Main。不允許出現其他的public class

1.2 使用Scanner處理輸入

Java中使用Scanner處理輸入。你需要注意如下幾個地方

  • 程序開頭必須import java.util.Scanner導入Scanner類。
  • 使用Scanner sc = new Scanner(System.in);生成scanner對象。
    該Scanner對象sc可以處理標准輸入。所謂的標准輸入,在你的電腦上就是你從鍵盤通過控制台進行的輸入。注意:字符串本身,也可被Scanner對象處理,如下代碼就可以處理字符串:
String str = "1 a 3.0";
Scanner sc = new Scanner(str);
//現在就可以通過sc來處理字符串str,比如將其中的每個字符取出來。
int x = sc.nextInt();    //將字符串中的1讀出來,並轉化為int型
String y = sc.next();   //將字符串中的a讀出來,是String型
double z = sc.nextDouble();  //將字符串中的3.0讀出來,並轉化為double型

示例程序1:不斷讀入字符並轉化為int然后相加,直到沒有輸入為止

import java.util.Scanner;//導入Scanner類

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);//生成Scanner對象
        while (sc.hasNextInt()) { 
            int a = sc.nextInt(); //讀下一個整型字符串
            int b = sc.nextInt();
            System.out.println(a + b);
        }
        sc.close(); //用完后關閉掃描器是一個好的習慣
    }
}

while (sc.hasNextInt())這個語句的含義是指,當標准輸入的下一個標記是整型則繼續處理,直到沒有輸入為止。
如果輸入1 2 3 4 a,那么只能處理前面的1、2、3、4。在處理a時跳出,因為a不是整型字符串。
注意:盡量不要使用while(true)的方式來處理多次輸入,否則在PTA系統中有可能出錯。

示例程序2:不斷讀入字符(以行的方式讀取),直到碰到end為止

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);//生成Scanner對象
        String x = sc.nextLine();
        while (!x.equals("end")) { 
            System.out.println(x);
            x  = sc.nextLine();
        }
        sc.close(); //用完后關閉掃描器是一個好的習慣
    }
}

示例程序3:讀入n,然后循環讀入n行數據

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);//生成Scanner對象
        int n = sc.nextInt();
        for(int i = 0; i < n; i++){
            //接下來處理一行輸入,比如一行的數據為"zhang 18"
            String name = sc.next();
            int age = sc.nextInt();
            //然后對name、age進行處理
        }
        sc.close(); //用完后關閉掃描器是一個好的習慣
    }
}

Scanner如何處理字符串中每個標記?
Scanner在處理字符串對象時,如果使用next函數,默認以空格、多個空格或者回車換行符作為分隔。比如上面這段程序,當我們輸入為

1x 2y

或者

1x
2y

Scanner將輸入分解成兩個標記1x和2y。

本機上如何快速測試?

  • 打開記事本(Notepad)。
  • 復制輸入樣例中的數據到記事本。注:如果每行數據之間有不應該出現的空行,請先刪除空行。
  • 全選復制(Ctrl+a, Ctrl+c)記事本的數據。注:為了將最后一行數據后面的回車換行也復制上。
  • 運行程序后,在控制台粘貼(Ctrl+v)。

2.Scanner對象常用方法

hasNext() //返回true或false,看有無下一個標記(字符串類型)。
比如對於a b c,現在處理到a,那么下一個標記就是b。
next() //返回類型為String(字符串),返回下一個標記。不會讀取回車換行。
hasNextInt() //返回true或false,看有無下一個整型字符串標記。
nextInt() //返回類型int,將下一個整型字符串標記轉化為int型返回。
nextBoolean() //返回類型為boolean,可以處理字符串true或者false,
nextDouble() //返回類型為double,可以處理字符串如1 2.3 -1.3等。
nextLine() //返回類型為String(字符串對象),返回一整行。會讀取回車換行符。

3.字符串與整型互相轉換

常用處理代碼

String str = sc.nextLine();
int numStu = Integer.parseInt(str); 
//也可使用如下代碼
int num = sc.nextInt();  //字符串->整型
String x = num+"";       //整型->字符串,其中""為空字符串。任何基本類型數據與字符串+,都將轉化為字符串。

也可以使用Double.parseDouble處理double類型數據,還有Long, Boolean等對象均有相似方法。

4.Scanner常見問題

該部分內容統一移到文章尾部的常見問題章節。

5.輸出

5.1 System.out.println("abc")打印字符串"abc"並回車換行。可使用+號連接各個類型的變量,組裝成字符串。

int x = 1;
String str = "abc";
System.out.println(x+2+"-"+str); //輸出12-abc。即,可以使用+拼接各個類型的變量,轉化為字符串

5.2 System.out.print("abc")打印字符串"abc",不打印回車換行。

5.3 格式化輸出:

代碼:System.out.printf("%d,%.3f,%5s,%b,80%%,end%n",123,3.141592654,"abcdef",true);
輸出:123,3.142,abcdef,true,80%,end
說明:
%d,按十進制整數格式輸出。%.3f,輸出浮點數保留3位小數。
%-5s,按字符串格式輸出,輸出寬度為5個字符,如果為不足5個字符,右方填充空格。%5s,左方填充空格。
%b,按boolean型格式輸出。
%%,輸出%。
%n,輸出行分隔符,如回車換行。
更多格式字符用法請查看API文檔中Formatter類的格式字符串語法節。

6.動態創建數組與ArrayList

有的時候需要動態創建一個數組來存放輸入的數據。

int n = sc.nextInt();
int[] arr = new int[n];//動態創建大小為n的數組
for(int i = 0; i < n; i++){
    arr[i] = sc.nextInt();
}

如果待輸入的數據不確定,無法一開始就確定數組的大小。我們可以使用ArrayList代替數組。

List<String> strList = new ArrayList<String>();//Java 7中可以List<String> strList = new ArrayList<>();
while(sc.hasNextLine()){
    strList.add(sc.nextLine());
}

//遍歷輸出列表中的內容
for (int i = 0; i < strList.size(); i++) {
    String str = strList.get(i);
    System.out.println(str);
}
//或者
for(String e: strList){
    System.out.println(e);
}

7.常見問題

7.1 本機編譯通過的Java程序,在PTA上提示編譯錯誤或者直接無法運行

  • 提交的public class類名不為Main,比如,提交的類名如果是public class Main1就會出錯。
  • 提交的代碼中有多個public class。注意:提交的代碼中只能有一個public class
  • 復制的時候將程序第一行package也復制進來。
  • 提交的代碼中出現中文。注意:提交的代碼中任何時候都不要出現中文,注釋也不要出現中文。
  • PTA上的Java暫時為Java 6,如果用Java7或8的語法可能會出錯。最新版的PTA使用Open JDK 8,已經支持Java 8。估計還不支持Java 9,請不要用Java 9中的新語法。注意:中國大學mooc網的程序評測平台可能僅支持Java 6。

7.2 本機運行正確的代碼放到PTA上提交提示“答案錯誤”或”格式錯誤”。

  • 確定使用前面提到的本機上如何快速測試的方法進行測試,請仔細比對樣例輸入與輸出。
  • 你的代碼輸出確實有誤。題庫中的集美大學Java題集的題目已經經過上百次有效提交,一般不會有錯,請仔細核對。核對方法:將樣例輸出放到屏幕左側,你的程序輸出放到右側,逐行對比。
  • 顯示格式錯誤,一般是因為你的輸出最后一行少了回車換行,或者每行的行尾多了空格之類的錯誤。

7.3 nextLine與其他next***混用的坑
此坑非常坑。建議所有人仔細閱讀。

for (int i = 0; i < 3; i++) {           
    int x = sc.nextInt();
    String str = sc.nextLine();
    System.out.println("x="+x+" str="+str);
}

當我們輸入1並按回車的時候,就直接輸出x=1 str=。可以看到sc.nextLine()並沒有讀取到任何東西。
實際上它讀取了1后面的回車換行符。我們應將其改為sc.next()
結論:當題目要求中一會要輸入數字、一會又要輸入字符,一會又要整行讀取。不要混合使用nextInt(),next(),nextLine()方法。不妨全部使用nextLine()整行讀入后,再進行處理。
其他:對於這個問題,我在PTA題庫中創建了1題jmu-Java-01入門-使用Scanner處理輸入,格式化輸出與String,主要用來考察Scanner處理輸入、格式化輸出、String的常見使用。歡迎大家使用。

7.4 重復創建Scanner對象

下面的代碼中存在一個非常典型的錯誤!!!

for (int i = 0; i < 3; i++) { 
    Scanner sc = new Scanner(System.in);//沒有必要重復創建Scanner對象!運行時會導致結果不正確。
    int x = sc.nextInt();
    String str = sc.nextLine();
    System.out.println("x="+x+" str="+str);
}

應將Scanner sc = new Scanner(System.in);移到for循環外。
這個錯誤很有隱蔽性。學生自己在控制台一個一個輸入的時候不會出錯,但是如果將多行輸入批量粘貼過來就無法得到正確結果

7.5 控制台如何跳出無限循環?

Ctrl+z或者強制終止程序。

7.6 程序中包含多個類怎么提交?

可以將多個類寫入一個文件。但只有Main類使用public修飾。

class Teacher{

}
public class Main{
    public static void main(String[] args) {

    }
}

8. Java語法練習題集PTA分享碼

Java語法練習題集-PTA分享碼
PTA中如何出Java題目?

轉自:https://www.cnblogs.com/zhrb/p/6347738.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM