From 6b3867dcd2bd1865656845bede4e9e52ccd7c605 Mon Sep 17 00:00:00 2001 From: Declan Munene Date: Tue, 7 Apr 2026 22:27:12 +0300 Subject: [PATCH] feat: lab3 complete - ENE212-0061/2023 --- starter/lab3_task1.php | 69 ++++++++++++-------- starter/lab3_task2.php | 139 +++++++++++++++++++++++++++-------------- starter/lab3_task3.php | 119 +++++++++++++++++++++++++---------- starter/lab3_task4.php | 135 ++++++++++++++++++++++++++------------- 4 files changed, 314 insertions(+), 148 deletions(-) diff --git a/starter/lab3_task1.php b/starter/lab3_task1.php index f396a7e..4cf6d61 100644 --- a/starter/lab3_task1.php +++ b/starter/lab3_task1.php @@ -3,58 +3,68 @@ * 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 Declan Munene + * @student ENE212-0061/2023 * @lab Lab 3 of 14 * @unit ICS 2371 - * @date [Date completed] + * @date April 7, 2026 */ // ══════════════════════════════════════════════════════════════ // 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 +$temperature = 39.2; -// TODO: Exercise A — your code here +// Using separate if statements only (no else/elseif) +if ($temperature >= 36.1 && $temperature <= 37.5) { + echo "Temperature ($temperature): Normal
"; +} +if ($temperature > 37.5) { + echo "Temperature ($temperature): Fever
"; +} + +if ($temperature < 36.1) { + echo "Temperature ($temperature): 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 +$number = 47; + +// Check if Even or Odd +if ($number % 2 == 0) { + echo "$number is EVEN
"; +} else { + echo "$number is ODD
"; +} -// TODO: Exercise B — your code here +// Divisibility checks +echo ($number % 3 == 0) ? "$number is divisible by 3
" : "$number is NOT divisible by 3
"; +echo ($number % 5 == 0) ? "$number is divisible by 5
" : "$number is NOT divisible by 5
"; +echo ($number % 3 == 0 && $number % 5 == 0) ? "$number is divisible by both 3 and 5
" : "$number is NOT divisible by both 3 and 5
"; // ══════════════════════════════════════════════════════════════ // EXERCISE C — Comparison Chain // ══════════════════════════════════════════════════════════════ -// Run this code EXACTLY as written. -// Record all six outputs in your report and explain each result. - $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? - -// Your explanation of each result goes in your PDF report (not here). +echo "

Exercise C Results:

"; +var_dump($x == $y); // A: bool(true) - Equality (values match after type juggling) +var_dump($x === $y); // B: bool(false) - Identity (int vs string) +var_dump($x == $z); // C: bool(true) - Equality (values match) +var_dump($x === $z); // D: bool(false) - Identity (int vs float) +var_dump($y === $z); // E: bool(false) - Identity (string vs float) +var_dump($x <=> $y); // F: int(0) - Spaceship operator returns 0 if values are equal // ══════════════════════════════════════════════════════════════ // EXERCISE D — Null & Default Values // ══════════════════════════════════════════════════════════════ -// Run this code as written, then extend it as instructed below. +echo "

Exercise D Results:

"; $username = null; $display = $username ?? "Guest"; @@ -67,4 +77,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: Checking for a user profile picture +$user_upload = null; +$gravatar_url = null; +$placeholder = "default_avatar.png"; + +$final_image = $user_upload ?? $gravatar_url ?? $placeholder; +echo "Profile Image: $final_image
"; +?> \ No newline at end of file diff --git a/starter/lab3_task2.php b/starter/lab3_task2.php index b03e13c..058c346 100644 --- a/starter/lab3_task2.php +++ b/starter/lab3_task2.php @@ -3,64 +3,111 @@ * 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. - * - * @author [Your Full Name] - * @student [Your Reg Number, e.g. SCT212-XXXX/2024] + * @author Declan Munene + * @student ENE212-0061/2023 * @lab Lab 3 of 14 * @unit ICS 2371 - * @date [Date completed] + * @date April 7, 2026 */ -// ── Test Data Set A (change values to run other test sets) ───────────────── -$name = "Your Name"; -$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" +// ── Test Data Set A (Update these values for Sets B, C, D, and E) ────────── +$name = "Declan Munene"; +$cat1 = 8; +$cat2 = 7; +$cat3 = 9; +$cat4 = 6; +$exam = 52; // ── STEP 1: Compute total ───────────────────────────────────────────────── -// TODO: compute $total - +$total = $cat1 + $cat2 + $cat3 + $cat4 + $exam; // ── STEP 2: Count CATs attended ─────────────────────────────────────────── -// TODO: compute $cats_attended (each CAT > 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 +$eligible = false; +$grade = "N/A"; +$desc = "N/A"; +$supp_status = "N/A"; + +if ($cats_attended >= 3 && $exam >= 20) { + $eligible = true; + + // Grade classification + if ($total >= 70) { + $grade = "A"; + $desc = "Distinction"; + } elseif ($total >= 65) { + $grade = "B+"; + $desc = "Credit Upper"; + } elseif ($total >= 60) { + $grade = "B"; + $desc = "Credit Lower"; + } elseif ($total >= 55) { + $grade = "C+"; + $desc = "Pass Upper"; + } elseif ($total >= 50) { + $grade = "C"; + $desc = "Pass Lower"; + } elseif ($total >= 40) { + $grade = "D"; + $desc = "Marginal Pass"; + } else { + $grade = "E"; + $desc = "Fail"; + } + + // Supplementary ternary rule + $supp_status = ($grade == "D") ? "Eligible for Supplementary Exam" : "Not eligible for supplementary"; +} else { + $eligible = false; + $desc = "DISQUALIFIED — Exam conditions not met"; +} // ── 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 +?> + + + + + JKUAT Student Report Card + + + +
+

