Java实验9 输入、输出流
实验9 输入、输出流
【实验目的】
掌握字符输入、输出流用法;掌握使用Scanner类解析文件。
【实验要求】
1、现在有如下格式的成绩单(文本格式)score.txt:
姓名:张三,数学72分,物理67分,英语70分.
姓名:李四,数学92分,物理98分,英语88分.
姓名:周五,数学68分,物理80分,英语77分.
要求按行读取成绩单,并在改行的后面加上该同学的总成绩,然后再将该行写入到一个名字为scoreAnalysis.txt的文件中。
2、使用Scanner类和正则表达式统计一篇英文中的单词,要求如下:
1)一共出现了多少个单词。
2)有多少个互不相同的单词。
3)按单词出现频率大小输出单词。
【效果示例】
示例1:

示例2:

【程序模板】
实验9.1 分析成绩单。 AnalysisResult.java代码如下:
import java.io.*;
import java.util.*;
public class AnalysisResult {
public static void main(String args[]) {
File fRead = new File("score.txt");
File fWrite = new File("socreAnalysis.txt");
try{
Writer out = 【代码1】//以尾加方式创建指向文件fWrite的out流
BufferedWriter bufferWrite = 【代码2】//创建指向out的bufferWrite流
Reader in = 【代码3】//创建指向文件fRead的in流
BufferedReader bufferRead =【代码4】//创建指向in的bufferRead流
String str = null;
while((str=bufferRead.readLine())!=null) {
double totalScore=Fenxi.getTotalScore(str);
str = str+" 总分:"+totalScore;
System.out.println(str);
bufferWrite.write(str);
bufferWrite.newLine();
}
bufferRead.close();
bufferWrite.close();
}
catch(IOException e) {
System.out.println(e.toString());
}
}
}
Fenxi.java代码如下:
import java.util.*;
public class Fenxi {
public static double getTotalScore(String s) {
Scanner scanner = new Scanner(s);
scanner.useDelimiter("[^0123456789.]+");
double totalScore=0;
while(scanner.hasNext()){
try{ double score = scanner.nextDouble();
totalScore = totalScore+score;
}
catch(InputMismatchException exp){
String t = scanner.next();
}
}
return totalScore;
}
}
实验9.2 统计英文单词。
上一实验的score.txt、goods.txt
WordStatistic.java代码如下:
import java.io.*;
import java.util.*;
public class WordStatistic {
Vector<String> allWord,noSameWord;
File file = new File("goods.txt");
Scanner sc = null;
String regex;
WordStatistic() {
allWord = new Vector<String>();
noSameWord = new Vector<String>();
//regex是由空格、数字和符号(!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~)组成的正则表达式
regex= "[\\s\\d\\p{Punct}]+";
try{
sc = 【代码5】 //创建指向file的sc
【代码6】//sc调用useDelimiter(String regex)方法,向参数传递regex
}
catch(IOException exp) {
System.out.println(exp.toString());
}
}
void setFileName(String name) {
file = new File(name);
try{
sc = new Scanner(file);
sc.useDelimiter(regex);
}
catch(IOException exp) {
System.out.println(exp.toString());
}
}
public void wordStatistic() {
try{
while(sc.hasNext()){
String word = sc.next();
allWord.add(word);
if(!noSameWord.contains(word))
noSameWord.add(word);
}
}
catch(Exception e){}
}
public Vector<String> getAllWord() {
return allWord;
}
public Vector<String> getNoSameWord() {
return noSameWord;
}
}
OutputWordMess.java代码如下:
import java.util.*;
public class OutputWordMess{
public static void main(String args[]) {
Vector<String> allWord,noSameWord;
WordStatistic statistic =new WordStatistic();
statistic.setFileName("score.txt");
【代码7】 //statistic调用wordStatistic()方法
allWord=statistic.getAllWord();
noSameWord=statistic.getNoSameWord();
System.out.println("共有"+allWord.size()+"个英文单词");
System.out.println("有"+noSameWord.size()+"个互不相同英文单词");
System.out.println("按出现频率排列:");
int count[]=new int[noSameWord.size()];
for(int i=0;i<noSameWord.size();i++) {
String s1 = noSameWord.elementAt(i);
for(int j=0;j<allWord.size();j++) {
String s2=allWord.elementAt(j);
if(s1.equals(s2))
count[i]++;
}
}
for(int m=0;m<noSameWord.size();m++) {
for(int n=m+1;n<noSameWord.size();n++) {
if(count[n]>count[m]) {
String temp=noSameWord.elementAt(m);
noSameWord.setElementAt(noSameWord.elementAt(n),m);
noSameWord.setElementAt(temp,n);
int t=count[m];
count[m]=count[n];
count[n]=t;
}
}
}
for(int m=0;m<noSameWord.size();m++) {
double frequency=(1.0*count[m])/allWord.size();
System.out.printf("%s:%-7.3f",noSameWord.elementAt(m),frequency);
}
}
}
【实验答案】
【代码1】:
【代码2】:
【代码3】:
【代码4】:
【代码5】:
【代码6】:
【代码7】:

浙公网安备 33010602011771号