102 lines
2.4 KiB
Plaintext
102 lines
2.4 KiB
Plaintext
|
|
// 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;
|
||
|
|
}
|