3

I'm trying to finish an assignment, I'm stuck at and can't find a solution. Below is my full code.

//Student Object
        var student = {
          f_name: "",
          l_name: "",
          s_numb: "",
          email: "",
          courses: [],
          /*This function returns if current object has a specific course 
          and returns true if it does and false if not.*/
          hasCourse: function (course) {
            for (var c = 0; c < this.courses.length; c++) {
              if (course == this.courses[c]) {
                return true;
              }
            }
            return false;
          }
        };
        
        
        /*This function returns name with first letter 
        capitalized and the rest lowercase.*/
        function formatingName(name) {
          return name.charAt(0).toUpperCase() + name.substr(1, name.length);
        }
        
        /*This function validates to match the Student ID pattern and 
        returns true it matches and false if not.*/
        function validateStudentID(sid) {
          var patt = /^([0-9]{3}[.]){2}[0-9]{3}$/;
          return patt.test(sid);
        }
        
        /*This function receives a string array of course codes which 
        are to be registered for a student. The function returns an empty 
        string indicating all course codes in the array are valid; otherwise 
        the function returns the first invalid course code in the array.*/
        function validateCourses(courses) {
        
          var error = false;
        
          for (i = 0; i < courses.length; i++) {
            if (error == false) {
              if (courses[i] != "APC100" && courses[i] != "IPC144" && 
                courses[i] != "ULI101" && courses[i] != "IOS110" && 
                courses[i] != "EAC150" && courses[i] != "IBC233" && 
                courses[i] != "OOP244" && courses[i] != "DBS201" && 
                courses[i] != "INT222") {
                error = courses[i];
                break;
              }
            }
          }
          if (error != false) {return error;} else {return "";}
          return '';
        }
        
        
        var response = true; //Continues to prompt if error is true
        var error = false;   //Error flag
        var temp_obj = [];   //Temporary object that hold current object's values
        var temp_course = []; 
        var students = [];
        var x = 0;
        
        while (response == true) {
        
          do {
          
            var str = prompt("Please enter first name, last name, student ID,\nemail and courses (separated by ',')");
            
            if (str == "" || str === null) {
              response = false;
              break;
            }
        
            //Removing white spaces in the string
            str = str.split(' ').join('');
            //Splitting the string into array by , (coma) and assigning it to temporary object array
            temp_obj = str.split(',');
        
            //Validating Student ID
            if (validateStudentID(temp_obj[2]) == false) {
              alert(temp_obj[2] + " is not a valid student ID, Please use xxx.xxx.xxx format.\nPlease try again!");
              error = true;
            }
            //Validating if student is registered in atleast 1 course.
            if (temp_obj.length < 5) {
              alert("A student must be registered in at-least 1 course");
              error = true;
            }
            //Checking if student is registered in more than 6 courses
            if (temp_obj.length > 10) {
              temp_obj = temp_obj.slice(0,9);
            }
            //Extracting courses from temporary object array
            temp_course = temp_obj.slice(4, temp_obj.length);
        
            //Makking all the courses uppercase
            for (i = 0; i < temp_course.length; i++) {
              temp_course[i] = temp_course[i].toUpperCase();
            }
            //Validating if courses are valid
            if (validateCourses(temp_course) != "") {
              alert(validateCourses(temp_course) + " is not the course provided by CPD program!\nPlease try again.");
              error = true;
            }
        
          }
          while (error == true);
          //Break out of loop if user submitted nothing or if user pressed cancel
          if (response == false) {break;}
        
            //Merging cources array back with temporary object array
            temp_obj = temp_obj.concat(temp_course);
        
            //Creating a new instance of a student    
            students[x] = Object.create(student);
            
            //Assigning values to student object from temporary object;
            students[x].f_name = formatingName(temp_obj[0]); //Formatting name
            students[x].l_name = formatingName(temp_obj[1]);
            students[x].s_numb = temp_obj[2];
            students[x].email = temp_obj[3].toLowerCase(); //Making the email all lowercase
            
            //Making the course codes in Uppercase
            for (i = 0; i < (temp_obj.length) - 4; i++ ) {
              students[x].courses[i] = temp_obj[i + 4].toUpperCase();
            }
          
          x++;
        
        }
        
        //Printing total registered students
        alert("There are total " + students.length + " students registered.");
        
          var R_fname = [];
          var R_lname = [];
          var R_sid = [];
          var R_email = [];
        
        do {
          var no_error = false;
          var query = true;
          var query_course = [];
        
          while (no_error == false) {
            query = prompt("Please enter a course code:");
            if (query == "" || query == null) {
              query = false;
              break;
            }
        
            no_error = true;
        
            query_course[0] = query.toUpperCase();
        
            if (validateCourses(query_course) != "") {
              alert(query + " is not the course provided by CPD program!\nPlease try again");
              no_error = false;
            }
        
          }
        
          if (query == false) {break;}
        
        
          //THIS IS WHERE I THINK THE PROBLEM IS
          //THIS IS WHERE I THINK THE PROBLEM IS
          //THIS IS WHERE I THINK THE PROBLEM IS
          //THIS IS WHERE I THINK THE PROBLEM IS
        
          for (var a = 0; a < students.length; a++) {
        
            //Checking if student is registred in a course
            if (students[a].hasCourse(query_course) == true) {
              //Assigning values to temporary array.
              R_fname[a] = students[a].f_name;
              R_lname[a] = students[a].l_name;
              R_sid[a] = students[a].s_numb;
              R_email[a] = students[a].email;
         
            }
          }
        
          var fin_str = "";
        
          //Concatenating all the students in a specific course to fin_str as string.
          for (var b = 0; b < R_fname.length; b++) {
            fin_str += (R_fname[b] + " " + R_lname[b] + "    " + R_sid[b] + "    " + R_email[b] + " \n");
          }
        
          //Printing list of student in a specific course
          alert("List of students registered in " + query + "\n\n" + fin_str);
        
          //Retting temporary arrays
          R_fname.length = 0;
          R_lname.length = 0;
          R_sid.length = 0;
          R_email.length = 0;
        
          //Confirms to Exit the query loop
          if (confirm("Click 'OK' to continue to query class lists.\nClick 'Cancel' to stop the program.") == false) {break;}
        
        }
        while (query != false);

