Commit 2b800af4275bea8c95b3bfb90fb6e94e64d968c4

  • Tree SHA1: 81c7300
  • Parent SHA1: 56816bf (Lisätty virheilmoitus sille jos portti DC:n ja kytkimen välissä. Lisäksi päivitetty virheilmoitusta jos ei ollenkaan kytkimiä tai ulostuloja)
  • raw diff | raw patch
Korjattu muotoile_lauseke(), nyt toimii keksimissäni testitapauksissa. Jos ei jossain tapauksessa toimi, niin opettaja huomannee sen testatessaan tehtävään antamaansa oikeaa lauseketta. Nyt järkevämpi toteutus ja enemmän kommentteja.
k8_lauseke_monimutkainen_toinen_muoto.txt
(1 / 0)
  
1LED = (((NOT (NOT(NOT A1) XOR B1)) AND (NOT (A2 XOR NOT (NOT (B2))))) AND NOT(NOT((NOT (A3 XOR B3)) AND (NOT (NOT(NOT(A4)) XOR B4)))))
simcirtest.py
(70 / 37)
  
623623 else:
624624 return pisteet, ""
625625
626
627626def muotoile_lauseke(lauseke):
628627 """
629628 Muuttaa LED = a AND b tyyppiset lausekkeet muotoon LED = AND(a,b)
630 Poistaa mahdolliset sulut, pyrkii säilyttämään 'puumaisen' rakenteen
631 uudessa lausekkeessa, testattu toimivaksi ao. lausekkeella
632 (((NOT (A1 XOR B1)) AND (NOT (A2 XOR B2))) AND (NOT (A3 XOR B3)) AND (NOT (A4 XOR B4)))
633 eli ensin käsitellään ne portit joiden sisäänmenona on pelkät muuttujat/kytkimet ja NOT:it
634 sitten vasta LEDiä lähimpänä puurakenteessa olevat portit
635 Tehdään lausekkeesta lista, johon lisätään muokatut termit ja poistetaan niitä vastaavat vanhat muotoilut
636 kunnes listassa on enää yksi termi ja se on uusi lauseke. LED irrotetaan alussa ja lisätään lopussa.
629 testattu toimivaksi ao. lausekkeella
630 LED = (((NOT (NOT(NOT A1) XOR B1)) AND (NOT (A2 XOR NOT (NOT (B2))))) AND NOT(NOT((NOT (A3 XOR B3)) AND (NOT (NOT(NOT(A4)) XOR B4)))))
631 Toiminta
632 - ensin käsitellään NOT, joilla parametrina yksi muuttuja
633 - sitten käsitellään NOT:ien alla olevat lausekkeet
634 - sitten NOT:tien alla olevat lausekkeet yhdistetään NOT:in kanssa samaksi lausekkeeksi
635 - sitten käsitellään muut operaattorit
636 Tehdään lausekkeesta lista, jossa muotattuja termejä yhdistellään ja niiden paikkoja vaihdellaan
637 - esim. listassa [... , 'A', 'XOR', 'B', ...] --> [... , 'XOR(A,B)', ...]
638 kunnes listassa on enää yksi termi ja se on uusi lauseke. LED irrotetaan alussa ja liitetään lopussa.
637639 :param lauseke: 'LED = a AND b' tai vastaava
638640 :return: 'LED = AND(a,b)' tai vastaava
639641 """
640 komponentit = ['AND', 'NAND', 'OR', 'NOR', 'XOR', 'XNOR', 'EOR', 'ENOR', 'NOT', 'DC']
641 osat = lauseke.split('=')
642 t = osat[1].lstrip().replace('(','').replace(')','').split(' ')
643 def muokkaa(lauseke):
644 tt = lauseke[a] + '(' + lauseke[a-1] + ',' + lauseke[a+1] + ')'
645 lauseke.insert(a-1,tt)
646 if a+2 == 0:
647 del lauseke[a-1:]
648 else:
649 del lauseke[a-1:a+2]
650642
651 a = -2
652 toinen = False
653 while len(t) > 1:
654 if abs(a) > len(t):
655 a = -2
656 toinen = True
657 if t[a] == 'NOT':
658 tt = t[a] + '(' + t[a+1] + ')'
659 t.insert(a,tt)
660 if a+2 == 0:
661 del t[a:]
662 else:
663 del t[a:a+2]
664 elif (t[a] in komponentit and not t[a-1].startswith(tuple(komponentit)) and not t[a+1].startswith(tuple(komponentit))):
665 muokkaa(t)
666 elif toinen:
667 muokkaa(t)
668 else:
669 a -= 1
643 def muokkaaLauseke(t):
644 # muokkaillaan lauseketta, yhdistetään operaatioihin termit ja muutetaan järjestystä
645 while (len(t) > 1):
646 j = 0
647 while j < len(t):
648 # Käsitellään NOT:it ilman sulkeita
649 if j+1 < len(t) and t[j] == 'NOT' and t[j + 1] != '(':
650 t[j], t[j + 1] = t[j] + '(', t[j + 1] + ')'
651 t[j:j + 2] = [''.join(t[j:j + 2])]
652 # print('0. t[j]: ' + t[j])
653 # yhdistetään ( -sulkeet sitä edeltävään loogiseen NOT operaatioon
654 if j+1 < len(t) and t[j] == 'NOT' and t[j+1] == '(':
655 t[j:j+2] = [''.join(t[j:j+2])] # x[3:6] = [''.join(x[3:6])]
656 #print('1. t[j]: ' + t[j])
657 # esim. 'NOT(', 'B2', ')' # Yhdistetään NOT sen sisällä olevaan lausekkeeseen
658 elif j+2 < len(t) and t[j] == 'NOT(' and t[j+2] == ')':
659 t[j:j+3] = [''.join(t[j:j+3])]
660 #print('2. t[j]: ' + t[j])
661 # esim. 'NOT(', '...', 'XOR', '...', ')' # Yhdistetään NOT:n sisällä oleva lauseke
662 elif j+5 < len(t) and t[j] == 'NOT(' and t[j+4] == ')' and t[j+2] in komponentit:
663 t[j+1], t[j+2], t[j+3] = t[j+2]+'(', t[j+1]+',', t[j+3]+')'
664 t[j:j+5] = [''.join(t[j:j+5])]
665 #print('3. t[j]: ' + t[j])
666 # esim. '(', '...', ')', 'AND', '(', '...', ')'
667 elif j-3 >= 0 and j+3 < len(t) and t[j] in komponentit and t[j-1] == ')' and t[j+3] == ')' and t[j-3] == '(' and t[j+1] == '(':
668 t[j-3], t[j-2], t[j-1], t[j], t[j+1] = t[j], t[j-3], t[j-2], ',', ''
669 t[j-3:j+4] = [''.join(t[j-3:j+4])]
670 #print('4. t[j-3]: ' + t[j-3])
671 j = j-3
672 # esim. '...', 'AND', '(', '...', ')'
673 elif j-1 >= 0 and j+3 < len(t) and t[j] in komponentit and t[j+3] == ')' and t[j+1] == '(' and t[j-1] != ')':
674 t[j-1], t[j], t[j+1] = t[j], t[j+1], t[j-1] + ','
675 t[j-1:j+4] = [''.join(t[j-1:j+4])]
676 #print('5. t[j-1]: ' + t[j-1])
677 j = j-1
678 # esim. '(', '...', 'AND', '...', ')'
679 elif j-2 >= 0 and j+2 < len(t) and t[j] in komponentit and t[j-2] == '(' and t[j+2] == ')':
680 t[j-1], t[j] = t[j], t[j-1]
681 t[j] = '(' + t[j]
682 t[j+1] = ',' + t[j+1] + ')'
683 t[j-1:j+2] = [''.join(t[j-1:j+2])]
684 #print('6. t[j-1]: ' + t[j-1])
685 j = j-1
686 # jos yksi muuttuja tms. sulkeiden välissä --> yhdistetään
687 elif j+2 < len(t) and t[j].endswith('(') and t[j+2].startswith(')'):
688 t[j:j+3] = [''.join(t[j:j+3])]
689 #print('7. t[j]: ' + t[j])
690 else:
691 j += 1
670692
693 # NOT käsitellään erikseen, ei testattu DC:n kanssa vielä (opettajan ratkaisun ei 'pitäisi' sisältää DC:tä)
694 komponentit = ['AND', 'NAND', 'OR', 'NOR', 'XOR', 'XNOR', 'EOR', 'ENOR']
695 osat = lauseke.split('=') # irroitetaan LED
696 t = osat[1].lstrip().replace('(',' ( ').replace(')',' ) ') # varmistetaan että sulkujen ympärillä on välejä
697 t = ' '.join(t.split()) # poistetaan extra välit
698 t = t.split(' ') # taulukoidaan sulut, muuttujat ja operaatiot
699 #print(t)
700 muokkaaLauseke(t) # muokataan kunnes listassa on enää yksi lopullinen string
701 #print(len(t))
702 #print(t)
671703 return osat[0].rstrip() + ' = ' + ''.join(t)
704
672705
673706def testaa_kaaviot(testikaavio, oikeakaavio, maksimipisteet, hyvportit = [], tulosta = True):
674707 """
testit.py
(3 / 0)
  
9898sys.stdout.write('Testi: A1,A1,A2,A3 ja B1,B1,B2,B3 yhtäsuuruus, paljon virheitä' + '\n')
9999testit('k8_lauseke_many_errors.txt', 'k8_lauseke_toinen_muoto.txt', 8)
100100
101sys.stdout.write('Testi: A1,A1,A2,A3 ja B1,B1,B2,B3 yhtäsuuruus, opettajan lauseke monimutkainen muodossa LED = a AND b (opiskelijan vastaus oikein)' + '\n')
102testit('k8.txt', 'k8_lauseke_monimutkainen_toinen_muoto.txt', 8)
103
101104sys.stdout.write('Testi: Sininen ja Keltainen LED (hyvportit oikea-tiedostossa tyhjän rivin jälkeen)' + '\n')
102105testit('k6.txt', 'k6_with_NAND.txt', 1)
103106