From 6818ea51ab818cb850a72e5298c447cc7d1748d3 Mon Sep 17 00:00:00 2001 From: KhotKeys Date: Sat, 4 Jul 2026 15:13:42 +0100 Subject: [PATCH 1/3] Complete task for the Sprint-1 --- Sprint-1/1-key-exercises/1-count.js | 3 ++- Sprint-1/1-key-exercises/2-initials.js | 2 +- Sprint-1/1-key-exercises/3-paths.js | 4 ++-- Sprint-1/1-key-exercises/4-random.js | 14 ++++++++--- Sprint-1/2-mandatory-errors/0.js | 5 ++-- Sprint-1/2-mandatory-errors/1.js | 4 +++- Sprint-1/2-mandatory-errors/2.js | 5 ++-- Sprint-1/2-mandatory-errors/3.js | 12 +++++----- Sprint-1/2-mandatory-errors/4.js | 9 ++++++-- .../1-percentage-change.js | 20 +++++++++------- .../3-mandatory-interpret/2-time-format.js | 23 +++++++++++-------- Sprint-1/3-mandatory-interpret/3-to-pounds.js | 18 +++++++++------ 12 files changed, 75 insertions(+), 44 deletions(-) diff --git a/Sprint-1/1-key-exercises/1-count.js b/Sprint-1/1-key-exercises/1-count.js index 117bcb2b6e..6c105794eb 100644 --- a/Sprint-1/1-key-exercises/1-count.js +++ b/Sprint-1/1-key-exercises/1-count.js @@ -3,4 +3,5 @@ let count = 0; count = count + 1; // Line 1 is a variable declaration, creating the count variable with an initial value of 0 -// Describe what line 3 is doing, in particular focus on what = is doing +// Line 3 is a variable reassignment. The = (assignment operator) takes the result of count + 1 +// (which evaluates to 1) and stores it back into the existing count variable, replacing the old value. diff --git a/Sprint-1/1-key-exercises/2-initials.js b/Sprint-1/1-key-exercises/2-initials.js index 47561f6175..4a09edec56 100644 --- a/Sprint-1/1-key-exercises/2-initials.js +++ b/Sprint-1/1-key-exercises/2-initials.js @@ -5,7 +5,7 @@ let lastName = "Johnson"; // Declare a variable called initials that stores the first character of each string. // This should produce the string "CKJ", but you must not write the characters C, K, or J in the code of your solution. -let initials = ``; +let initials = `${firstName[0]}${middleName[0]}${lastName[0]}`; // https://www.google.com/search?q=get+first+character+of+string+mdn diff --git a/Sprint-1/1-key-exercises/3-paths.js b/Sprint-1/1-key-exercises/3-paths.js index ab90ebb28e..98ab371c3f 100644 --- a/Sprint-1/1-key-exercises/3-paths.js +++ b/Sprint-1/1-key-exercises/3-paths.js @@ -17,7 +17,7 @@ console.log(`The base part of ${filePath} is ${base}`); // Create a variable to store the dir part of the filePath variable // Create a variable to store the ext part of the variable -const dir = ; -const ext = ; +const dir = filePath.slice(0, lastSlashIndex); +const ext = base.slice(base.lastIndexOf(".")); // https://www.google.com/search?q=slice+mdn \ No newline at end of file diff --git a/Sprint-1/1-key-exercises/4-random.js b/Sprint-1/1-key-exercises/4-random.js index 292f83aabb..a3de7bcf84 100644 --- a/Sprint-1/1-key-exercises/4-random.js +++ b/Sprint-1/1-key-exercises/4-random.js @@ -3,7 +3,15 @@ const maximum = 100; const num = Math.floor(Math.random() * (maximum - minimum + 1)) + minimum; +console.log(num); + // In this exercise, you will need to work out what num represents? -// Try breaking down the expression and using documentation to explain what it means -// It will help to think about the order in which expressions are evaluated -// Try logging the value of num and running the program several times to build an idea of what the program is doing +// num represents a random integer between 1 and 100 (inclusive). +// +// Breakdown: +// 1. Math.random() generates a random decimal in [0, 1) +// 2. (maximum - minimum + 1) = 100, so Math.random() * 100 gives a decimal in [0, 100) +// 3. Math.floor(...) rounds down to an integer in [0, 99] +// 4. Adding minimum (1) shifts the range to [1, 100] +// +// So num is a random whole number from 1 to 100. diff --git a/Sprint-1/2-mandatory-errors/0.js b/Sprint-1/2-mandatory-errors/0.js index cf6c5039f7..1ae934d04b 100644 --- a/Sprint-1/2-mandatory-errors/0.js +++ b/Sprint-1/2-mandatory-errors/0.js @@ -1,2 +1,3 @@ -This is just an instruction for the first activity - but it is just for human consumption -We don't want the computer to run these 2 lines - how can we solve this problem? \ No newline at end of file +// This is just an instruction for the first activity - but it is just for human consumption +// We don't want the computer to run these 2 lines - how can we solve this problem? +// Solution: Prefix each line with // to make them comments, as done here. \ No newline at end of file diff --git a/Sprint-1/2-mandatory-errors/1.js b/Sprint-1/2-mandatory-errors/1.js index 7a43cbea76..f1318d2089 100644 --- a/Sprint-1/2-mandatory-errors/1.js +++ b/Sprint-1/2-mandatory-errors/1.js @@ -1,4 +1,6 @@ // trying to create an age variable and then reassign the value by 1 +// Error: Assignment to constant variable. +// const variables cannot be reassigned. Fix: use let instead. -const age = 33; +let age = 33; age = age + 1; diff --git a/Sprint-1/2-mandatory-errors/2.js b/Sprint-1/2-mandatory-errors/2.js index e09b89831d..485338158f 100644 --- a/Sprint-1/2-mandatory-errors/2.js +++ b/Sprint-1/2-mandatory-errors/2.js @@ -1,5 +1,6 @@ // Currently trying to print the string "I was born in Bolton" but it isn't working... -// what's the error ? +// Error: ReferenceError - cityOfBirth is used before it is declared. +// const is not hoisted like var. Fix: declare the variable before using it. -console.log(`I was born in ${cityOfBirth}`); const cityOfBirth = "Bolton"; +console.log(`I was born in ${cityOfBirth}`); diff --git a/Sprint-1/2-mandatory-errors/3.js b/Sprint-1/2-mandatory-errors/3.js index ec101884db..a3910d0985 100644 --- a/Sprint-1/2-mandatory-errors/3.js +++ b/Sprint-1/2-mandatory-errors/3.js @@ -1,9 +1,9 @@ +// Prediction: .slice() is a string method, not a number method, so it will throw a TypeError. +// Error: TypeError: cardNumber.slice is not a function +// Fix: convert the number to a string first. + const cardNumber = 4533787178994213; -const last4Digits = cardNumber.slice(-4); +const last4Digits = cardNumber.toString().slice(-4); +console.log(last4Digits); // The last4Digits variable should store the last 4 digits of cardNumber -// However, the code isn't working -// Before running the code, make and explain a prediction about why the code won't work -// Then run the code and see what error it gives. -// Consider: Why does it give this error? Is this what I predicted? If not, what's different? -// Then try updating the expression last4Digits is assigned to, in order to get the correct value diff --git a/Sprint-1/2-mandatory-errors/4.js b/Sprint-1/2-mandatory-errors/4.js index 5f86c730bc..7bbe15e213 100644 --- a/Sprint-1/2-mandatory-errors/4.js +++ b/Sprint-1/2-mandatory-errors/4.js @@ -1,2 +1,7 @@ -const 12HourClockTime = "8:53pm"; -const 24hourClockTime = "20:53"; +// Error: variable names cannot start with a digit. +// Fix: rename the variables to valid identifiers. +const twelveHourClockTime = "8:53pm"; +const twentyFourHourClockTime = "20:53"; + +console.log(twentyFourHourClockTime); +console.log(twelveHourClockTime); diff --git a/Sprint-1/3-mandatory-interpret/1-percentage-change.js b/Sprint-1/3-mandatory-interpret/1-percentage-change.js index e24ecb8e18..311960b4e1 100644 --- a/Sprint-1/3-mandatory-interpret/1-percentage-change.js +++ b/Sprint-1/3-mandatory-interpret/1-percentage-change.js @@ -2,21 +2,25 @@ let carPrice = "10,000"; let priceAfterOneYear = "8,543"; carPrice = Number(carPrice.replaceAll(",", "")); -priceAfterOneYear = Number(priceAfterOneYear.replaceAll("," "")); +priceAfterOneYear = Number(priceAfterOneYear.replaceAll(",", "")); const priceDifference = carPrice - priceAfterOneYear; const percentageChange = (priceDifference / carPrice) * 100; console.log(`The percentage change is ${percentageChange}`); -// Read the code and then answer the questions below +// a) Function calls: +// Line 4: replaceAll(",", "") and Number(...) +// Line 5: replaceAll(",", "") and Number(...) +// Line 10: console.log(...) -// a) How many function calls are there in this file? Write down all the lines where a function call is made +// b) The error on line 5 is a missing comma between the two arguments to replaceAll: +// replaceAll("," "") should be replaceAll(",", ""). Fixed above. -// b) Run the code and identify the line where the error is coming from - why is this error occurring? How can you fix this problem? +// c) Variable reassignment statements: lines 4 and 5 (carPrice = ..., priceAfterOneYear = ...) -// c) Identify all the lines that are variable reassignment statements +// d) Variable declarations: lines 1, 2 (let), lines 7, 8 (const) -// d) Identify all the lines that are variable declarations - -// e) Describe what the expression Number(carPrice.replaceAll(",","")) is doing - what is the purpose of this expression? +// e) Number(carPrice.replaceAll(",","")) first removes all commas from the string "10,000" +// turning it into "10000", then converts that string into the number 10000. +// This is necessary because you cannot do arithmetic on strings. diff --git a/Sprint-1/3-mandatory-interpret/2-time-format.js b/Sprint-1/3-mandatory-interpret/2-time-format.js index 47d2395587..fbd809a8f7 100644 --- a/Sprint-1/3-mandatory-interpret/2-time-format.js +++ b/Sprint-1/3-mandatory-interpret/2-time-format.js @@ -9,17 +9,22 @@ const totalHours = (totalMinutes - remainingMinutes) / 60; const result = `${totalHours}:${remainingMinutes}:${remainingSeconds}`; console.log(result); -// For the piece of code above, read the code and then answer the following questions +// a) There are 6 variable declarations: movieLength, remainingSeconds, totalMinutes, +// remainingMinutes, totalHours, result. -// a) How many variable declarations are there in this program? +// b) There is 1 function call: console.log(result) on line 10. -// b) How many function calls are there? +// c) movieLength % 60 uses the modulo (remainder) operator. +// It gives the remainder after dividing movieLength by 60, i.e. the leftover seconds +// that don't make a full minute. -// c) Using documentation, explain what the expression movieLength % 60 represents -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators +// d) totalMinutes = (movieLength - remainingSeconds) / 60 +// First, the remaining seconds are subtracted so the value is an exact multiple of 60. +// Dividing by 60 then converts the total seconds into whole minutes. -// d) Interpret line 4, what does the expression assigned to totalMinutes mean? +// e) result represents the movie length formatted as HH:MM:SS (hours:minutes:seconds). +// A clearer name would be formattedDuration or timeDisplay. -// e) What do you think the variable result represents? Can you think of a better name for this variable? - -// f) Try experimenting with different values of movieLength. Will this code work for all values of movieLength? Explain your answer +// f) The code works for any non-negative integer value of movieLength. +// It will not work correctly for negative values (a negative duration makes no sense) +// but for any valid seconds value >= 0 the arithmetic is correct. diff --git a/Sprint-1/3-mandatory-interpret/3-to-pounds.js b/Sprint-1/3-mandatory-interpret/3-to-pounds.js index 60c9ace69a..9e9677ba57 100644 --- a/Sprint-1/3-mandatory-interpret/3-to-pounds.js +++ b/Sprint-1/3-mandatory-interpret/3-to-pounds.js @@ -17,11 +17,15 @@ const pence = paddedPenceNumberString console.log(`£${pounds}.${pence}`); -// This program takes a string representing a price in pence -// The program then builds up a string representing the price in pounds - -// You need to do a step-by-step breakdown of each line in this program -// Try and describe the purpose / rationale behind each step - -// To begin, we can start with +// Step-by-step breakdown: // 1. const penceString = "399p": initialises a string variable with the value "399p" +// 2. penceStringWithoutTrailingP = penceString.substring(0, penceString.length - 1) +// Removes the trailing "p", leaving "399" +// 3. paddedPenceNumberString = "399".padStart(3, "0") +// Ensures the string is at least 3 characters long by padding with "0" on the left. +// "399" is already 3 chars so it stays "399". For "9p" this would give "009". +// 4. pounds = paddedPenceNumberString.substring(0, paddedPenceNumberString.length - 2) +// Takes all characters except the last 2. For "399" this gives "3" (the pounds part). +// 5. pence = paddedPenceNumberString.substring(paddedPenceNumberString.length - 2).padEnd(2, "0") +// Takes the last 2 characters ("99") as the pence part, and pads to 2 chars if needed. +// 6. console.log(`£${pounds}.${pence}`): prints "£3.99" From bee1483faabf88a7350c91f509b085f2214a2d77 Mon Sep 17 00:00:00 2001 From: KhotKeys Date: Sun, 5 Jul 2026 20:00:46 +0100 Subject: [PATCH 2/3] Complete task for the Sprint-2 --- Sprint-2/1-key-errors/0.js | 14 ++++------ Sprint-2/1-key-errors/1.js | 22 ++++++--------- Sprint-2/1-key-errors/2.js | 23 ++++----------- Sprint-2/2-mandatory-debug/0.js | 15 ++++------ Sprint-2/2-mandatory-debug/1.js | 14 ++++------ Sprint-2/2-mandatory-debug/2.js | 27 +++++++----------- Sprint-2/3-mandatory-implement/1-bmi.js | 2 +- Sprint-2/3-mandatory-implement/2-cases.js | 20 ++++--------- Sprint-2/3-mandatory-implement/3-to-pounds.js | 16 +++++++---- Sprint-2/4-mandatory-interpret/time-format.js | 28 ++++++++----------- 10 files changed, 70 insertions(+), 111 deletions(-) diff --git a/Sprint-2/1-key-errors/0.js b/Sprint-2/1-key-errors/0.js index 653d6f5a07..ab694faa1b 100644 --- a/Sprint-2/1-key-errors/0.js +++ b/Sprint-2/1-key-errors/0.js @@ -1,13 +1,9 @@ -// Predict and explain first... -// =============> write your prediction here - -// call the function capitalise with a string input -// interpret the error message and figure out why an error is occurring +// Predict: SyntaxError or ReferenceError because `str` is re-declared with `let` inside the function +// where it already exists as a parameter. +// Explanation: You cannot use `let` to re-declare a variable that already exists in the same scope. +// Fix: remove the `let` keyword — just reassign str. function capitalise(str) { - let str = `${str[0].toUpperCase()}${str.slice(1)}`; + str = `${str[0].toUpperCase()}${str.slice(1)}`; return str; } - -// =============> write your explanation here -// =============> write your new code here diff --git a/Sprint-2/1-key-errors/1.js b/Sprint-2/1-key-errors/1.js index f2d56151f4..ec47cab7a4 100644 --- a/Sprint-2/1-key-errors/1.js +++ b/Sprint-2/1-key-errors/1.js @@ -1,20 +1,14 @@ -// Predict and explain first... - -// Why will an error occur when this program runs? -// =============> write your prediction here - -// Try playing computer with the example to work out what is going on +// Prediction: Two errors — (1) re-declaring decimalNumber with const inside the function +// when it is already a parameter shadows and causes a SyntaxError. +// (2) console.log(decimalNumber) outside the function will throw ReferenceError because +// decimalNumber is not defined in the outer scope. +// Explanation: The parameter decimalNumber already exists; const re-declaration is illegal. +// Also, decimalNumber is not accessible outside the function. +// Fix: remove the const re-declaration inside the function, and pass a value to the function. function convertToPercentage(decimalNumber) { - const decimalNumber = 0.5; const percentage = `${decimalNumber * 100}%`; - return percentage; } -console.log(decimalNumber); - -// =============> write your explanation here - -// Finally, correct the code to fix the problem -// =============> write your new code here +console.log(convertToPercentage(0.5)); diff --git a/Sprint-2/1-key-errors/2.js b/Sprint-2/1-key-errors/2.js index aad57f7cfe..f1691d09f2 100644 --- a/Sprint-2/1-key-errors/2.js +++ b/Sprint-2/1-key-errors/2.js @@ -1,20 +1,9 @@ -// Predict and explain first BEFORE you run any code... +// Prediction: SyntaxError — a function parameter must be a valid identifier, not a literal number. +// Error: SyntaxError: Unexpected number +// Explanation: `3` is a number literal and cannot be used as a parameter name. +// Fix: use a named parameter like `num`. -// this function should square any number but instead we're going to get an error - -// =============> write your prediction of the error here - -function square(3) { - return num * num; +function square(num) { + return num * num; } - -// =============> write the error message here - -// =============> explain this error message here - -// Finally, correct the code to fix the problem - -// =============> write your new code here - - diff --git a/Sprint-2/2-mandatory-debug/0.js b/Sprint-2/2-mandatory-debug/0.js index b27511b417..f1b522c21f 100644 --- a/Sprint-2/2-mandatory-debug/0.js +++ b/Sprint-2/2-mandatory-debug/0.js @@ -1,14 +1,11 @@ -// Predict and explain first... - -// =============> write your prediction here +// Prediction: The template literal will print "undefined" for the function result because +// multiply uses console.log internally but does not return a value (returns undefined). +// Explanation: Functions without a return statement return undefined. +// The outer console.log then interpolates undefined into the string. +// Fix: replace console.log inside multiply with a return statement. function multiply(a, b) { - console.log(a * b); + return a * b; } console.log(`The result of multiplying 10 and 32 is ${multiply(10, 32)}`); - -// =============> write your explanation here - -// Finally, correct the code to fix the problem -// =============> write your new code here diff --git a/Sprint-2/2-mandatory-debug/1.js b/Sprint-2/2-mandatory-debug/1.js index 37cedfbcfd..3e7c689a10 100644 --- a/Sprint-2/2-mandatory-debug/1.js +++ b/Sprint-2/2-mandatory-debug/1.js @@ -1,13 +1,11 @@ -// Predict and explain first... -// =============> write your prediction here +// Prediction: The sum will print "undefined" because return; exits the function +// immediately without a value, so a + b is never evaluated. +// Explanation: return; with no expression returns undefined. The a + b on the next +// line is unreachable dead code. +// Fix: put a + b on the same line as return. function sum(a, b) { - return; - a + b; + return a + b; } console.log(`The sum of 10 and 32 is ${sum(10, 32)}`); - -// =============> write your explanation here -// Finally, correct the code to fix the problem -// =============> write your new code here diff --git a/Sprint-2/2-mandatory-debug/2.js b/Sprint-2/2-mandatory-debug/2.js index 57d3f5dc35..90ad3ac10b 100644 --- a/Sprint-2/2-mandatory-debug/2.js +++ b/Sprint-2/2-mandatory-debug/2.js @@ -1,24 +1,17 @@ -// Predict and explain first... +// Prediction: All three logs will print "3" (the last digit of the module-level const num = 103) +// because getLastDigit ignores its parameter and always uses the outer num. +// Output: +// The last digit of 42 is 3 +// The last digit of 105 is 3 +// The last digit of 806 is 3 +// Explanation: The function has no parameter, so any argument passed in is discarded. +// It always reads the outer `num` variable which is 103. +// Fix: add a parameter to getLastDigit and use it. -// Predict the output of the following code: -// =============> Write your prediction here - -const num = 103; - -function getLastDigit() { +function getLastDigit(num) { return num.toString().slice(-1); } console.log(`The last digit of 42 is ${getLastDigit(42)}`); console.log(`The last digit of 105 is ${getLastDigit(105)}`); console.log(`The last digit of 806 is ${getLastDigit(806)}`); - -// Now run the code and compare the output to your prediction -// =============> write the output here -// Explain why the output is the way it is -// =============> write your explanation here -// Finally, correct the code to fix the problem -// =============> write your new code here - -// This program should tell the user the last digit of each number. -// Explain why getLastDigit is not working properly - correct the problem diff --git a/Sprint-2/3-mandatory-implement/1-bmi.js b/Sprint-2/3-mandatory-implement/1-bmi.js index 17b1cbde1b..305dad6a11 100644 --- a/Sprint-2/3-mandatory-implement/1-bmi.js +++ b/Sprint-2/3-mandatory-implement/1-bmi.js @@ -15,5 +15,5 @@ // It should return their Body Mass Index to 1 decimal place function calculateBMI(weight, height) { - // return the BMI of someone based off their weight and height + return Number((weight / (height * height)).toFixed(1)); } \ No newline at end of file diff --git a/Sprint-2/3-mandatory-implement/2-cases.js b/Sprint-2/3-mandatory-implement/2-cases.js index 5b0ef77ad9..ca893c05f1 100644 --- a/Sprint-2/3-mandatory-implement/2-cases.js +++ b/Sprint-2/3-mandatory-implement/2-cases.js @@ -1,16 +1,6 @@ -// A set of words can be grouped together in different cases. +function toUpperSnakeCase(str) { + return str.replaceAll(" ", "_").toUpperCase(); +} -// For example, "hello there" in snake case would be written "hello_there" -// UPPER_SNAKE_CASE means taking a string and writing it in all caps with underscores instead of spaces. - -// Implement a function that: - -// Given a string input like "hello there" -// When we call this function with the input string -// it returns the string in UPPER_SNAKE_CASE, so "HELLO_THERE" - -// Another example: "lord of the rings" should be "LORD_OF_THE_RINGS" - -// You will need to come up with an appropriate name for the function -// Use the MDN string documentation to help you find a solution -// This might help https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toUpperCase +console.log(toUpperSnakeCase("hello there")); // "HELLO_THERE" +console.log(toUpperSnakeCase("lord of the rings")); // "LORD_OF_THE_RINGS" diff --git a/Sprint-2/3-mandatory-implement/3-to-pounds.js b/Sprint-2/3-mandatory-implement/3-to-pounds.js index 6265a1a703..d58031cd52 100644 --- a/Sprint-2/3-mandatory-implement/3-to-pounds.js +++ b/Sprint-2/3-mandatory-implement/3-to-pounds.js @@ -1,6 +1,12 @@ -// In Sprint-1, there is a program written in interpret/to-pounds.js +function toPounds(penceString) { + const withoutP = penceString.substring(0, penceString.length - 1); + const padded = withoutP.padStart(3, "0"); + const pounds = padded.substring(0, padded.length - 2); + const pence = padded.substring(padded.length - 2).padEnd(2, "0"); + return `£${pounds}.${pence}`; +} -// You will need to take this code and turn it into a reusable block of code. -// You will need to declare a function called toPounds with an appropriately named parameter. - -// You should call this function a number of times to check it works for different inputs +console.log(toPounds("399p")); // £3.99 +console.log(toPounds("9p")); // £0.09 +console.log(toPounds("50p")); // £0.50 +console.log(toPounds("1000p")); // £10.00 diff --git a/Sprint-2/4-mandatory-interpret/time-format.js b/Sprint-2/4-mandatory-interpret/time-format.js index 17127bc01e..aaf374025d 100644 --- a/Sprint-2/4-mandatory-interpret/time-format.js +++ b/Sprint-2/4-mandatory-interpret/time-format.js @@ -15,24 +15,20 @@ function formatTimeDisplay(seconds) { return `${pad(totalHours)}:${pad(remainingMinutes)}:${pad(remainingSeconds)}`; } -// You will need to play computer with this example - use the Python Visualiser https://pythontutor.com/visualize.html#mode=edit -// to help you answer these questions +// a) pad is called 3 times per call to formatTimeDisplay (once for hours, minutes, seconds). -// Questions +// Call formatTimeDisplay(61): +// remainingSeconds = 61 % 60 = 1 +// totalMinutes = (61 - 1) / 60 = 1 +// remainingMinutes = 1 % 60 = 1 +// totalHours = (1 - 1) / 60 = 0 +// pad is called with: totalHours=0, remainingMinutes=1, remainingSeconds=1 -// a) When formatTimeDisplay is called how many times will pad be called? -// =============> write your answer here +// b) num = 0 (totalHours) when pad is called for the first time. -// Call formatTimeDisplay with an input of 61, now answer the following: +// c) pad(0): "0".length < 2, so prepend "0" -> "00". Return value: "00" -// b) What is the value assigned to num when pad is called for the first time? -// =============> write your answer here +// d) num = 1 (remainingSeconds) when pad is called for the last time. +// It is the last argument passed in the template literal. -// c) What is the return value of pad is called for the first time? -// =============> write your answer here - -// d) What is the value assigned to num when pad is called for the last time in this program? Explain your answer -// =============> write your answer here - -// e) What is the return value of pad when it is called for the last time in this program? Explain your answer -// =============> write your answer here +// e) pad(1): "1".length < 2, so prepend "0" -> "01". Return value: "01" From f9cd0aebe8d29e8d2dc41749dda6d289023d150c Mon Sep 17 00:00:00 2001 From: KhotKeys Date: Mon, 20 Jul 2026 10:05:57 +0100 Subject: [PATCH 3/3] Restore original questions alongside answers in Sprint-2 files; fix capitalise to use new const instead of reassigning parameter --- Sprint-2/1-key-errors/0.js | 26 +++++++++++++---- Sprint-2/1-key-errors/1.js | 22 +++++++++++--- Sprint-2/1-key-errors/2.js | 14 +++++++-- Sprint-2/2-mandatory-debug/0.js | 10 ++++++- Sprint-2/2-mandatory-debug/1.js | 13 +++++++-- Sprint-2/2-mandatory-debug/2.js | 18 ++++++++++-- Sprint-2/4-mandatory-interpret/time-format.js | 29 +++++++++++-------- 7 files changed, 102 insertions(+), 30 deletions(-) diff --git a/Sprint-2/1-key-errors/0.js b/Sprint-2/1-key-errors/0.js index ab694faa1b..d7bc3f3e53 100644 --- a/Sprint-2/1-key-errors/0.js +++ b/Sprint-2/1-key-errors/0.js @@ -1,9 +1,23 @@ -// Predict: SyntaxError or ReferenceError because `str` is re-declared with `let` inside the function -// where it already exists as a parameter. -// Explanation: You cannot use `let` to re-declare a variable that already exists in the same scope. -// Fix: remove the `let` keyword — just reassign str. +// Predict and explain first... +// Prediction: SyntaxError because `str` is re-declared with `let` inside the function +// where it already exists as a parameter. You cannot use `let` to re-declare a variable +// that already exists in the same scope. + +// call the function capitalise with a string input +// interpret the error message and figure out why an error is occurring + +// Original broken code: +// function capitalise(str) { +// let str = `${str[0].toUpperCase()}${str.slice(1)}`; +// return str; +// } + +// Explanation: The parameter `str` already exists in the function scope. +// Using `let str` tries to re-declare it, which is a SyntaxError. +// Instead of reassigning `str` (which represents the original input), +// we use a new const `capitalisedStr` to make it clear this is a different value. function capitalise(str) { - str = `${str[0].toUpperCase()}${str.slice(1)}`; - return str; + const capitalisedStr = `${str[0].toUpperCase()}${str.slice(1)}`; + return capitalisedStr; } diff --git a/Sprint-2/1-key-errors/1.js b/Sprint-2/1-key-errors/1.js index ec47cab7a4..1f4cabacba 100644 --- a/Sprint-2/1-key-errors/1.js +++ b/Sprint-2/1-key-errors/1.js @@ -1,10 +1,24 @@ +// Predict and explain first... + +// Why will an error occur when this program runs? // Prediction: Two errors — (1) re-declaring decimalNumber with const inside the function -// when it is already a parameter shadows and causes a SyntaxError. +// when it is already a parameter causes a SyntaxError. // (2) console.log(decimalNumber) outside the function will throw ReferenceError because // decimalNumber is not defined in the outer scope. -// Explanation: The parameter decimalNumber already exists; const re-declaration is illegal. -// Also, decimalNumber is not accessible outside the function. -// Fix: remove the const re-declaration inside the function, and pass a value to the function. + +// Try playing computer with the example to work out what is going on + +// Original broken code: +// function convertToPercentage(decimalNumber) { +// const decimalNumber = 0.5; +// const percentage = `${decimalNumber * 100}%`; +// return percentage; +// } +// console.log(decimalNumber); + +// Explanation: The parameter decimalNumber already exists in the function scope; +// const re-declaration is illegal. Also, decimalNumber is not accessible outside the function. +// Fix: remove the const re-declaration inside the function, and pass a value when calling it. function convertToPercentage(decimalNumber) { const percentage = `${decimalNumber * 100}%`; diff --git a/Sprint-2/1-key-errors/2.js b/Sprint-2/1-key-errors/2.js index f1691d09f2..fd9e0e3310 100644 --- a/Sprint-2/1-key-errors/2.js +++ b/Sprint-2/1-key-errors/2.js @@ -1,7 +1,17 @@ +// Predict and explain first BEFORE you run any code... -// Prediction: SyntaxError — a function parameter must be a valid identifier, not a literal number. -// Error: SyntaxError: Unexpected number +// this function should square any number but instead we're going to get an error + +// Prediction: SyntaxError — a function parameter must be a valid identifier, not a number literal. + +// Original broken code: +// function square(3) { +// return num * num; +// } + +// Error message: SyntaxError: Unexpected number // Explanation: `3` is a number literal and cannot be used as a parameter name. +// Parameters must be valid identifiers (variable names). // Fix: use a named parameter like `num`. function square(num) { diff --git a/Sprint-2/2-mandatory-debug/0.js b/Sprint-2/2-mandatory-debug/0.js index f1b522c21f..83cea4380d 100644 --- a/Sprint-2/2-mandatory-debug/0.js +++ b/Sprint-2/2-mandatory-debug/0.js @@ -1,7 +1,15 @@ +// Predict and explain first... // Prediction: The template literal will print "undefined" for the function result because // multiply uses console.log internally but does not return a value (returns undefined). + +// Original broken code: +// function multiply(a, b) { +// console.log(a * b); +// } +// console.log(`The result of multiplying 10 and 32 is ${multiply(10, 32)}`); + // Explanation: Functions without a return statement return undefined. -// The outer console.log then interpolates undefined into the string. +// The outer console.log then interpolates undefined into the string. // Fix: replace console.log inside multiply with a return statement. function multiply(a, b) { diff --git a/Sprint-2/2-mandatory-debug/1.js b/Sprint-2/2-mandatory-debug/1.js index 3e7c689a10..ff7d5fb412 100644 --- a/Sprint-2/2-mandatory-debug/1.js +++ b/Sprint-2/2-mandatory-debug/1.js @@ -1,7 +1,16 @@ +// Predict and explain first... // Prediction: The sum will print "undefined" because return; exits the function // immediately without a value, so a + b is never evaluated. -// Explanation: return; with no expression returns undefined. The a + b on the next -// line is unreachable dead code. + +// Original broken code: +// function sum(a, b) { +// return; +// a + b; +// } +// console.log(`The sum of 10 and 32 is ${sum(10, 32)}`); + +// Explanation: return; with no expression returns undefined. +// The a + b on the next line is unreachable dead code and is never executed. // Fix: put a + b on the same line as return. function sum(a, b) { diff --git a/Sprint-2/2-mandatory-debug/2.js b/Sprint-2/2-mandatory-debug/2.js index 90ad3ac10b..c1d8633ea9 100644 --- a/Sprint-2/2-mandatory-debug/2.js +++ b/Sprint-2/2-mandatory-debug/2.js @@ -1,12 +1,24 @@ +// Predict and explain first... + +// Predict the output of the following code: // Prediction: All three logs will print "3" (the last digit of the module-level const num = 103) // because getLastDigit ignores its parameter and always uses the outer num. -// Output: +// Expected output: // The last digit of 42 is 3 // The last digit of 105 is 3 // The last digit of 806 is 3 + +// Original broken code: +// const num = 103; +// function getLastDigit() { +// return num.toString().slice(-1); +// } + +// Actual output matched prediction — all printed "3". + // Explanation: The function has no parameter, so any argument passed in is discarded. -// It always reads the outer `num` variable which is 103. -// Fix: add a parameter to getLastDigit and use it. +// It always reads the outer `num` variable which is 103. +// Fix: add a parameter to getLastDigit and use it instead of the outer variable. function getLastDigit(num) { return num.toString().slice(-1); diff --git a/Sprint-2/4-mandatory-interpret/time-format.js b/Sprint-2/4-mandatory-interpret/time-format.js index aaf374025d..0d53b353aa 100644 --- a/Sprint-2/4-mandatory-interpret/time-format.js +++ b/Sprint-2/4-mandatory-interpret/time-format.js @@ -15,20 +15,25 @@ function formatTimeDisplay(seconds) { return `${pad(totalHours)}:${pad(remainingMinutes)}:${pad(remainingSeconds)}`; } -// a) pad is called 3 times per call to formatTimeDisplay (once for hours, minutes, seconds). +// You will need to play computer with this example - use the Python Visualiser https://pythontutor.com/visualize.html#mode=edit +// to help you answer these questions -// Call formatTimeDisplay(61): -// remainingSeconds = 61 % 60 = 1 -// totalMinutes = (61 - 1) / 60 = 1 -// remainingMinutes = 1 % 60 = 1 -// totalHours = (1 - 1) / 60 = 0 -// pad is called with: totalHours=0, remainingMinutes=1, remainingSeconds=1 +// Questions -// b) num = 0 (totalHours) when pad is called for the first time. +// a) When formatTimeDisplay is called how many times will pad be called? +// =============> pad is called 3 times per call to formatTimeDisplay (once for totalHours, once for remainingMinutes, once for remainingSeconds). -// c) pad(0): "0".length < 2, so prepend "0" -> "00". Return value: "00" +// Call formatTimeDisplay with an input of 61, now answer the following: +// (remainingSeconds = 1, totalMinutes = 1, remainingMinutes = 1, totalHours = 0) -// d) num = 1 (remainingSeconds) when pad is called for the last time. -// It is the last argument passed in the template literal. +// b) What is the value assigned to num when pad is called for the first time? +// =============> num = 0 (totalHours), because totalHours is the first argument in the template literal. -// e) pad(1): "1".length < 2, so prepend "0" -> "01". Return value: "01" +// c) What is the return value of pad when it is called for the first time? +// =============> "00" — "0".length < 2, so "0" is prepended, giving "00". + +// d) What is the value assigned to num when pad is called for the last time in this program? Explain your answer +// =============> num = 1 (remainingSeconds). It is the last argument passed in the template literal, so pad is called with it last. + +// e) What is the return value of pad when it is called for the last time in this program? Explain your answer +// =============> "01" — "1".length < 2, so "0" is prepended, giving "01".