упр.04 задача 1

Предадени решения

Краен срок:
05.11.2025 23:59
Точки:
2

Срокът за предаване на решения е отминал

// Include the solution source in the same file, so we
// don't have to worry about item visibility.
// Please don't use `include!` in real code, this is a hack
// around the checking system.
include!{ "../src/lib.rs" }
#[test]
fn test_basic() {
let s1 = Student::new("Ivan".to_string(), 20, Spec::SI);
let s2 = Student::new("Peter".to_string(), 25, Spec::SI);
let t1 = Teacher::new(
"Dr. Petrov".to_string(),
45,
vec![Spec::SI, Spec::IS],
Title::Professor,
);
let uni = University::new("SU".to_string(), vec![s1, s2], vec![t1]);
let expected = r#"{
"name":"SU",
"students": [
{"name": "Ivan", "age": 20, "spec": "SI"},
{"name": "Peter", "age": 25, "spec": "SI"}
],
"teachers": [
{"name": "Dr. Petrov", "age": 45, "spec": ["SI", "IS"], "title": "Professor"}
]
}"#;
assert_eq!(uni.to_json().replace(char::is_whitespace, ""), expected.replace(char::is_whitespace, ""));
}
#[test]
fn test_basic2() {
let s1 = Student::new("Ivan".to_string(), 20, Spec::SI);
let s2 = Student::new("Peter".to_string(), 25, Spec::SI);
let uni = University::new("SU".to_string(), vec![s1], vec![s2]);
let expected = r#"{
"name":"SU",
"students": [
{"name": "Ivan", "age": 20, "spec": "SI"}
],
"teachers": [
{"name": "Peter", "age": 25, "spec": "SI"}
]
}"#;
assert_eq!(uni.to_json().replace(char::is_whitespace, ""), expected.replace(char::is_whitespace, ""));
}

Да се създаде програма на езика Rust, която моделира структурата на университет, включващ студенти и преподаватели.

  1. Да се дефинира енум специалност Spec, описващ специалности в университета, със следните стойности: SI, IS, KN, I, M.
  2. Да се дефинира енум титла Title, описващ академичното звание на преподавател: Assistant, Doctor, Professor.
  3. Да се дефинира структура студент Student, съдържаща име , възраст и специалност.
  4. Да се дефинира структура преподавател Teacher, съдържаща име, възраст, списък от специалности, на които преподава и академично звание.
  5. Да се създаде структура университет University, която съдържа име на университета, списък от студенти и списък от преподаватели.
  6. Да се реализират трейта ToJson — дефиниращ метод to_json, който връща JSON представяне.
  7. Всички изброени структури и енумерации трябва да могат да се отпечатват чрез {:?}.
  8. Да се реализира метод to_json за структурата University, който връща цялата информация за университета в JSON формат.
  9. В main() да се създаде примерен университет с поне един студент и един преподавател и да се отпечата резултатът от метода to_json().

Университета трябва да позволява следната употреба:

    // Може преподавателите да са от тип Teacher

    let s1 = Student::new("Ivan".to_string(), 20, Spec::SI);
    let s2 = Student::new("Peter".to_string(), 25, Spec::SI);
    let t1 = Teacher::new(
        "Dr. Petrov".to_string(),
        45,
        vec![Spec::SI, Spec::IS],
        Title::Professor,
    );

    let uni = University::new("SU".to_string(), vec![s1, s2], vec![t1]);
    println!("{}", uni.to_json());
    // {
    //     "name":"SU",
    //     "students": [
    //         {"name": "Ivan", "age": 20, "spec": "SI"},
    //         {"name": "Peter", "age": 25, "spec": "SI"}
    //     ],
    //     "teachers": [
    //         {"name": "Dr. Petrov", "age": 45, "spec": ["SI", "IS"], "title": "Professor"}
    //     ]
    // }
    // Може и преподавателите да са от тип Student

    let s1 = Student::new("Ivan".to_string(), 20, Spec::SI);
    let s2 = Student::new("Peter".to_string(), 25, Spec::SI);

    let uni = University::new("SU".to_string(), vec![s1], vec![s2]);

    println!("{}", uni.to_json());
    // {
    //     "name":"SU",
    //     "students": [
    //         {"name": "Ivan", "age": 20, "spec": "SI"}
    //     ],
    //     "teachers": [
    //         {"name": "Peter", "age": 25, "spec": "SI"}
    //     ]
    // }

Забележка: при сравняването ще игнорираме всякакви whitespace символи във върнатия JSON

Забележка2: "университет" е объркващо име, може би трябваше да го преименуваме на курс или нещо друго... Но променяхме задачата в последния момент


Задължително прочетете (или си припомнете): Указания за предаване на домашни

Погрижете се решението ви да се компилира с базовия тест:

// Include the solution source in the same file, so we
// don't have to worry about item visibility.
// Please don't use `include!` in real code, this is a hack
// around the checking system.
include!{ "../src/lib.rs" }
#[test]
fn test_basic() {
let s1 = Student::new("Ivan".to_string(), 20, Spec::SI);
let s2 = Student::new("Peter".to_string(), 25, Spec::SI);
let t1 = Teacher::new(
"Dr. Petrov".to_string(),
45,
vec![Spec::SI, Spec::IS],
Title::Professor,
);
let uni = University::new("SU".to_string(), vec![s1, s2], vec![t1]);
let expected = r#"{
"name":"SU",
"students": [
{"name": "Ivan", "age": 20, "spec": "SI"},
{"name": "Peter", "age": 25, "spec": "SI"}
],
"teachers": [
{"name": "Dr. Petrov", "age": 45, "spec": ["SI", "IS"], "title": "Professor"}
]
}"#;
assert_eq!(uni.to_json().replace(char::is_whitespace, ""), expected.replace(char::is_whitespace, ""));
}
#[test]
fn test_basic2() {
let s1 = Student::new("Ivan".to_string(), 20, Spec::SI);
let s2 = Student::new("Peter".to_string(), 25, Spec::SI);
let uni = University::new("SU".to_string(), vec![s1], vec![s2]);
let expected = r#"{
"name":"SU",
"students": [
{"name": "Ivan", "age": 20, "spec": "SI"}
],
"teachers": [
{"name": "Peter", "age": 25, "spec": "SI"}
]
}"#;
assert_eq!(uni.to_json().replace(char::is_whitespace, ""), expected.replace(char::is_whitespace, ""));
}