题干
《面向对象程序设计》课程设计题目
第2题唐诗学习系统
【涉及知识点】。
1. Java语言的文件操作
2. Java中的异常处理
3.数据的输入和输出。
4. String、StringBuilder和StringBuffer的应用;
【题目介绍】
为什么要学习唐诗?你去旅游,看到了美景,别人在说,这儿风景真好,鸟真多。读唐诗的你却可以脱口而出:
雁引愁心去,山衔好月来。
大学毕业,朝夕相处四年的舍友各奔东西。临行前的聚会,每个人眼眶红红的,想说点啥,但是又不知道说什么。
你若读过唐诗,你就会安慰好友:某愁前路无知己,天下谁人不识君。
所以,我们有必要设计一款“唐诗学习系统”,来帮助大家学习古诗,陶冶情操。
【功能要求】
【基础功能】
给出一个文本文档“唐诗三百首. txt”,内容是一些唐朝诗人的选集。观察此文件的内容格式,完成下列工作:
1、读取“唐诗三百首:txt”,将其全部内容追加到一个字符串对象中
2、采取合适的手段分离出每首诗呢?,然后执行如下操作:
(1)按标题搜索一首诗;
(2)按作者搜索诗集,返回这位作者的所有唐诗;
(3)按某个词语或者诗句搜索诗,返回包含特定内容的所有唐诗;
(4)随机选取一首诗,显示其标题和内容,让用户猜这首诗的作者是谁,并显示结果。【扩展功能】
另创建一个文件夹“诗人”,遍历“唐诗三百首. txt”中所有的诗,按作者分类,
在“诗人”文件夹中为每个作者创建一个txt文件,将此作者的诗集复制到此文件中。
learnPoem类
package com.xbmu.LearnTangDynasty;
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
public class learnPoem {
static Scanner scan = new Scanner(System.in);
public static void main(String[] args) throws IOException {
//打印展示界面
showPrint print = new showPrint();
print.Show();
//功能选择
functionSelect select = new functionSelect();
select.Select();
}
}
showPrint类
package com.xbmu.LearnTangDynasty;
//打印展示界面类
public class showPrint {
//打印界面
public void Show(){
System.out.println(" 大家一起学唐诗吧! ");
System.out.println("*********************************************");
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
System.out.println("~~ ~~");
System.out.println("~~ 请按1: 读取唐诗文件 ~~");
System.out.println("~~ 请按2: 按标题查唐诗 ~~");
System.out.println("~~ 请按3: 按诗人查唐诗 ~~");
System.out.println("~~ 请按4: 按诗句查唐诗 ~~");
System.out.println("~~ 请按5: 看唐诗猜诗人 ~~");
System.out.println("~~ 请按6: 按作者导出文件 ~~");
System.out.println("~~ 请按0: 退出本次学习 ~~");
System.out.println("~~ ~~");
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
}
}
functionSelect类
package com.xbmu.LearnTangDynasty;
import java.io.IOException;
import java.util.Scanner;
//功能选择类
public class functionSelect {
Scanner scan = new Scanner(System.in);
functionRealize realize = new functionRealize();
//功能选择方法
public void Select() throws IOException {
String [] readContent = null;
while (true){
System.out.println("请选择:");
int number = scan.nextInt();
switch (number){
case 1:{
readContent = realize.Read();
System.out.println("文件导入完毕.");
break;
}
case 2:{
System.out.println("请输入标题:");
String title = scan.next();
realize.Title (title, readContent);
break;
}
case 3:{
System.out.println("请输入诗人姓名:");
String poetName = scan.next();
realize.Poet(poetName, readContent);
break;
}
case 4:{
System.out.println("请输入诗句:");
String sentence = scan.next();
realize.Sentencce(sentence, readContent);
break;
}
case 5:{
realize.guessPoet(readContent);
break;
}
case 6:{
realize.poetSortFile(readContent);
break;
}
case 0:{
System.out.println("你已成功退出本次学习.");
System.exit(0);
}
default:{
System.out.println("无效选择!\n");
}
}
}
}
}
functionRealize类
package com.xbmu.LearnTangDynasty;
import java.io.*;
import java.util.Random;
import java.util.Scanner;
//功能实现类
public class functionRealize {
static Scanner scan = new Scanner(System.in);
//读取唐诗文件实现方法
public static String[] Read() throws IOException {
BufferedReader br = new BufferedReader(new FileReader("D:\\Project\\CurriculumDesign\\src\\com\\xbmu\\LearnTangDynasty\\dynastyPoem\\唐诗三百首.txt"));
char[] ch = new char[1024];
int len;
StringBuilder builder = new StringBuilder();//创建StringBuilder对象
while ((len=br.read(ch)) != -1){//将字符读入数组,如果到达流末尾则返回-1
builder.append((new String(ch,0,len))); //在原有字符串尾部添加新的字符串
}
br.close();
String str = builder.toString();//将builder中的数据已字符串形式返回
String[] allPart = str.split("\n\n");//把每一首诗分开,观察文件“唐诗三百首.txt”内容,每首诗结束为两个换行“\t\t”,而不是“。”
return allPart;
}
//按标题查找诗
public static void Title(String title, String[] readContent) throws IOException{
System.out.println("找出的唐诗显示如下:");
System.out.println("---------------");
//遍历每一首诗
for (String str: readContent){
String[] row = str.split("\n");
if (row[0].equals(title)){
System.out.println(str + "\n");
}
}
System.out.println("---------------");
}
//按诗人姓名查找
public static void Poet(String poetName, String[] readContent) throws IOException{
int cnt = 0;
System.out.println("[" + poetName + "] 诗词全集:");
System.out.println("---------------");
for (String str: readContent){
String[] row = str.split("\n");
String[] poet = row[1].split(":");
if (poet[1].equals(poetName)){
System.out.println("第 " + ++ cnt + " 首:\n" + str + "\n");
}
}
System.out.println("---------------");
}
//按诗句查找
public static void Sentencce(String sentence, String[] readContent) throws IOException{
System.out.println("包含 ”" + sentence + "“ 诗句的唐诗:");
System.out.println("----------------");
for (String str1: readContent){//遍历每一首诗
String[] row = str1.split("\n");//将每一首诗分割为每一行
for (String str2: row){//遍历每一行
String[] wipeSymbol = str2.split(",|。|?|!");//将每一句诗末尾的标点符号去掉
for (String str3: wipeSymbol){
if (str3.equals(sentence)){
System.out.println(str1 + "\n");
}
}
}
}
System.out.println("---------------");
}
//猜诗人
public static void guessPoet(String[] readContent) throws IOException{
Random random = new Random();
System.out.println("随机选出的唐诗为:");
System.out.println("----------------");
int rand = random.nextInt(52);//随机数确定诗的索引
String[] row = readContent[rand].split("\n");//将随机选出的诗分割成每一行
for (int i = 0; i < row.length; i ++){//遍历分割后的诗的每一行
if (i != 1){//不打印作者行
System.out.println(row[i]);
}
}
String[] PoetName = row[1].split(":");//将作者行分割,得到单独的诗人姓名
System.out.println("----------------");
System.out.println("这首诗的作者是谁呢?");
String poetName = scan.next();
if (PoetName[1].equals(poetName)){//PoetName[1]就是完整的诗人姓名
System.out.println("恭喜你,猜对啦!");
}else {
System.out.println("很遗憾,你猜错了! 这首诗的作者是: " + PoetName[1]);
}
}
//按作者导出文件
public static void poetSortFile(String[] readContent) throws IOException{
//创建作者集文件
for (String str: readContent){ //遍历每一首诗
String[] row = str.split("\n");//将每一首诗按行分割
String[] poet = row[1].split(":");//取出诗人姓名,poet[1]即为诗人姓名
File file = new File("D:\\Project\\CurriculumDesign\\src\\com\\xbmu\\LearnTangDynasty\\poetClassify\\" + poet[1] + ".txt");
if (!file.exists()){//判断该文件是否存在,不存在就创建.
file.createNewFile();
}
}
//按作者将诗写入作者集文件
File file = new File("D:\\Project\\CurriculumDesign\\src\\com\\xbmu\\LearnTangDynasty\\poetClassify");
String[] poetList = file.list();
for (String str1: poetList){//遍历file文件夹对象下的文件
String[] filePoet = str1.split("\\.");//按“.”分割文件名,分割后filePoet[0]即为诗人姓名.
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\Project\\CurriculumDesign\\src\\com\\xbmu\\LearnTangDynasty\\poetClassify\\" + str1));
for (String str2: readContent){//遍历每一首诗
String[] row = str2.split("\n");//将每一首诗按行分割
String[] poet = row[1].split(":");//将每首诗的第二行row[1]按“.”分割得到诗人姓名poet[1]
if (poet[1].equals(filePoet[0])){//按诗人姓名写入作者集合文件中
bw.write(str2 + "\n\n");
}
}
bw.close();
}
System.out.println("操作完毕! 已按作者导出诗集.");
}
}
冒昧请问一下,博主的java语言程序设计老师是不是冯金栋冯老师。
兄弟你叫啥,我和老师说去
老师让我来问的
实在抱歉,近半年没有登录关注消息,冯老师确实是我的专业老师,带过WEB开发课程。