Advertisement
Guest User

Untitled

a guest
Nov 20th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.97 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "bufio"
  5. "fmt"
  6. "os"
  7. "reflect"
  8. "strconv"
  9. "strings"
  10. )
  11.  
  12. type provider struct {
  13. product string
  14. quantity int
  15. price float64
  16. }
  17.  
  18. type consumer struct {
  19. product string
  20. quantity int
  21. }
  22.  
  23. func main() {
  24. providers := [][]provider{{}}
  25. consumers := [][]consumer{{}}
  26. var providersCh chan [][]provider = make(chan [][]provider)
  27. var consumersCh chan [][]consumer = make(chan [][]consumer)
  28. var result chan []provider = make(chan []provider)
  29. providers, consumers = readFromFile("IFF5-2_ZavadskisD_L3_dat_3.txt")
  30. go runProcesses(providersCh, consumersCh, result)
  31. providersCh <- providers
  32. consumersCh <- consumers
  33. writeToFile("IFF5-2_ZavadskisD_L3_rez.txt", <-result, providers, consumers)
  34. }
  35.  
  36. func runProcesses(providersCh chan [][]provider, consumersCh chan [][]consumer, result chan []provider) {
  37. providers := <-providersCh
  38. consumers := <-consumersCh
  39. var datap []chan []provider = make([]chan []provider, len(providers)) //provider data input
  40. for i := range datap {
  41. datap[i] = make(chan []provider)
  42. }
  43. var datac []chan []consumer = make([]chan []consumer, len(consumers)) //consumer data input
  44. for i := range datac {
  45. datac[i] = make(chan []consumer)
  46. }
  47. var cp []chan provider = make([]chan provider, len(providers)) //provider data output
  48. for i := range cp {
  49. cp[i] = make(chan provider)
  50. }
  51. var cc []chan consumer = make([]chan consumer, len(consumers)) //consumer data output
  52. for i := range cc {
  53. cc[i] = make(chan consumer)
  54. }
  55. var jobReqI []chan bool = make([]chan bool, len(consumers)) //consumer job request chanel input
  56. for i := range jobReqI {
  57. jobReqI[i] = make(chan bool)
  58. }
  59. var jobReqO []chan int = make([]chan int, len(consumers)) //consumer job request chanel output
  60. for i := range jobReqO {
  61. jobReqO[i] = make(chan int)
  62. }
  63. var cd chan int = make(chan int) //manager data input
  64. pCnt, cCnt := 0, 0
  65. go manager(cp, cc, jobReqI, jobReqO, cd, result)
  66. for i := 0; i < len(providers); i++ {
  67. go put(cp[i], datap[i])
  68. datap[i] <- providers[i]
  69. pCnt += len(providers[i])
  70. }
  71. cd <- pCnt
  72. for i := 0; i < len(consumers); i++ {
  73. go remove(cc[i], jobReqI[i], jobReqO[i], datac[i])
  74. datac[i] <- consumers[i]
  75. cCnt += len(consumers[i])
  76. }
  77. cd <- cCnt
  78. cd <- len(consumers)
  79. }
  80.  
  81. func manager(cp []chan provider, cc []chan consumer, jobReqI []chan bool, jobReqO []chan int, cd chan int, result chan []provider) {
  82. var b []provider
  83. var somethingChanged bool
  84. pCnt := <-cd
  85. cCnt := <-cd
  86. jobsCnt := <-cd
  87. cCntDef := cCnt
  88. close(cd)
  89. cases := make([]reflect.SelectCase, len(jobReqI)+len(cp)+len(cc))
  90. for i, ch := range cp {
  91. cases[i] = reflect.SelectCase{Dir: reflect.SelectRecv, Chan: reflect.ValueOf(ch)}
  92. }
  93. for i, ch := range cc {
  94. cases[i+len(cp)] = reflect.SelectCase{Dir: reflect.SelectRecv, Chan: reflect.ValueOf(ch)}
  95. }
  96. for i, ch := range jobReqI {
  97. cases[i+len(cp)+len(cc)] = reflect.SelectCase{Dir: reflect.SelectRecv, Chan: reflect.ValueOf(ch)}
  98. }
  99. for jobsDone := 0; jobsDone < jobsCnt; {
  100. chosen, value, ok := reflect.Select(cases)
  101. fmt.Printf("Value: %v\n", value)
  102. if ok {
  103. switch value.Interface().(type) {
  104. case provider:
  105. tmp, _ := value.Interface().(provider)
  106. fmt.Printf("Put: %v\n", value.Interface().(provider))
  107. b = insertOrUpdate(b, tmp)
  108. pCnt--
  109. case consumer:
  110. tmp, _ := value.Interface().(consumer)
  111. fmt.Printf("Remove:%v\n", tmp)
  112. b, somethingChanged = removeOrUpdate(b, tmp)
  113. if pCnt == 0 && !somethingChanged {
  114. cCnt--
  115. } else {
  116. cCnt = cCntDef
  117. }
  118. case bool:
  119. if pCnt <= 0 && cCnt <= 0 {
  120. jobReqO[chosen-len(cp)-len(cc)] <- 0
  121. jobsDone++
  122. } else {
  123. jobReqO[chosen-len(cp)-len(cc)] <- 1
  124. }
  125. default:
  126. fmt.Println(chosen)
  127. fmt.Println(value)
  128. fmt.Println(value.Interface())
  129. fmt.Println(reflect.ValueOf(value).Interface())
  130. panic("dd")
  131. }
  132. }
  133. }
  134. result <- b
  135. }
  136.  
  137. func put(ch chan provider, data chan []provider) {
  138. p := <-data
  139. close(data)
  140. for i := 0; i < len(p); i++ {
  141. ch <- p[i]
  142. }
  143. close(ch)
  144. }
  145.  
  146. func insertOrUpdate(b []provider, p provider) []provider {
  147. var i int
  148. if len(b) == 0 {
  149. return append(b, p)
  150. }
  151. if b[0].product > p.product || b[0].product == p.product && b[0].price > p.price {
  152. return append([]provider{p}, b...)
  153. }
  154. i = len(b) - 1
  155. if b[i].product < p.product || b[i].product == p.product && b[i].price < p.price {
  156. return append(b, p)
  157. }
  158. for i = 0; i < len(b); i++ {
  159. if b[i].product == p.product && b[i].price == p.price {
  160. b[i].quantity += p.quantity
  161. return b
  162. }
  163. if b[i].product > p.product || b[i].product == p.product && b[i].price > p.price {
  164. return append(b[0:i], append([]provider{p}, b[i:len(b)]...)...)
  165. }
  166. }
  167. return b
  168. }
  169.  
  170. func remove(ch chan consumer, jobReqI chan bool, jobReqO chan int, datac chan []consumer) {
  171. var jt int
  172. c := <-datac
  173. close(datac)
  174. jobReqI <- true
  175. for {
  176. jt = <-jobReqO
  177. if jt == 0 {
  178. break
  179. } else {
  180. for i := 0; i < len(c); i++ {
  181. ch <- c[i]
  182. }
  183. jobReqI <- true
  184. }
  185. }
  186. close(jobReqI)
  187. close(jobReqO)
  188. }
  189.  
  190. func removeOrUpdate(b []provider, c consumer) ([]provider, bool) {
  191. var i int
  192. if len(b) == 0 {
  193. return b, false
  194. }
  195. for i = 0; i < len(b); i++ {
  196. if b[i].product == c.product {
  197. b[i].quantity -= c.quantity
  198. if b[i].quantity < 0 {
  199. return append(b[:i], b[i+1:]...), true
  200. }
  201. return b, true
  202. }
  203. }
  204. return b, false
  205. }
  206.  
  207. func readFromFile(fileName string) ([][]provider, [][]consumer) {
  208. var tint int
  209. var tfloat float64
  210. file, err := os.Open(fileName)
  211. check(err)
  212. defer file.Close()
  213.  
  214. scanner := bufio.NewScanner(file)
  215.  
  216. //Providers
  217. scanner.Scan()
  218. x, err := strconv.Atoi(scanner.Text())
  219. check(err)
  220. providers := make([][]provider, x)
  221. for i := 0; i < x; i++ {
  222. scanner.Scan()
  223. y, err := strconv.Atoi(scanner.Text())
  224. check(err)
  225. providers[i] = make([]provider, y)
  226. for j := 0; j < y; j++ {
  227. scanner.Scan()
  228. line := strings.Split(scanner.Text(), " ")
  229. tint, err = strconv.Atoi(line[1])
  230. check(err)
  231. tfloat, err = strconv.ParseFloat(line[2], 64)
  232. check(err)
  233. providers[i][j] = provider{line[0], tint, tfloat}
  234. }
  235. }
  236. //Consumers
  237. scanner.Scan()
  238. x, err = strconv.Atoi(scanner.Text())
  239. check(err)
  240. consumers := make([][]consumer, x)
  241. for i := 0; i < x; i++ {
  242. scanner.Scan()
  243. y, err := strconv.Atoi(scanner.Text())
  244. check(err)
  245. consumers[i] = make([]consumer, y)
  246. for j := 0; j < y; j++ {
  247. scanner.Scan()
  248. line := strings.Split(scanner.Text(), " ")
  249. tint, err = strconv.Atoi(line[1])
  250. check(err)
  251. consumers[i][j] = consumer{line[0], tint}
  252. }
  253. }
  254.  
  255. check(scanner.Err())
  256. return providers, consumers
  257. }
  258.  
  259. func writeToFile(fileName string, final []provider, providers [][]provider, consumers [][]consumer) {
  260. if _, err := os.Stat(fileName); !os.IsNotExist(err) {
  261. var err = os.Remove(fileName)
  262. check(err)
  263. }
  264. var file, err = os.Create(fileName)
  265. check(err)
  266. defer file.Close()
  267. f, err := os.OpenFile(fileName, os.O_APPEND|os.O_WRONLY, 0600)
  268. if err != nil {
  269. panic(err)
  270. }
  271.  
  272. defer f.Close()
  273. if _, err = f.WriteString(fmt.Sprintf("%-15s|%-8s|%-8s\n", "Pavadinimas", "Kiekis", "Kaina")); err != nil {
  274. panic(err)
  275. }
  276. for i := 0; i < len(providers); i++ {
  277. if _, err = f.WriteString(fmt.Sprintf("---------------------------------\n")); err != nil {
  278. panic(err)
  279. }
  280. for j := 0; j < len(providers[i]); j++ {
  281. if _, err = f.WriteString(fmt.Sprintf("%-15s|%8d|%8.2f\n", providers[i][j].product, providers[i][j].quantity, providers[i][j].price)); err != nil {
  282. panic(err)
  283. }
  284. }
  285. }
  286. if _, err = f.WriteString(fmt.Sprintf("---------------------------------\n")); err != nil {
  287. panic(err)
  288. }
  289.  
  290. if _, err = f.WriteString(fmt.Sprintf("\n\n------------------------\n")); err != nil {
  291. panic(err)
  292. }
  293.  
  294. if _, err = f.WriteString(fmt.Sprintf("%-15s|%-8s\n", "Pavadinimas", "Kiekis")); err != nil {
  295. panic(err)
  296. }
  297. for i := 0; i < len(consumers); i++ {
  298. if _, err = f.WriteString(fmt.Sprintf("------------------------\n")); err != nil {
  299. panic(err)
  300. }
  301. for j := 0; j < len(consumers[i]); j++ {
  302. if _, err = f.WriteString(fmt.Sprintf("%-15s|%8d\n", consumers[i][j].product, consumers[i][j].quantity)); err != nil {
  303. panic(err)
  304. }
  305. }
  306. }
  307. if _, err = f.WriteString(fmt.Sprintf("------------------------\n")); err != nil {
  308. panic(err)
  309. }
  310.  
  311. if _, err = f.WriteString(fmt.Sprintf("\n\n---------------------------------\n")); err != nil {
  312. panic(err)
  313. }
  314. if _, err = f.WriteString(fmt.Sprintf("%-15s|%-8s|%-8s\n", "Pavadinimas", "Kiekis", "Kaina")); err != nil {
  315. panic(err)
  316. }
  317. if _, err = f.WriteString(fmt.Sprintf("---------------------------------\n")); err != nil {
  318. panic(err)
  319. }
  320. for i := 0; i < len(final); i++ {
  321. if _, err = f.WriteString(fmt.Sprintf("%-15s|%8d|%8.2f\n", final[i].product, final[i].quantity, final[i].price)); err != nil {
  322. panic(err)
  323. }
  324. }
  325. if _, err = f.WriteString(fmt.Sprintf("---------------------------------\n")); err != nil {
  326. panic(err)
  327. }
  328. }
  329.  
  330. func check(e error) {
  331. if e != nil {
  332. panic(e)
  333. }
  334. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement