PTA三次作业
1.前言:
第一次作业难度较大,从无到有的设计,涉及到的主要类有Paper,Question,AnswerPaper,Main,主要题目方向为字符串判断与字符串处理(提取有效信息),判断对错算总分,配合一些Java自带的数据结构如ArrayList即可快速解决问题,第一次作业是后面作业的基础,需自行了解正则表达式等方法。第二次作业难度适中,题目在第一次作业前提下添加了试卷类,涉及较为复杂类引用,需要对类的引用有一定了解。第三次作业难度最高,在前两次作业基础上添加学生信息及删除题号,还添加了许多错误提醒及错误提醒优先级显示。这三次作业的难度可以说是逐次递增,需要学生在第一次作业建立良好的类结构,并在第二次作业中添加类,以及第三次作业给删除的题目添加标记以执行语句都是难点。这三次PTA作业考察了学生构建程序框架的能力,以及正则表达式提取所需信息,ArrayList储存内容等方面的知识。
2.设计与分析:
第一次作业:
只需用AnswerPaper判断,Paper储存Question数组。由于当时还未学习ArrayList,使用数组储存,设计上采用两个字符串数组,一个数组装题目(题号与题目对应),一个数组装写的答案(题号与标准的答案对应),传递到AnswerPaper中进行比较。Question类封装题目信息,包括题号、题目内容、标准答案、作答;最后再将Question类封装进AnswerPaper类,其方法为判断答案与标准答案是否相同,最后进行输出。
建立Question类储存数据
点击查看源码
class Question{
private int num;
private String content;
private String standard_answer;
private String answer;
private boolean result;
public Question(){}
public Question(int num,String content,String standard_answer,String answer,boolean result){
this.num=num;
this.content=content;
this.standard_answer=standard_answer;
this.answer=answer;
this.result=result;
}
public String getStandard_Answer(){
return standard_answer;
}
public void setStandard_Answer(String standard_answer){
this.standard_answer=standard_answer;
}
public String getContent(){
return content;
}
public void setContent(String content){
this.content=content;
}
public int getNum(){
return num;
}
public void setNum(int num){
this.num=num;
}
public void setAnswer(String answer){
this.answer=answer;
}
public String getAnswer(){
return answer;
}
public void setResult(boolean result){
this.result=result;
}
public boolean getResult(){
return this.result;
}
public boolean TF(){
if(standard_answer==answer)
{
result=true;
}
else
{
result=false;
}
return result;
}
}
建立AnswerPaper类以便判断
点击查看源码
class AnswerPaper{
private Paper paper;
private Question []question=new Question[1000];
public AnswerPaper(Paper paper,String str,int num){
this.paper=paper;
String answer1;
boolean result;
String strs[]=str.split(" #");
for(int i=0;i<strs.length;i++)
{
String strs1[]=strs[i].split(":");
strs1[1]=strs1[1].trim();
answer1=strs1[1];
if(answer1.equals(this.paper.getQuestionAnswer(i+1)))
{
result=true;
}
else
{
result=false;
}
Question que=new Question(i+1,paper.getQuestionContent(i+1),paper.getQuestionAnswer(i+1),answer1,result);
question[i]=que;
}
}
public String getPaperAnswer(int i){
return question[i-1].getAnswer();
}
public String getPaperResult(int a){
String str=String.valueOf(question[0].getResult());
for(int i=1;i<a;i++)
{
str=str+" "+String.valueOf(question[i].getResult());
}
return str;
}
}
建立Paper类以储存Question数组,提取题目内容
点击查看源码
class Paper{
private int num;
private Question []question=new Question[1000];
private int flag=1;
public Paper(){}
public Paper(int num){
this.num=num;
}
public void setNum(int num){
this.num=num;
}
public int getNum(){
return num;
}
public void setQuestion(String str){
String strs[]=str.split(" #");
String strs1[]=strs[0].split(":");
strs1[1]=strs1[1].replaceAll(" ","");
int i=Integer.parseInt(strs1[1]);
String strs2[]=strs[1].split(":");
strs2[1]=strs2[1].trim();
String strs3[]=strs[2].split(":");
strs3[1]=strs3[1].replaceAll(" ","");
Question que=new Question(i,strs2[1],strs3[1],null,true);
question[i-1]=que;
}
public String getQuestionAnswer(int i){
return question[i-1].getStandard_Answer();
}
public String getQuestionContent(int i){
return question[i-1].getContent();
}
}
SourceMontor的生成报表如下
类图如下
第二次作业:
第二次作业在第一次作业的基础上增加了试卷和答卷,其中试卷中包括题目的序号以及分值。试卷中极有可能有多道题,这就导致可能会出现答案不全的情况(试卷中的题目并没有全都被作答)。在输出部分,第二次作业比第一次作业多了试卷满分不是100分、答卷缺失部分答案、无效的试卷号。在输入格式方面,第二次作业的格式与第一次作业的格式要求没有变化,因为没有错误要求,所以输入的都为正确格式,正则表达式的作用也只是将输入的字符串分成几个部分。此次作业使用了类,但是并没有遵守或运用单一职责原则、开闭原则、迪米特法则,且许多判定过程写在了主方法中,而不是写在类中作为类的方法,更没有代理类。因为在敲之前,很多逻辑部分并没有思考清楚,导致代码出现了许多的冗余及不必要的代码,但又担心删掉那部分之后代码无法正常运行,所以为了完成作业得到较高的分数就没有修改。这次作业中,我深刻意识到了写注释的重要性。前几次提交之后,我发现代码的逻辑有些问题。但当我回头看我的代码的时候,我已经看不懂我原来的写的内容了。一方面是因为,代码更多的是面向过程而非面向对象,另一方面就是因为没有写注释了。写注释不仅有益于在写代码过程中清晰自己的逻辑,更有益于改代码过程中读懂自己之前写的代码。
SourceMontor的生成报表如下:
可见代码存在许多的不足(方法的功能较为单一、最复杂方法行的数量过高有待优化、代码中的块结构相对简单、注释少等),大多是由于基础知识不扎实,但第二次作业是在第一次作业基础上完成的,难度有所降低。在第一次作业基础上,我将提取有效内容功能放在了main中,用上了ArrayList传递数据,将作答部分写成新类——Answer——代码如下:
点击查看代码
class Answer{
private String answer;
private int grade;
public Answer(String answer){
this.answer=answer;
}
public String getAnswer(){
return answer;
}
public void setGrade(int grade){
this.grade=grade;
}
public int getGrade(){
return grade;
}
}
在Paper类中添加分数数组以求试卷总分——代码如下:
点击查看代码
class Paper{
private int num;
private int score_sum;
private int question_sum;
private ArrayList<Question> list = new ArrayList<>();
private int score[];
public Paper(int num,int questionnum[],int score[],ArrayList<Question> listQuestion)
{
this.num=num;
this.score=score;
this.question_sum=questionnum.length-1;
for(int i=1;i<score.length;i++)
{
this.score_sum+=this.score[i];
}
for(int i=1;i<questionnum.length;i++)
{
for(Question t:listQuestion)
{
if(questionnum[i]==t.getNum())
{
list.add(t);
}
}
}
}
public ArrayList<Question> getList(){
return list;
}
public int getSum()
{
return score_sum;
}
public int getNum(){
return num;
}
public int getScore(int i){
return score[i+1];
}
}
减少了AnswerPaper功能,使该类的功能更明显,更多在Main中实现——代码如下:
点击查看代码
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
ArrayList<Question> listQuestion = new ArrayList<>();
ArrayList<Paper> listPaper = new ArrayList<>();
ArrayList<AnswerPaper> listAnswerPaper = new ArrayList<>();
String str=scanner.nextLine();
while(!str.equals("end"))
{
if(str.indexOf("#N")!=-1)
{
String strs[]=str.split(" #");
String strs1[]=strs[0].split(":");
strs1[1]=strs1[1].replaceAll(" ","");
int i=Integer.parseInt(strs1[1]);
String strs2[]=strs[1].split(":");
strs2[1]=strs2[1].trim();
String strs3[]=strs[2].split(":");
strs3[1]=strs3[1].replaceAll(" ","");
Question question=new Question(i,strs2[1],strs3[1]);
listQuestion.add(question);
}
if(str.indexOf("#T")!=-1)
{
String strs[]=str.split(" ");
String strs1[]=strs[0].split(":");
int questionnum[]=new int [strs.length];
int score[]=new int [strs.length];
int i=Integer.parseInt(strs1[1]);
for(int j=1;j<strs.length;j++)
{
String strs2[]=strs[j].split("-");
questionnum[j]=Integer.parseInt(strs2[0]);
score[j]=Integer.parseInt(strs2[1]);
}
Paper paper=new Paper(i,questionnum,score,listQuestion);
listPaper.add(paper);
}
if(str.indexOf("#S")!=-1)
{
ArrayList<Answer> listAnswer = new ArrayList<>();
String strs[]=str.split(" #");
String strs1[]=strs[0].split(":");
strs1[1]=strs1[1].replaceAll(" ","");
int i=Integer.parseInt(strs1[1]);
for(int j=1;j<strs.length;j++)
{
String strs2[]=strs[j].split(":");
Answer answer=new Answer(strs2[1]);
listAnswer.add(answer);
}
AnswerPaper answerPaper=new AnswerPaper(i,listAnswer);
listAnswerPaper.add(answerPaper);
}
str=scanner.nextLine();
}
for (int i = 0; i < listPaper.size(); i++) {
if(listPaper.get(i).getSum()!=100)
{
System.out.println("alert: full score of test paper"+listPaper.get(i).getNum()+" is not 100 points");
}
}
int flag=1;
for(AnswerPaper r : listAnswerPaper)
{
flag=1;
for (Paper p:listPaper)
{
if(r.getNum()==p.getNum())
{
flag=0;
for(int i = 0; i < p.getList().size()&& i < r.getList().size(); i++)
{
Question w=p.getList().get(i);
Answer x=r.getList().get(i);
System.out.print(w.getContent()+"~"+x.getAnswer()+"~");
if(w.getStandard_Answer().equals(x.getAnswer()))
{
System.out.println("true");
x.setGrade(p.getScore(i));
r.setSum(p.getScore(i));
}
else
{
System.out.println("false");
x.setGrade(0);
}
}
for(int i = 0; i < p.getList().size() - r.getList().size(); i++)
{
System.out.println("answer is null");
}
for(int i = 0; i < p.getList().size(); i++)
{
if(i < r.getList().size())
{
Answer x=r.getList().get(i);
System.out.print(x.getGrade());
}
else
System.out.print("0");
if(i!=p.getList().size()-1)
System.out.print(" ");
else
System.out.print("~");
}
System.out.println(r.getSum());
}
}
}
if(flag==1)
System.out.println("The test paper number does not exist");
}
}
class AnswerPaper{
private int num;
private int sum;
private ArrayList<Answer> list = new ArrayList<>();
public AnswerPaper(int num,ArrayList<Answer> listAnswer){
this.num=num;
for(Answer t:listAnswer)
{
list.add(t);
}
}
public int getNum(){
return num;
}
public ArrayList<Answer> getList(){
return list;
}
public void setSum(int grade){
this.sum+=grade;
}
public int getSum(){
return sum;
}
}
Question类用于储存数据,基本不变,减少了未使用的get/set方法,简化代码——代码如下:
点击查看代码
class Question{
private int num;
private String content;
private String standard_answer;
public Question(int num,String content,String standard_answer){
this.num=num;
this.content=content;
this.standard_answer=standard_answer;
}
public int getNum(){
return num;
}
public String getContent(){
return content;
}
public String getStandard_Answer(){
return standard_answer;
}
}
类图如下:
第三次作业:
第三次作业结束了几天,至今仍有心理阴影,心理路程依旧记忆犹新,不仅是正则表达式学习实践每每出错,难以改正,split的使用出现非零返回,耗费心力,而且删减的过程也是困难重重(会在采坑心得内分析),我的得分很低,该代码多用于避坑,辩证性看待分析。
第三次作业在第二次作业的基础上增加了删除题目和学生信息,这就使在输出部分多了找不到学生信息以及题目被删出,另外,作业中还增加了引用本来就不存在的题目等错误情况,并要求错误优先级显示。这次作业我做出了一部分改进,使代码变得复杂度降低一些,且开始有意识的遵循或运用单一职责原则、开闭原则、迪米特法则。
第三次作业增加了错误格式这一部分。我便没有办法像前两次作业一样只用split切割输入语句,增加了Matcher和Pattern的运用。在运用错误格式这里,我卡了很久,卡的测试点中错误表达式就占了两种类型(8个点)。重写了很久pattern.compile和输入部分的代码,后尝试改回split,但效果不佳。感觉不是什么技术问题、逻辑问题、理解问题或者设计问题,可能是做事不够仔细认真,对正则表达式理解不够彻底。
第三次作业增加了Student类——代码如下:
点击查看代码
class Student{
private String num;
private String name;
public Student(String num,String name){
this.num=num;
this.name=name;
}
public String getNum(){
return num;
}
public String getName(){
return name;
}
}
用作链表的类储存数据。尝试在Paper类中添加判断题目序号有效与否——代码如下:
点击查看代码
class Paper{
private int num;
private int score_sum;
private int question_sum;
private ArrayList<Question> list = new ArrayList<>();
private int score[];
private boolean haveque=true;
public Paper(int num,int questionnum[],int score[],ArrayList<Question> listQuestion)
{
this.num=num;
this.score=score;
this.question_sum=questionnum.length-1;
for(int i=1;i<score.length;i++)
{
this.score_sum+=this.score[i];
}
for(int i=1;i<questionnum.length;i++)
{
for(Question t:listQuestion)
{
if(questionnum[i]==t.getNum())
{
list.add(t);
this.haveque=true;
}
else
{
this.haveque=false;
}
}
}
}
public ArrayList<Question> getList(){
return list;
}
public int getSum()
{
return score_sum;
}
public boolean getHaveque()
{
return haveque;
}
public int getNum(){
return num;
}
public int getScore(int i){
return score[i+1];
}
}
同时在Main中输出是添加判断条件——代码如下:
点击查看代码
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
ArrayList<Question> listQuestion = new ArrayList<>();
ArrayList<Student> listStudent = new ArrayList<>();
ArrayList<Paper> listPaper = new ArrayList<>();
ArrayList<AnswerPaper> listAnswerPaper = new ArrayList<>();
String str=scanner.nextLine();
int num_of_cut=0;
while(!str.equals("end"))
{
Pattern pattern = Pattern.compile("^#N:(.*)\\s#Q:(.*)\\s+#A:(.*)");
Matcher matcher = pattern.matcher(str);
Pattern pattern2 = Pattern.compile("^#T:(\\d+)(\\s+(\\d+-\\d+))*$");
Matcher matcher2 = pattern2.matcher(str);
Pattern pattern3 = Pattern.compile("^#S:(\\d+)\\s+(\\d+)(.*)");
Matcher matcher3 = pattern3.matcher(str);
Pattern pattern4 = Pattern.compile("^#X:(\\d+)\\s+(\\w+)(-\\d+\\s\\w+)*$");
Matcher matcher4 = pattern4.matcher(str);
Pattern pattern5 = Pattern.compile("^#D:N\\-(\\d+)$");
Matcher matcher5 = pattern5.matcher(str);
if(matcher.find())
{
String num=matcher.group(1);
String que=matcher.group(2);
String ans=matcher.group(3);
int i=Integer.parseInt(num);
Question question=new Question(i,que,ans);
listQuestion.add(question);
}
else if(matcher2.find())
{
String num=matcher2.group(1);
String text=matcher2.group(2);
String strs[]=text.split("\\s+");
int numofp=Integer.parseInt(num);
int questionnum[]=new int [strs.length];
int score[]=new int [strs.length];
for(int j=1;j<strs.length;j++)
{
String strs2[]=strs[j].split("-");
questionnum[j]=Integer.parseInt(strs2[0]);
score[j]=Integer.parseInt(strs2[1]);
}
Paper paper=new Paper(numofp,questionnum,score,listQuestion);
listPaper.add(paper);
}
else if(matcher3.find())
{
ArrayList<Answer> listAnswer = new ArrayList<>();
String num=matcher3.group(1);
String nums=matcher3.group(2);
String text=matcher3.group(3);
String strs[]=text.split("\\s+#A:");
int numofap=Integer.parseInt(num);
for(int j=1;j<strs.length;j++)
{
String strs2[]=strs[j].split("-");
int num_of_que=Integer.parseInt(strs2[0]);
Answer answer=new Answer(num_of_que,strs2[1]);
listAnswer.add(answer);
}
AnswerPaper answerPaper=new AnswerPaper(numofap,nums,listAnswer);
listAnswerPaper.add(answerPaper);
}
else if(matcher4.find())
{
String text1=matcher4.group(1);
String text=matcher4.group(2);
Student student=new Student(text1,text);
listStudent.add(student);
String text2=matcher4.group(3);
if(text2!=null)
{
String strs3[]=text2.split("-");
for (String part : strs3)
{
if (part.length() > 8)
{
String date = part.substring(0, 8);
String nameOrIdentifier = part.substring(8);
Student student2 = new Student(date, nameOrIdentifier);
listStudent.add(student2);
}
}
}
}
else if(matcher5.find())
{
String num=matcher5.group(1);
num_of_cut=Integer.parseInt(num);
}
else
{
System.out.println("wrong format:"+str);
}
str=scanner.nextLine();
}
for (int i = 0; i < listPaper.size(); i++) {
if(listPaper.get(i).getSum()!=100)
{
System.out.println("alert: full score of test paper"+listPaper.get(i).getNum()+" is not 100 points");
}
}
int flag=1;
for(AnswerPaper r : listAnswerPaper)
{
flag=1;
for (Paper p:listPaper)
{
if(r.getNum()==p.getNum())
{
flag=0;
for(int i = 0; i < p.getList().size()&& i < r.getList().size(); i++)
{
Question w=p.getList().get(i);
Answer x=r.getList().get(i);
if(w.getNum()==num_of_cut)
{
x.setGrade(0);
System.out.println("the question "+w.getNum()+" invalid~0");
}
else
{
if(p.getHaveque())
{
System.out.print(w.getContent()+"~"+x.getAnswer()+"~");
if(w.getStandard_Answer().equals(x.getAnswer()))
{
System.out.println("true");
x.setGrade(p.getScore(i));
r.setSum(p.getScore(i));
}
else
{
System.out.println("false");
x.setGrade(0);
}
}
else
{
System.out.println("non-existent question~0");
x.setGrade(0);
}
}
}
for(int i = 0; i < p.getList().size() - r.getList().size(); i++)
{
System.out.println("answer is null");
}
int flag1=0;
for(int j = 0;j<listStudent.size();j++){
if(r.getNums().equals(listStudent.get(j).getNum()))
{
System.out.print(r.getNums()+" "+listStudent.get(j).getName()+": ");
for(int i = 0; i < p.getList().size(); i++)
{
if(i < r.getList().size())
{
Answer x=r.getList().get(i);
System.out.print(x.getGrade());
}
else
System.out.print("0");
if(i!=p.getList().size()-1)
System.out.print(" ");
else
System.out.print("~");
}
System.out.println(r.getSum());
flag1=1;
break;
}
}
if(flag1==0)
{
System.out.println(r.getNums()+" not found");
}
}
}
}
if(flag==1)
System.out.println("The test paper number does not exist");
}
}
其他类没有思路去修改
SourceMontor的生成报表如下:
根据此报表,以下是改进方向:
减少方法调用:方法调用可能会导致代码执行效率降低。尝试合并或简化方法调用,以减少方法的调用次数。
增加注释:注释严重不足,有很多的空间来添加注释,从而提高代码的可读性和维护性。
优化类和接口:确保类的结构和接口的设计是合理的。避免过度耦合,尽量保持类的独立性。
控制方法复杂度:平均每方法语句数过多,这可能表明某些方法过于复杂。尝试分解这些方法为更小的、更专注的部分。
管理块深度:最大块深度为太大,这可能会影响代码的性能。优化块结构,使其更加扁平化,以减少执行时间。
类图如下:
采坑心得:
第一次作业:在answer1.equals(this.paper.getQuestionAnswer(i+1))判断时用equals不要直接用=,用等号过不了;
如图:
Question类可简化出Answer类;
第二次作业:提取时用正则表达式会更加方便快捷;
第三次作业:这段代码中,我将spilt改为固定数提取,因为我发现在测试用例中20201103 Tom-20201104 Jack-20201105 Www检测不出空格,应该是无空格,测试用例中的空格不存在。
点击查看代码
if(text2!=null)
{
String strs3[]=text2.split("-");
for (String part : strs3)
{
if (part.length() > 8)
{
String date = part.substring(0, 8);
String nameOrIdentifier = part.substring(8);
Student student2 = new Student(date, nameOrIdentifier);
listStudent.add(student2);
}
}
}
正则表达式中提取输入链表储存过程中提取会少数据,应该是Pattern.compile部分出错;
如图:
试卷题目数明显少了。
改进建议:
第三次作业中,判定题目删减时用HashMap会好很多。
正则表达式的Pattern.compile有待改准。
第二次作业中,输入提取部分改用正则表达式提取。
写代码时提前画好类图以减少遗漏。
总结:
1.学到了:
Java是一门纯粹的面向对象语言,因此理解类、对象、继承、多态和封装这些OOP概念至关重要。这些概念是Java编程的核心。
理论知识很重要,但没有实践是不够的。尝试编写自己的程序,从简单的“Hello World”开始,逐步增加难度。通过实际编码,可以更好地理解概念,并学会如何解决问题。
Java拥有丰富的标准库,提供了许多预制的类和接口,用于处理文件、网络、数据库等。熟悉这些库可以节省编写代码的时间,并提高代码的质量。
编写清晰、可读的代码比仅仅让代码工作更重要。遵循良好的编码习惯,使用有意义的变量名和方法名,添加注释,这些都是编写可维护代码的关键。
Java中有许多提前设计好的便捷方法供我们使用,多学习有利于减少冗余代码,如:HashMap与ArrayList等。
2.需要进一步学习及研究:
在写代码之前,要将整个代码的逻辑部分设计好,避免出现写到中途手忙脚乱的现象。
提升代码的可复用性,注重设计中的开闭原则。
每次写完代码都会出现数组越界的情况,原因大概是思考逻辑时,无法面面俱到。多敲代码以提升自己的思考能力以及逻辑能力。画设计图、类图是个不错的选择。
对正则表达式理解、运用仍有不足。
3.建议:
希望老师能提前推荐更多用得上方法帮助作业完成。
希望测试点点明测试方向。
希望老师能演示类之间引用的例子,讲方法时更深入些,讲些多出现的特例。
PTA三次作业的更多相关文章
- C语言第三次作业总结
本次作业的亮点 总体情况 大部分同学基本掌握了单层循环结构的写法,懂得了代码调试的过程 PTA通过率及作业质量都不错,希望再接再厉 推荐博客 黄毓颖 推荐理由:代码思路清晰,格式良好:调试过程相当形象 ...
- C语言程序设计第三次作业--选择结构(1)
Deadline: 2017-10-29 22:00 一.学习要点 掌握关系运算符和关系表达式 掌握如何判断两个实数相等 掌握常用数学函数的使用 掌握逻辑运算符和逻辑表达式 理解逻辑运算的短路特性 掌 ...
- 【西北师大-2108Java】第三次作业成绩汇总
[西北师大-2108Java]第三次作业成绩汇总 熟悉PTA平台线上测试环境: 理解用户自定义类的定义: 掌握对象的声明: 学会使用构造函数初始化对象: 使用类属性与方法的使用掌握使用: 掌握pack ...
- java第三阶段作业总结
Java第三阶段总结 前言 到这里,Java课程学习进入了尾声,在这学习过程中,我学习到很多,也发现了自己的很多不足,这篇博客主要针对的是Java整门课程学习的总结. 课程收获 对整门课程的学习,我有 ...
- 耿丹CS16-2班第三次作业汇总
-- Deadline: 2016-10-12 22:48 -- 作业内容: 1.实验2-6 猜数字游戏 2.实验2-7 判断能否为三角形 3.实验2-8 个人所得税计算器 -- 第三次作业总结: 1 ...
- JAVA第三周作业(从键盘输入若干数求和)
JAVA第三周作业(从键盘输入若干数求和) 在新的一周,我学习了JAVA的IO编程.下面的代码实现了从键盘输入若干数求和的目标.import java.util.Scanner; public cla ...
- 第三次作业:caculator
第三次作业 作业链接 ********* 遇到的问题: Scan类: 队列的使用方法不了解,上网查询并自己练习了一下才初步了解,才运用到作业 . 判断数字用的 if (input[i] >= ' ...
- HTML第三天作业做的表格
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...
- 第三次作业——《K米评测》
第三次作业--<K米评测> 一.调研.评测 上手体验 APP的图标做的不错,一眼就知道和KTV唱歌相关的 点进去就是连接包箱的界面和直播界面,把软件最重要的两个功能展示出来了,一目了然 热 ...
- 软件工程(QLGY2015)第三次作业点评(含成绩)
相关博文目录: 第一次作业点评 第二次作业点评 第三次作业点评 团队信息 本页点评团队1-22,其他组见:http://www.cnblogs.com/xiaozhi_5638/p/4490764.h ...
随机推荐
- 【风控算法】二、SQL->Python->PySpark计算KS,AUC及PSI
KS,AUC 和 PSI 是风控算法中最常计算的几个指标,本文记录了多种工具计算这些指标的方法. 生成本文的测试数据: import pandas as pd import numpy as np i ...
- autohotkey 设置快捷键 设置光标位置 (ctrl + alt + Numpad0)
autohotkey 设置快捷键 设置光标位置 (ctrl + alt + Numpad0) 原因 3个屏幕,所以鼠标设置的灵敏度非常高,经常就找不到鼠标在哪了. 设置个快捷键,让鼠标每次都初始化一个 ...
- 动态挂载指定vue组件 Vue.extend $mount('#aaa111')
模板中要有定位 <template> <div id="aaa111"></div> </template> 指定某个函数执行 im ...
- 2.4G无线音频一对多传输解决方案难点解析
前记 2.4G无线音频传输是一个非主流的应用,做这个的人 相对要比较少.但是,这个领域所涉及到的知识却不少,也就导致了这个领域是好入门,但是东西想做好特别难.这里涉及到声学,无线协议,电子,设 ...
- cpp面向对象
面向对象编程 目录 面向对象编程 类 拷贝构造函数 常量函数 友元 友元函数 友元类 静态成员 重载函数 函数重载 操作符重载 继承 多态 虚函数 虚析构函数 1.虚析构函数的作用:避免内存泄漏. 2 ...
- Serverless学习笔记
Serverless 闲言碎语 前段时间看了一些Serverless的文章,恰好最近又听了一门Serverless的应用实践课程,就把笔记拿出来和大家分享一下,如表述有误还请各位斧正 大家关心的问题 ...
- 基于Rust的Tile-Based游戏开发杂记(02)ggez绘图实操
尽管ggez提供了很多相关特性的[demo](ggez/examples at master · ggez/ggez (github.com))供运行查看,但笔者第一次使用的时候还是有很多疑惑不解.经 ...
- JS(运算符、流程控制)
一 运算符(操作符) 1 运算符的分类 运算符(operator)也被称为操作符,是用于实现赋值.比较和执行算数运算等功能的符号. JavaScript中常用的运算符有: 算数运算符 递增和递减运算符 ...
- 安装npm install报错npm ERR! code ETIMEDOUT npm ERR! errno ETIMEDOUT npm ERR! network request to https://registry.npmjs.org/webpack-subresource-integrity failed, reason
执行命令:npm run dev 启动前端项目报如下错误,vue-cli-service是Vue一个启动的插件,需要安装 D:\nodejs\npm.cmd run dev > yuntan1h ...
- 你对SPA单页面的理解,它的优缺点分别是什么?如何实现SPA应用呢?
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.什么是SPA SPA(single-page application),翻译过来就是单页应用SPA是一种网络应用程序或网站的模型,它通 ...