Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2020
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 7.96 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "encoding/json"
  5.     "fmt"
  6.     "io/ioutil"
  7.     "os"
  8.     "strconv"
  9.     "sync"
  10.     "time"
  11. )
  12.  
  13. var wg sync.WaitGroup
  14. var workDone int
  15.  
  16. type Students struct {
  17.     Students []Student `json:"students"`
  18. }
  19. type Student struct {
  20.     Name       string  `json:"vardas"`
  21.     Year       int     `json:"kursas"`
  22.     Grade      float32 `json:"vidurkis"`
  23.     encryption string
  24. }
  25.  
  26. const file1 string = "IFF7.9_SarockaT_L1a_dat1.json"
  27. const file2 string = "IFF7.9_SarockaT_L1a_dat2.json"
  28. const file3 string = "IFF7.9_SarockaT_L1a_dat3.json"
  29. const filetest string = "test.json"
  30. var finished bool = false;
  31.  
  32. func main() {
  33.  
  34.     // 1. Nuskaito duomenuu faila i duomenu struktura
  35.     var studentsArray = ReadFromJson(file2)
  36.  
  37.     size := len(studentsArray.Students)
  38.     workingChannel := make(chan Student)
  39.     dataChannel := make(chan Student)
  40.     resultsChannel := make(chan Student)
  41.     toMainThread := make(chan Student)
  42.  
  43.     fmt.Println(studentsArray)
  44.  
  45.     // 2.1 Paleidzia 2 darbines gijas:
  46.     threadnumber := 2
  47.     count := 0
  48.     for count < threadnumber  {
  49.         go Worker(workingChannel,resultsChannel)
  50.  
  51.         count++
  52.     }
  53.     //go Worker(workingChannel,resultsChannel)
  54.     //go Worker(workingChannel,resultsChannel)
  55.     //go Worker(workingChannel,resultsChannel)
  56.  
  57.     // 2.2 Paleidzia viena duomenu masyva valdancia gija
  58.     go AddDataToWorkingChannels(dataChannel, workingChannel, size)
  59.  
  60.     // 2.3 Paleidzia viena rezultatu masyva valdancia gija
  61.     go ResultsControl(resultsChannel, toMainThread)
  62.  
  63.     // 3. Duomenu masyva valdanciai gijai po viena persiuncia visus nuskaitytus elementus is failo
  64.     for _, item := range studentsArray.Students {
  65.         dataChannel <- item
  66.     }
  67.  
  68.     // 4. Is rezultatu masyva valdancios gijos gauna rezultatus.
  69.     var resultArray []Student
  70.  
  71.     //counter:=0
  72.     for{
  73.         msg, open := <- toMainThread
  74.         if !open{
  75.             break
  76.         }
  77.         resultArray = append(resultArray, msg)
  78.     }
  79.  
  80.     Sort(resultArray)
  81.     /*
  82. Loop:
  83.     for{
  84.         select{
  85.         case result := <-toMainThread:{
  86.             resultArray = append(resultArray, result)
  87.             fmt.Println(result)
  88.         }
  89.         case <-time.After(2 * time.Second):{
  90.             fmt.Println("DONE")
  91.             break Loop
  92.         }
  93.         }
  94.     }
  95.  
  96.      */
  97.  
  98.     // 5. Gautus rezultatus isveda i tekstini faila lentele.
  99.     file, e := os.OpenFile("rez2.txt", os.O_CREATE | os.O_WRONLY, 0666)
  100.     if e!= nil{
  101.         fmt.Println(e)
  102.     }else{
  103.         fmt.Fprintf(file, "%-10s %-10s %-10s \r\n", "Name", "Year", "Grade")
  104.         fmt.Fprintf(file,"--------------------------------------------- \r\n")
  105.         for _, item := range resultArray{
  106.             fmt.Fprintf(file, "%-10s %-10s %-10s \r\n", item.Name, strconv.Itoa(item.Year), strconv.FormatFloat(float64(item.Grade), 'f', -1, 32))
  107.             //file.WriteString(toString(item) + "    " + "\r\n")
  108.  
  109.         }
  110.     }
  111.     file.Close()
  112.  
  113. }
  114.  
  115. func Sort( resultArray []Student) {
  116.  
  117.     l := len(resultArray)
  118.     for i := 1; i < l; i++ {
  119.         j := i
  120.         for j > 0 && resultArray[j].Name < resultArray[j-1].Name {
  121.             resultArray[j], resultArray[j-1] = resultArray[j-1], resultArray[j]
  122.             j -= 1
  123.         }
  124.     }
  125. }
  126.  
  127. func toString(student Student)(stringed string){
  128.     stringed+= student.Name+" ";
  129.     stringed+= strconv.Itoa(student.Year)+" "
  130.     stringed+= strconv.FormatFloat(float64(student.Grade), 'f', -1, 32)
  131.     return
  132. }
  133.  
  134. // ReadFromJson
  135. func ReadFromJson(path string) Students {
  136.     jsonFile, err := os.Open(path)
  137.     if err != nil {
  138.         fmt.Println(err)
  139.     }
  140.     defer jsonFile.Close()
  141.     byteValue, _ := ioutil.ReadAll(jsonFile)
  142.     var studentArray Students
  143.     json.Unmarshal(byteValue, &studentArray)
  144.     return studentArray
  145. }
  146. // created function where data goes from dataChannel to workingChannel
  147. func AddDataToWorkingChannels(dataChannel <-chan Student, workingChannel chan<- Student, size int) {
  148.     studentsArray := make([]Student, (size / 5)) // lokalus masyvas, dydis < n/2
  149.     var index int = -1
  150.     count := 0
  151.     for count<=size*2{
  152.         var student Student
  153.         if index==-1{ // Jei tuscias
  154.             student = <- dataChannel
  155.             index++
  156.             studentsArray[index] = student
  157.             count++
  158.         }else if index==(size/5)-1{ // Jei pilnas
  159.             workingChannel <- studentsArray[index]
  160.             index--
  161.             count++
  162.         }else {
  163.             select {
  164.             case student = <-dataChannel:
  165.                 {
  166.                     index++
  167.                     studentsArray[index] = student;
  168.                     count++
  169.                 }
  170.             case workingChannel <- studentsArray[index]:
  171.                 {
  172.                     index--
  173.                     count++
  174.                 }
  175.             }
  176.         }
  177.         if count >= size*2{
  178.             break
  179.         }
  180.     }
  181.     close(workingChannel)
  182. }
  183. func Worker(workingChannel <-chan Student, resultsChannel chan<- Student) {
  184.  
  185.     for{
  186.         msg, open := <- workingChannel
  187.         if !open{
  188.             //fmt.Println("GNAGNGANAGNGANAGNAGNAGNAGN111111111111111")
  189.             break
  190.         }
  191.  
  192.         if msg.Grade <= 5{ // B raide
  193.             continue
  194.         }
  195.         //fmt.Println(msg.Grade)
  196.         resultsChannel <- msg
  197.  
  198.     }
  199.  
  200.     //close(resultsChannel)
  201.     /*
  202.     for{
  203.         select {
  204.         case player := <-workingChannel:{
  205.  
  206.             if player.Grade <= 5{
  207.                 continue
  208.             }
  209.             resultsChannel <- player
  210.             //fmt.Println(toString(player))
  211.             //fmt.Println("Students name: "+player.Name)
  212.             //fmt.Println("Student's year:  " + strconv.Itoa(player.Year))
  213.             //fmt.Println("Student's grade: " + strconv.FormatFloat(float64(player.Grade), 'f', -1, 32))
  214.         }
  215.         }
  216.     }
  217.      */
  218. }
  219. func ResultsControl(resultsChannel <-chan Student, toMainThread chan<- Student){
  220.     var resultArr []Student
  221.  
  222.     count:=0
  223. Loop:
  224.     for{
  225.         select{
  226.         case result := <-resultsChannel:{
  227.             resultArr = append(resultArr, result)
  228.             count++
  229.         }
  230.         case <-time.After(1 * time.Second):{
  231.             fmt.Println(strconv.Itoa(count))
  232.             break Loop
  233.         }
  234.         }
  235.     }
  236.  
  237.     /*
  238.             for i:=0; i<count; i++{
  239.             result := <-resultsChannel
  240.             resultArr = append(resultArr, result)
  241.         }
  242.     */
  243.     for _, item := range resultArr{
  244.         toMainThread <- item
  245.     }
  246.     close(toMainThread)
  247.     //fmt.Println("BROKEN")
  248. }
  249.  
  250. // prints all players
  251. func PrintPlayersToConsole(carsArray Students) {
  252.     for i := 0; i < len(carsArray.Students); i++ {
  253.         fmt.Println("Student's name: " + carsArray.Students[i].Name)
  254.         fmt.Println("Student's year:  " + strconv.Itoa(carsArray.Students[i].Year))
  255.         fmt.Println("Student's price: " + strconv.FormatFloat(float64(carsArray.Students[i].Grade), 'f', -1, 32))
  256.     }
  257. }
  258.  
  259.  
  260.  
  261.  
  262.  
  263.  
  264.  
  265.  
  266. ------------------------------------------------------------------------------------------------------------------
  267.  
  268. {
  269.     "students": [
  270.   {
  271.     "vardas": "Jurgis",
  272.     "kursas": 1,
  273.     "vidurkis": 2.5
  274.   },
  275.   {
  276.     "vardas": "Tobis",
  277.     "kursas": 2,
  278.     "vidurkis": 7.0
  279.   },
  280.   {
  281.     "vardas": "Tautvydas",
  282.     "kursas": 4,
  283.     "vidurkis": 1.01
  284.   },
  285.   {
  286.     "vardas": "Samanta",
  287.     "kursas": 3,
  288.     "vidurkis": 0.13
  289.   },
  290.   {
  291.     "vardas": "Antanas",
  292.     "kursas": 1,
  293.     "vidurkis": 0.95
  294.   },
  295.   {
  296.     "vardas": "Kazys",
  297.     "kursas": 2,
  298.     "vidurkis": 8.65
  299.   },
  300.   {
  301.     "vardas": "Petras",
  302.     "kursas": 2,
  303.     "vidurkis": 7.01
  304.   },
  305.   {
  306.     "vardas": "Sonata",
  307.     "kursas": 3,
  308.     "vidurkis": 9.13
  309.   },
  310.  
  311.   {
  312.     "vardas": "Jonas",
  313.     "kursas": 1,
  314.     "vidurkis": 2.95
  315.   },
  316.   {
  317.     "vardas": "Martynas",
  318.     "kursas": 3,
  319.     "vidurkis": 9.13
  320.   },
  321.   {
  322.     "vardas": "Arturas",
  323.     "kursas": 2,
  324.     "vidurkis": 7.01
  325.   },
  326.   {
  327.     "vardas": "Vacys",
  328.     "kursas": 2,
  329.     "vidurkis": 8.65
  330.   },
  331.   {
  332.     "vardas": "Robertas",
  333.     "kursas": 3,
  334.     "vidurkis": 2.43
  335.   },
  336.   {
  337.     "vardas": "Mykolas",
  338.     "kursas": 1,
  339.     "vidurkis": 6.95
  340.   },
  341.   {
  342.     "vardas": "Aldona",
  343.     "kursas": 3,
  344.     "vidurkis": 9.13
  345.   },
  346.   {
  347.     "vardas": "Asta",
  348.     "kursas": 2,
  349.     "vidurkis": 7.01
  350.   },
  351.   {
  352.     "vardas": "Viktoras",
  353.     "kursas": 2,
  354.     "vidurkis": 2.65
  355.   },
  356.   {
  357.     "vardas": "Artuturas",
  358.     "kursas": 5,
  359.     "vidurkis": 8.32
  360.   },
  361.   {
  362.     "vardas": "Vytas",
  363.     "kursas": 3,
  364.     "vidurkis": 7.85
  365.   },
  366.   {
  367.     "vardas": "Jonas",
  368.     "kursas": 1,
  369.     "vidurkis": 6.95
  370.   },
  371.   {
  372.     "vardas": "Zigmas",
  373.     "kursas": 3,
  374.     "vidurkis": 2.13
  375.   },
  376.   {
  377.     "vardas": "Artturas",
  378.     "kursas": 2,
  379.     "vidurkis": 7.01
  380.   },
  381.   {
  382.     "vardas": "Simas",
  383.     "kursas": 3,
  384.     "vidurkis": 6.43
  385.   },
  386.   {
  387.     "vardas": "Diana",
  388.     "kursas": 2,
  389.     "vidurkis": 4.01
  390.   },
  391.   {
  392.     "vardas": "Liucija",
  393.     "kursas": 3,
  394.     "vidurkis": 5.01
  395.   }
  396. ]
  397. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement