Commit bb282fe752623b8cc98d26b59a1ede9669c17ea9

  • Tree SHA1: 3c90303
  • Parent SHA1: 51a529a (muokattu simcirtest.py siten että kutsutaan vain yhtä aliohjelmaa, jolle parametrilla kerrotaan, onko oikea ratkaisu kaavio, lauseke vai totuustaulu, päivitetty README, muutettu testit.py siten että testaa tiedostoilla. Lisätty testitiedostot lausekkeille ja totuustauluille)
  • raw diff | raw patch
Lauseke saa nyt olla muodossa 'LED = AND(a,b)' tai muodossa 'LED = a AND b'. Lisätty 1 testi tuota varten.
README.txt
(1 / 1)
  
2121 :param testidata: tekstitiedosto, jossa testattava simcir kaavio JSON muodossa
2222 :param oikeadata: joko kaavio, lauseke tai totuustaulu, sen mukaan mitä oikeantyyppi on. Muotoilu
2323 Kaavio - JSON simcir kaavio
24 Lauseke - jokainen lauseke omalla rivillään muodossa: LED = AND(a,b) - TODO: että hyväksyy myös muodon LED = a AND b
24 Lauseke - jokainen lauseke omalla rivillään muodossa: LED = AND(a,b) tai hyväksyy myös muodon LED = a AND b
2525 Totuustaulu - jokainen totuustaulun rivi omalla rivillään, saa sisältää rivin joka alkaa tavuviivalla (-), ne jätetään huomiotta
2626 :param oikeantyyppi: 'k' - kaavio, 'l' - lauseke, 't' - totuustaulu
2727 :param maksimipisteet: Tehtävästä saatava maksimipistemäärä
k8_lauseke_toinen_muoto.txt
(1 / 0)
  
1LED = (((NOT (A1 XOR B1)) AND (NOT (A2 XOR B2))) AND (NOT (A3 XOR B3)) AND (NOT (A4 XOR B4)))
simcirtest.py
(53 / 4)
  
