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//以尾加方式创建指向文件fWriteout

            BufferedWriter bufferWrite = 【代码2//创建指向outbufferWrite

            Reader in = 【代码3//创建指向文件fReadin

            BufferedReader bufferRead =【代码4//创建指向inbufferRead

            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.txtgoods.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 //创建指向filesc

          【代码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】:  

 

 

posted @ 2020-02-22 19:36  imanuu  阅读(52)  评论(0)    收藏  举报