These are the test values:

roy,bean,056.171.486,[email protected],int222

carl,bell,121.126.536,[email protected],dbs201,int222

eric,brand,046.123.976,[email protected],oop244,dbs201,int222

henry, clay, 034.146.412, [email protected] , ibc233 , oop244 , dbs201 , int222

When the program asks to enter the course code; it is suppose to see if the students have that course and only if they do, it prints that students info.

In my case, even if student does not have the course it still prints it. Please run the code to see if it makes more sense... I can't explain any better

3
  • Demo: jsfiddle.net/arunpjohny/a25s1hrg/2 Commented Jun 23, 2015 at 3:41
  • 1
    developer.chrome.com/devtools/docs/javascript-debugging Grab some coffee and crack open that panel. If you take your time and walk through the code, you'll find your problem. Commented Jun 23, 2015 at 3:59
  • @Ja͢ck try the first 2 test values. then when asked for courses, enter int222 it will show both student. then enter dbs201, it shows both students again where as it only suppose to show the second one. Commented Jun 23, 2015 at 4:01

1 Answer 1

3

The problem can be reduced to this:

var Foo = {
  courses: []
};

var x = Object.create(Foo);
var y = Object.create(Foo);
x.courses.push(123);
alert(y.courses[0]); // "123"

The reason for this behaviour is that both objects inherit the same prototype and any changes made to .courses will apply to both objects.

For this reason, it would be better to create a constructor function instead:

function Foo()
{
    this.courses = [];
}

var x = new Foo();
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.