以下为个人学习笔记和习题整理
课程:零基础学Java语言-浙江大学-翁恺 @ 中国大学MOOC
https://www.icourse163.org/course/ZJU-1001541001
'a'
, '1'
Unicode16
表达字符,在所有的机器上,不管CPU、操作系统和本地语言,字符类型是一致和统一的。char c = 'A';
c++;
System.out.println(c); // 输出结果为:B
int i = 'Z'-'A';
System.out.println(i); // 输出结果为:25
System.out.println((int)c); // 输出结果为:66
'a' - 'A'
可以得到两段之间的距离a + 'a' - 'A'
可以把一个大写字母变成小写字母a + 'A' - 'a'
可以把一个小写字母变成大写字母‘0’ < ‘9’
‘A’ < ‘Z’
‘a’ > ‘Z’
‘Z’ < ‘a’
字符 | 意义 | 字符 | 意义 |
---|---|---|---|
\b | 回退一格(但不删除) | " | 双引号 |
\t | 到下一个表格位 | ’ | 单引号 |
\n | 换行 | \ | 反斜杠本身 |
\r | 回车 |
对于基本数据类型,Java提供了对应的包裹(wrap)类型。
这些包裹类型将一个基本数据类型的数据转换成对象的形式,从而使得它们可以像对象一样参与运算和传递。
下表列出了基本数据类型所对应的包裹类型:
基本类型 | 包裹类型 |
---|---|
boolean | Boolean |
char | Character |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
// 定义包裹类型变量
Integer i = 10;
Integer i = new Integer(10);
Integer i = new Integer("10");
// 获得包裹类型的值
Integer iii = 10;
int i = iii;
当需要让一个类或对象做事情的时候,使用 .
运算符。
获得该类型的最大最小值
Integer.MIN_VALUE
Integer.MAX_VALUE
static boolean isDigit(char ch)
static boolean isLetter(char ch)
static boolean isLetterOrDigit(char ch)
static boolean isLowerCase(char ch)
static boolean isUpperCase(char ch)
static boolean isWhitespace(char ch)
static char toLowerCase(char ch)
static char toUpperCase(char ch)
“hello”
“1”
“”
in.next();
in.nextLine();
String s;
String s = new String("a string");
String s = "hello";
if( input == "bye" ) {
...
}
equals
比较内容是否相同if( input.equals("bye") ) {
...
}
"hello" + "world"
→ "helloworld"
+
的一边是字符串而另一边不是时,会将另一边表达为字符串,然后做连接"I’m " + 18
→ "I’m 18"
1 + 2 + "age"
→ "3age"
"age" + 1 + 2
→ "age12"
.
这个运算符来进行的字符串.操作
对.
左边的这个字符串,做右边的那个操作
左边的字符串可以是变量,也可以是常量
Java的字符串是一种特殊的不可变
对象,所有的字符串操作都是产生一个新的字符串,而不是对原来的字符串的修改。
String s = "abc";
System.out.println(s.toUpperCase()); // ABC
System.out.println(s); // abc
s1.compareTo(s2)
s1.compareToIgnoreCase(s2)// 可以不区分大小写地比较大小
String name = "Hellola";
name.length(); // 输出: 7
String str1 = "one";
str1.length(); // 输出:3
String str2 = "";
str2.length(); // 输出: 0
String str3;
str2.length(); // Error! 因为str3没有管理任何String对象
s.charAT(index)
0
到length()-1
s.substring(n)
s.substring(b,e)
s.index0f(c)
s.index0f(c,n)
s.index0f(t)
s.lastIndex0f(c)
s.lastIndex0f(c,n)
s.lastIndex0f(t)
s.startsWith(t)
s.endsWith(t)
s.trim()
s.replace(c1,c2)
s.toLowerCase()
s.toUpperCase()
题目内容
你的程序要读入一行文本,其中以空格分隔为若干个单词,以 .
结束。你要输出这行文本中每个单词的长度。这里的单词与语言无关,可以包括各种符号,比如“it’s”算一个单词,长度为4。注意,行中可能出现连续的空格。
输入格式
输入在一行中给出一行文本,以.
结束,结尾的句号不能计算在最后一个单词的长度内。
输出格式
在一行中输出这行文本对应的单词的长度,每个长度之间以空格隔开,行末没有最后的空格。
输入样例
It’s great to see you here.
输出样例
4 5 2 3 3 4
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.next();// 字符串输入
String comma = "";
int len; // 字符串长度
while ( true ) {
len = s.length();
if (s.endsWith(".") ) {
len -= 1;
if (len > 0) {
System.out.print(comma + len);
}
break;
}
System.out.print(comma + len);
s = in.next();// 下一个字符串输入
comma = " "; // 下一个字符串前有空格
}
}
}
题目内容
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的大写字母的。另外,如果你需要的话,可以用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
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String str = in.next();// 字符串输入
String substr = "";
Integer check, hh = 0, mm = 0, ss = 0;
int code = 0;
while ( !str.equals("END") ) {
if ( !str.startsWith("$GPRMC")) {
str = in.next();// 下一个字符串输入
continue;
}
// 将$和*之间所有的字符做^运算
substr = str.substring(1, str.indexOf("*"));
// 获得*后的校验符的十六进制数
check = Integer.parseInt(str.substring(str.indexOf("*")+1), 16);
for(int i = 0; i < substr.length(); i++) {
code ^= substr.charAt(i);
}
if (code % 65536 == check) { // 数据合法
String[] strs = str.split(",");
if (strs[2].equals("A")) { // 已定位
hh = Integer.parseInt(strs[1].substring(0, 2));
mm = Integer.parseInt(strs[1].substring(2, 4));
ss = Integer.parseInt(strs[1].substring(4, 6));
//输出北京时间
hh = ( hh + 8 ) % 24;
if ( hh < 10 ) {
System.out.print("0");
}
System.out.print(hh+":"+mm+":"+ss);
}
}
str = in.next();// 下一个字符串输入
}
}
}