Skip to Content

Ćwiczenia

Statystyki F1

Celem zadania jest pobranie przykładowych danych dotyczących wyścigów F1 z serwisu https://openf1.org/ oraz wczytanie ich do kolekcji. a następnie, z wykorzystaniem iteratorów i domknięć, policzenie podstawowych statystyk.

Przygotowanie

  1. Utwórz nowy projekt poleceniem cargo new.
  2. W pliku Cargo.toml dodaj następujące zależności:
    [dependencies] anyhow = "1.0" chrono = { version = "0.4", features = ["serde"] } reqwest = { version = "0.12", features = ["blocking"] } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0"
  3. W zadaniu wykorzystamy dane na temat parametrów samochodów w poszczególnych sesjach i wyścigach, które można pobrać z usługi https://api.openf1.org/v1/car_data. Dokumentacja usługi znajduje się na stronie: https://openf1.org/#car-data.
  4. W pliku main.rs dodaj kod odpowiedzialny za model danych, odzwierciedlający dane z API oraz wykorzystamy bibliotekę serde do serializacji i deserializacji.
    use std::fs::File; use std::io::{BufReader, BufWriter}; use std::path::Path; use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use anyhow::Result; const DATA_FILE : &str = "data.json"; const API_QUERY : &str = "https://api.openf1.org/v1/car_data?driver_number=55&session_key=9159"; #[derive(Serialize, Deserialize)] struct CarData { brake : u32, date: DateTime<Utc>, driver_number: u32, drs: u8, meeting_key: u32, n_gear: u8, rpm: u32, session_key: u32, speed: u32, throttle: u8 }
  5. Dodaj funkcje do pobierania i zapisu danych do pliku oraz funkcję uruchomieniową:
    fn fetch_car_data(url: &str, data_file : &str) -> Result<()> { let data = reqwest::blocking::get(url)?.text()?; let car_data : Vec<CarData> = serde_json::from_str(&data)?; let writer = BufWriter::new(File::create(data_file)?); serde_json::to_writer(writer, &car_data)?; Ok(()) } fn load_car_data_from_file(data_file : &str) -> Result<Vec<CarData>> { let car_data : Vec<CarData> = serde_json::from_reader(BufReader::new(File::open(data_file)?))?; Ok(car_data) } fn check_if_data_exists(data_file : &str) -> bool { Path::new(data_file).exists() } fn main() -> Result<()> { if !check_if_data_exists(DATA_FILE) { fetch_car_data(API_QUERY, DATA_FILE)?; } let car_data = load_car_data_from_file(DATA_FILE).unwrap(); Ok(()) }

Zadania

  1. Napisz funkcję avarage, która wylicza średnią szybkość kierowcy w danej sesji.
  2. Napisz funkcję high_speed, która oblicza szacunkowy czas, kiedy kierowca jechał szybciej niż zadana szybkość.
  3. Napisz funkcję max_rpm, która wyznaczy maksymalną liczbę obrotów silnika (rpm) oraz na jakim biegu została osiągnięta ta wartość.
Last updated on