306306 '''
307307 Tätä ei tällä hetkellä kutsuta:
308308 - terminalit lisätään konstruktorissa
309 - self.komponentit korvataan self.devices
309 - self.komponentit korvataan self.devices HUOM self.komponentit otettu muuhun käyttöön!!!
310310 - ei tue vielä 3+ input loogisia portteja, pitää miettiä jos senkin tekee kostruktorissa
311311 '''
312312 '''
373373 '''
374374 yhtalot pitaa olla taulukko stringeistä, esim.: ["LED = AND(A,B)"] tai ["Sininen = AND(a,sel)", "Keltainen = AND(a,NOT(sel))"]
375375 = -merkin vasemalla puolella on ulostulon nimi (label)
376 TODO: tuki yhtalo muotoa "LED = A AND B"
377376 Palauttaa: lausekkeista muodotetun totuustaulun, esim. kahdelle outputille
378377 a sel Keltainen Sininen
379378 0 0 0 0
523523 return pisteet, ""
524524
525525
526def muotoile_lauseke(lauseke):
527 """
528 Muuttaa LED = a AND b tyyppiset lausekkeet muotoon LED = AND(a,b)
529 Poistaa mahdolliset sulut, pyrkii säilyttämään 'puumaisen' rakenteen
530 uudessa lausekkeessa, testattu toimivaksi ao. lausekkeella
531 (((NOT (A1 XOR B1)) AND (NOT (A2 XOR B2))) AND (NOT (A3 XOR B3)) AND (NOT (A4 XOR B4)))
532 eli ensin käsitellään ne portit joiden sisäänmenona on pelkät muuttujat/kytkimet ja NOT:it
533 sitten vasta LEDiä lähimpänä puurakenteessa olevat portit
534 Tehdään lausekkeesta lista, johon lisätään muokatut termit ja poistetaan niitä vastaavat vanhat muotoilut
535 kunnes listassa on enää yksi termi ja se on uusi lauseke. LED irrotetaan alussa ja lisätään lopussa.
536 :param lauseke: 'LED = a AND b' tai vastaava
537 :return: 'LED = AND(a,b)' tai vastaava
538 """
539 komponentit = ['AND', 'NAND', 'OR', 'NOR', 'XOR', 'XNOR', 'EOR', 'ENOR', 'NOT', 'DC']
540 osat = lauseke.split('=')
541 t = osat[1].lstrip().replace('(','').replace(')','').split(' ')
542 def muokkaa(lauseke):
543 tt = lauseke[a] + '(' + lauseke[a-1] + ',' + lauseke[a+1] + ')'
544 lauseke.insert(a-1,tt)
545 if a+2 == 0:
546 del lauseke[a-1:]
547 else:
548 del lauseke[a-1:a+2]
549
550 a = -2
551 toinen = False
552 while len(t) > 1:
553 if abs(a) > len(t):
554 a = -2
555 toinen = True
556 if t[a] == 'NOT':
557 tt = t[a] + '(' + t[a+1] + ')'
558 t.insert(a,tt)
559 if a+2 == 0:
560 del t[a:]
561 else:
562 del t[a:a+2]
563 elif (t[a] in komponentit and not t[a-1].startswith(tuple(komponentit)) and not t[a+1].startswith(tuple(komponentit))):
564 muokkaa(t)
565 elif toinen:
566 muokkaa(t)
567 else:
568 a -= 1
569
570 return osat[0].rstrip() + ' = ' + ''.join(t)
571
526572def testaa_kaaviot(testikaavio, oikeakaavio, maksimipisteet, hyvportit = [], tulosta = True):
527573 """
528574 Testaa opettajan antaman kaavion vs. opiskelijan kytkentäkaavio
588588def testaa_lauseke_vs_kaavio(testikaavio, oikealauseke, maksimipisteet, hyvportit = [], tulosta = True):
589589 """
590590 Testaa opettajan antaman lausekkeen vs. opiskelijan kytkentäkaavio
591 TODO: totuustaulu_lausekkeesta pitää lisätä vaihtoehto, jossa lausekkeet voi antaa myös muodossa ["Sininen = a AND sel", "Keltainen = a AND NOT sel"]
592591 :param testikaavio: JSON string opiskelijan simcirjs kaaviosta
593592 :param oikealauseke: lausekkeet omilla riveillään (järjestyksellä ei väliä)
594593 Keltainen = AND(a,NOT(sel))
595594 Sininen = AND(a,sel)
595 tai muodossa (saa sisältää sulkuja)
596 Sininen = a AND sel
597 Keltainen = a AND NOT sel
596598 niistä muodostetaan taulukko esim. ["Sininen = AND(a,sel)", "Keltainen = AND(a,NOT(sel))"]
597599 HUOM: muuttujat eivät voi olla pythonin varattuja sanoja esim. 'in'
598600 :param maksimipisteet: Tehtävästä saatava maksimipistemäärä
602602 :param tulosta: True/False - tulostetaanko tieto arvostelusta vai ei (esim. kokeessa) palauttaa kuitenkin pisteet aina!
603603 :return: (double, string) - pisteet doublena, ja string:n, jossa 'oikein'-teksti, virheelliset totuustaulun rivit tai muuta virheinformaatiota
604604 """
605 if ',' not in oikealauseke: # a AND b muodossa ei ole pilkkua, kun taas muodossa AND(a,b) on
606 oikealauseke = muotoile_lauseke(oikealauseke)
605607 testitaulu, portit = totuustaulu_kaaviosta(json.loads(testikaavio))
606608 oikeataulu = totuustaulu_lausekkeesta(oikealauseke.splitlines())
607609
641641 :param testidata: tekstitiedosto, jossa testattava simcir kaavio JSON muodossa
642642 :param oikeadata: joko kaavio, lauseke tai totuustaulu, sen mukaan mitä oikeantyyppi on. Muotoilu
643643 Kaavio - JSON simcir kaavio
644 Lauseke - jokainen lauseke omalla rivillään muodossa: LED = AND(a,b) - TODO: että hyväksyy myös muodon LED = a AND b
644 Lauseke - jokainen lauseke omalla rivillään muodossa: LED = AND(a,b) - hyväksyy myös muodon LED = a AND b
645645 Totuustaulu - jokainen totuustaulun rivi omalla rivillään, saa sisältää rivin joka alkaa tavuviivalla (-), ne jätetään huomiotta
646646 :param oikeantyyppi: 'k' - kaavio, 'l' - lauseke, 't' - totuustaulu
647647 :param maksimipisteet: Tehtävästä saatava maksimipistemäärä
testit.py
(3 / 0)
  
9797testit('koe8.txt', 'k8.txt', 'k', 8)
9898testit('koe8.txt', 'k8_lauseke.txt', 'l', 8)
9999testit('koe8.txt', 'k8_taulu.txt', 't', 8)
100
101sys.stdout.write('Testi: A1,A1,A2,A3 ja B1,B1,B2,B3 yhtäsuuruus, opettajan lauseke muodossa LED = a AND b (koe8.txt yksi ENOR vaihdettu NOR:ksi)' + '\n')
102testit('koe8.txt', 'k8_lauseke_toinen_muoto.txt', 'l', 8)