Academic Report Card

+
Student Name:
+
CAT Scores:
+
Exam Score: / 60
+
CATs Attended: / 4
+
Total Marks: / 100
+ + +
+ Grade:
+ +
+ +
+ +
+ +
-// ── 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 + + \ No newline at end of file diff --git a/starter/lab3_task3.php b/starter/lab3_task3.php index d9e00c8..2993cf9 100644 --- a/starter/lab3_task3.php +++ b/starter/lab3_task3.php @@ -3,59 +3,112 @@ * 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 Declan Munene + * @student ENE212-0061/2023 * @lab Lab 3 of 14 * @unit ICS 2371 - * @date [Date completed] + * @date April 7, 2026 */ // ══════════════════════════════════════════════════════════════ // 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. - -$day = 3; // change this to test all cases - -// TODO: switch-case for day classifier +$day = 3; +echo "

Exercise A: 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 ($day). Please use 1-7.
"; + break; +} // ══════════════════════════════════════════════════════════════ // EXERCISE B — HTTP Status Code Explainer // ══════════════════════════════════════════════════════════════ -// 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" - $status_code = 404; -// TODO: switch-case for HTTP status - +echo "

Exercise B: HTTP Switch

"; +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 error
"; + 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 fault
"; + break; + default: + echo "Unknown status code
"; + break; +} // ══════════════════════════════════════════════════════════════ // EXERCISE C — PHP 8 match Expression // ══════════════════════════════════════════════════════════════ -// 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 Match (PHP 8+)

"; -// TODO: match expression for HTTP status — same logic as Exercise B +$message = match ($status_code) { + 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 "HTTP Status $status_code: $message
"; // ══════════════════════════════════════════════════════════════ -// EXERCISE D — Rewrite comparison +// EXERCISE D — Written Comparison (For your 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. KEY DIFFERENCE: + 'switch' uses loose comparison (==), meaning it will type-juggle (e.g., string "200" equals integer 200). + 'match' uses strict comparison (===), meaning both value AND type must be identical. + + 2. EXAMPLE OF DIFFERENCE: + If $status_code = "200" (a string): + - switch ($status_code) case 200: would match and print "OK". + - match ($status_code) 200 => : would NOT match and would go to 'default' (or throw an error). + + 3. WHEN TO PREFER SWITCH: + You might prefer 'switch' if you need to execute complex blocks of logic (multiple lines of code) + per case, or if you intentionally want to use "fall-through" logic (omitting breaks) to handle + multiple cases with the same code. 'match' is an expression that returns a value and is + best for simple mappings. +*/ +?> \ No newline at end of file diff --git a/starter/lab3_task4.php b/starter/lab3_task4.php index 2a3d225..5280b68 100644 --- a/starter/lab3_task4.php +++ b/starter/lab3_task4.php @@ -3,57 +3,106 @@ * 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. - * - * @author [Your Full Name] - * @student [Your Reg Number, e.g. SCT212-XXXX/2024] + * @author Declan Munene + * @student ENE212-0061/2023 * @lab Lab 3 of 14 * @unit ICS 2371 - * @date [Date completed] + * @date April 7, 2026 */ -// ── 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" - -// ── Test data (change to test all branches) ─────────────────────────────── +// ── Test data (Update these values to run Sets A through E) ──────────────── $enrolled = true; -$gpa = 3.1; -$annual_income = 180000; -$previous_loan = false; +$gpa = 2.0; +$annual_income = 50000; +$previous_loan = true; + +// Initialize decision variables +$decision = ""; +$is_eligible = false; + +// ── STEP 1: Outer enrollment check (Nested Logic) ────────────────────────── +if ($enrolled) { + + // INNER CHECK 1 — GPA requirement + if ($gpa >= 2.0) { + + // INNER CHECK 2 — Household income bracket + if ($annual_income < 100000) { + $decision = "Eligible — Full loan award"; + $is_eligible = true; + } elseif ($annual_income < 250000) { + $decision = "Eligible — Partial loan (75%)"; + $is_eligible = true; + } elseif ($annual_income < 500000) { + $decision = "Eligible — Partial loan (50%)"; + $is_eligible = true; + } else { + $decision = "Not eligible — household income exceeds threshold"; + $is_eligible = false; + } -// ── STEP 1: Outer enrollment check ──────────────────────────────────────── -// TODO: nested if structure implementing all rules above + // ADDITIONAL RULE — Ternary for renewal vs new application + // Appended only if the student passed all inner checks + if ($is_eligible) { + $decision .= ($previous_loan) ? " | Renewal application" : " | New application"; + } + } else { + $decision = "Not eligible — GPA below minimum (2.0)"; + } + +} else { + $decision = "Not eligible — must be an active student"; +} // ── STEP 2: Display result ──────────────────────────────────────────────── -// TODO: output formatted result showing all input values and the decision +?> + + + + + HELB Eligibility Result + + + + +
+

HELB Loan Application Status

+ +
+ Enrollment Status: + +
+ +
+ Current GPA: + / 4.0 +
+ +
+ Annual Household Income: + KES +
+ +
+ Application History: + +
+
+ RESULT: +
+
-// ── 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 -// 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 + + \ No newline at end of file