From a24171ad591fca984572e5fbd8389930e03cc012 Mon Sep 17 00:00:00 2001 From: AnthonyMichaelTDM <68485672+AnthonyMichaelTDM@users.noreply.github.com> Date: Sat, 19 Mar 2022 14:20:52 -0700 Subject: [PATCH] finish rust port of 22_Change --- 22_Change/rust/Cargo.toml | 8 ++ 22_Change/rust/README.md | 3 + 22_Change/rust/src/main.rs | 169 +++++++++++++++++++++++++++++++++++++ 3 files changed, 180 insertions(+) create mode 100644 22_Change/rust/Cargo.toml create mode 100644 22_Change/rust/README.md create mode 100644 22_Change/rust/src/main.rs diff --git a/22_Change/rust/Cargo.toml b/22_Change/rust/Cargo.toml new file mode 100644 index 00000000..1ec69633 --- /dev/null +++ b/22_Change/rust/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "rust" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/22_Change/rust/README.md b/22_Change/rust/README.md new file mode 100644 index 00000000..7e85f9a1 --- /dev/null +++ b/22_Change/rust/README.md @@ -0,0 +1,3 @@ +Original source downloaded [from Vintage Basic](http://www.vintage-basic.net/games.html) + +Conversion to [Rust](https://www.rust-lang.org/) by Anthony Rubick [AnthonyMichaelTDM](https://github.com/AnthonyMichaelTDM) diff --git a/22_Change/rust/src/main.rs b/22_Change/rust/src/main.rs new file mode 100644 index 00000000..f5baf682 --- /dev/null +++ b/22_Change/rust/src/main.rs @@ -0,0 +1,169 @@ +use std::io::{self, stdout, Write}; + +fn main() { + //DATA + let mut cost_in_cents:i16; + let mut payment_in_cents:i16; + let mut amount_owed_in_cents:i16; + + let mut hundred:i16; + let mut fifty:i16; + let mut twenty:i16; + let mut ten:i16; + let mut five:i16; + let mut one:i16; + let mut quarters:i16; + let mut dimes:i16; + let mut nickles:i16; + let mut pennies:i16; + + //print welcome message + welcome(); + + //print prompt + println!("I, YOUR FRIENDLY MICROCOMPUTER, WILL DETERMINE"); + println!("THE CORRECT CHANGE FOR ITEMS COSTING UP TO ${}.00.",i16::MAX/100); + + //game loop + loop { + //get cost of items + cost_in_cents = get_dollar_value_in_cents_from_user("COST OF ITEM:\t\t$"); + //get amount they already paid + payment_in_cents = get_dollar_value_in_cents_from_user("AMOUNT OF PAYMENT:\t$"); + + //calculate amount they owe + amount_owed_in_cents = payment_in_cents - cost_in_cents; + + //check whether the payment is equal to, less than, or greater than, the cost + if cost_in_cents == payment_in_cents { + println!("CORRECT AMOUNT, THANK YOU."); + continue; + } + else if payment_in_cents < cost_in_cents{ //amount_owed_in_cents is less than 0 + println!( + "SORRY, YOU HAVE SHORT-CHANGED ME ${}.{}", + -amount_owed_in_cents/100,//leading digits + -amount_owed_in_cents%100,//trailing digits + ); + continue; + } + else { + println!("YOUR CHANGE, ${}.{}", amount_owed_in_cents/100, amount_owed_in_cents%100); + } + + //calculate change due + //hundred dollar bills owed + hundred = amount_owed_in_cents / (100*100); + if hundred > 0 {println!("HUNDRED DOLLAR BILL(S): {}", hundred);} + amount_owed_in_cents = amount_owed_in_cents % (100*100); + + //fifty dollar bills owed + fifty = amount_owed_in_cents / (50*100); + if fifty > 0 {println!("FIFTY DOLLAR BILL(S): {}", fifty);} + amount_owed_in_cents = amount_owed_in_cents % (50*100); + + //twenty dollar bills owed + twenty = amount_owed_in_cents / (20*100); + if twenty > 0 {println!("TWENTY DOLLAR BILL(S): {}", twenty);} + amount_owed_in_cents = amount_owed_in_cents % (20*100); + + //ten dollar bills owed + ten = amount_owed_in_cents / (10*100); + if ten > 0 {println!("TEN DOLLAR BILL(S): {}", ten);} + amount_owed_in_cents = amount_owed_in_cents % (10*100); + + //five dollar bills owed + five = amount_owed_in_cents / (5*100); + if five > 0 {println!("FIVE DOLLAR BILL(S): {}", five);} + amount_owed_in_cents = amount_owed_in_cents % (5*100); + + //one dollar bills owed + one = amount_owed_in_cents / (1*100); + if one > 0 {println!("ONE DOLLAR BILL(S): {}", one);} + amount_owed_in_cents = amount_owed_in_cents % (1*100); + + //quarters owed + quarters = amount_owed_in_cents / 25; + if quarters > 0 {println!("QUARTER(S): {}", quarters);} + amount_owed_in_cents = amount_owed_in_cents % 25; + + //dimes owed + dimes = amount_owed_in_cents / 10; + if dimes > 0 {println!("DIME(S): {}", dimes);} + amount_owed_in_cents = amount_owed_in_cents % 10; + + //nickles owed + nickles = amount_owed_in_cents / 5; + if nickles > 0 {println!("NICKEL(S): {}", nickles);} + amount_owed_in_cents = amount_owed_in_cents % 5; + + //pennies owed + pennies = amount_owed_in_cents / 1; + if pennies > 0 {println!("PENNY(S): {}", pennies);} + + //print ending message + println!("THANK YOU, COME AGAIN.\n\n"); + } +} + +/** + * print welcome message + */ +fn welcome() { + println!("\t\t\t\tCHANGE\n\t CREATIVE COMPUTING MORRISTOWN, NEW JERSEY\n\n\n"); +} + +/** + * get number of money from user input + */ +fn get_dollar_value_in_cents_from_user(prompt:&str) -> i16 { + let mut value:i16; + //input loop + loop { + //data + let mut raw_input = String::new(); + + //print prompt + print!("{}",prompt); + //flush std out // allows prompt to be on same line as input + stdout().flush().expect("failed to flush"); + + //get input + io::stdin().read_line(&mut raw_input).expect("failed to read input"); + //filter out characters that aren't numbers or '.' + let mut no_prior_periods = true; + raw_input = raw_input.chars().filter(|c| { + if c.eq_ignore_ascii_case(&'.') && no_prior_periods { + no_prior_periods = false; + true + } else { + c.is_ascii_digit() + } + }).collect(); + + //should only be (at most) 1 . + if !raw_input.contains(".") { raw_input += ".00";} //if there are none, add one + + //ensure there are at least 2 trailing digits + if raw_input[raw_input.find('.').unwrap_or(raw_input.len())..].len() <= 2 { //if a slice of the string from the . onwards is less than or equal to 2, add two 0's to the end + raw_input += "00" + } + //truncate the trailing digits to 2 digits + raw_input = raw_input[..=raw_input.find('.').unwrap_or(raw_input.len()-2)+2].to_string(); //raw_input = a slice of raw_input from the start to 2 past the . + + //remove the '.' and convert the string to an integer + raw_input = raw_input.chars().filter(|c| c.is_ascii_digit()).collect(); + match raw_input.parse::().ok() { + Some(v) => {value = v;} + None => { + println!("INPUT OUTSIDE OF ACCEPTABLE RANGE, TRY AGAIN"); + continue; + }, + } + + //println!("{}",value); + + if value <= 0 {continue;} + else {return value;} + } +}