From aef8cd1f105ec4e6bfc37d553dfcc4091fdcff99 Mon Sep 17 00:00:00 2001
From: Martin Schmollinger <martin.schmollinger@gmail.com>
Date: Wed, 12 May 2021 11:09:09 +0200
Subject: [PATCH] Initial solution to exercise gouni

---
 src/gouni/go.mod               |  3 +++
 src/gouni/main.go              | 23 +++++++++++++++++
 src/gouni/model/address.go     | 30 ++++++++++++++++++++++
 src/gouni/model/shared_flat.go | 39 ++++++++++++++++++++++++++++
 src/gouni/model/student.go     | 47 ++++++++++++++++++++++++++++++++++
 5 files changed, 142 insertions(+)
 create mode 100644 src/gouni/go.mod
 create mode 100644 src/gouni/main.go
 create mode 100644 src/gouni/model/address.go
 create mode 100644 src/gouni/model/shared_flat.go
 create mode 100644 src/gouni/model/student.go

diff --git a/src/gouni/go.mod b/src/gouni/go.mod
new file mode 100644
index 0000000..9e6a1cb
--- /dev/null
+++ b/src/gouni/go.mod
@@ -0,0 +1,3 @@
+module github.com/turngeek/examples-go/src/gouni
+
+go 1.16
diff --git a/src/gouni/main.go b/src/gouni/main.go
new file mode 100644
index 0000000..96a647f
--- /dev/null
+++ b/src/gouni/main.go
@@ -0,0 +1,23 @@
+package main
+
+import (
+	"fmt"
+
+	"github.com/turngeek/examples-go/src/gouni/model"
+)
+
+func main() {
+
+	home := model.Address{}
+	home.SetStreet("Burgstr. 39")
+	home.SetCity("Reutlingen")
+
+	s1 := model.CreateStudent("Schiesser", home)
+	s1.AddGrade("ESD", 1.0)
+	s1.AddGrade("BPT", 2.0)
+	fmt.Printf("Student %s has an overall average grade of %.1f\n", s1.GetName(), s1.GetOverallAverageGrade())
+
+	flat := model.CreateSharedFlat(model.CreateAddress("Pestalozzistr. 120", "Reutlingen"))
+	flat.AddStudent(s1)
+	fmt.Println(flat.String())
+}
diff --git a/src/gouni/model/address.go b/src/gouni/model/address.go
new file mode 100644
index 0000000..d8ba271
--- /dev/null
+++ b/src/gouni/model/address.go
@@ -0,0 +1,30 @@
+package model
+
+type Address struct {
+	street string
+	city   string
+}
+
+func (adr *Address) String() string {
+	return adr.street + ", " + adr.city
+}
+
+func (adr *Address) SetStreet(street string) {
+	adr.street = street
+}
+
+func (adr *Address) GetStreet() string {
+	return adr.street
+}
+
+func (adr *Address) SetCity(city string) {
+	adr.city = city
+}
+
+func (adr *Address) GetCity() string {
+	return adr.city
+}
+
+func CreateAddress(street string, city string) Address {
+	return Address{street, city}
+}
diff --git a/src/gouni/model/shared_flat.go b/src/gouni/model/shared_flat.go
new file mode 100644
index 0000000..a46dba0
--- /dev/null
+++ b/src/gouni/model/shared_flat.go
@@ -0,0 +1,39 @@
+package model
+
+import (
+	"fmt"
+	"strings"
+)
+
+type SharedFlat struct {
+	address  Address
+	students []Student
+}
+
+func (flat *SharedFlat) GetAddress() Address {
+	return flat.address
+}
+
+func (flat *SharedFlat) SetAddress(address Address) {
+	flat.address = address
+}
+
+func (flat *SharedFlat) AddStudent(student Student) {
+	flat.students = append(flat.students, student)
+}
+
+func (flat *SharedFlat) GetNames() []string {
+	names := []string{}
+	for _, student := range flat.students {
+		names = append(names, student.GetName())
+	}
+	return names
+}
+
+func (flat *SharedFlat) String() string {
+	return fmt.Sprintf("Flat -> Address: %s, Students living in flat: %s", flat.address.String(), strings.Join(flat.GetNames(), ", "))
+}
+
+func CreateSharedFlat(address Address) SharedFlat {
+	return SharedFlat{address, make([]Student, 0)}
+}
diff --git a/src/gouni/model/student.go b/src/gouni/model/student.go
new file mode 100644
index 0000000..87d5230
--- /dev/null
+++ b/src/gouni/model/student.go
@@ -0,0 +1,47 @@
+package model
+
+type Student struct {
+	name    string
+	address Address
+	grades  map[string]float32
+}
+
+func (student *Student) String() string {
+	return student.name + " " + student.address.String()
+}
+
+func (student *Student) GetName() string {
+	return student.name
+}
+
+func (student *Student) SetName(name string) {
+	student.name = name
+}
+
+func (student *Student) GetAddress() Address {
+	return student.address
+}
+
+func (student *Student) SetAddress(address Address) {
+	student.address = address
+}
+
+func (student *Student) AddGrade(lecture string, grade float32) {
+	student.grades[lecture] = grade
+}
+
+func (student *Student) GetOverallAverageGrade() float32 {
+	var sum float32
+	for _, grade := range student.grades {
+		sum += grade
+	}
+	if sum == 0 {
+		return 0.0
+	} else {
+		return sum / float32(len(student.grades))
+	}
+}
+
+func CreateStudent(name string, address Address) Student {
+	return Student{name, address, make(map[string]float32)}
+}
-- 
GitLab