From 518d86a85c74132a67fc47b565c6d4009874b3e5 Mon Sep 17 00:00:00 2001 From: Simon Barrett <barretts1@cardiff.ac.uk> Date: Thu, 13 Jan 2022 19:20:44 +0000 Subject: [PATCH] Uploading to Gitlab --- .idea/.name | 1 + .idea/artifacts/1218123_jar.xml | 8 + Submission/1218123_SourceCode+LessonData.zip | Bin 0 -> 18885 bytes Submission/CreateALessonTemplate.txt | 21 ++ Submission/Lesson.java | 136 ++++++++++++ .../CSSLesson.txt | 65 ++++++ .../DataTypes.txt | 40 ++++ .../HTMLlesson.txt | 62 ++++++ .../Keywords.txt | 84 +++++++ .../OOP.txt | 74 +++++++ .../ScrumLesson.txt | 77 +++++++ Submission/LessonReader.java | 130 +++++++++++ Submission/Module.java | 67 ++++++ Submission/Question.java | 75 +++++++ Submission/QuizSystem.java | 208 ++++++++++++++++++ Submission/ScannerExtension.java | 131 +++++++++++ Submission/User.java | 55 +++++ Submission/UsersStorage.java | 91 ++++++++ out/artifacts/1218123.zip | Bin 0 -> 17692 bytes out/artifacts/1218123_jar/1218123.jar | Bin 0 -> 13175 bytes out/artifacts/1218123_jar/CSSLesson.txt | 65 ++++++ .../1218123_jar/CreateALessonTemplate.txt | 21 ++ out/artifacts/1218123_jar/DataTypes.txt | 40 ++++ out/artifacts/1218123_jar/HTMLlesson.txt | 62 ++++++ out/artifacts/1218123_jar/Keywords.txt | 84 +++++++ out/artifacts/1218123_jar/OOP.txt | 74 +++++++ out/artifacts/1218123_jar/ScrumLesson.txt | 77 +++++++ .../java-cw1-attempt-2/META-INF/MANIFEST.MF | 3 + .../java-cw1-attempt-2/QuizSystem.class | Bin 5341 -> 5339 bytes src/LessonReader.java | 2 +- src/META-INF/MANIFEST.MF | 3 + src/QuizSystem.java | 15 +- 32 files changed, 1762 insertions(+), 9 deletions(-) create mode 100644 .idea/.name create mode 100644 .idea/artifacts/1218123_jar.xml create mode 100644 Submission/1218123_SourceCode+LessonData.zip create mode 100644 Submission/CreateALessonTemplate.txt create mode 100644 Submission/Lesson.java create mode 100644 Submission/LessonDataToBePlacedInSameFolderAsJAR/CSSLesson.txt create mode 100644 Submission/LessonDataToBePlacedInSameFolderAsJAR/DataTypes.txt create mode 100644 Submission/LessonDataToBePlacedInSameFolderAsJAR/HTMLlesson.txt create mode 100644 Submission/LessonDataToBePlacedInSameFolderAsJAR/Keywords.txt create mode 100644 Submission/LessonDataToBePlacedInSameFolderAsJAR/OOP.txt create mode 100644 Submission/LessonDataToBePlacedInSameFolderAsJAR/ScrumLesson.txt create mode 100644 Submission/LessonReader.java create mode 100644 Submission/Module.java create mode 100644 Submission/Question.java create mode 100644 Submission/QuizSystem.java create mode 100644 Submission/ScannerExtension.java create mode 100644 Submission/User.java create mode 100644 Submission/UsersStorage.java create mode 100644 out/artifacts/1218123.zip create mode 100644 out/artifacts/1218123_jar/1218123.jar create mode 100644 out/artifacts/1218123_jar/CSSLesson.txt create mode 100644 out/artifacts/1218123_jar/CreateALessonTemplate.txt create mode 100644 out/artifacts/1218123_jar/DataTypes.txt create mode 100644 out/artifacts/1218123_jar/HTMLlesson.txt create mode 100644 out/artifacts/1218123_jar/Keywords.txt create mode 100644 out/artifacts/1218123_jar/OOP.txt create mode 100644 out/artifacts/1218123_jar/ScrumLesson.txt create mode 100644 out/production/java-cw1-attempt-2/META-INF/MANIFEST.MF create mode 100644 src/META-INF/MANIFEST.MF diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..c89b75d --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +Lesson.java \ No newline at end of file diff --git a/.idea/artifacts/1218123_jar.xml b/.idea/artifacts/1218123_jar.xml new file mode 100644 index 0000000..5510842 --- /dev/null +++ b/.idea/artifacts/1218123_jar.xml @@ -0,0 +1,8 @@ +<component name="ArtifactManager"> + <artifact type="jar" name="1218123:jar"> + <output-path>$PROJECT_DIR$/out/artifacts/1218123_jar</output-path> + <root id="archive" name="java-cw1-attempt-2.jar"> + <element id="module-output" name="java-cw1-attempt-2" /> + </root> + </artifact> +</component> \ No newline at end of file diff --git a/Submission/1218123_SourceCode+LessonData.zip b/Submission/1218123_SourceCode+LessonData.zip new file mode 100644 index 0000000000000000000000000000000000000000..01bcab9f6f423d6503fe3984e02b2d9f18c1b180 GIT binary patch literal 18885 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 a+EChS0p6@^ASL_^{0!MF3=A%=ARYimP@u5@ literal 0 HcmV?d00001 diff --git a/Submission/CreateALessonTemplate.txt b/Submission/CreateALessonTemplate.txt new file mode 100644 index 0000000..01b1770 --- /dev/null +++ b/Submission/CreateALessonTemplate.txt @@ -0,0 +1,21 @@ +## Title +Lesson Title Goes Here + +## Lesson Text +Lesson Text goes here all as one line + +## Questions + +# Question +Question goes here (Do not number the question, this is done in the program) + +# Answers +Add as many answers as you want +One per line +Do not number the answers +This is done in the program +If this is the correct answer then the int for correct answer will be 5 +# Correct Answer +Int representing the correct answers place in the answers above goes here + +You can then Repeat the # Question tag as many times as you like. \ No newline at end of file diff --git a/Submission/Lesson.java b/Submission/Lesson.java new file mode 100644 index 0000000..f7d6df0 --- /dev/null +++ b/Submission/Lesson.java @@ -0,0 +1,136 @@ +public class Lesson { + + /* + This class creates a lesson object along with the ability to print the lesson and print and complete the quiz + associated with it. + */ + + /* Design Decision: + Part [1] - Lesson Title, Lesson and QuestionArray are marked as final as once initialised they will not change + Part [2] - Lesson + Quiz Completed and QuizScore record what parts of a lesson each user has completed + Makes logical sense to store completion data with the lesson, however as code gets larger it may be useful to + split part [2] into a separate class as you don't need to store all of part [1], only the lessonTitle + in the user record. This could save on memory. + It is currently written this way to simplify the reading of the program, reducing the time needed to go through it. + */ + final private String lessonTitle; + final private String lessonText; + final private Question[] questionArray; + private boolean lessonCompleted; + private boolean quizCompleted; + private int quizScore; + + /** + * When a lesson is initialised the user hasn't seen or completed the lesson or quiz so these are set to false and zero + * @param lessonTitle + * @param lessonText + * @param questionArray + */ + public Lesson(String lessonTitle, String lessonText, Question[] questionArray) { + this.lessonTitle = lessonTitle; + this.lessonText = lessonText; + this.questionArray = questionArray; + this.lessonCompleted = false; + this.quizCompleted = false; + this.quizScore = 0; + } + + /* GETTER METHODS + 3 Standard getter methods, 1 custom getter method + */ + public String getLessonTitle() { + return lessonTitle; + } + + public int getQuizScore() { + return quizScore; + } + + public boolean isQuizCompleted() { + return quizCompleted; + } + + // Rather than have a getter and then call .length on it, it has been combined here for readability. + public int getQuestionArrayLength() { + return questionArray.length; + } + + // END GETTER METHODS + + /* SETTER METHODS + 3 fields are marked as final so can't be set + */ + public void setQuizCompleted(boolean quizCompleted) { + this.quizCompleted = quizCompleted; + } + + /** + * Checks if current quiz score is greater than saved score and replaces it. + * This ensures that users best quiz score is saved. + * @param quizScore + */ + public void setQuizScore(int quizScore) { + if(quizScore > this.quizScore) { + this.quizScore = quizScore; + } + } + + // END SETTER METHODS + + // CUSTOM METHODS + + /** + * Prints out the lesson title followed by the lesson text with empty lines in between for styling + * <p> + * Sets lessonCompleted to true as the lesson has now been printed out for user to read + */ + public void printLesson() { + // Prints out lesson title and text and sets the lesson completed to true + System.out.println("You have chosen the lesson: " + lessonTitle); + System.out.println(" "); + System.out.println(lessonText); + System.out.println(" "); + lessonCompleted = true; + } + + /** + * Iterates over questionArray printing out each question in turn, recording user score, + * and giving user immediate feedback on the quiz + * @return total correct user answers + */ + public int doQuiz() { + // Initialise the users score and questions answered so they can see how they are doing after every question + int correctAnswers = 0; + int questionsAnswered = 0; + + // Styling so it is easy to see where the quiz starts + System.out.println(" + ------------------------------------------------ +"); + System.out.println(" + | Quiz | +"); + System.out.println(" + ------------------------------------------------ +"); + System.out.println(" "); + + for(int i = 0; i < questionArray.length; i++) { + // Checks that user got the question correct and adds 1 to score if they do + if(questionArray[i].askQuestion(i + 1)) { + correctAnswers += 1; + } + questionsAnswered += 1; + + // Checks to see if it is the last questions and outputs a different string depending on if it is or not. + if (i != questionArray.length - 1) { + System.out.print("Your current score is " + correctAnswers + "/" + questionsAnswered + "."); + } else { + System.out.println("Your final score is " + correctAnswers + "/" + questionsAnswered + "."); + System.out.println("Congratulations on completing the lesson and the quiz."); + } + // Creates gap before next question + System.out.println(" "); + System.out.println(" "); + } + // Returns the users total score for the quiz so this can be recorded + return correctAnswers; + } + + // END CUSTOM METHODS + +} diff --git a/Submission/LessonDataToBePlacedInSameFolderAsJAR/CSSLesson.txt b/Submission/LessonDataToBePlacedInSameFolderAsJAR/CSSLesson.txt new file mode 100644 index 0000000..520f260 --- /dev/null +++ b/Submission/LessonDataToBePlacedInSameFolderAsJAR/CSSLesson.txt @@ -0,0 +1,65 @@ +## Title +CSS - Cascading Style Sheets + +## Lesson Text +Cascading Style Sheets (CSS) is a language used to describe how a document written in markup Language (E.G. HTML) is presented. It is one of the three main web technologies alongside HTML and JavaScript. CSS can be written inline, in an internal <style> element or added as an external stylesheet using a <link> in the HTML header. One of the most important CSS concepts is the box model, which is a box which wraps around every HTML element and includes padding, margin, and other properties. You can find the full list of CSS properties here: https://www.w3schools.com/cssref/default.asp + +## Questions + +# Question +What does CSS stand for? + +# Answers +Caesar salad, sir? +Cascading Style Sheets +Completely straightforward and sensible +Can see something? +# Correct Answer +2 + +# Question +How do you select a class? + +# Answers +.class +#class +<class> +@class +# Correct Answer +1 + +# Question +Which of these is not a valid colour? + +# Answers +color: #000 +color: rgb(0,0,0) +color: #000000 +color: 000000 +# Correct Answer +4 + +# Question +How do you select an id? + +# Answers +.id +#id +<id> +@id +# Correct Answer +2 + +# Question +What is the corresponding keyword to the font-weight: 700? + +# Answers +Bold +Normal +Light +Bolder +# Correct Answer +1 + + + diff --git a/Submission/LessonDataToBePlacedInSameFolderAsJAR/DataTypes.txt b/Submission/LessonDataToBePlacedInSameFolderAsJAR/DataTypes.txt new file mode 100644 index 0000000..98a0e70 --- /dev/null +++ b/Submission/LessonDataToBePlacedInSameFolderAsJAR/DataTypes.txt @@ -0,0 +1,40 @@ +## Title +Data Types + +## Lesson Text +Java is a statically-typed programming language. This means that all variables must first be declared before they can be used. This involves stating both the variables type and name. In java there are 8 primitive data types. These are: byte, short, int, long, float, double, boolean, char. These are predefined by the language and their names are reserved keywords. + +## Questions + +# Question +What is the correct way to declare a variable? + +# Answers +i = 5; +int i 5; +int i = 5; +int i(5); +# Correct Answer +3 + +# Question +Which data type is best to store a true/false value? + +# Answers +byte +char +Boolean +Int +Double +# Correct Answer +3 + +# Question +What is the default value for an int? + +# Answers +Null +Undefined +0 +# Correct Answer +3 \ No newline at end of file diff --git a/Submission/LessonDataToBePlacedInSameFolderAsJAR/HTMLlesson.txt b/Submission/LessonDataToBePlacedInSameFolderAsJAR/HTMLlesson.txt new file mode 100644 index 0000000..7011c76 --- /dev/null +++ b/Submission/LessonDataToBePlacedInSameFolderAsJAR/HTMLlesson.txt @@ -0,0 +1,62 @@ +## Title +HTML - HyperText Markup Language + +## Lesson Text +HyperText Markup Language (HTML) is the building block of the web. Invented in 1993 by Tim Berners-Lee it has gone through many iterations with the current being HTML5. This introduced semantic tags in order to help developers clearly define a pages content for browsers and screen readers. HTML is written using tags which general come in a pair: the opening tag <tag> and the closing tag </tag>, however sometimes the closing tag can be left out. Each type of tag defines how the browser will format and display the content. You can find a full list of tags here: https://www.w3schools.com/TAGS/default.ASP. + +## Questions + +# Question +What does HTML stand for? + +# Answers +Help To Make Layout +Highly Typed Machine Language +HyperText Markup Language +Hey! That’s my Llama +# Correct Answer +3 + +# Question +Which of these tags doesn’t need a closing tag? + +# Answers +<h1> +<body> +<form> +<img> +# Correct Answer +4 + +# Question +Where should the <!DOCTYPE html> tag go on the page? + +# Answers +It’s should be the first item +At the start of the body element +It’s should be the last item +Anywhere you want +# Correct Answer +1 + +# Question +What tag do you normally use to link to another web page? + +# Answers +<a> +<link> +<nav> +<li> +# Correct Answer +1 + +# Question +What is the correct way to declare a comment in HTML? + +# Answers +// This is a comment +/* This is a comment*/ +<! This is a comment -> +<!- -This is a comment - -> +# Correct Answer +4 diff --git a/Submission/LessonDataToBePlacedInSameFolderAsJAR/Keywords.txt b/Submission/LessonDataToBePlacedInSameFolderAsJAR/Keywords.txt new file mode 100644 index 0000000..51ae02e --- /dev/null +++ b/Submission/LessonDataToBePlacedInSameFolderAsJAR/Keywords.txt @@ -0,0 +1,84 @@ +## Title +Java Keywords + +## Lesson Text +Java has a number of keywords which are reserved so that you can’t use them as identifiers in your program. These keywords indicate to java that a certain action needs to be performed. When programming in an IDE you will often be told if a word is a keyword and you can’t use it as an identifier. For a full list visit this link: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html. This quiz will test your knowledge of keywords, for each question you have to find the word which isn’t a keyword. + +## Questions + +# Question +Which of these is not a keyword? + +# Answers +continue +goto +finally +next +# Correct Answer +4 + +# Question +Which of these is not a keyword? + +# Answers +for +if +when +else +# Correct Answer +3 + +# Question +Which of these is not a keyword? + +# Answers +private +protected +public +personal +# Correct Answer +4 + +# Question +Which of these is not a keyword? + +# Answers +huge +short +long +double +# Correct Answer +1 + +# Question +Which of these is not a keyword? + +# Answers +case +catch +class +client +# Correct Answer +4 + +# Question +Which of these is not a keyword? + +# Answers +implements +impresses +interface +instanceof +# Correct Answer +2 + +# Question +Which of these is not a keyword? + +# Answers +try +catch +maybe +throws +# Correct Answer +3 \ No newline at end of file diff --git a/Submission/LessonDataToBePlacedInSameFolderAsJAR/OOP.txt b/Submission/LessonDataToBePlacedInSameFolderAsJAR/OOP.txt new file mode 100644 index 0000000..0578ec0 --- /dev/null +++ b/Submission/LessonDataToBePlacedInSameFolderAsJAR/OOP.txt @@ -0,0 +1,74 @@ +## Title +Object-Oriented Programming + +## Lesson Text +Object-Oriented programming (OOP) is a type of programming paradigm based on the concept of “Objects”, which contain fields and methods. Fields contains data and can be primitive types or hold other objects through composition. Methods define procedures and depending on the fields access modifier are often the only way to access fields. Classes must be built with a constructor, this can set values for the fields when the class is initialised. It can also contain getters and setters to access private values from outside of the class. + +## Questions + +# Question +Which of these is not a Java access modifier keyword? + +# Answers +Private +Public +Class Private +Protected +Default +# Correct Answer +3 + +# Question +Coupling and Cohesion are two OOP concepts, which statement best describes the way we want them to be used in our program? + +# Answers +Decreased Coupling, Decreased Cohesion +Decreased Coupling, Increased Cohesion +Increased Coupling, Decreased Cohesion +Increased Coupling, Increased Cohesion +# Correct Answer +2 + +# Question +What is the best reason to use a design pattern? + +# Answers +It will result in code which is more extensible and maintainable +It will result in an easier to describe product +You can proudly tell everyone you are following a certain pattern +# Correct Answer +1 + +# Question +Composition is best described by what type of relationship? + +# Answers +IS – A +HAS – A +WAS – A +DOES – A +CREATES – A +# Correct Answer +2 + +# Question +Inheritance is best described by what type of relationship? + +# Answers +IS – A +HAS – A +WAS – A +DOES – A +CREATES – A +# Correct Answer +1 + +# Question +When would you use an interface class? + +# Answers +When you wanted to ensure that a class contained certain variables and methods +The interface class is the main way that a user operates your program +When you need to store a large amount of data you use an interface class to do it +# Correct Answer +1 \ No newline at end of file diff --git a/Submission/LessonDataToBePlacedInSameFolderAsJAR/ScrumLesson.txt b/Submission/LessonDataToBePlacedInSameFolderAsJAR/ScrumLesson.txt new file mode 100644 index 0000000..3904107 --- /dev/null +++ b/Submission/LessonDataToBePlacedInSameFolderAsJAR/ScrumLesson.txt @@ -0,0 +1,77 @@ +## Title +Scrum Framework + +## Lesson Text +Scrum is a lightweight framework used to generate value through solutions to problems. Originally designed for Software Engineering it is now used in multiple other fields. In a nutshell, Scrum requires a Scrum Master to foster an environment where a Product Owner orders the work for a complex problem into a product backlog. The Scrum Team then turns a selection of the work into an Increment of value during a Sprint. This is shown to stakeholders to inspect the results, the sprint is reviewed and then the Sprint starts again. + +## Questions + +# Question +Which one of these isn’t a member of the Scrum team? + +# Answers +Scrum Master +Chief Technology Officer +Product Owner +Developer +# Correct Answer +2 + +# Question +What is the recommended longest length of time for a sprint? + +# Answers +One Week +One Month +Two Weeks +6 Weeks +# Correct Answer +2 + +# Question +Which of these is not part of the scrum workflow ? + +# Answers +Sprint +Sprint Planning +Team Brunch +Daily Scrum +Sprint Review +Sprint Retrospective +# Correct Answer +3 + +# Question +What is the Definition of Done? + +# Answers +The Criteria to determine whether work on sprint backlog item is complete +The Product which has been produced at the end of the Sprint +When the developer is fed up of working on a feature +# Correct Answer +1 + +# Question +Which of these is not a Scrum Value? + +# Answers +Commitment +Courage +Focus +Freedom +Openness +Respect +# Correct Answer +4 + +# Question +The length for a daily scrum should be? + +# Answers +30 minutes +15 minutes +10 minutes +1 hour +45 minutes +# Correct Answer +2 \ No newline at end of file diff --git a/Submission/LessonReader.java b/Submission/LessonReader.java new file mode 100644 index 0000000..f291576 --- /dev/null +++ b/Submission/LessonReader.java @@ -0,0 +1,130 @@ +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Scanner; + +public class LessonReader { + + /* + This class reads a text file and creates a lesson from it. The text file needs to be a certain structure. The structure + is clearly defined in the ReadMe. This class has been designed so that the quiz for a lesson can have a variable amount + of questions and these questions can have a variable amount of answers related to them. + + Please Note: If the Text File is not written how it's specified in the ReadMe this class may fail. However, it does + have fall back values so that the user will see that the lesson has not been inputted correctly. + */ + + /** + * Converts a text file to an ArrayList<String> line by line, each line being a new entry + * @param fileName In the form "fileName.txt" + * @return Text File as ArrayList<String> + */ + public ArrayList<String> createArrayListFromTextFile(String fileName) { + + Scanner scanner = null; + ArrayList<String> stringArrayList = new ArrayList<>(); + + try { + scanner = new Scanner(new BufferedReader(new FileReader(fileName))); + + while (scanner.hasNext()){ + stringArrayList.add(scanner.nextLine()); + } + + } catch (IOException e) { + System.err.println(e.getMessage()); + } finally { + scanner.close(); + } + return stringArrayList; + }; + + /** + * Creates a lesson from the Text File that you give it, Text file must be formatted a specific + * way, this can be found in the ReadMe. + * @param fileName in the form "fileName.txt" + * @return Lesson object built from text file + */ + public Lesson createLessonFromTextFile(String fileName) { + + /* Create the variables needed to build a lesson and give them fallback values + if the text file provided is empty. + */ + String lessonTitle = "This lesson doesn't have a title"; + String lessonText = "This lesson doesn't have any text"; + String questionString = ""; + int correctAnswer = 1; + + // Scans in the text file and gives the function the ArrayList to work with + ArrayList<String> textArray = createArrayListFromTextFile(fileName); + + /* The answers input for a Question object and the questionsArray input for a Lesson object + both require the data in an array, however to make the program more flexible and resilient and allow different + amounts of answers and questions these are originally initialised as ArrayLists and then converted + */ + ArrayList<String> answersArrayList = new ArrayList<>(); + ArrayList<Question> questionsArrayList = new ArrayList<>(); + + + // Array is looped through to get the title and Lesson text + for(int i = 0; i < textArray.size(); i++) { + if(textArray.get(i).equals("## Title")) { + lessonTitle = textArray.get(i + 1); + } + if(textArray.get(i).equals("## Lesson Text")) { + lessonText = textArray.get(i + 1); + } + if(textArray.get(i).equals("## Questions")) { + + /* Once Array gets to the Questions a second loop is created so that each question can + be created separately, this allows for the text file to have different amounts of questions + */ + for(int j = i; j < textArray.size(); j++) { + if (textArray.get(j).equals("# Question")) { + questionString = textArray.get(j + 1); + } + if (textArray.get(j).equals("# Answers")) { + /* + A while loop goes through the answers adding them to the answersArrayList, + This allows for each question to have a different amount of answers + + Design Decision: Though having multiple loops inside each other is bad practice + it is unlikely that a text file will get to the size where this has any negative performance + impact and allowing different questions to have different amounts of answers + adds to the programs' user experience and flexibility. + */ + boolean endOfAnswers = false; + while(!endOfAnswers) { + j += 1; + if(textArray.get(j).equals("# Correct Answer")) { + correctAnswer = Integer.parseInt(textArray.get(j + 1)); + endOfAnswers = true; + } else { + answersArrayList.add(textArray.get(j)); + } + } + // Converts an Array List into an array + String[] answerArray = new String[answersArrayList.size()]; + answerArray = answersArrayList.toArray(answerArray); + + // Creates the Question and adds it to question Array + Question question = new Question(questionString, answerArray, correctAnswer); + questionsArrayList.add(question); + + // Removes the answers to the previous question so the array List can be reused + answersArrayList.clear(); + } + } + } + } + // Converts the ArrayList of Questions to an Array which can be used to create the lesson + Question[] questionArray = new Question[questionsArrayList.size()]; + questionArray = questionsArrayList.toArray(questionArray); + + // Creates the Lesson and returns it so that it can be used in the program + Lesson lesson = new Lesson(lessonTitle,lessonText, questionArray); + return lesson; + } +} + diff --git a/Submission/Module.java b/Submission/Module.java new file mode 100644 index 0000000..ea4c98a --- /dev/null +++ b/Submission/Module.java @@ -0,0 +1,67 @@ +public class Module { + + /* + This class holds the lesson objects and enables the user to pick from them. It has been designed so that it + can be replicated and reused to add a Courses class to the program. This is expanded upon in the ReadMe. + */ + + private Lesson[] lessons; + + public Module(Lesson[] lessons) { + this.lessons = lessons; + } + + // GETTER METHODS + + /** + * Returns a lesson from the Lesson array depending on User input + * User starts choice at 1 rather than 0 so this needs to be translated to arrays with base 0 + * @param choice + * @return Lesson object from array at choice - 1 + */ + public Lesson getLesson(int choice) { + return lessons[choice - 1]; + } + + // Rather than have a getter and then call .length on it, it has been combined here for readability. + public int getLessonsArrayLength() { + return lessons.length; + } + // END GETTER METHODS + + /** + * Loops through the array printing out each lesson + * Also prints out the user instruction based on the number of lessons in the module + */ + public void listAll() { + // Lesson Menu Title + System.out.println(" + ------------------------------------------------ +"); + System.out.println(" + | LESSONS | +"); + System.out.println(" + ------------------------------------------------ +"); + + System.out.println(" Please pick from one of the lessons below: "); + System.out.println(" "); + + // Empty Strings declared which will be used to build the userInstruction string + String userInstruction = ""; + String numberToChooseLesson = ""; + + /* Loops through the lesson array printing out the titles along with a lesson number + that users can to press to access their chosen lesson + */ + for(int i = 0; i < lessons.length; i++) { + System.out.println("[" + (i + 1) + "] " + lessons[i].getLessonTitle()); + + /* If it is the last lesson to add to the userInstruction String then the String needs to + include the closing bracket + */ + if(i != lessons.length - 1) { + numberToChooseLesson = (i + 1) + ", "; + } else { + numberToChooseLesson = (i + 1) + "):"; + } + userInstruction = userInstruction + numberToChooseLesson; + } + System.out.println("By pressing the corresponding number (" + userInstruction); + }; +} diff --git a/Submission/Question.java b/Submission/Question.java new file mode 100644 index 0000000..dffb603 --- /dev/null +++ b/Submission/Question.java @@ -0,0 +1,75 @@ +public class Question { + + /* + This class creates a Question which can be presented to the user. + It has been designed so that the question can have as many answers + as you wish to present to the user. + */ + + private String question; + private String[] answers; + private int correctAnswer; + + /** + * Basic all arguments Constructor + * @param question Just include the question String, no question number or punctuation before + * @param answers Just include the answer String, no answer number or punctuation before + * @param correctAnswer Add an int relating to the position of the correct answer based on array starting at 1, not 0. + * (E.G. if you have 4 answers and the correct one is number 3 then use 3.) + */ + public Question(String question, String[] answers, int correctAnswer) { + this.question = question; + this.answers = answers; + this.correctAnswer = correctAnswer; + } + + /** + * Prints the Question for the user, the user can then pick an answer. + * <p> + * Returns a Boolean, true = user answered correctly, false = user answered incorrectly. + * @param questionNumber used to format the question string displayed to the user. + */ + public boolean askQuestion(int questionNumber) { + /* Design decision. This was a choice between using a bool to represent correct or incorrect + or using 1 to represent a correct answer and 0 for an incorrect answer. I decided on a boolean so that it + reduces the use of "Magic Numbers" in the code, and it makes the code more resilient changes. + */ + + // Prints question with corresponding number + System.out.println("Question " + questionNumber + ": " + question); + System.out.println(" "); + + // Empty Strings declared which will be used to build the userInstruction string + String userInstruction = ""; + String numberToChooseLesson = ""; + + // Prints out the answers with their corresponding number and adds it to the userInstruction string + for(int i = 0; i < answers.length; i++) { + System.out.println((i + 1) + ". " + answers[i]); + /* Check if it is the last answer, if so the string that is added to the userInstruction + changes to represent this. + */ + if(i != answers.length - 1) { + numberToChooseLesson = (i + 1) + ", "; + } else { + numberToChooseLesson = (i + 1) + "):"; + } + userInstruction = userInstruction + numberToChooseLesson; + } + + // Prints out the userInstruction string with all the valid choices a user can make + System.out.println(" "); + System.out.println("Choose your answer by pressing the corresponding number (" + userInstruction); + + // Takes in the user input and checks if they got it right and then returns a boolean based on that + int userChoice = ScannerExtension.scanForUserIntChoice(answers.length); + + if(userChoice == correctAnswer) { + System.out.println("Correct!"); + return true; + } else { + System.out.println("Incorrect"); + } + return false; + }; +} diff --git a/Submission/QuizSystem.java b/Submission/QuizSystem.java new file mode 100644 index 0000000..8b340a6 --- /dev/null +++ b/Submission/QuizSystem.java @@ -0,0 +1,208 @@ +public class QuizSystem { + + /* + This class is the heart of the Quiz and is where the main method is run from, it contains the vast majority of + the logic for how the user navigates through the quiz and contains the styling to make the quiz more readable rather + than just having a block of text in the command line. This class both initialises the vast majority of the data and + contains the code logic for it, a discussion of why this decision has been made is written below. + */ + + public static void main(String[] args) { + + // Welcome message, shown once to users when quiz starts + System.out.println(" "); + System.out.println(" + ------------------------------------------------ +"); + System.out.println(" + | Welcome to the MSc Software Engineering Quiz | +"); + System.out.println(" + ------------------------------------------------ +"); + System.out.println(" Simon Barrett (C1218123) 2021"); + + + // QUIZ AND DATA SET UP + /* Create a boolean which is used to keep the quiz repeating itself and the storage to contain users + completion data */ + boolean continueWithQuiz = true; + UsersStorage users = new UsersStorage(); + + // Create all the lessons and add them to the module array to use + LessonReader lessonReader = new LessonReader(); + Lesson htmlLesson = lessonReader.createLessonFromTextFile("HTMLLesson.txt"); + Lesson scrumLesson = lessonReader.createLessonFromTextFile("ScrumLesson.txt"); + Lesson cssLesson = lessonReader.createLessonFromTextFile("CSSLesson.txt"); + Lesson dataTypesLesson = lessonReader.createLessonFromTextFile("DataTypes.txt"); + Lesson oopLesson = lessonReader.createLessonFromTextFile("OOP.txt"); + Lesson keywordsLesson = lessonReader.createLessonFromTextFile("Keywords.txt"); + + Lesson[] cmt652LessonsArray = {htmlLesson, cssLesson, scrumLesson, dataTypesLesson,oopLesson,keywordsLesson}; + Module cmt652 = new Module(cmt652LessonsArray); + // END QUIZ AND DATA SETUP + + + // Quiz will repeat itself until the user chooses to end it. + // continueWithQuiz can be changed by the output from checkUserDecision() + while (continueWithQuiz) { + + // Value set to false so that main menu loops until user chooses to view the lesson + boolean goToLesson = false; + + /* + Design Decision: The code has been broken up into 4 methods as listed below the main method. This is to + increase readability, and make the logic easier to follow. It is also so that when code is changed in one + method it is easier to see if and where the code breaks and to maintain a better separation of code. This is + instead of having all the code inside the while loop where it could get confusing. + + The methods could also be removed from this Class and put into their own class if the program got larger, + however at this stage I don't think it's necessary. It is enough that they make it more readable. + */ + + /* + Design Decision: The user has three options to choose from in the main menu which means that a boolean can't be + used for the user decision, even though this would be the preferred option as it makes the code more resilient and + harder for the next developer to make a mistake. + */ + int userDecision = checkUserDecision(); + /* !!! CHECK THE BELOW NUMBERS AGAINST THE OUTPUTS for checkUserDecision BEFORE CHANGING THEM !!!! + User choice evaluated (these values have been hard-coded as it is unlikely the menu will change and if it does + then it will likely be refactored at that time), having "Magic numbers" is a known weakness of this code */ + + // User chooses to go to the lessons + if (userDecision == 1) { + goToLesson = true; + + // User chooses to check progress, once user has checked progress it will loop back to the main menu + } else if (userDecision == 2) { + // Create Progress Banner + System.out.println(" + ------------------------------------------------ +"); + System.out.println(" + | Check Your Progress | +"); + System.out.println(" + ------------------------------------------------ +"); + System.out.println("Please type in your name to access your data, or (all) to print all user data"); + ScannerExtension.viewUserData(users); + + // User chooses to exit game + } else if (userDecision == 3) { + continueWithQuiz = false; + } + + // If user has chosen to view the lessons then this logic is run + if(goToLesson) { + Lesson chosenLesson = chooseLessonToComplete(cmt652); + + String userName = checkIfUserWantsToDoQuiz(chosenLesson); + + addUserProgressToCompletionData(users, userName, chosenLesson); + } + + } + + // Styling shown to user when they exit + System.out.println(" "); + System.out.println(" + ----------------------------------------------------------- +"); + System.out.println(" + | Thank you for playing the MSc Software Engineering Quiz | +"); + System.out.println(" + | Have a great day!!! | +"); + System.out.println(" + ----------------------------------------------------------- +"); + } + + // 4 MAIN CONTROL FLOW METHODS + /** + * Checks if user wants to continue quiz, see their completion data or see everyone's completion data. + * @return 1 = to go to lessons, 2 = go to data, 3 = exit game + */ + public static int checkUserDecision() { + // Create Main Menu text + System.out.println(" "); + System.out.println(" + ------------------------------------------------ +"); + System.out.println(" + | MAIN MENU | +"); + System.out.println(" + ------------------------------------------------ +"); + System.out.println(" Please pick from one of the options:"); + System.out.println(" "); + + // Create a list from user to choose from + /* + DO NOT CHANGE THESE NUMBERS WITHOUT CHECKING THE IF/ELSE STATEMENT AFTER THE METHOD IS CALLED + */ + System.out.println("[1] See the list of lessons"); + System.out.println("[2] Check your progress"); + System.out.println("[3] Exit Game"); + System.out.println("By pressing the corresponding number (1, 2, 3):"); + + // User makes choice + int userDecision = ScannerExtension.scanForUserIntChoice(3); + + return userDecision; + } + + /** + * Lists all the lessons in the module, user chooses lesson, user is shown lesson + * @param module contains the data needed to run the quiz + * @return Returns the users Chosen Lesson Object + */ + public static Lesson chooseLessonToComplete(Module module) { + // List all the Lessons in the module, User inputs lesson choice and this is saved as a variable + module.listAll(); + int choice = ScannerExtension.scanForUserIntChoice(module.getLessonsArrayLength()); + Lesson chosenLesson = module.getLesson(choice); + + // Styled header so it is easy to see where the lesson begins + System.out.println(" + ------------------------------------------------ +"); + System.out.println(" + | LESSON | +"); + System.out.println(" + ------------------------------------------------ +"); + System.out.println(" "); + + // Print out users chosen lesson and return the variable + chosenLesson.printLesson(); + return chosenLesson; + } + + /** + * Checks if user wishes to do the quiz, user does the quiz and has their score updated, or + * is taken back to the main menu if they don't want to do the quiz. + * @param chosenLesson + * @return Returns the username which the player used to record their progress + */ + public static String checkIfUserWantsToDoQuiz(Lesson chosenLesson) { + // Ask user if they want to do the quiz, and check users decision + System.out.println("Would you like to complete the quiz now? Type 'y' (yes) or 'n' (no): "); + String userName = ""; + String nextString = ScannerExtension.chooseYorN(); + + // Decision based on users choice, y = users does the quiz, n = user taken back to main menu + // Username is taken in both cases and a different string is shown based on user decision + if (nextString.equals("y")) { + // User does the quiz. Score and quiz completion is updated on the lesson object + chosenLesson.setQuizScore(chosenLesson.doQuiz()); + chosenLesson.setQuizCompleted(true); + System.out.println("Please enter your name (in lowercase) to record that you have completed the lesson and the quiz: "); + userName = ScannerExtension.scanStringToLowercase(); + System.out.println("Record of Lesson + Quiz Completion and Quiz Score saved under username: " + userName); + + } else if (nextString.equals("n")) { + System.out.println("Please enter your name (in lowercase) to record that you have completed the lesson: "); + userName = ScannerExtension.scanStringToLowercase(); + System.out.println("Record of Lesson Completion saved under username: " + userName); + System.out.println(" "); + } + System.out.println(" "); + + // Output the username so that it can be used to save User completion data + return userName; + } + + /** + * Either adds user progress to their data, or adds a new user to the UserStorage + * @param users UserStorage for the program + * @param userName Username give by user to store their data + * @param chosenLesson Lesson object data you wish to store + */ + public static void addUserProgressToCompletionData(UsersStorage users, String userName, Lesson chosenLesson) { + // Add User progress to UserStorage + int userExists = users.checkIfUserExists(userName); + // Create a user and add to storage if they don't already exist + if (userExists == -1) { + User recordCurrentIteration = new User(userName); + recordCurrentIteration.addToUserRecord(chosenLesson); + users.add(recordCurrentIteration); + } else { + // Add to existing users data + users.getUsers().get(userExists).addToUserRecord(chosenLesson); + } + } +} \ No newline at end of file diff --git a/Submission/ScannerExtension.java b/Submission/ScannerExtension.java new file mode 100644 index 0000000..f90d6a8 --- /dev/null +++ b/Submission/ScannerExtension.java @@ -0,0 +1,131 @@ +import java.util.ArrayList; +import java.util.Scanner; + +public class ScannerExtension { + + /* Design Decision: This extension file has been designed so that all scanner logic is held in one place + and future developers know exactly where to look if there is something wrong with a scanner. + + The middle two scanners are needed to achieve specific goals but have been designed to have a level of + reusability and been given method names to make it clear what goal they achieve. + + The last scanner is very specific to the method which calls it but despite the cohesion it has been placed + in this file so that all the scanner logic for the program stays together. + + I have added these Scanner extensions so that the user is unable to crash the program by typing incorrect + information, thus creating a better user experience and making the program more resilient. + + These Self-Contained methods are static so that you do not need to create a new class everytime we need to use one. + */ + + public static Scanner scanner = new Scanner(System.in); + + /** + * Takes in a string from the scanner and converts it to lower case + * @return lower case version of the string entered into the scanner + */ + public static String scanStringToLowercase() { + String nextString = scanner.next(); + nextString = nextString.toLowerCase(); + return nextString; + } + + /* + Known Edge Case: For the below method if you type an incorrect int followed by a letter it crashes + the program. This will be fixed in future editions. + */ + + /** + * Extends Scanner to include error handling so that a user can only pick an integer in the given range + * <p> + * Method will keep asking for a user choice until user has picked a valid integer + * @param totalChoices User can pick a number from 1 - totalChoices (inclusive). + * @return Users integer choice + */ + public static int scanForUserIntChoice(int totalChoices) { + boolean correctEntry = false; + // Prevents a user from entering a non-integer and asks them to pick again + while (scanner.hasNextInt() == false) { + scanner.next(); + System.out.println("Incorrect entry! Please choose from one of the options above."); + } + int nextInt = scanner.nextInt(); + while (!correctEntry) { + // Scanner will keep looping until the user has entered a valid choice + if(nextInt <= totalChoices && nextInt > 0) { + correctEntry = true; + } else { + System.out.println("Incorrect entry! Please choose from one of the options above."); + nextInt = scanner.nextInt(); + } + } + // Return a valid choice which has been error handled so program won't crash + return nextInt; + } + + + /** + * User can choose between y or n, this will be converted to lowerCase so Y and N work as well + * <p> + * Method will keep asking for a user choice until they pick a correctEntry + * @return y or n + */ + public static String chooseYorN() { + boolean correctEntry = false; + String nextString = scanner.next(); + /* Convert user input to lowercase and check if they have entered y or n, + Loop will continue until user makes one of those two choices + */ + nextString = nextString.toLowerCase(); + while (!correctEntry) { + if(nextString.equals("y") || nextString.equals("n")) { + correctEntry = true; + } else { + System.out.println("Incorrect entry! Please choose 'y' or 'n'."); + nextString = scanner.next(); + nextString = nextString.toLowerCase(); + } + } + return nextString; + } + + /** + *User can type in all to see all users data or theirs own name to check their data + *<p> + *If the name the user inputs doesn't match any data in the UserCompletionData then user can try another + *name or press x to exit and go back to the main menu + * @param users UserStorage object for user input from scanner to be checked against + */ + public static void viewUserData(UsersStorage users) { + String nextString = scanner.next(); + nextString = nextString.toLowerCase(); + // Checks if string equals all, if so it prints out all user data + if(nextString.equals("all")) { + users.printAllUsersData(); + } else { + /* + If the user didn't type all then the input will be checked to see if the username has data attached to it + Loop will keep going until a correct username is given or the user decides to exit by pressing x. + */ + boolean correctEntry = false; + while (!correctEntry){ + int userExists = users.checkIfUserExists(nextString); + if(userExists == -1) { + System.out.println("This user doesn't exist. Please enter another username or 'x' to exit."); + nextString = scanner.next(); + nextString = nextString.toLowerCase(); + if(nextString.equals("x")) { + correctEntry = true; + } + } else { + ArrayList<Lesson> userRecord= users.getUsers().get(userExists).getUserRecord(); + System.out.println(nextString + ":"); + for(int i = 0; i < userRecord.size(); i++) { + System.out.println(users.printOutUserCompletionDataForLesson(userRecord.get(i))); + } + correctEntry = true; + } + } + } + } +} diff --git a/Submission/User.java b/Submission/User.java new file mode 100644 index 0000000..ed70973 --- /dev/null +++ b/Submission/User.java @@ -0,0 +1,55 @@ +import java.util.ArrayList; + +public class User { + + /* + Class to represent a User, includes the User's name and a record of which + lessons, quizzes and scores they have completed. + */ + + private String username; + private ArrayList<Lesson> userRecord; + + public User(String username) { + this.username = username; + this.userRecord = new ArrayList<>(); + } + + // GETTER METHODS + + public String getUsername() { + return username; + } + + public ArrayList<Lesson> getUserRecord() { + return userRecord; + } + // END GETTER METHODS + + // CUSTOM METHODS + + /** + * Checks the Users record to see if they have already completed the lesson and/or quiz for that Lesson + * object. If not then their record is updated to show what they have done for that Lesson. + * @param currentLesson + */ + public void addToUserRecord(Lesson currentLesson) { + boolean inUserRecord = false; + int lessonsPlaceInRecord = 0; + + // Check to see if currentLesson is in the user record already + for(int i = 0; i < userRecord.size(); i++) { + if(userRecord.get(i).getLessonTitle().equals(currentLesson.getLessonTitle())){ + inUserRecord = true; + lessonsPlaceInRecord = i; + } + } + + // Update or create the lesson in the user record + if(inUserRecord) { + userRecord.get(lessonsPlaceInRecord).setQuizScore(currentLesson.getQuizScore()); + } else { + userRecord.add(currentLesson); + } + } +} diff --git a/Submission/UsersStorage.java b/Submission/UsersStorage.java new file mode 100644 index 0000000..3d98f65 --- /dev/null +++ b/Submission/UsersStorage.java @@ -0,0 +1,91 @@ +import java.util.ArrayList; + +public class UsersStorage { + + /* + This class stores a list of the Custom object User to record each user's progress while the program is running. + It has been put into its own class due to the need to have some custom methods to interact with the storage. + */ + + private ArrayList<User> users; + + public UsersStorage() { + this.users = new ArrayList<>(); + } + + // GETTER METHODS + public ArrayList<User> getUsers() { + return users; + } + // END GETTER METHODS + + // CUSTOM METHODS + + /** + * Adds a user to the Storage ArrayList + * @param user Custom User object + */ + public void add(User user) { + users.add(user); + } + + + /** + * Check if the username entered already exists in Storage ArrayList + * @param username Username you want to check + * @return Returns -1 if the user doesn't exist, or returns the users place in the Storage ArrayList if they do + */ + public int checkIfUserExists(String username) { + for(int i = 0; i < users.size(); i++){ + String userNameInStorage = users.get(i).getUsername(); + if(userNameInStorage.equals(username)) { + return i; + } + } + return -1; + } + + /** + * Returns a string to display to the user based on if the user has completed just the lesson + * or the lesson and the quiz and prints the score if applicable + * @return Custom String based on input + */ + public String printOutUserCompletionDataForLesson(Lesson lesson) { + String lessonTitle = lesson.getLessonTitle(); + if(lesson.isQuizCompleted() == false) { + return "Has completed the lesson for " + lessonTitle + " but not the quiz."; + } else { + return "Has completed the lesson and quiz for " + lessonTitle + ", with a score of " + lesson.getQuizScore() + "/" + lesson.getQuestionArrayLength() + "."; + } + } + + /* + Design Decision: The method below is not strictly necessary but has been included so that it is easy to check if + the storage is working. Removing it could simplify the Program, Class and related ScannerExtension. + */ + /** + * Prints out all the data in the Storage Array List + */ + public void printAllUsersData() { + for(int i = 0; i < users.size(); i++) { + /* Get a user from the array and loop over their record printing out each lesson, + quiz and quiz score stored for them. + Repeat this for every user stored in Storage ArrayList + */ + User currentUser = users.get(i); + System.out.println(currentUser.getUsername() + ": "); + for (int j = 0; j < currentUser.getUserRecord().size(); j++) { + System.out.println(printOutUserCompletionDataForLesson(currentUser.getUserRecord().get(j))); + } + /* + Design Decision: Though having two nested arrays results in O(i * j) it is unlikely in this program that + the arrays would get big enough for this to cause a performance issue. However, if the program was to grow + it may be worth looking at more efficient ways to do this. + */ + } + // Fallback string, to be shown if no user data has been entered but user asks to see all user data. + if(users.size() == 0) { + System.out.println("No user data is stored at this time."); + } + } +} diff --git a/out/artifacts/1218123.zip b/out/artifacts/1218123.zip new file mode 100644 index 0000000000000000000000000000000000000000..0e777110020a12b09f01cfdfac9c980f58809007 GIT binary patch literal 17692 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 literal 0 HcmV?d00001 diff --git a/out/artifacts/1218123_jar/1218123.jar b/out/artifacts/1218123_jar/1218123.jar new file mode 100644 index 0000000000000000000000000000000000000000..b9f9034507ced5418aa5c52de409e4bef95dc226 GIT binary patch literal 13175 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 Sl?`MzD5}z#7#MyTfOr7>$x68Z literal 0 HcmV?d00001 diff --git a/out/artifacts/1218123_jar/CSSLesson.txt b/out/artifacts/1218123_jar/CSSLesson.txt new file mode 100644 index 0000000..520f260 --- /dev/null +++ b/out/artifacts/1218123_jar/CSSLesson.txt @@ -0,0 +1,65 @@ +## Title +CSS - Cascading Style Sheets + +## Lesson Text +Cascading Style Sheets (CSS) is a language used to describe how a document written in markup Language (E.G. HTML) is presented. It is one of the three main web technologies alongside HTML and JavaScript. CSS can be written inline, in an internal <style> element or added as an external stylesheet using a <link> in the HTML header. One of the most important CSS concepts is the box model, which is a box which wraps around every HTML element and includes padding, margin, and other properties. You can find the full list of CSS properties here: https://www.w3schools.com/cssref/default.asp + +## Questions + +# Question +What does CSS stand for? + +# Answers +Caesar salad, sir? +Cascading Style Sheets +Completely straightforward and sensible +Can see something? +# Correct Answer +2 + +# Question +How do you select a class? + +# Answers +.class +#class +<class> +@class +# Correct Answer +1 + +# Question +Which of these is not a valid colour? + +# Answers +color: #000 +color: rgb(0,0,0) +color: #000000 +color: 000000 +# Correct Answer +4 + +# Question +How do you select an id? + +# Answers +.id +#id +<id> +@id +# Correct Answer +2 + +# Question +What is the corresponding keyword to the font-weight: 700? + +# Answers +Bold +Normal +Light +Bolder +# Correct Answer +1 + + + diff --git a/out/artifacts/1218123_jar/CreateALessonTemplate.txt b/out/artifacts/1218123_jar/CreateALessonTemplate.txt new file mode 100644 index 0000000..01b1770 --- /dev/null +++ b/out/artifacts/1218123_jar/CreateALessonTemplate.txt @@ -0,0 +1,21 @@ +## Title +Lesson Title Goes Here + +## Lesson Text +Lesson Text goes here all as one line + +## Questions + +# Question +Question goes here (Do not number the question, this is done in the program) + +# Answers +Add as many answers as you want +One per line +Do not number the answers +This is done in the program +If this is the correct answer then the int for correct answer will be 5 +# Correct Answer +Int representing the correct answers place in the answers above goes here + +You can then Repeat the # Question tag as many times as you like. \ No newline at end of file diff --git a/out/artifacts/1218123_jar/DataTypes.txt b/out/artifacts/1218123_jar/DataTypes.txt new file mode 100644 index 0000000..98a0e70 --- /dev/null +++ b/out/artifacts/1218123_jar/DataTypes.txt @@ -0,0 +1,40 @@ +## Title +Data Types + +## Lesson Text +Java is a statically-typed programming language. This means that all variables must first be declared before they can be used. This involves stating both the variables type and name. In java there are 8 primitive data types. These are: byte, short, int, long, float, double, boolean, char. These are predefined by the language and their names are reserved keywords. + +## Questions + +# Question +What is the correct way to declare a variable? + +# Answers +i = 5; +int i 5; +int i = 5; +int i(5); +# Correct Answer +3 + +# Question +Which data type is best to store a true/false value? + +# Answers +byte +char +Boolean +Int +Double +# Correct Answer +3 + +# Question +What is the default value for an int? + +# Answers +Null +Undefined +0 +# Correct Answer +3 \ No newline at end of file diff --git a/out/artifacts/1218123_jar/HTMLlesson.txt b/out/artifacts/1218123_jar/HTMLlesson.txt new file mode 100644 index 0000000..76187f4 --- /dev/null +++ b/out/artifacts/1218123_jar/HTMLlesson.txt @@ -0,0 +1,62 @@ +## Title +HTML - HyperText Markup Language + +## Lesson Text +HyperText Markup Language (HTML) is the building block of the web. Invented in 1993 by Tim Berners-Lee it has gone through many iterations with the current being HTML5. This introduced semantic tags in order to help developers clearly define a pages content for browsers and screen readers. HTML is written using tags which general come in a pair: the opening tag <tag> and the closing tag </tag>, however sometimes the closing tag can be left out. Each type of tag defines how the browser will format and display the content. You can find a full list of tags here: https://www.w3schools.com/TAGS/default.ASP. + +## Questions + +# Question +What does HTML stand for? + +# Answers +Help To Make Layout +Highly Typed Machine Language +HyperText Markup Language +Hey! That`s my Llama +# Correct Answer +3 + +# Question +Which of these tags doesn`t need a closing tag? + +# Answers +<h1> +<body> +<form> +<img> +# Correct Answer +4 + +# Question +Where should the <!DOCTYPE html> tag go on the page? + +# Answers +It`s should be the first item +At the start of the body element +It`s should be the last item +Anywhere you want +# Correct Answer +1 + +# Question +What tag do you normally use to link to another web page? + +# Answers +<a> +<link> +<nav> +<li> +# Correct Answer +1 + +# Question +What is the correct way to declare a comment in HTML? + +# Answers +// This is a comment +/* This is a comment*/ +<! This is a comment -> +<!- -This is a comment - -> +# Correct Answer +4 diff --git a/out/artifacts/1218123_jar/Keywords.txt b/out/artifacts/1218123_jar/Keywords.txt new file mode 100644 index 0000000..3ccf861 --- /dev/null +++ b/out/artifacts/1218123_jar/Keywords.txt @@ -0,0 +1,84 @@ +## Title +Java Keywords + +## Lesson Text +Java has a number of keywords which are reserved so that you can`t use them as identifiers in your program. These keywords indicate to java that a certain action needs to be performed. When programming in an IDE you will often be told if a word is a keyword and you can`t use it as an identifier. For a full list visit this link: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html. This quiz will test your knowledge of keywords, for each question you have to find the word which isn`t a keyword. + +## Questions + +# Question +Which of these is not a keyword? + +# Answers +continue +goto +finally +next +# Correct Answer +4 + +# Question +Which of these is not a keyword? + +# Answers +for +if +when +else +# Correct Answer +3 + +# Question +Which of these is not a keyword? + +# Answers +private +protected +public +personal +# Correct Answer +4 + +# Question +Which of these is not a keyword? + +# Answers +huge +short +long +double +# Correct Answer +1 + +# Question +Which of these is not a keyword? + +# Answers +case +catch +class +client +# Correct Answer +4 + +# Question +Which of these is not a keyword? + +# Answers +implements +impresses +interface +instanceof +# Correct Answer +2 + +# Question +Which of these is not a keyword? + +# Answers +try +catch +maybe +throws +# Correct Answer +3 \ No newline at end of file diff --git a/out/artifacts/1218123_jar/OOP.txt b/out/artifacts/1218123_jar/OOP.txt new file mode 100644 index 0000000..e421fd0 --- /dev/null +++ b/out/artifacts/1218123_jar/OOP.txt @@ -0,0 +1,74 @@ +## Title +Object-Oriented Programming + +## Lesson Text +Object-Oriented programming (OOP) is a type of programming paradigm based on the concept of `Objects`, which contain fields and methods. Fields contains data and can be primitive types or hold other objects through composition. Methods define procedures and depending on the fields access modifier are often the only way to access fields. Classes must be built with a constructor, this can set values for the fields when the class is initialised. It can also contain getters and setters to access private values from outside of the class. + +## Questions + +# Question +Which of these is not a Java access modifier keyword? + +# Answers +Private +Public +Class Private +Protected +Default +# Correct Answer +3 + +# Question +Coupling and Cohesion are two OOP concepts, which statement best describes the way we want them to be used in our program? + +# Answers +Decreased Coupling, Decreased Cohesion +Decreased Coupling, Increased Cohesion +Increased Coupling, Decreased Cohesion +Increased Coupling, Increased Cohesion +# Correct Answer +2 + +# Question +What is the best reason to use a design pattern? + +# Answers +It will result in code which is more extensible and maintainable +It will result in an easier to describe product +You can proudly tell everyone you are following a certain pattern +# Correct Answer +1 + +# Question +Composition is best described by what type of relationship? + +# Answers +IS A +HAS A +WAS A +DOES A +CREATES A +# Correct Answer +2 + +# Question +Inheritance is best described by what type of relationship? + +# Answers +IS A +HAS A +WAS A +DOES A +CREATES A +# Correct Answer +1 + +# Question +When would you use an interface class? + +# Answers +When you wanted to ensure that a class contained certain variables and methods +The interface class is the main way that a user operates your program +When you need to store a large amount of data you use an interface class to do it +# Correct Answer +1 \ No newline at end of file diff --git a/out/artifacts/1218123_jar/ScrumLesson.txt b/out/artifacts/1218123_jar/ScrumLesson.txt new file mode 100644 index 0000000..ef35976 --- /dev/null +++ b/out/artifacts/1218123_jar/ScrumLesson.txt @@ -0,0 +1,77 @@ +## Title +Scrum Framework + +## Lesson Text +Scrum is a lightweight framework used to generate value through solutions to problems. Originally designed for Software Engineering it is now used in multiple other fields. In a nutshell, Scrum requires a Scrum Master to foster an environment where a Product Owner orders the work for a complex problem into a product backlog. The Scrum Team then turns a selection of the work into an Increment of value during a Sprint. This is shown to stakeholders to inspect the results, the sprint is reviewed and then the Sprint starts again. + +## Questions + +# Question +Which one of these isn`t a member of the Scrum team? + +# Answers +Scrum Master +Chief Technology Officer +Product Owner +Developer +# Correct Answer +2 + +# Question +What is the recommended longest length of time for a sprint? + +# Answers +One Week +One Month +Two Weeks +6 Weeks +# Correct Answer +2 + +# Question +Which of these is not part of the scrum workflow ? + +# Answers +Sprint +Sprint Planning +Team Brunch +Daily Scrum +Sprint Review +Sprint Retrospective +# Correct Answer +3 + +# Question +What is the Definition of Done? + +# Answers +The Criteria to determine whether work on sprint backlog item is complete +The Product which has been produced at the end of the Sprint +When the developer is fed up of working on a feature +# Correct Answer +1 + +# Question +Which of these is not a Scrum Value? + +# Answers +Commitment +Courage +Focus +Freedom +Openness +Respect +# Correct Answer +4 + +# Question +The length for a daily scrum should be? + +# Answers +30 minutes +15 minutes +10 minutes +1 hour +45 minutes +# Correct Answer +2 \ No newline at end of file diff --git a/out/production/java-cw1-attempt-2/META-INF/MANIFEST.MF b/out/production/java-cw1-attempt-2/META-INF/MANIFEST.MF new file mode 100644 index 0000000..e6d6934 --- /dev/null +++ b/out/production/java-cw1-attempt-2/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: QuizSystem + diff --git a/out/production/java-cw1-attempt-2/QuizSystem.class b/out/production/java-cw1-attempt-2/QuizSystem.class index 184ef6c5e91391474331a456e38fe70ad83e6328..c882bd2bbc1ec9358327bd05ae02104a0c9e07e5 100644 GIT binary patch delta 26 Ycmcbsd0TVCP8MD*1thTf1dFHu0Bvyw(*OVf delta 28 acmcbuc~^78P8NP01tf52<>q57q5=ScSqMM? diff --git a/src/LessonReader.java b/src/LessonReader.java index f291576..c4af75a 100644 --- a/src/LessonReader.java +++ b/src/LessonReader.java @@ -46,7 +46,7 @@ public class LessonReader { * @param fileName in the form "fileName.txt" * @return Lesson object built from text file */ - public Lesson createLessonFromTextFile(String fileName) { + public static Lesson createLessonFromTextFile(String fileName) { /* Create the variables needed to build a lesson and give them fallback values if the text file provided is empty. diff --git a/src/META-INF/MANIFEST.MF b/src/META-INF/MANIFEST.MF new file mode 100644 index 0000000..e6d6934 --- /dev/null +++ b/src/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: QuizSystem + diff --git a/src/QuizSystem.java b/src/QuizSystem.java index 55f1844..b043be0 100644 --- a/src/QuizSystem.java +++ b/src/QuizSystem.java @@ -14,7 +14,7 @@ public class QuizSystem { System.out.println(" + ------------------------------------------------ +"); System.out.println(" + | Welcome to the MSc Software Engineering Quiz | +"); System.out.println(" + ------------------------------------------------ +"); - System.out.println(" \u00a9 Simon Barrett (C1218123) 2021"); + System.out.println(" Simon Barrett (C1218123) 2021"); // QUIZ AND DATA SET UP @@ -24,13 +24,12 @@ public class QuizSystem { UsersStorage users = new UsersStorage(); // Create all the lessons and add them to the module array to use - LessonReader lessonReader = new LessonReader(); - Lesson htmlLesson = lessonReader.createLessonFromTextFile("HTMLLesson.txt"); - Lesson scrumLesson = lessonReader.createLessonFromTextFile("ScrumLesson.txt"); - Lesson cssLesson = lessonReader.createLessonFromTextFile("CSSLesson.txt"); - Lesson dataTypesLesson = lessonReader.createLessonFromTextFile("DataTypes.txt"); - Lesson oopLesson = lessonReader.createLessonFromTextFile("OOP.txt"); - Lesson keywordsLesson = lessonReader.createLessonFromTextFile("Keywords.txt"); + Lesson htmlLesson = LessonReader.createLessonFromTextFile("HTMLLesson.txt"); + Lesson scrumLesson = LessonReader.createLessonFromTextFile("ScrumLesson.txt"); + Lesson cssLesson = LessonReader.createLessonFromTextFile("CSSLesson.txt"); + Lesson dataTypesLesson = LessonReader.createLessonFromTextFile("DataTypes.txt"); + Lesson oopLesson = LessonReader.createLessonFromTextFile("OOP.txt"); + Lesson keywordsLesson = LessonReader.createLessonFromTextFile("Keywords.txt"); Lesson[] cmt652LessonsArray = {htmlLesson, cssLesson, scrumLesson, dataTypesLesson,oopLesson,keywordsLesson}; Module cmt652 = new Module(cmt652LessonsArray); -- GitLab