// Public domain / CC0. Use freely for any purpose. RoyR 2026 // calculator.cm - Simple expression calculator // Demonstrates: global variables, function composition, control flow void printf(uint8 *fmt); // Global state for the calculator int32 last_result = 0; int32 operation_count = 0; int32 add(int32 a, int32 b) { operation_count = operation_count + 1; last_result = a + b; return last_result; } int32 subtract(int32 a, int32 b) { operation_count = operation_count + 1; last_result = a - b; return last_result; } int32 multiply(int32 a, int32 b) { operation_count = operation_count + 1; last_result = a * b; return last_result; } int32 divide(int32 a, int32 b) { if (b == 0) { printf("Error: Division by zero\n"); return 0; } operation_count = operation_count + 1; last_result = a / b; return last_result; } int32 power(int32 base, int32 exp) { operation_count = operation_count + 1; int32 result = 1; for (int32 i = 0; i < exp; i = i + 1) { result = result * base; } last_result = result; return result; } int32 factorial(int32 n) { operation_count = operation_count + 1; if (n <= 1) { last_result = 1; return 1; } int32 result = 1; for (int32 i = 2; i <= n; i = i + 1) { result = result * i; } last_result = result; return result; } void print_stats(void) { printf("\n=== Calculator Statistics ===\n"); printf("Total operations: %d\n", operation_count); printf("Last result: %d\n", last_result); printf("============================\n"); } int32 main(void) { printf("Calculator Demo\n"); printf("===============\n\n"); // Basic arithmetic printf("10 + 5 = %d\n", add(10, 5)); printf("10 - 5 = %d\n", subtract(10, 5)); printf("10 * 5 = %d\n", multiply(10, 5)); printf("10 / 5 = %d\n", divide(10, 5)); // Power function printf("\n2^10 = %d\n", power(2, 10)); printf("5^3 = %d\n", power(5, 3)); // Factorial printf("\n5! = %d\n", factorial(5)); printf("10! = %d\n", factorial(10)); // Complex expression: (5 + 3) * (10 - 2) int32 a = add(5, 3); int32 b = subtract(10, 2); int32 result = multiply(a, b); printf("\n(5 + 3) * (10 - 2) = %d\n", result); // Division by zero test printf("\nTesting division by zero:\n"); divide(10, 0); print_stats(); return 0; }