|
@@ -0,0 +1,136 @@
|
|
|
|
|
+package main
|
|
|
|
|
+
|
|
|
|
|
+import (
|
|
|
|
|
+ "encoding/json"
|
|
|
|
|
+ "fmt"
|
|
|
|
|
+ "io"
|
|
|
|
|
+ "os"
|
|
|
|
|
+)
|
|
|
|
|
+
|
|
|
|
|
+type Student struct {
|
|
|
|
|
+ LastName string
|
|
|
|
|
+ FirstName string
|
|
|
|
|
+ MiddleName string
|
|
|
|
|
+ Birthday string
|
|
|
|
|
+ Address string
|
|
|
|
|
+ Phone string
|
|
|
|
|
+ Rating []int
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+type Group struct {
|
|
|
|
|
+ ID int
|
|
|
|
|
+ Number string
|
|
|
|
|
+ Year int
|
|
|
|
|
+ Students []Student
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func main() {
|
|
|
|
|
+ // readJsonFromVar()
|
|
|
|
|
+ // readJsonFromFile()
|
|
|
|
|
+ readJsonFromStdin()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func readJsonFromStdin() {
|
|
|
|
|
+ var group Group
|
|
|
|
|
+ var markCount, studentCount int
|
|
|
|
|
+
|
|
|
|
|
+ data, err := io.ReadAll(os.Stdin)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ fmt.Println("Ошибка чтения")
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if err := json.Unmarshal(data, &group); err != nil {
|
|
|
|
|
+ fmt.Println(err)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ for _, val := range group.Students {
|
|
|
|
|
+ // for _, _ := range val.Rating {
|
|
|
|
|
+ markCount += len(val.Rating)
|
|
|
|
|
+ studentCount++
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ type Avr struct {
|
|
|
|
|
+ Average float32
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ avr := Avr{float32(markCount) / float32(studentCount)}
|
|
|
|
|
+ jsonData, err := json.MarshalIndent(avr, "", " ")
|
|
|
|
|
+
|
|
|
|
|
+ io.WriteString(os.Stdout, string(jsonData))
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func readJsonFromFile() {
|
|
|
|
|
+ file, err := os.Open("json_data.json")
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ fmt.Printf("Ошибка открытия файла: %v\n", err)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ defer func() {
|
|
|
|
|
+ if err := file.Close(); err != nil {
|
|
|
|
|
+ fmt.Printf("Ошибка закрытия файла %v\n", err)
|
|
|
|
|
+ } else {
|
|
|
|
|
+ fmt.Println("Файл закрыт")
|
|
|
|
|
+ }
|
|
|
|
|
+ }()
|
|
|
|
|
+
|
|
|
|
|
+ fileBytes, err := io.ReadAll(file)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ fmt.Printf("Ошибка чтения файла: %v\n", err)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ var group Group
|
|
|
|
|
+
|
|
|
|
|
+ if err := json.Unmarshal(fileBytes, &group); err != nil {
|
|
|
|
|
+ fmt.Println(err)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ var count, sum int
|
|
|
|
|
+
|
|
|
|
|
+ for _, val := range group.Students {
|
|
|
|
|
+ for _, mark := range val.Rating {
|
|
|
|
|
+ count++
|
|
|
|
|
+ sum += mark
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // avr := fmt.Sprintf("%.1f", float32(sum)/float32(count))
|
|
|
|
|
+ // avr := float32(sum)/float32(count)
|
|
|
|
|
+ // var avr float32 = 12.3
|
|
|
|
|
+ // var jsonData []byte
|
|
|
|
|
+ type jd struct {
|
|
|
|
|
+ Average float32
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ jD := jd{15.43}
|
|
|
|
|
+
|
|
|
|
|
+ jsonData, err := json.MarshalIndent(jD, "", " ")
|
|
|
|
|
+
|
|
|
|
|
+ /*
|
|
|
|
|
+ if jsonData, err := json.Marshal(avr); err != nil {
|
|
|
|
|
+ fmt.Printf("Что-то пошло не так")
|
|
|
|
|
+ }
|
|
|
|
|
+ */
|
|
|
|
|
+ fmt.Println(jsonData)
|
|
|
|
|
+ fmt.Println(string(jsonData))
|
|
|
|
|
+ // fmt.Println(avr)
|
|
|
|
|
+
|
|
|
|
|
+ // fmt.Println(float32(sum) / float32(count))
|
|
|
|
|
+
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// Создали тестовый массив байт в виде JSON и
|
|
|
|
|
+// распарсили его в структуру.
|
|
|
|
|
+func readJsonFromVar() {
|
|
|
|
|
+ testInput := []byte(`{
|
|
|
|
|
+ "ID": 134,
|
|
|
|
|
+ "Number": "ИЛМ-1274",
|
|
|
|
|
+ "Year": 2}`)
|
|
|
|
|
+
|
|
|
|
|
+ var group Group
|
|
|
|
|
+
|
|
|
|
|
+ if err := json.Unmarshal(testInput, &group); err != nil {
|
|
|
|
|
+ fmt.Println(err)
|
|
|
|
|
+ } else {
|
|
|
|
|
+ fmt.Println(group.ID, group.Number, group.Year)
|
|
|
|
|
+ }
|
|
|
|
|
+}
|