Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "encoding/json"
- "fmt"
- "io/ioutil"
- "os"
- "strconv"
- "sync"
- "time"
- )
- var wg sync.WaitGroup
- var workDone int
- type Students struct {
- Students []Student `json:"students"`
- }
- type Student struct {
- Name string `json:"vardas"`
- Year int `json:"kursas"`
- Grade float32 `json:"vidurkis"`
- encryption string
- }
- const file1 string = "IFF7.9_SarockaT_L1a_dat1.json"
- const file2 string = "IFF7.9_SarockaT_L1a_dat2.json"
- const file3 string = "IFF7.9_SarockaT_L1a_dat3.json"
- const filetest string = "test.json"
- var finished bool = false;
- func main() {
- // 1. Nuskaito duomenuu faila i duomenu struktura
- var studentsArray = ReadFromJson(file2)
- size := len(studentsArray.Students)
- workingChannel := make(chan Student)
- dataChannel := make(chan Student)
- resultsChannel := make(chan Student)
- toMainThread := make(chan Student)
- fmt.Println(studentsArray)
- // 2.1 Paleidzia 2 darbines gijas:
- threadnumber := 2
- count := 0
- for count < threadnumber {
- go Worker(workingChannel,resultsChannel)
- count++
- }
- //go Worker(workingChannel,resultsChannel)
- //go Worker(workingChannel,resultsChannel)
- //go Worker(workingChannel,resultsChannel)
- // 2.2 Paleidzia viena duomenu masyva valdancia gija
- go AddDataToWorkingChannels(dataChannel, workingChannel, size)
- // 2.3 Paleidzia viena rezultatu masyva valdancia gija
- go ResultsControl(resultsChannel, toMainThread)
- // 3. Duomenu masyva valdanciai gijai po viena persiuncia visus nuskaitytus elementus is failo
- for _, item := range studentsArray.Students {
- dataChannel <- item
- }
- // 4. Is rezultatu masyva valdancios gijos gauna rezultatus.
- var resultArray []Student
- //counter:=0
- for{
- msg, open := <- toMainThread
- if !open{
- break
- }
- resultArray = append(resultArray, msg)
- }
- Sort(resultArray)
- /*
- Loop:
- for{
- select{
- case result := <-toMainThread:{
- resultArray = append(resultArray, result)
- fmt.Println(result)
- }
- case <-time.After(2 * time.Second):{
- fmt.Println("DONE")
- break Loop
- }
- }
- }
- */
- // 5. Gautus rezultatus isveda i tekstini faila lentele.
- file, e := os.OpenFile("rez2.txt", os.O_CREATE | os.O_WRONLY, 0666)
- if e!= nil{
- fmt.Println(e)
- }else{
- fmt.Fprintf(file, "%-10s %-10s %-10s \r\n", "Name", "Year", "Grade")
- fmt.Fprintf(file,"--------------------------------------------- \r\n")
- for _, item := range resultArray{
- fmt.Fprintf(file, "%-10s %-10s %-10s \r\n", item.Name, strconv.Itoa(item.Year), strconv.FormatFloat(float64(item.Grade), 'f', -1, 32))
- //file.WriteString(toString(item) + " " + "\r\n")
- }
- }
- file.Close()
- }
- func Sort( resultArray []Student) {
- l := len(resultArray)
- for i := 1; i < l; i++ {
- j := i
- for j > 0 && resultArray[j].Name < resultArray[j-1].Name {
- resultArray[j], resultArray[j-1] = resultArray[j-1], resultArray[j]
- j -= 1
- }
- }
- }
- func toString(student Student)(stringed string){
- stringed+= student.Name+" ";
- stringed+= strconv.Itoa(student.Year)+" "
- stringed+= strconv.FormatFloat(float64(student.Grade), 'f', -1, 32)
- return
- }
- // ReadFromJson
- func ReadFromJson(path string) Students {
- jsonFile, err := os.Open(path)
- if err != nil {
- fmt.Println(err)
- }
- defer jsonFile.Close()
- byteValue, _ := ioutil.ReadAll(jsonFile)
- var studentArray Students
- json.Unmarshal(byteValue, &studentArray)
- return studentArray
- }
- // created function where data goes from dataChannel to workingChannel
- func AddDataToWorkingChannels(dataChannel <-chan Student, workingChannel chan<- Student, size int) {
- studentsArray := make([]Student, (size / 5)) // lokalus masyvas, dydis < n/2
- var index int = -1
- count := 0
- for count<=size*2{
- var student Student
- if index==-1{ // Jei tuscias
- student = <- dataChannel
- index++
- studentsArray[index] = student
- count++
- }else if index==(size/5)-1{ // Jei pilnas
- workingChannel <- studentsArray[index]
- index--
- count++
- }else {
- select {
- case student = <-dataChannel:
- {
- index++
- studentsArray[index] = student;
- count++
- }
- case workingChannel <- studentsArray[index]:
- {
- index--
- count++
- }
- }
- }
- if count >= size*2{
- break
- }
- }
- close(workingChannel)
- }
- func Worker(workingChannel <-chan Student, resultsChannel chan<- Student) {
- for{
- msg, open := <- workingChannel
- if !open{
- //fmt.Println("GNAGNGANAGNGANAGNAGNAGNAGN111111111111111")
- break
- }
- if msg.Grade <= 5{ // B raide
- continue
- }
- //fmt.Println(msg.Grade)
- resultsChannel <- msg
- }
- //close(resultsChannel)
- /*
- for{
- select {
- case player := <-workingChannel:{
- if player.Grade <= 5{
- continue
- }
- resultsChannel <- player
- //fmt.Println(toString(player))
- //fmt.Println("Students name: "+player.Name)
- //fmt.Println("Student's year: " + strconv.Itoa(player.Year))
- //fmt.Println("Student's grade: " + strconv.FormatFloat(float64(player.Grade), 'f', -1, 32))
- }
- }
- }
- */
- }
- func ResultsControl(resultsChannel <-chan Student, toMainThread chan<- Student){
- var resultArr []Student
- count:=0
- Loop:
- for{
- select{
- case result := <-resultsChannel:{
- resultArr = append(resultArr, result)
- count++
- }
- case <-time.After(1 * time.Second):{
- fmt.Println(strconv.Itoa(count))
- break Loop
- }
- }
- }
- /*
- for i:=0; i<count; i++{
- result := <-resultsChannel
- resultArr = append(resultArr, result)
- }
- */
- for _, item := range resultArr{
- toMainThread <- item
- }
- close(toMainThread)
- //fmt.Println("BROKEN")
- }
- // prints all players
- func PrintPlayersToConsole(carsArray Students) {
- for i := 0; i < len(carsArray.Students); i++ {
- fmt.Println("Student's name: " + carsArray.Students[i].Name)
- fmt.Println("Student's year: " + strconv.Itoa(carsArray.Students[i].Year))
- fmt.Println("Student's price: " + strconv.FormatFloat(float64(carsArray.Students[i].Grade), 'f', -1, 32))
- }
- }
- ------------------------------------------------------------------------------------------------------------------
- {
- "students": [
- {
- "vardas": "Jurgis",
- "kursas": 1,
- "vidurkis": 2.5
- },
- {
- "vardas": "Tobis",
- "kursas": 2,
- "vidurkis": 7.0
- },
- {
- "vardas": "Tautvydas",
- "kursas": 4,
- "vidurkis": 1.01
- },
- {
- "vardas": "Samanta",
- "kursas": 3,
- "vidurkis": 0.13
- },
- {
- "vardas": "Antanas",
- "kursas": 1,
- "vidurkis": 0.95
- },
- {
- "vardas": "Kazys",
- "kursas": 2,
- "vidurkis": 8.65
- },
- {
- "vardas": "Petras",
- "kursas": 2,
- "vidurkis": 7.01
- },
- {
- "vardas": "Sonata",
- "kursas": 3,
- "vidurkis": 9.13
- },
- {
- "vardas": "Jonas",
- "kursas": 1,
- "vidurkis": 2.95
- },
- {
- "vardas": "Martynas",
- "kursas": 3,
- "vidurkis": 9.13
- },
- {
- "vardas": "Arturas",
- "kursas": 2,
- "vidurkis": 7.01
- },
- {
- "vardas": "Vacys",
- "kursas": 2,
- "vidurkis": 8.65
- },
- {
- "vardas": "Robertas",
- "kursas": 3,
- "vidurkis": 2.43
- },
- {
- "vardas": "Mykolas",
- "kursas": 1,
- "vidurkis": 6.95
- },
- {
- "vardas": "Aldona",
- "kursas": 3,
- "vidurkis": 9.13
- },
- {
- "vardas": "Asta",
- "kursas": 2,
- "vidurkis": 7.01
- },
- {
- "vardas": "Viktoras",
- "kursas": 2,
- "vidurkis": 2.65
- },
- {
- "vardas": "Artuturas",
- "kursas": 5,
- "vidurkis": 8.32
- },
- {
- "vardas": "Vytas",
- "kursas": 3,
- "vidurkis": 7.85
- },
- {
- "vardas": "Jonas",
- "kursas": 1,
- "vidurkis": 6.95
- },
- {
- "vardas": "Zigmas",
- "kursas": 3,
- "vidurkis": 2.13
- },
- {
- "vardas": "Artturas",
- "kursas": 2,
- "vidurkis": 7.01
- },
- {
- "vardas": "Simas",
- "kursas": 3,
- "vidurkis": 6.43
- },
- {
- "vardas": "Diana",
- "kursas": 2,
- "vidurkis": 4.01
- },
- {
- "vardas": "Liucija",
- "kursas": 3,
- "vidurkis": 5.01
- }
- ]
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement