Advertisement
Guest User

Untitled

a guest
Nov 19th, 2018
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 10.15 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "bufio"
  5.     "fmt"
  6.     "os"
  7.     "strconv"
  8.     "strings"
  9.     "sync"
  10. )
  11.  
  12. type Task struct {
  13.     x int
  14.     c chan int
  15. }
  16.  
  17. type Darbuotojas struct {
  18.     vardas string
  19.     amzius int
  20.     alga float64
  21. }
  22. type rasytojuContainer struct {
  23.     masyvas []Darbuotojas
  24. }
  25.  
  26. type skaitytojuStruktura struct
  27. {
  28.      elementas int
  29.      kiekis int
  30. }
  31.  
  32. type skaitytojuContainer struct
  33. {
  34.     masyvas  []skaitytojuStruktura
  35.     count int
  36. }
  37.  
  38. type valdytojoStruktura struct {
  39.     masyvas  []skaitytojuStruktura
  40. }
  41. //a = append(a[:i], a[i+1:]...)
  42. func (v *valdytojoStruktura) deti(elementas int) {
  43.  
  44.     count := len(v.masyvas)
  45.     newPosition := count;
  46.     for i := 0; i < count; i++ {
  47.         if elementas >= v.masyvas[i].elementas {
  48.             newPosition = i;
  49.             break;
  50.         }
  51.     }
  52.  
  53.     if newPosition == count {
  54.         v.masyvas = append(v.masyvas, skaitytojuStruktura{elementas, 1})
  55.     } else
  56.     {
  57.         if (v.masyvas[newPosition].elementas == elementas) {
  58.             v.masyvas[newPosition].kiekis++;
  59.         } else {
  60.             v.masyvas = append(v.masyvas, skaitytojuStruktura{0, 0})
  61.             for i := count; i > newPosition; i-- {
  62.                 v.masyvas[i] = v.masyvas[i-1];
  63.             }
  64.             v.masyvas[newPosition].elementas = elementas;
  65.             v.masyvas[newPosition].kiekis = 1;
  66.         }
  67.     }
  68. }
  69.  
  70. func (v *valdytojoStruktura) trinti(elementas int) (bool) {
  71.     for i := 0; i < len(v.masyvas); i++{
  72.         if v.masyvas[i].elementas == elementas {
  73.             if v.masyvas[i].kiekis > 1 {
  74.                 v.masyvas[i].kiekis--;
  75.                 return true
  76.             } else {
  77.                 v.masyvas = append(v.masyvas[:i], v.masyvas[i+1:]...)
  78.                 return true
  79.             }
  80.         }
  81.     }
  82.     return false
  83. }
  84.  
  85. func readFromFile(fileName string) ([]rasytojuContainer, []skaitytojuContainer, error) {
  86.     file, err := os.Open(fileName)
  87.     if err != nil {
  88.         fmt.Println(err)
  89.         return nil, nil, err
  90.     }
  91.     scanner := bufio.NewScanner(file)
  92.  
  93.     //Reading data for writer threads
  94.     scanner.Scan()
  95.     var rasytojuDuomenys []rasytojuContainer
  96.     for i := 0; scanner.Text() != "-"; i++ {
  97.  
  98.         var container rasytojuContainer
  99.         for j := 0; scanner.Text() != ""; j++ {
  100.  
  101.             var darbuotojas Darbuotojas
  102.             values := strings.Split(scanner.Text(), " ")
  103.             darbuotojas.vardas = values[0]
  104.             amzius, err := strconv.Atoi(values[1])
  105.             if err != nil {
  106.                 fmt.Println(err)
  107.                 return nil, nil, err
  108.             }
  109.             alga, err := strconv.ParseFloat(values[2], 64)
  110.             if err != nil {
  111.                 fmt.Println(err)
  112.                 return nil, nil, err
  113.             }
  114.             darbuotojas.amzius = amzius
  115.             darbuotojas.alga = alga
  116.  
  117.             container.masyvas = append(container.masyvas, darbuotojas)
  118.             scanner.Scan()
  119.         }
  120.         rasytojuDuomenys = append(rasytojuDuomenys, container)
  121.         scanner.Scan()
  122.     }
  123.  
  124.     //Reading data for reader threads
  125.     var skaitytojuDuomenys []skaitytojuContainer
  126.     scanner.Scan()
  127.     for i := 0; scanner.Text() != "-"; i++ {
  128.  
  129.         var container skaitytojuContainer
  130.         for j := 0; scanner.Text() != ""; j++ {
  131.             var struktura skaitytojuStruktura
  132.             values := strings.Split(scanner.Text(), " ")
  133.             elementas, err := strconv.Atoi(values[0])
  134.             if err != nil {
  135.                 fmt.Println(err)
  136.                 return nil, nil, err
  137.             }
  138.             kiekis, err := strconv.Atoi(values[1])
  139.             if err != nil {
  140.                 fmt.Println(err)
  141.                 return nil, nil, err
  142.             }
  143.             struktura.elementas = elementas
  144.             struktura.kiekis = kiekis
  145.  
  146.             container.masyvas = append(container.masyvas, struktura)
  147.             scanner.Scan()
  148.         }
  149.  
  150.         skaitytojuDuomenys = append(skaitytojuDuomenys, container)
  151.  
  152.         scanner.Scan()
  153.     }
  154.     file.Close()
  155.     return rasytojuDuomenys, skaitytojuDuomenys, err
  156. }
  157.  
  158. func printToFile(fileName string, rasytojuDuomenys []rasytojuContainer, skaitytojuDuomenys []skaitytojuContainer, valdytojoDuomenys valdytojoStruktura) {
  159.     file, err := os.Create(fileName)
  160.     if err != nil {
  161.         return
  162.     }
  163.     defer file.Close()
  164.     writer := bufio.NewWriter(file)
  165.     fmt.Fprint(writer, "Rasytoju duomenys:\r\n")
  166.     for i := 0 ; i < len(rasytojuDuomenys); i++ {
  167.         fmt.Fprintf(writer, "Rasytojas nr. %d:\r\n", i + 1)
  168.         fmt.Fprint(writer, "----------------------------------------\r\n")
  169.         fmt.Fprintf(writer,"%3s %-15s %4s %10s\r\n", "eil", "Vardas", "Met.", "Alga")
  170.         for j := 0; j < len(rasytojuDuomenys[i].masyvas); j++{
  171.             fmt.Fprintf(writer, "%3d %-15s %4d %10.2f\r\n", j + 1, rasytojuDuomenys[i].masyvas[j].vardas, rasytojuDuomenys[i].masyvas[j].amzius, rasytojuDuomenys[i].masyvas[j].alga)
  172.         }
  173.         fmt.Fprint(writer, "----------------------------------------\r\n")
  174.     }
  175.     fmt.Fprint(writer, "Skaitytoju duomenys:\r\n")
  176.     for i := 0 ; i < len(skaitytojuDuomenys); i++ {
  177.         fmt.Fprintf(writer, "Skaitytojas nr. %d:\r\n", i + 1)
  178.         fmt.Fprint(writer, "----------------------------------------\r\n")
  179.         fmt.Fprintf(writer,"%3s %10s %6s\r\n", "eil", "elementas", "kiekis")
  180.         for j := 0; j < len(skaitytojuDuomenys[i].masyvas); j++{
  181.             fmt.Fprintf(writer, "%3d %10d %6d\r\n", j + 1, skaitytojuDuomenys[i].masyvas[j].elementas, skaitytojuDuomenys[i].masyvas[j].kiekis)
  182.         }
  183.         fmt.Fprint(writer, "----------------------------------------\r\n")
  184.     }
  185.     fmt.Fprint(writer, "Rezultatas:\r\n")
  186.     fmt.Fprint(writer, "----------------------------------------\r\n")
  187.     fmt.Fprintf(writer,"%3s %10s %6s\r\n", "eil", "elementas", "kiekis")
  188.     for i := 0 ; i < len(valdytojoDuomenys.masyvas); i++ {
  189.  
  190.         fmt.Fprintf(writer, "%3d %10d %6d\r\n", i + 1, valdytojoDuomenys.masyvas[i].elementas, valdytojoDuomenys.masyvas[i].kiekis)
  191.     }
  192.     fmt.Fprint(writer, "----------------------------------------\r\n")
  193.     writer.Flush()
  194. }
  195.  
  196. func main() {
  197.     rasytojuDuomenys, skaitytojuDuomenys, error := readFromFile("IFF64_PetkusR_L2_1.txt")
  198.  
  199.     if error != nil {
  200.         fmt.Println("klaida nuskaitant duomenys")
  201.         return
  202.     }
  203.     //fmt.Println(skaitytojuDuomenys)
  204.     //fmt.Println(rasytojuDuomenys)
  205.  
  206.     var rasytojoDuomenuPerdavimoKanalas = make(chan rasytojuContainer)
  207.     var skaitytojoDuomenuPerdavimoKanalas = make(chan skaitytojuContainer)
  208.  
  209.     go duomenuPerdavimas(rasytojoDuomenuPerdavimoKanalas, skaitytojoDuomenuPerdavimoKanalas, rasytojuDuomenys, skaitytojuDuomenys)
  210.  
  211.     var programosBaigimoKanalas = make(chan valdytojoStruktura)
  212.     var rasytojuBaigimoKanalas = make(chan bool)
  213.     var skaitytojuBaigimoKanalas = make(chan bool)
  214.  
  215.     var rasytojuValdymoKanalas = make(chan int)
  216.     var skaitytojuValdymoKanalas = make(chan Task)
  217.  
  218.     var rasytojuWaitGroup sync.WaitGroup
  219.     var skaitytojuWaitGroup sync.WaitGroup
  220.     rasytojuWaitGroup.Add(len(rasytojuDuomenys))
  221.     skaitytojuWaitGroup.Add(len(skaitytojuDuomenys))
  222.     //var names = []string {"First", "Second", "Third", "Fourth", "Fifth"}
  223.     //for i := 0; i < 5; i++ {
  224.     //  var message = rand.Intn(65535)
  225.     //  go sender(channel, names[i], message)
  226.     //}
  227.     //go receiver(channel, finishChannel)
  228.     for i := 0; i < len(rasytojuDuomenys); i++ {
  229.         go rasytojoDarbas(rasytojoDuomenuPerdavimoKanalas, rasytojuValdymoKanalas, &rasytojuWaitGroup)
  230.     }
  231.     for i := 0; i < len(skaitytojuDuomenys); i++ {
  232.         go skaitytojoDarbas(skaitytojoDuomenuPerdavimoKanalas, skaitytojuValdymoKanalas, &skaitytojuWaitGroup)
  233.     }
  234.     go valdytojoDarbas(rasytojuValdymoKanalas, skaitytojuValdymoKanalas, rasytojuBaigimoKanalas, skaitytojuBaigimoKanalas, programosBaigimoKanalas)
  235.  
  236.     go func(){
  237.         rasytojuWaitGroup.Wait();
  238.         rasytojuBaigimoKanalas <- true
  239.     }()
  240.     go func(){
  241.         skaitytojuWaitGroup.Wait();
  242.         skaitytojuBaigimoKanalas <- true
  243.     }()
  244.  
  245.     galutineStruktura := <-programosBaigimoKanalas
  246.     printToFile("rez.txt", rasytojuDuomenys, skaitytojuDuomenys, galutineStruktura)
  247. }
  248. func duomenuPerdavimas(rasytojuKanalas chan<- rasytojuContainer, skaitytojuKanalas chan<- skaitytojuContainer,
  249.     rasytojuDuomenys []rasytojuContainer, skaitytojuDuomenys []skaitytojuContainer) {
  250.     for _, duomenys := range rasytojuDuomenys {
  251.         rasytojuKanalas <- duomenys
  252.     }
  253.     for _, duomenys := range skaitytojuDuomenys {
  254.         skaitytojuKanalas <- duomenys
  255.     }
  256.  
  257. }
  258.  
  259. func valdytojoDarbas(rasytojoKanalas <-chan int, skaitytojoKanalas <-chan Task,
  260.     rasytojuBaigimoKanalas <-chan bool, skaitytojuBaigimoKanalas <-chan bool, programosBaigimoKanalas chan<- valdytojoStruktura) {
  261.  
  262.     var galutinisKonteineris valdytojoStruktura
  263.     skaitytojaiBaige := false
  264.     rasytojaiBaige := false
  265.     for ; !skaitytojaiBaige || !rasytojaiBaige; {
  266.         select {
  267.         case rasytojoDuomenys := <-rasytojoKanalas:
  268.             //fmt.Println("Dedu: ", rasytojoDuomenys)
  269.             galutinisKonteineris.deti(rasytojoDuomenys)
  270.         case skaitytojoDuomenys := <-skaitytojoKanalas:
  271.             //fmt.Println("Trinu: ", skaitytojoDuomenys)
  272.             if galutinisKonteineris.trinti(skaitytojoDuomenys.x) || rasytojaiBaige{
  273.                 //fmt.Println("Pavyko")
  274.                 skaitytojoDuomenys.c <- 1
  275.             } else {
  276.                 //fmt.Println("nePavyko")
  277.                 skaitytojoDuomenys.c <- 0
  278.             }
  279.         case rasytojaiBaige = <-rasytojuBaigimoKanalas:
  280.  
  281.         case skaitytojaiBaige = <-skaitytojuBaigimoKanalas:
  282.         }
  283.     }
  284.     programosBaigimoKanalas <- galutinisKonteineris
  285. }
  286.  
  287. func rasytojoDarbas(duomenuGavimoKanalas <-chan rasytojuContainer, duomenuSiuntimoKanalas chan<- int, waitGroup *sync.WaitGroup){
  288.     defer waitGroup.Done()
  289.  
  290.     duomenys := <- duomenuGavimoKanalas
  291.     for i := 0; i < len(duomenys.masyvas); i++{
  292.         duomenuSiuntimoKanalas <- duomenys.masyvas[i].amzius;
  293.     }
  294.     //fmt.Println("Rasytojo duomenys", duomenys)
  295. }
  296.  
  297. func skaitytojoDarbas(duomenuGavimoKanalas <-chan skaitytojuContainer, duomenuSiuntimoKanalas chan<- Task, waitGroup *sync.WaitGroup) {
  298.     defer waitGroup.Done()
  299.     duomenys := <-duomenuGavimoKanalas
  300.     baigtuTrintiSkaicius := 0
  301.     for ;baigtuTrintiSkaicius < len(duomenys.masyvas); {
  302.         for i := 0; i < len(duomenys.masyvas); i++ {
  303.             naujasKiekis := duomenys.masyvas[i].kiekis
  304.             for j := 0; j < duomenys.masyvas[i].kiekis; j++ {
  305.                 grazinimoKanalas := make(chan int)
  306.                 //fmt.Println("Trinu: ", duomenys.masyvas[i].elementas)
  307.                 duomenuSiuntimoKanalas <- Task{duomenys.masyvas[i].elementas, grazinimoKanalas};
  308.                 success := <-grazinimoKanalas
  309.                 if success == 1 {
  310.                     //fmt.Println("Istryniau", duomenys.masyvas[i].elementas)
  311.                     naujasKiekis--
  312.                 } else {
  313.  
  314.                 }
  315.             }
  316.             if naujasKiekis == 0 && duomenys.masyvas[i].kiekis != 0 {
  317.                 baigtuTrintiSkaicius++
  318.             }
  319.             duomenys.masyvas[i].kiekis = naujasKiekis
  320.             //fmt.Println("Skaitytojo duomenys", duomenys)
  321.         }
  322.     }
  323. }
  324. //func sender(channel chan<- int, name string, x int) {
  325. //  fmt.Println(name, "is going to send value", x)
  326. //  channel <- x
  327. //}
  328. //func receiver(channel <-chan int, finishChannel chan<- bool) {
  329. //  var a int
  330. //  for i := 0; i < 5; i++ {
  331. //      a = <- channel
  332. //      fmt.Println("Received value", a)
  333. //  }
  334. //  finishChannel <- true
  335. //}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement