Where learning finds its shape.

Spend less time checking work and more time teaching. Progma keeps your courses, exercises and exams in one place.

Fundamentals of Programming

Active

Problem solving with variables, conditions, loops and functions, building up to small console programs.

18 Activities
EBCBLT
+39

Lab 3: Linked Lists

NewPracticeOngoing

Implement insertion, deletion and reversal on a singly linked list, and trace each pointer update.

3 itemsDue in 2 days
Updated an hour ago

Data Structures

Active

Arrays, linked lists, stacks, queues, trees and graphs, with attention to the cost of each operation.

19 Activities
MCOPZM
+32

Checkpoint Quiz: Recursion

NewGradedScheduled

A short check on base cases and recursive calls, then one function to write from scratch.

2 itemsOpens in a day
Updated an hour ago

Object-Oriented Programming

Active

Classes, encapsulation, inheritance and interfaces in Java and C#, through small domain models.

14 Activities
RFHPNH
+35

Midterm Lab Exam

GradedClosed

Timed and graded in lockdown mode: stacks, queues and command processing in C.

4 itemsClosed 4 days ago
Updated an hour ago

Web Development Fundamentals

Active

JavaScript and TypeScript from the language up: functions, collections, and parsing real input.

12 Activities
ASLMGE
+26

Problem Set: Trees and Traversals

NewPracticeOngoing

Open practice on recursive decomposition, traversal order and keeping track of state.

5 itemsDue in 12 days
Updated an hour ago

Two Sum

Print the indices of the two numbers that add up to the target.

main.py
n, target = map(int, input().split())nums = list(map(int, input().split())) seen = {}for i, x in enumerate(nums):    if target - x in seen:        print(seen[target - x], i)        break    seen[x] = ielse:    print(-1)
Shared taghash mapsShared tagarrays
6 test cases4 hidden

Bank Account

Process deposits and withdrawals, rejecting any that overdraw.

Main.java
import java.util.Scanner; public class Main {    static class Account {        private long balance;         void deposit(long amount) {            balance += amount;        }         boolean withdraw(long amount) {            if (amount > balance) return false;            balance -= amount;            return true;        }    }     public static void main(String[] args) {        Scanner in = new Scanner(System.in);        Account account = new Account();        int q = in.nextInt();        while (q-- > 0) {            String op = in.next();            long amount = in.nextLong();            if (op.equals("deposit")) {                account.deposit(amount);            } else if (!account.withdraw(amount)) {                System.out.println("Insufficient funds");            }        }        System.out.println(account.balance);    }}
Shared tagclassesShared tagencapsulation
8 test cases5 hidden

Big-O Warm-up

Reason about running time before writing any code.

  1. Question 1Multiple choice1 point

    What is the time complexity of binary search on a sorted array?

    O(1)
    O(log n)Correct answer
    O(n)
    O(n log n)
  2. Question 2Multiple select2 points

    Which of these run in linear time?

    Select all that apply.

    Linear searchCorrect answer
    Bubble sort, worst case
    Summing an arrayCorrect answer
    Merge sort
  3. Question 3True/false1 point

    An O(n²) algorithm is always slower than an O(n) one.

    True
    FalseCorrect answer
  4. Question 4Fill in the blank1 point

    Doubling n roughly Blank 1 the running time of an O(n²) algorithm.

    Accepted answers
    • quadruples, multiplies by 4
Multiple choiceMultiple selectTrue/falseFill in the blankShared tagcomplexity
4 questions5 points

Spiral Matrix

Print a matrix's values in clockwise spiral order.

main.c
#include <stdio.h> int printed = 0; void out(int value) {    printf(printed++ ? " %d" : "%d", value);} int main(void) {    int r, c, m[20][20];    scanf("%d %d", &r, &c);    for (int i = 0; i < r; i++)        for (int j = 0; j < c; j++)            scanf("%d", &m[i][j]);     int top = 0, bottom = r - 1;    int left = 0, right = c - 1;    while (top <= bottom && left <= right) {        for (int j = left; j <= right; j++)            out(m[top][j]);        top++;        for (int i = top; i <= bottom; i++)            out(m[i][right]);        right--;        if (top <= bottom) {            for (int j = right; j >= left; j--)                out(m[bottom][j]);            bottom--;        }        if (left <= right) {            for (int i = bottom; i >= top; i--)                out(m[i][left]);            left++;        }    }    printf("\n");    return 0;}
Shared tag2D arraysShared tagloops
7 test cases5 hidden

Balanced Brackets

For each line, print YES if every bracket is closed in order.

index.js
const fs = require("fs");const lines = fs.readFileSync(0, "utf8").trim().split("\n");const pairs = { ")": "(", "]": "[", "}": "{" }; for (const line of lines.slice(1)) {  const stack = [];  let ok = true;  for (const ch of line.trim()) {    if ("([{".includes(ch)) {      stack.push(ch);    } else if (ch in pairs && stack.pop() !== pairs[ch]) {      ok = false;      break;    }  }  console.log(ok && stack.length === 0 ? "YES" : "NO");}
Shared tagstacksShared tagstrings
9 test cases6 hidden

Java OOP Concepts

Inheritance, access and abstraction, checked before the lab.

  1. Question 1Identification1 point

    Which keyword lets a class reuse another class's fields and methods?

    Accepted answers
    • extends
  2. Question 2Multiple choice1 point

    Which access modifier makes a member visible only inside its own class?

    public
    protected
    privateCorrect answer
    No modifier
  3. Question 3True/false1 point

    A Java class can extend more than one class.

    True
    FalseCorrect answer
  4. Question 4Essay5 points

    Explain the difference between an abstract class and an interface, with an example of when you would use each.

    Up to 150 words.

    Rubric

    2 pts: a correct distinction. 2 pts: a fitting example for each. 1 pt: clear writing.

IdentificationMultiple choiceTrue/falseEssayShared tagclassesShared taginheritance
4 questions8 points

Grade Report

Average each student's scores and assign a letter grade.

Program.cs
using System;using System.Linq; class Program{    static string Letter(double average)    {        if (average >= 90) return "A";        if (average >= 80) return "B";        if (average >= 70) return "C";        return "F";    }     static void Main()    {        int n = int.Parse(Console.ReadLine());        for (int i = 0; i < n; i++)        {            string[] parts = Console.ReadLine().Split(' ');            double average = parts.Skip(1)                .Select(s => double.Parse(s))                .Average();            Console.WriteLine(                $"{parts[0]} {average:F1} {Letter(average)}");        }    }}
Shared tagLINQShared tagconditionals
6 test cases3 hidden

Binary Search

Answer each query with the index of the value, or -1.

index.ts
declare const require: (id: "fs") => {  readFileSync(fd: number, encoding: "utf8"): string;}; const input: string[] = require("fs")  .readFileSync(0, "utf8")  .trim()  .split("\n");const nums: number[] = input[1].split(" ").map(Number); function binarySearch(arr: number[], target: number): number {  let lo = 0;  let hi = arr.length - 1;  while (lo <= hi) {    const mid = (lo + hi) >> 1;    if (arr[mid] === target) return mid;    if (arr[mid] < target) lo = mid + 1;    else hi = mid - 1;  }  return -1;} for (const q of input[2].split(" ").map(Number)) {  console.log(binarySearch(nums, q));}
Shared tagsearchingShared tagfunctions
8 test cases5 hidden

Pointers in C

Addresses, dereferencing, and what makes behavior undefined.

  1. Question 1Multiple choice1 point

    Given int x = 5; int *p = &x;, what does *p evaluate to?

    5Correct answer
    The address of x
    The address of p
    It is undefined
  2. Question 2Fill in the blank2 points

    The Blank 1 operator gives the address of a variable, and the Blank 2 operator dereferences a pointer.

    Accepted answers
    • Blank 1: &
    • Blank 2: *
  3. Question 3Multiple select2 points

    Which of these cause undefined behavior?

    Select all that apply.

    Dereferencing NULLCorrect answer
    Reading through an uninitialized pointerCorrect answer
    Passing a pointer to a function
    Using memory after freeCorrect answer
  4. Question 4True/false1 point

    Calling free twice on the same pointer is safe.

    True
    FalseCorrect answer
Multiple choiceFill in the blankMultiple selectTrue/falseShared tagpointersShared tagmemory
4 questions6 points

Word Frequency

Print the three most frequent words, ties broken alphabetically.

main.py
import sysfrom collections import Counter words = sys.stdin.read().lower().split()counts = Counter(w.strip(".,!?") for w in words)ranked = sorted(counts.items(), key=lambda p: (-p[1], p[0])) for word, count in ranked[:3]:    print(f"{word} {count}")
Shared tagdictionariesShared tagsorting
5 test cases3 hidden

Reverse a Linked List

Read n values into a linked list and print it reversed.

main.c
#include <stdio.h>#include <stdlib.h> typedef struct Node {    int value;    struct Node *next;} Node; Node *push(Node *head, int value) {    Node *node = malloc(sizeof(Node));    node->value = value;    node->next = head;    return node;} int main(void) {    int n, x;    Node *head = NULL;    scanf("%d", &n);    for (int i = 0; i < n; i++) {        scanf("%d", &x);        head = push(head, x);    }    for (Node *p = head; p; p = p->next)        printf(p->next ? "%d " : "%d\n", p->value);    return 0;}
Shared tagpointersShared taglinked lists
6 test cases4 hidden

Testing and Debugging Reflection

A short write-up after the week's lab, plus two checks.

  1. Question 1Essay5 points

    Describe a bug you hit this week: how you located it, and what you changed to fix it.

    Up to 200 words.

    Rubric

    2 pts: a specific bug. 2 pts: a clear debugging process. 1 pt: what the fix was and why it works.

  2. Question 2Identification1 point

    What do we call a test that uses the smallest or largest valid input?

    Accepted answers
    • edge case, boundary case
  3. Question 3True/false1 point

    A program that passes every visible test case is guaranteed to pass the hidden ones.

    True
    FalseCorrect answer
EssayIdentificationTrue/falseShared tagtestingShared tagreflection
3 questions7 points

Every part of an exercise, built with AI

  1. Describe it

    Answer a few questions, or describe the whole exercise in one sentence. AI drafts the title, summary, statement and tags.

  2. Solution and starter code

    AI writes a reference solution and the files students start from. Lock a file so students can read it but not edit it, or hide it entirely.

  3. Test cases

    AI suggests test cases aimed at common student mistakes. One click fills in every expected output by running your solution.

  4. Keyword rules

    Require or forbid keywords, like banning qsort so students write their own sort. A violation scores the item 0 by default, and you can change the penalty.

  5. Refine the statement

    Ask for changes in your own words. AI edits the problem statement, and you apply it when it reads right.

  6. Check the exercise

    Before students see it, AI reviews the statement, solution, starter code and test cases together, and flags what is missing.

Exams you can review, not just hope about

  • Leaving fullscreenLockdown asks students to stay in fullscreen. They are told each exit is recorded, and so is their return.
  • Switching tabsLeaving the exam for another tab or app is recorded the same way, on the same log.
  • A timeline for every studentOpen any student's activity log for the counts and the moments behind them, from start to submission.

Everything else a programming course runs on

Shared item bank

Every teacher's exercises in one bank, in Java, Python, C and more. Browse by author, or keep to your own.

Activity setup

Schedule it, set time limits, access codes and lockdown, choose who takes it and when answers show.

Course overview

Write the page students land on, with files and links that turn into cards.

Enrollment and invitations

Invite students, share a join code, or require approval, and watch the roster fill up.

Student groups

Sort students into color-coded groups, like a class section or an extra-practice group.

BSIT 1-A
EBEthan Brooksethan.brooks@school.edu
LTLucas Turnerlucas.turner@school.edu
Extra practice
CBChloe Bennettchloe.bennett@school.edu
MCMaya Collinsmaya.collins@school.edu

Grading and AI Insights

Hidden test cases score each submission, and AI rates its hard-coding risk and code quality.

Class Record

A gradebook for every course, with class stats at a glance, color-banded scores and filters by group.

The kind of courses teachers build

Bring Progma to your institution today