一、实验目的
1.String类中处理字符串方法的使用
2.从命令行传递参数给main方法的编程及运行
3.文件类及文件输入输出
二、实验内容
1.【检测密码】一些网站设定了一些指定密码的规则。编写一个方法,检测一个字符串是否是合法的密码。假定密码规则如下:
1)密码必须至少有8个字符。
2)密码只能包括数字和字母。
3)密码必须至少有2个数字。
编写一个程序,提示用户输入密码,如果该密码符合规则就显示“Valid Password”,否则显示“Invalid Password”。
2.【统计一个字符中的字符数、单词数和行数】编写程序统计一个文件中的字符数(控制字符\r和\n除外)、单词数以及行数。单词由空格、Tab、回车或换行符分隔。文件名作为命令行参数传递。如下图所示:【注意:此题请同时上交.java和.class文件以便测试】
3.【读写数据】编写一个程序,如果名为Exercise9_19.txt的文件不存在,则创建该文件。使用文本I/O编写随机产生10个整数给文件。文件中的整数由空格分开。从文件中读回这些数据,然后显示排好序的数据。
三、实验要求:
要求每个学生独立完成实验任务。
四、实验报告
1.实验结果与分析
(1)检测密码
A)实验运行
根据提示输入密码内容
当密码内容小于8字符,里面不只含有字母与数字,数字个数小于2时均返回Invalid Password
当密码内容正确时返回Valid Password
B)结果分析与实验思路
本题考查String字符串的使用
首先实现isValid函数,传入String类型的密码文本,定义判断变量jud,首先用s.length() 方法判断字符串长度,若字符串长度小于8则判断为false,设置数字计数器并初始化,然后用for循环搭配charat函数遍历字符串,判断是否是字母或数字,如果是数字的话给数字计数器加一,如果非字符非数字则判断为false,最后判断数字个数,如果小于2判断为false,如果false则输出“Invalid Password”,如果是true则输出“Valid Password”;
for(int i= 0; i <s.length();i++){
if(!Character.isDigit(s.charAt(i)) && !Character.isLetter(s.charAt(i)))jud = false;
if(Character.isDigit(s.charAt(i)))count++;
}
if(count < 2)jud = false;
if(jud)System.out.println("Valid Password");
else if(!jud)System.out.println("Invalid Password");
再在main函数中实现输入字符串即可。
(2)统计
A)实验运行
根据题目要求使用命令行
首先调到java文件下
然后使用命令行参数传入文件名称,若文件存在进行统计,若文件不存在跳出提示
(附根目录截图与文本截图)
B)结果分析与实验思路
本题考查File类与文本I//O相关知识点
首先看到题目要求中有命令行参数要求,将传入的参数名改成args[0]即为命令行参数的使用
File file = new File(args[0]);
然后进行main函数实现,首先注意异常的抛出
public static void main(String[] args) throws IOException
原因是在PrintWriter与Scanner处理文件内容时可能会抛出某种I/O异常,且这种异常属于必检异常,因此要进行抛出或者处理,在这里我们选择抛出。
然后判断是否存在文件:如果存在进行处理,不存在进行提示,这里使用file.exists()函数进行处理,然后在存在情况下设置三个计数器,分别对应字母数,单词数,行数;
下面是重点内容:
首先用scanner.hasNextLine()方法判断是否还存在未扫描文本行,如果有,行计数器加一,同时对这行的内容进行单词扫描,这里使用scanner2.next()方法(注:除了Line方法读取一行外,其余next方法均使用令牌读取法),如果有下面内容则单词计数器加一,再Character.isLetter(c.charAt(i))遍历对单词里面的字母数进行计数,这样就可以实现对这三类文本的计数。
while(scanner.hasNextLine()){
numOfLine++;
String c = scanner.nextLine();
Scanner scanner2 = new Scanner(c);
while(scanner2.hasNext()){
String string = scanner2.next();
numOfWord++;
for(int i = 0;i < string.length();i++){
if(Character.isLetter(c.charAt(i))){
numOfLetter++;
}}}}
最后进行内容输出即可。
(3)读写数据
A)实验运行
直接回车返回结果:
B)结果分析与实验思路
本题考查随机数,文本I/O,数组类排序等相关知识点
首先注意异常的抛出
public static void main(String[] args) throws IOException
然后根据文本创建和写入方法进行设置
先File类实例创建一个文件,然后PrintWriter类实例修改这个文件,遍历十次输入随机数字(调用Random类实例)并使用print方法写入,最后关闭PrintWriter。
File file = new File("Exercise9_19.txt");
PrintWriter printWriter = new PrintWriter(file);
Random random = new Random();
for(int i = 0 ; i < 10 ; i++){
printWriter.print(random.nextInt(500) + " ");
}
printWriter.close();
这种文本相关方法是一种套路。
然后创建Scanner实例和数字数组,遍历文件内文本并用scanner.nextInt()方法将数字扫描到数组中;
最后一步使用Arrays.sort(num)方法对数组排序输出即可。
2.心得体会
题目的难度在随着知识点的深入而以可感受到的方式进行增长,这次的实验在几处犯了难:
首先是第二题中对三类文本的计数,对单词计数的同时对字母计数是比较容易实现的,但同时对行计数比较困难,最开始的思路是对回车符进行计数,如果有回车则计数器加一,但调用API查找相关方法后发现这种思路很难实现(至少在我的目前知识体系下很难实现),查找next()与nextLine()方法的异同点后想到了一行行的进行读取判断的方法;在第三题中最开始想用hasNextInt方法进行判断,但因为next相关方法的特点始终只能读取最后一个元素,分析过后发现这道题不像书中的例子一样需要判断,在Scanner的nextInt()方法实现过程中就包含了对数字有无的判断,最终果断舍弃,试验成功。
这次的实验让我对文本I/O的使用有了进一步的提高,在debug的过程中也学到了一些小技巧,总的来说是一次很成功的实验。
【题目一】
import java.util.Scanner;
public class Password {
public static void isValid(String s){
boolean jud = true;
if(s.length() < 8)jud = false;
int count = 0;
for(int i= 0; i <s.length();i++){
if(!Character.isDigit(s.charAt(i)) && !Character.isLetter(s.charAt(i)))jud = false;
if(Character.isDigit(s.charAt(i)))count++;
}
if(count < 2)jud = false;
if(jud)System.out.println("Valid Password");
else if(!jud)System.out.println("Invalid Password");
}
public static void main(String[] args) {
String string = new String();
Scanner input = new Scanner(System.in);
System.out.println("请输入需要测试的密码: ");
string = input.nextLine();
isValid(string);
}
}
【题目二】
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;
public class Count {
public static void main(String[] args) throws IOException {
File file = new File(args[0]);
if(file.exists()){
Scanner scanner = new Scanner(file);
int numOfLetter = 0;
int numOfWord = 0;
int numOfLine = 0;
while(scanner.hasNextLine()){
numOfLine++;
String c = scanner.nextLine();
Scanner scanner2 = new Scanner(c);
while(scanner2.hasNext()){
String string = scanner2.next();
numOfWord++;
for(int i = 0;i < string.length();i++){
if(Character.isLetter(c.charAt(i))){
numOfLetter++;
}
}
}
}
System.out.println("File "+file.getName()+" has");
System.out.println(numOfLetter + " Characters");
System.out.println(numOfWord + " Words");
System.out.println(numOfLine + " Lines");
}
else{
System.out.println("您的请求文件不存在,请重新输入");
}
}
}
【题目三】
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;
public class Reading {
public static void main(String[] args) throws IOException {
File file = new File("Exercise9_19.txt");
PrintWriter printWriter = new PrintWriter(file);
Random random = new Random();
for(int i = 0 ; i < 10 ; i++){
printWriter.print(random.nextInt(500) + " ");
}
printWriter.close();
Scanner scanner = new Scanner(file);
int[] num = new int[10];
for(int i =0; i < 10;i++){
num[i] = scanner.nextInt();
}
Arrays.sort(num);
for(int j = 0;j < 10;j++){
System.out.println(num[j]);
}
}
}