From 369eb89ea18250bad1b3ef73280b7683ee1c6f93 Mon Sep 17 00:00:00 2001 From: seth Date: Mon, 3 Jul 2023 23:54:18 -0400 Subject: initial commit --- .gitignore | 5 +++++ LICENSE | 21 +++++++++++++++++++ README.md | 7 +++++++ flake.lock | 26 +++++++++++++++++++++++ flake.nix | 39 +++++++++++++++++++++++++++++++++++ src/Calculator.java | 53 +++++++++++++++++++++++++++++++++++++++++++++++ src/calculator.d | 49 ++++++++++++++++++++++++++++++++++++++++++++ src/calculator.hs | 22 ++++++++++++++++++++ src/calculator.rs | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/calculator.swift | 41 +++++++++++++++++++++++++++++++++++++ 10 files changed, 321 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 src/Calculator.java create mode 100644 src/calculator.d create mode 100644 src/calculator.hs create mode 100644 src/calculator.rs create mode 100644 src/calculator.swift diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c033348 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +calculator +*.hi +*.o +*.class +*.exe diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..171b89c --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 seth + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..ff77b6f --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +# calculators + +this is a collection of small calculator programs i make for random languages. enjoy! + +## playing with it + +this project has a dev shell that can be used with `nix develop`. it will include tools to compile all of the files in this repo diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..1ec4784 --- /dev/null +++ b/flake.lock @@ -0,0 +1,26 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1688231357, + "narHash": "sha256-ZOn16X5jZ6X5ror58gOJAxPfFLAQhZJ6nOUeS4tfFwo=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "645ff62e09d294a30de823cb568e9c6d68e92606", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "ref": "nixos-unstable", + "type": "indirect" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..3f75ebc --- /dev/null +++ b/flake.nix @@ -0,0 +1,39 @@ +{ + description = "cool calculators"; + + inputs.nixpkgs.url = "nixpkgs/nixos-unstable"; + + outputs = {nixpkgs, ...}: let + systems = [ + "x86_64-linux" + "aarch64-linux" + "x86_64-darwin" + "aarch64-darwin" + ]; + + forAllSystems = nixpkgs.lib.genAttrs systems; + nixpkgsFor = forAllSystems (system: import nixpkgs {inherit system;}); + + forEachSystem = fn: + forAllSystems (system: + fn { + inherit system; + pkgs = nixpkgsFor.${system}; + }); + in { + devShells = forEachSystem ({pkgs, ...}: { + default = pkgs.mkShell { + packages = with pkgs; [ + ghc + haskellPackages.runghc + jdk17_headless + ldc + rustc + swift + ]; + }; + }); + + formatter = forEachSystem ({pkgs, ...}: pkgs.alejandra); + }; +} diff --git a/src/Calculator.java b/src/Calculator.java new file mode 100644 index 0000000..6f2cb94 --- /dev/null +++ b/src/Calculator.java @@ -0,0 +1,53 @@ +import java.util.Scanner; + +class InvalidOperatorException extends Exception { + public InvalidOperatorException(String errorMessage) { + super(errorMessage); + } +} + +public class Calculator { + private static float calculate(String operator, float number1, float number2) throws InvalidOperatorException { + switch(operator) { + case "+": + return number1 + number2; + case "-": + return number1 - number2; + case "/": + return number1 / number2; + case "*": + return number1 * number2; + default: + throw new InvalidOperatorException("invalid operator used!"); + } + } + + public static void main(String[] args) { + Scanner scan = new Scanner(System.in); + + float number1, number2, result; + String operator; + + try { + System.out.print("enter a number: " ); + number1 = scan.nextFloat(); + System.out.print("enter an operator: "); + scan.nextLine(); + operator = scan.nextLine(); + System.out.print("enter another number: "); + number2 = scan.nextFloat(); + } catch (Exception e) { + System.out.println("couldn't get your input!"); + return; + } + + try { + result = calculate(operator, number1, number2); + } catch (InvalidOperatorException e) { + System.out.println(e.getMessage()); + return; + } + + System.out.println(result); + } +} diff --git a/src/calculator.d b/src/calculator.d new file mode 100644 index 0000000..c7933be --- /dev/null +++ b/src/calculator.d @@ -0,0 +1,49 @@ +import std.stdio; +import std.string; + +class InvalidOperatorException : Exception { + this(string msg, string file = __FILE__, size_t line = __LINE__) { + super(msg, file, line); + } +} + +float calculate(char[] operator, float number1, float number2) { + foreach (c; operator) { + switch(c) { + case '+': + return number1 + number2; + case '-': + return number1 - number2; + case '/': + return number1 / number2; + case '*': + return number1 * number2; + default: + continue; + } + } + throw new InvalidOperatorException("invalid operator used!"); +} + +void main() { + char[] operator; + float number1; + float number2; + write("enter a number: "); + readf("%f", &number1); + + write("enter an operator: "); + readf(" %s\n", &operator); + + write("enter another number: "); + readf(" %f", &number2); + + float result; + try { + result = calculate(operator, number1, number2); + } catch (InvalidOperatorException e) { + writeln(e); + } + + writeln(result); +} diff --git a/src/calculator.hs b/src/calculator.hs new file mode 100644 index 0000000..1da13af --- /dev/null +++ b/src/calculator.hs @@ -0,0 +1,22 @@ +calculate :: String -> Float -> Float -> Float +calculate operator number1 number2 = case operator of + "+" -> number1 + number2 + "-" -> number1 - number2 + "/" -> number1 / number2 + "*" -> number1 * number2 + _ -> error "invalid operator!" + +main :: IO() +main = do + putStr "enter a number: " + input<-getLine + let number1 = (read input :: Float) + + putStr "enter an operator: " + operator<-getLine + + putStr "enter another number: " + input<-getLine + let number2 = (read input :: Float) + + print (calculate operator number1 number2) diff --git a/src/calculator.rs b/src/calculator.rs new file mode 100644 index 0000000..eab3ac8 --- /dev/null +++ b/src/calculator.rs @@ -0,0 +1,58 @@ +use std::error::Error; +use std::fmt; +use std::io; +use std::process; + +#[derive(Debug)] +struct UnknownOperatorError; + +impl Error for UnknownOperatorError {} + +impl fmt::Display for UnknownOperatorError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "invalid operator!") + } +} + +fn get_input() -> String { + let mut res = String::new(); + io::stdin() + .read_line(&mut res) + .expect("failed to get input!"); + + return (*res).trim().to_string(); +} + +fn get_number() -> f32 { + get_input() + .parse::() + .expect("failed to get your number (possible lack of rizz)") +} + +fn calculate(operator: &String, number1: &f32, number2: &f32) -> Result { + match operator.as_str() { + "+" => Ok(number1 + number2), + "-" => Ok(number1 - number2), + "/" => Ok(number1 / number2), + "*" => Ok(number1 * number2), + _ => Err(UnknownOperatorError), + } +} + +fn main() { + println!("enter a number: "); + let number1 = get_number(); + println!("enter an operator: "); + let operator = get_input(); + println!("enter another number: "); + let number2 = get_number(); + + let res = calculate(&operator, &number1, &number2); + match res { + Ok(i) => println!("{i}"), + Err(e) => { + eprintln!("{e}"); + process::exit(1); + } + } +} diff --git a/src/calculator.swift b/src/calculator.swift new file mode 100644 index 0000000..dfd4c4c --- /dev/null +++ b/src/calculator.swift @@ -0,0 +1,41 @@ +enum InvalidOperatorError: Error { + case operatorNotSupported +} + +func calculate(operatorThing: String, number1: Float, number2: Float) throws -> Float { + switch operatorThing { + case "+": + return number1 + number2 + case "-": + return number1 - number2 + case "/": + return number1 / number2 + case "*": + return number1 * number2 + default: + throw InvalidOperatorError.operatorNotSupported + } +} + + +func main() { + print("enter a number:") + let number1 = Float(readLine()!)! + print("enter an operator:") + let operatorThing = readLine()! + print("enter another number:") + let number2 = Float(readLine()!)! + + do { + let result = try calculate(operatorThing: operatorThing, number1: number1, number2: number2) + print(result) + } catch InvalidOperatorError.operatorNotSupported { + print("invalid operator!") + return + } catch { + print("unexpected error!") + return + } +} + +main() -- cgit v1.2.3