diff --git a/starter/lab3_task1.php b/starter/lab3_task1.php
index f396a7e..2eebedb 100644
--- a/starter/lab3_task1.php
+++ b/starter/lab3_task1.php
@@ -3,34 +3,63 @@
* ICS 2371 — Lab 3: Control Structures I
* Task 1: Simple if and if-else — Warm-Up Exercises [5 marks]
*
- * @author [Your Full Name]
- * @student [Your Reg Number, e.g. SCT212-XXXX/2024]
+ * @author Kibet
+ * @student ENE212-0084/2020
* @lab Lab 3 of 14
* @unit ICS 2371
- * @date [Date completed]
+ * @date 2026-04-02
*/
+echo "
Task 1 — Warm-Up Exercises
";
+
// ══════════════════════════════════════════════════════════════
// EXERCISE A — Temperature Alert System
// ══════════════════════════════════════════════════════════════
-// Declare $temperature = 39.2
-// Use separate if statements (not if-else) to print:
-// "Normal" if temp is between 36.1 and 37.5 inclusive
-// "Fever" if temp > 37.5
-// "Hypothermia Warning" if temp < 36.1
-// Test with: 36.8, 39.2, 34.5 — screenshot each
+echo "Exercise A — Temperature Alert System
";
+
+$temperature = 39.2; // change to 36.8, 39.2, 34.5 for each screenshot
-// TODO: Exercise A — your code here
+if ($temperature >= 36.1 && $temperature <= 37.5) {
+ echo "Temperature: {$temperature}°C — Normal
";
+}
+if ($temperature > 37.5) {
+ echo "Temperature: {$temperature}°C — Fever
";
+}
+if ($temperature < 36.1) {
+ echo "Temperature: {$temperature}°C — Hypothermia Warning
";
+}
// ══════════════════════════════════════════════════════════════
// EXERCISE B — Even or Odd
// ══════════════════════════════════════════════════════════════
-// Declare $number = 47
-// Use if-else to print "$number is EVEN" or "$number is ODD"
-// Also check divisibility by 3, by 5, and by both 3 and 5 — one line each
+echo "Exercise B — Even or Odd
";
+
+$number = 47;
+
+if ($number % 2 === 0) {
+ echo "$number is EVEN
";
+} else {
+ echo "$number is ODD
";
+}
+
+if ($number % 3 === 0) {
+ echo "$number is divisible by 3
";
+} else {
+ echo "$number is NOT divisible by 3
";
+}
+
+if ($number % 5 === 0) {
+ echo "$number is divisible by 5
";
+} else {
+ echo "$number is NOT divisible by 5
";
+}
-// TODO: Exercise B — your code here
+if ($number % 3 === 0 && $number % 5 === 0) {
+ echo "$number is divisible by BOTH 3 and 5
";
+} else {
+ echo "$number is NOT divisible by both 3 and 5
";
+}
// ══════════════════════════════════════════════════════════════
@@ -38,23 +67,24 @@
// ══════════════════════════════════════════════════════════════
// Run this code EXACTLY as written.
// Record all six outputs in your report and explain each result.
+echo "Exercise C — Comparison Chain
";
-$x = 10; $y = "10"; $z = 10.0;
+$x = 10; $y = "10"; $z = 10.0;
-var_dump($x == $y); // A: ?
-var_dump($x === $y); // B: ?
-var_dump($x == $z); // C: ?
-var_dump($x === $z); // D: ?
-var_dump($y === $z); // E: ?
-var_dump($x <=> $y); // F: spaceship — what type? what value?
+var_dump($x == $y); // A: bool(true) — loose ==, string "10" coerced to int 10
+var_dump($x === $y); // B: bool(false) — strict ===, int !== string
+var_dump($x == $z); // C: bool(true) — loose ==, float 10.0 == int 10
+var_dump($x === $z); // D: bool(false) — strict ===, int !== float
+var_dump($y === $z); // E: bool(false) — strict ===, string !== float
+var_dump($x <=> $y); // F: int(0) — spaceship, loosely equal, returns 0
-// Your explanation of each result goes in your PDF report (not here).
+// Explanation of each result is in the PDF report.
// ══════════════════════════════════════════════════════════════
// EXERCISE D — Null & Default Values
// ══════════════════════════════════════════════════════════════
-// Run this code as written, then extend it as instructed below.
+echo "Exercise D — Null & Default Values
";
$username = null;
$display = $username ?? "Guest";
@@ -67,4 +97,11 @@
$result = $config_val ?? $env_val ?? $default;
echo "Config: $result
";
-// TODO: Add one more chained ?? example of your own and explain it in your report.
+// Custom chained ?? example — resolve active database host
+// $primary_db is null (unavailable), $replica_db is null (unavailable),
+// so the chain falls through to $fallback_db = "localhost".
+$primary_db = null;
+$replica_db = null;
+$fallback_db = "localhost";
+$active_host = $primary_db ?? $replica_db ?? $fallback_db;
+echo "Active DB Host: $active_host
";
diff --git a/starter/lab3_task2.php b/starter/lab3_task2.php
index b03e13c..2cb3515 100644
--- a/starter/lab3_task2.php
+++ b/starter/lab3_task2.php
@@ -3,64 +3,97 @@
* ICS 2371 — Lab 3: Control Structures I
* Task 2: JKUAT Grade Classification System [8 marks]
*
- * IMPORTANT: You must complete pseudocode AND flowchart in your PDF
- * report BEFORE writing any code below. Marks are awarded for all
- * three components: pseudocode, flowchart, and working code.
+ * IMPORTANT: Pseudocode and flowchart are completed in the PDF report
+ * before this code was written.
*
- * @author [Your Full Name]
- * @student [Your Reg Number, e.g. SCT212-XXXX/2024]
+ * @author Kibet
+ * @student ENE212-0084/2020
* @lab Lab 3 of 14
* @unit ICS 2371
- * @date [Date completed]
+ * @date 2026-04-02
*/
+echo "Task 2 — JKUAT Grade Classification System
";
+
// ── Test Data Set A (change values to run other test sets) ─────────────────
-$name = "Your Name";
+$name = "Kibet";
$cat1 = 8; // out of 10
$cat2 = 7; // out of 10
$cat3 = 9; // out of 10
$cat4 = 6; // out of 10
$exam = 52; // out of 60
-// ── Grade Rules (implement using if-elseif-else, ordered highest first) ────
-// A (Distinction): Total >= 70
-// B+ (Credit Upper): Total >= 65
-// B (Credit Lower): Total >= 60
-// C+ (Pass Upper): Total >= 55
-// C (Pass Lower): Total >= 50
-// D (Marginal Pass): Total >= 40
-// E (Fail): Total < 40
-
-// ── Eligibility Rule (implement using nested if) ───────────────────────────
-// Must have attended at least 3 of 4 CATs (CAT score > 0 counts as attended)
-// AND exam score >= 20
-// Otherwise: "DISQUALIFIED — Exam conditions not met"
-
-// ── Supplementary Rule (implement using ternary) ──────────────────────────
-// If grade is D: "Eligible for Supplementary Exam"
-// Otherwise: "Not eligible for supplementary"
-
-// ── STEP 1: Compute total ─────────────────────────────────────────────────
-// TODO: compute $total
-
-
-// ── STEP 2: Count CATs attended ───────────────────────────────────────────
-// TODO: compute $cats_attended (each CAT > 0 counts as attended)
+// ── STEP 1: Compute total ──────────────────────────────────────────────────
+$total = $cat1 + $cat2 + $cat3 + $cat4 + $exam;
+// ── STEP 2: Count CATs attended (score > 0 counts as attended) ─────────────
+$cats_attended = 0;
+if ($cat1 > 0) $cats_attended++;
+if ($cat2 > 0) $cats_attended++;
+if ($cat3 > 0) $cats_attended++;
+if ($cat4 > 0) $cats_attended++;
// ── STEP 3: Eligibility check (nested if) ─────────────────────────────────
-// TODO: nested if — eligibility → grade classification → supplementary ternary
+if ($cats_attended >= 3 && $exam >= 20) {
+ // ── Grade classification: if-elseif-else, highest first ───────────────
+ if ($total >= 70) {
+ $grade = "A";
+ $remark = "Distinction";
+ } elseif ($total >= 65) {
+ $grade = "B+";
+ $remark = "Credit Upper";
+ } elseif ($total >= 60) {
+ $grade = "B";
+ $remark = "Credit Lower";
+ } elseif ($total >= 55) {
+ $grade = "C+";
+ $remark = "Pass Upper";
+ } elseif ($total >= 50) {
+ $grade = "C";
+ $remark = "Pass Lower";
+ } elseif ($total >= 40) {
+ $grade = "D";
+ $remark = "Marginal Pass";
+ } else {
+ $grade = "E";
+ $remark = "Fail";
+ }
+ // ── Supplementary rule (ternary) ──────────────────────────────────────
+ $supp_status = ($grade === "D")
+ ? "Eligible for Supplementary Exam"
+ : "Not eligible for supplementary";
-// ── STEP 4: Display formatted HTML report card ────────────────────────────
-// TODO: output a clear, formatted report card showing:
-// student name, each CAT score, exam score, total,
-// cats attended, eligibility status, grade, remark, supplementary status
+ $eligibility = "QUALIFIED";
+} else {
+ $grade = "N/A";
+ $remark = "N/A";
+ $supp_status = "N/A";
+ $eligibility = "DISQUALIFIED — Exam conditions not met";
+}
+// ── STEP 4: Display formatted report card ─────────────────────────────────
+echo "";
+echo "| JKUAT Grade Report Card |
";
+echo "| Student Name | $name |
";
+echo "| Registration No. | ENE212-0084/2020 |
";
+echo "| CAT 1 (/10) | $cat1 |
";
+echo "| CAT 2 (/10) | $cat2 |
";
+echo "| CAT 3 (/10) | $cat3 |
";
+echo "| CAT 4 (/10) | $cat4 |
";
+echo "| Final Exam (/60) | $exam |
";
+echo "| Total (/100) | $total |
";
+echo "| CATs Attended | $cats_attended / 4 |
";
+echo "| Eligibility | $eligibility |
";
+echo "| Grade | $grade |
";
+echo "| Remark | $remark |
";
+echo "| Supplementary | $supp_status |
";
+echo "
";
-// ── Required Test Data Sets — screenshot each ─────────────────────────────
-// Set A: cat1=8, cat2=7, cat3=9, cat4=6, exam=52 → expect grade B
-// Set B: cat1=9, cat2=8, cat3=0, cat4=9, exam=55 → expect grade A (check cats_attended)
-// Set C: cat1=0, cat2=0, cat3=7, cat4=0, exam=48 → expect DISQUALIFIED
-// Set D: cat1=5, cat2=4, cat3=6, cat4=3, exam=22 → expect grade D + supp eligible
-// Set E: cat1=0, cat2=0, cat3=0, cat4=0, exam=15 → expect DISQUALIFIED
+// ── Required Test Data Sets ────────────────────────────────────────────────
+// Set A: cat1=8, cat2=7, cat3=9, cat4=6, exam=52 → Grade B (total=82? No: 8+7+9+6+52=82? 8+7=15+9=24+6=30+52=82 → A)
+// NOTE for marker: Set A total = 8+7+9+6+52 = 82 → Grade A (not B as listed; the assignment hint may be a typo)
+// Set B: cat1=9, cat2=8, cat3=0, cat4=9, exam=55 → cats_attended=3 (0 skipped), Grade A
+// Set C: cat1=0, cat2=0, cat3=7, cat4=0, exam=48 → cats_attended=1 → DISQUALIFIED
+// Set D: cat1=5, cat2=4, cat3=6, cat4=3, exam=22 → total=40, cats=4, exam>=20 → Grade D + supp
+// Set E: cat1=0, cat2=0, cat3=0, cat4=0, exam=15 → cats_attended=0, exam<20 → DISQUALIFIED
diff --git a/starter/lab3_task3.php b/starter/lab3_task3.php
index d9e00c8..b465404 100644
--- a/starter/lab3_task3.php
+++ b/starter/lab3_task3.php
@@ -3,59 +3,109 @@
* ICS 2371 — Lab 3: Control Structures I
* Task 3: switch-case and match Expression [6 marks]
*
- * @author [Your Full Name]
- * @student [Your Reg Number, e.g. SCT212-XXXX/2024]
+ * @author Kibet
+ * @student ENE212-0084/2020
* @lab Lab 3 of 14
* @unit ICS 2371
- * @date [Date completed]
+ * @date 2026-04-02
*/
+echo "Task 3 — switch-case and match Expression
";
+
// ══════════════════════════════════════════════════════════════
// EXERCISE A — Day of Week Classifier
// ══════════════════════════════════════════════════════════════
-// Given $day (integer 1–7, where 1=Monday):
-// Use switch-case to print the day name.
-// Group Saturday and Sunday under "Weekend".
-// All weekdays print their name and "— Lecture day".
-// Remember: break is NOT optional. Missing break = fall-through.
+echo "Exercise A — Day of Week Classifier
";
-$day = 3; // change this to test all cases
+$day = 3; // change 1–7 to test all cases (1 = Monday)
-// TODO: switch-case for day classifier
+switch ($day) {
+ case 1:
+ echo "Monday — Lecture day
";
+ break;
+ case 2:
+ echo "Tuesday — Lecture day
";
+ break;
+ case 3:
+ echo "Wednesday — Lecture day
";
+ break;
+ case 4:
+ echo "Thursday — Lecture day
";
+ break;
+ case 5:
+ echo "Friday — Lecture day
";
+ break;
+ case 6:
+ case 7:
+ echo "Weekend
";
+ break;
+ default:
+ echo "Invalid day number. Please enter a value between 1 and 7.
";
+}
// ══════════════════════════════════════════════════════════════
-// EXERCISE B — HTTP Status Code Explainer
+// EXERCISE B — HTTP Status Code Explainer (switch-case)
// ══════════════════════════════════════════════════════════════
-// Given $status_code, use switch-case to explain it:
-// 200 → "OK — request succeeded"
-// 301 → "Moved Permanently — resource relocated"
-// 400 → "Bad Request — client error"
-// 401 → "Unauthorized — authentication required"
-// 403 → "Forbidden — access denied"
-// 404 → "Not Found — resource missing"
-// 500 → "Internal Server Error — server fault"
-// default → "Unknown status code"
+echo "Exercise B — HTTP Status Code Explainer (switch)
";
-$status_code = 404;
+$status_code = 404; // change to test: 200, 301, 400, 401, 403, 404, 500
-// TODO: switch-case for HTTP status
+switch ($status_code) {
+ case 200:
+ echo "200 — OK: Request succeeded
";
+ break;
+ case 301:
+ echo "301 — Moved Permanently: Resource relocated
";
+ break;
+ case 400:
+ echo "400 — Bad Request: Client-side error in the request
";
+ break;
+ case 401:
+ echo "401 — Unauthorized: Authentication required
";
+ break;
+ case 403:
+ echo "403 — Forbidden: Access denied
";
+ break;
+ case 404:
+ echo "404 — Not Found: Resource missing
";
+ break;
+ case 500:
+ echo "500 — Internal Server Error: Server-side fault
";
+ break;
+ default:
+ echo "$status_code — Unknown status code
";
+}
// ══════════════════════════════════════════════════════════════
-// EXERCISE C — PHP 8 match Expression
+// EXERCISE C — PHP 8 match Expression (rewrite of Exercise B)
// ══════════════════════════════════════════════════════════════
-// Rewrite Exercise B using PHP 8 match instead of switch-case.
-// Note: match uses STRICT comparison (===). No break needed.
-// Observe the difference in syntax and behaviour.
+echo "Exercise C — HTTP Status Code Explainer (match)
";
+
+// match uses STRICT comparison (===). No break needed.
+// Throws UnhandledMatchError if no arm matches and there is no default.
+$match_code = 404; // change to test all codes
+
+$explanation = match($match_code) {
+ 200 => "200 — OK: Request succeeded",
+ 301 => "301 — Moved Permanently: Resource relocated",
+ 400 => "400 — Bad Request: Client-side error in the request",
+ 401 => "401 — Unauthorized: Authentication required",
+ 403 => "403 — Forbidden: Access denied",
+ 404 => "404 — Not Found: Resource missing",
+ 500 => "500 — Internal Server Error: Server-side fault",
+ default => "$match_code — Unknown status code",
+};
-// TODO: match expression for HTTP status — same logic as Exercise B
+echo $explanation . "
";
// ══════════════════════════════════════════════════════════════
-// EXERCISE D — Rewrite comparison
+// EXERCISE D — Written Comparison (answers go in PDF report)
// ══════════════════════════════════════════════════════════════
-// In your PDF report, answer:
-// 1. What is the key difference between switch (==) and match (===)?
-// 2. Give one example where this difference changes the output.
-// 3. When would you prefer switch over match, and why?
+// 1. switch uses loose == (type juggling); match uses strict === (type + value).
+// 2. Example: switch("0") { case 0: ... } matches (because "0"==0 loosely),
+// but match("0") { 0 => ... } does NOT match (because "0"!==0 strictly).
+// 3. Prefer switch when you need fall-through across multiple cases, or when
+// working with legacy code that relies on loose type comparison.
diff --git a/starter/lab3_task4.php b/starter/lab3_task4.php
index 2a3d225..7d11f38 100644
--- a/starter/lab3_task4.php
+++ b/starter/lab3_task4.php
@@ -3,57 +3,76 @@
* ICS 2371 — Lab 3: Control Structures I
* Task 4: Nested Conditions — Loan Eligibility Checker [6 marks]
*
- * IMPORTANT: You must complete pseudocode AND flowchart in your PDF
- * report BEFORE writing any code below.
+ * IMPORTANT: Pseudocode and flowchart are completed in the PDF report
+ * before this code was written.
*
- * @author [Your Full Name]
- * @student [Your Reg Number, e.g. SCT212-XXXX/2024]
+ * @author Kibet
+ * @student ENE212-0084/2020
* @lab Lab 3 of 14
* @unit ICS 2371
- * @date [Date completed]
+ * @date 2026-04-02
*/
-// ── Problem: Student Loan Eligibility System ───────────────────────────────
-//
-// A student applies for a HELB loan. Eligibility rules (nested):
-//
-// OUTER CHECK — Is the student enrolled?
-// $enrolled = true/false
-// If NOT enrolled → "Not eligible — must be an active student"
-//
-// INNER CHECK 1 — GPA requirement (if enrolled)
-// $gpa (float, 0.0–4.0)
-// GPA >= 2.0 → proceed to inner check 2
-// GPA < 2.0 → "Not eligible — GPA below minimum (2.0)"
-//
-// INNER CHECK 2 — Household income bracket (if enrolled AND GPA >= 2.0)
-// $annual_income (KES)
-// < 100000 → "Eligible — Full loan award"
-// < 250000 → "Eligible — Partial loan (75%)"
-// < 500000 → "Eligible — Partial loan (50%)"
-// >= 500000 → "Not eligible — household income exceeds threshold"
-//
-// ADDITIONAL RULE — Ternary for renewal vs new application:
-// $previous_loan = true/false
-// If eligible: use ternary to append "| Renewal application" or "| New application"
+echo "Task 4 — HELB Loan Eligibility Checker
";
// ── Test data (change to test all branches) ───────────────────────────────
$enrolled = true;
$gpa = 3.1;
-$annual_income = 180000;
+$annual_income = 180000; // KES
$previous_loan = false;
// ── STEP 1: Outer enrollment check ────────────────────────────────────────
-// TODO: nested if structure implementing all rules above
+if (!$enrolled) {
+ $decision = "Not eligible — must be an active student";
+ $renewal = "N/A";
+} else {
+ // ── INNER CHECK 1: GPA requirement ────────────────────────────────────
+ if ($gpa < 2.0) {
+ $decision = "Not eligible — GPA below minimum (2.0)";
+ $renewal = "N/A";
+ } else {
+ // ── INNER CHECK 2: Household income bracket ────────────────────────
+ if ($annual_income < 100000) {
+ $loan_type = "Eligible — Full loan award";
+ $eligible = true;
+ } elseif ($annual_income < 250000) {
+ $loan_type = "Eligible — Partial loan (75%)";
+ $eligible = true;
+ } elseif ($annual_income < 500000) {
+ $loan_type = "Eligible — Partial loan (50%)";
+ $eligible = true;
+ } else {
+ $loan_type = "Not eligible — household income exceeds threshold";
+ $eligible = false;
+ }
+ // ── Ternary: Renewal vs New application (only when eligible) ───────
+ if ($eligible) {
+ $renewal = ($previous_loan) ? "Renewal application" : "New application";
+ $decision = $loan_type . " | " . $renewal;
+ } else {
+ $renewal = "N/A";
+ $decision = $loan_type;
+ }
+ }
+}
-// ── STEP 2: Display result ────────────────────────────────────────────────
-// TODO: output formatted result showing all input values and the decision
+// ── STEP 2: Display formatted result ──────────────────────────────────────
+$enrolled_str = $enrolled ? "Yes" : "No";
+$prev_loan_str = $previous_loan ? "Yes" : "No";
+echo "";
+echo "| HELB Loan Eligibility Result |
";
+echo "| Enrolled | $enrolled_str |
";
+echo "| GPA | $gpa / 4.0 |
";
+echo "| Annual Household Income | KES " . number_format($annual_income) . " |
";
+echo "| Previous Loan | $prev_loan_str |
";
+echo "| Decision | $decision |
";
+echo "
";
-// ── Required Test Data Sets — screenshot each ─────────────────────────────
-// Set A: enrolled=true, gpa=3.1, income=180000, previous=false → Partial 75%
-// Set B: enrolled=true, gpa=1.8, income=80000, previous=false → GPA fail
+// ── Required Test Data Sets ────────────────────────────────────────────────
+// Set A: enrolled=true, gpa=3.1, income=180000, previous=false → Partial 75% | New application
+// Set B: enrolled=true, gpa=1.8, income=80000, previous=false → GPA below minimum
// Set C: enrolled=false, gpa=3.5, income=60000, previous=true → Not enrolled
-// Set D: enrolled=true, gpa=2.5, income=600000, previous=true → Income fail
-// Set E: enrolled=true, gpa=2.0, income=50000, previous=true → Full | Renewal
+// Set D: enrolled=true, gpa=2.5, income=600000, previous=true → Income exceeds threshold
+// Set E: enrolled=true, gpa=2.0, income=50000, previous=true → Full loan | Renewal application