提交到PTA的套路

在PTA提交Java程序需要注意如下几个要点。


1. Main类与Scanner
1.1 Main类
你提交的所有程序都应该有一个Main类,并且必须是声明为public


1.2 输入与输出
Java中使用Scanner处理输入。你需要注意如下几个地方


程序开头必须import java.util.Scanner导入Scanner类。


使用Scanner sc = new Scanner(System.in);生成scanner对象。
该Scanner对象处理标准输入。所谓标准输入在你的电脑上就是你从键盘通过控制台进行的输入。从控制台输入的一个字符串,可以被Scanner对象处理。


一个标准的程序示例程序如下:


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 = in.nextInt(); //读下一个整型字符串
            int b = in.nextInt();
            System.out.println(a + b);
        }
        sc.close(); //关闭扫描器,是一个好的习惯
    }
}


**Scanner处理输入:**
Scanner在处理字符串对象的时候,默认以空格或者回车换行符作为分隔。比如上面一段程序我们输入


1 2
或者输入


1
2
Scanner均可处理。


循环处理输入:
while (sc.hasNextInt())这个语句的含义是指,当标准输入的下一个标记是整型则继续处理。
如果输入1 2 3 4 a,那么只能处理前面的1、2、3、4。在处理a时跳出,因为a不是整型字符串。


本机上如何快速进行测试?
复制输入样例中的数据或者自己在记事本按照输入格式批量输入测试数据,全选复制。
运行程序后,在控制台粘贴。
注意:最后一个数据后面的回车换行也要复制上。


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); 
也可以使用Double.parseDouble处理double类型数据,还有Long, Boolean等对象均有相似方法。


4.Scanner常见问题
4.1 nextLine的坑
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()并没有读取到任何东西。
实际上它是读取去了回车换行符。我们应将其改为sc.next()。


4.2 重复创建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循环外。
这个错误很有隐蔽性。学生自己在控制台一个一个输入的时候不会出错,但是如果将多行输入批量粘贴过来就无法得到正确结果。


5.输出
5.1 System.out.println打印字符串并回车换行。可以使用使用+号连接各个类型的变量。
int x = 1;
String str = "abc";
System.out.println(x+"-"+str); //输出1-abc,即可以使用+连接各个类型的变量。
5.2 System.out.print打印字符串,不打印回车换行。
5.2 格式化输出:
System.out.printf("%d,%f,%s,%b\n",1,2.3,"abc",true)输出1,2.300000,abc,true


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>();
while(sc.hasNextLine()){
    strList.add(sc.nextLine());
}


/*遍历输出列表中的内容*/
for (int i = 0; i < strList.size(); i++) {
    String str = strList.get(i);
    System.out.println(str);
}
7.其他问题
1.本机编译通过的Java程序,在PTA上提示编译错误:


PTA上的Java暂时为Java6,如果用Java7或8的语法可能会出错。


2.提交的程序中尽量不要出现中文
甚至注释里都不要出现中文,否则编译阶段就可能出错。


3.控制台如何跳出无限循环?
按Ctrl+z


4.程序中包含多个类


可以将多个类写入一个文件。但只有Main类可以使用public修饰。


class Teacher{
}
public class Main(){
    public static void main(String[] args) {
    }
}
不同编程语言在PTA提交内容的方式有所不同,以下以Python、Java和C++为例介绍: #### Python 在PTA提交Python程序时,直接编写符合题目要求的Python代码,然后在PTA提交界面选择Python3语言,将代码复制粘贴到代码编辑区域进行提交。例如对于从控制台读入两个数然后将其相加输出的题目,代码如下: ```python a, b = map(int, input().split()) print(a + b) ``` #### Java 编写Java程序时,要注意输入的处理。可以通过传入相应的字符的方式,完成对字符串的分割,将分割的结果传入字符串数组中。例如: ```java import java.util.Scanner; public class Main { public static void main(String[] arg) { Scanner cin = new Scanner(System.in); String s = cin.nextLine(); String[] nums = s.split(","); for (String num : nums) { System.out.println(Integer.parseInt(num)); } } } ``` 在PTA提交时,选择Java语言,将上述代码复制到代码编辑区域提交即可[^2]。 #### C++ 编写C++程序时,要注意文件的命名和组织。比如编写的源程序命名为test.cpp,提交之前,将qmscore.dat和test.cpp放在src文件夹下,然后在src文件夹的上层文件夹中压缩src.zip,保证这个zip文件中有src文件夹和其中的test.cpp文件。示例代码如下: ```cpp #include <stdio.h> #include <stdlib.h> #include <string.h> struct student { char name[20]; int score; }; int main() { FILE *fp; struct student st[100]; int i,j,one,two,three; if((fp=fopen("src/qmscore.dat","rb"))==NULL) { printf("can not open qmscore.dat\n"); exit(0); } i=0; while((fread(&st[i],sizeof(struct student),1,fp))!=NULL) { i++; } one=two=three=0; for(j=0;j<i;j++) { if(st[one].score <st[j].score ) one=j; } for(j=0;j<i;j++) { if(st[two].score <st[j].score&& st[j].score <st[one].score ) two=j; } for(j=0;j<i;j++) { if(st[three].score <st[j].score && st[j].score <st[one].score && st[j].score <st[two].score ) three=j; } fclose(fp); printf("%s:%s:%s\n",st[one].name ,st[two].name,st[three].name); return 0; } ``` 在PTA提交界面选择C++语言,上传之前压缩好的src.zip文件即可[^3]。
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值