summaryrefslogtreecommitdiff
path: root/rust-book/mathsssss/src/main.rs
blob: 991590b7b9d49c7aceaebd004cb7d75f91082f4e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
use std::env;
use std::collections::HashMap;

fn calc_mean(numbers: &Vec<i32>) -> f32 {
    let sum: i32 = numbers.iter().sum();
    sum as f32 / numbers.len() as f32
}

fn calc_median(numbers: &Vec<i32>) -> i32 {
    numbers[numbers.len() / 2]
}

fn calc_mode(numbers: &Vec<i32>) -> i32 {
    let mut counts: HashMap<i32, i32> = HashMap::new();

    for each in numbers {
        let count = counts.entry(*each).or_insert(0);
        *count += 1;
    }

    let mut most: i32 = 0;
    let mut result: i32 = 0;

    for (key, val) in counts.iter() {
        
        if val > &most {
            most = *val;
            result = *key;
        }
    }
        
    if most <= 1 {
        0
    }
    else {
        result
    }

}

fn main() {
    // grab numbers
    let mut numbers: Vec<i32> = Vec::new();

    for arg in env::args().skip(1) {
        let number: i32 = arg.trim().parse()
            .expect("error: could not parse arg");
        numbers.push(number);
    }

    // sort list (mostly for median)
    numbers.sort_by(|a, b| a.partial_cmp(b).unwrap());

    // calculate and print results
    let mean: f32 = calc_mean(&numbers);
    println!("mean:   {}", mean);
    let median: i32 = calc_median(&numbers);
    println!("median: {}", median);
    let mode: i32 = calc_mode(&numbers);
    println!("mode:   {}", mode);
}