# data[].attributes.headline
13.12.2018 Viimane töö. Üks ülesanne kaks skripti

# data[].attributes.subject
13.12.2018 Viimane töö. Üks ülesanne kaks skripti

# data[].attributes.body
Juhend ja vajalikud algandmed
Google Drive
Powershellis kiirsalvestamine

# data[].attributes.body
Kaks skripti erinevas keeles (PowerShell ja Python)

Kirjuta skript mis genereerib etteantud arvu failinimesid koos laiendiga ning kirjutab failinimed faili FileList.txt (iga fail eraldi real).

Järgnevalt teeb need failid reaalselt ka kettale. Windowsi arvuti puhul tehakse failid C:\Temp\IT17 ja linuxi puhul /tmp/IT17 Mõlemal juhul peab see kaust eelnevalt tehtud olema
Fail FileList.txt asub samas kaustas kus skript ise. Skripti nimeks Viimane_Eesnimi.py või Viimane_Eesnimi.ps1

Tekkinud lisa küsimused:

1. Mis on failinimi? Failinimed on juhuslikud. Faililaiendid on aga skriptijal eelnevalt defineeritud, et need oleks reaalaselt olemas.

2. Kas fialilaiendid võivad samad olla? Kuna juhendis täpselt pole öeldud, siis faili laiendid võivad samad olla

# data[].attributes.body
Isikukoodid mis on vaja kontrollida on siin.

Eelnevates tundides oleme üke isikukoodi kontrolli teinud. Nüüd on teil vaja see kirjutada nii ümber (teha uus skiript), et saaksite failis olevaid isikukoode kontrollida ja peale kontrollimist kirjutada tulemus faili personalcodes_checked.txt nii et ees on isikukood ja selle järgi vastavalt tekst Korras või Vigane. Näide:
61022564548 Vigane
12605283524 Korras

See kord peab kood olema võimalikult loogiline, kasutama sobivaid funktsioone (def) et vajadusel saaks asja kiiresti modifitseerida.

Täiendus, kui esimene osa töötab
Edasi arendus on selline, et lubatud oleks ka 19. sajandil sündinud isikud (vaikimisi seda pole. Isikud kes on sündinud 01.01.1800 - 31.12.1899)

# data[].attributes.headline
06.12.2018 Sugu ja Sünniaeg => Isikukood

# data[].attributes.subject
06.12.2018 Sugu ja Sünniaeg => Isikukood

# data[].attributes.body
Ette antud soo ja sünniaja järgi tuleb genereerida peaaegu õige isikukood. Vigane võib olla neli viimast numbrit. Lahendus kuidas asju osadena teha:

funktsioon genLastFourNr() - genereerib juhusliku täisarvu vahemikus 1 - 9999, kus juures number peab olema neljakohaline. Tagastab neljakohalise numbri tekstina.. Näiteks 9 puhul peab see olema 0009. või 768 asemel 0768. Aga 1234 jääbki 1234
import random

def genLastFourNumber():
    """ Teeb neljakohalise numbri (Tulemus on string) """
    return str(random.randint(1, 9999)).rjust(4, '0') # 0025 või 1234

funktsioon checkDate(userDate) - kontrollib kas kasutaja sisestatud kuupäev on õiges vormingus ja kas see on ka kuupäev. Tagastab True, kui kuupäev on korrektne ja False kui kuupäev on vale.
import datetime

def checkDate(userDate):
    """ Kontrollib, kas kuupäev on õiges vormingus ja kuupäev """
    try:
        datetime.datetime.strptime(userDate, '%d.%m.%Y')
        if len(userDate) == 10:
            return True
        else:
            return False
    except ValueError:
        return False

funktsioon isDateBetween(userDate)  - kontrollib kas kasutaja sisestatud kuupäev on vahemikus 01.01.1900  kuni tänane päev kaasa arvatud. Tagastab True kui kuupäev on õiges vahemikus ja False kui on vales vahemikus.

def isDateBetween(userDate):
    """ Kontrollib, kas kasutaja kuupäev on 01.01.1900 - tänane päev k.a. """
    past = datetime.datetime.strptime(userDate, "%d.%m.%Y")
    today = datetime.datetime.now()
    first = datetime.datetime.strptime('01.01.1900', "%d.%m.%Y")
    if past.date() >= first.date() and past.date() <= today.date():
        return True
    else:
        return False

funktsioon checkGender(sex) - kontrollib kas sooks on M või N. Tagastatb True, kui on õige ja False kui pole õige.

def checkGender(sex):
    """ Kontrollib kas sugu on õige täht """
    if sex.lower() == 'm' or sex.lower() == 'n':
        return True
    else:
        return False

funktsioon getGenderNr(sex, date) - teeb vastavalt soole ja sünniaastale sobiva soo numbri isikukoodi esimeseks numbriks. Tagastab tekstina numbri 3, 4, 5 või 6.

def getGenderNr(sex, date):
    """ Soo ja sünnaja põhjal tagastab soo numbri tekstina """
    if sex.lower() == 'm':
        if int(date[6:8]) == 19:
            return '3'
        else:
            return '5'
    elif sex.lower() == 'n':
        if int(date[6:8]) == 19:
            return '4'
        else:
            return '6'

funktsioon genFullCode(sex, date)  - Teeb valmis isikukoodi kasutades eelpool tehtud funktsioone õiges järjekorras. Tulemusena väljastab valmis isikukoodi

def genFullCode(sex, date):
    """ Genereerib valmis koodi soo ja etteantud kuupäevaga """
    personalCode = ""
    if checkGender(sex):
        if checkDate(date): # Kas kuupäev on õiges vormingus PP.KK.AAAA
            if isDateBetween(date): # Kas kuupäev on õiges vahemikus
                personalCode += getGenderNr(sex, date) # Soo number
                personalCode += date[8:10] # Aasta kaks numbrit
                personalCode += date[3:5]  # Kuu kaks numbrit
                personalCode += date[0:2]  # Päeva kaks numbrit
                personalCode += genLastFourNumber() # Neli viimast numbrit
                return personalCode
            else:
                print('Kuupäev peab olema vahemikus 01.01.1900 - tänane päev k.a.')
                return False
        else:
            print('Pole kuupäev või vales vormingus ' + date)
            return False
    else:
        print('See pole sugu: ' + str(sex.upper()))
        return False

Peale viimast funktsiooni tuleb kaks muutuja millest üks on sugu ja teine sünniaeg ning viimase funktsiooni välja kutsumine eelpool mainitud muutujatega.
VALMIS :D

Täiendused:

1. Kuupäeva kontroll ei tohi olla osade kaupa kontroll. Kasutada Pythoni võimalusi! Tee funktsioon selleks (vaata koodi eespool)

2. Kas sisestatud kuupäev on õiges vahemikus. kasuta funktsiooni vaata eespoolt

3. Kasutaja võib olla laisk. Tekitage võimalus et genereeritakse juhuslik sugu ja kui kasutaja vajutab Enter ilma sugu kirjutamata, siis kasutatakse juhuslikult genereeritud soo tähte. Eelnevalt tuleb näidata ka vaikimisi genereritud sugu.

4. Kasutaja on ikka ääretult laisk. Tekitage võimalus, et kui kasutaja ei sisesta sünniaega, siis genereerige eelnevalt juhuslik sünniaeg vahemikus 01.01.1900 kuni tänane kuupäev k.a. Enne Enter klahvi vajutust peab olema näha mis kuupäeva kasutatakse kui kasutaja vajutab Enter.

def genRandomGender():
    """ Genereeri juhuslik sugu """
    nr = random.randint(1,2)
    if nr % 2 == 0: # Kui on paaris arv
        return 'N'  # Siis on N
    else:
        return 'M'  # Paaritu on M


def genRandomDate(start, end, format):
    """ Genereerib kahe kuupäevavahel oleva juhusliku kuupäeva.
        Arvestab ka kuupäeva vormingut. Vorminguks (format) tuleb kirjutada
        '%d.%m.%Y' """
    delta = end - start
    int_delta = (delta.days * 24 * 60 * 60) + delta.seconds
    random_second = random.randrange(int_delta)
    return (start + datetime.timedelta(seconds=random_second)).strftime(format)

""" Need neli rida on ülesande täiendused """
d1 = datetime.datetime.strptime('01.01.1900', '%d.%m.%Y') # Väikseim kuupäev
d2 = datetime.datetime.now() # Tänane kuupäev
rndDate = genRandomDate(d1, d2, '%d.%m.%Y') # Juhuslik kuupäev
rndGender = genRandomGender() # Juhuslik sugu

gender = input('Sisesta sugu [M/N] [Vaikimisi ' + rndGender + ']: ')
birthDate = input('Sisesta sünniaeg eesti vormingus: [Vaikimisi ' +rndDate + '] ')
# Kui sugu või sünniaeg on tühjad, siis kasutab juhuslikult genereeritud väärtust
if gender.strip() == "":
    gender = rndGender
if birthDate.strip() == "":
    birthDate = rndDate

print(gender.strip()) # Näita sugu
print(birthDate.strip()) # Näita sünniaega
print(genFullCode(gender.strip(), birthDate.strip())) # Näita isikukoodi

KÕIK!

# data[].attributes.body
Laadige alla virtuaal masinasse C:\Temp kausta. Vaadata võib sisu ainult Notepad või Notepad++ programmiga. Failid on siin.

# data[].attributes.body
Ülesanded on siin Docx ja PDF Valmis ülesanne saata aadressile livental@gmail.com Kui viirustõrje ei lase saata, siis kasutaga upload.ee või mõnda muud pilve teenust

# data[].attributes.body
Koostage uus skript.
Ülesanne 1: Genereerige 10 juhusliku numbrit vahemikus 1 - 100 ja väljastage iga numbri järgi, kas see on paaris või paaritu. Ilus kui iga numbri ees oleks järjekorra number. Näide:
1. 52 paaris
2. 3 paaritu
3. 86 paaris
jne.

Ülesanne 2: Täiendage ülesannet nii, et näidatakse 10 asemel 20 juhusliku numbrit, kuid kui number lõppeb 5 või 0'ga, siis ütleb ümmargune number aga paars või paaritu, enam ütlema ei pea. VIHJE: Enne tuleb kontrollida kas on ümmargune number! ja else osas see mis on juba tehtud :)

Ülesanne 3: Täiendage ülesannet nii, et järjekorra numbrid mis pole kahe kohalised, oleks ees 0. Näiteks 1 on 01 ja 9 on 09. Sama parandus tehke juhuslikule numbrile, mis on alla 10, algavad nulliga.

Ülesanne 4: Kui on juubel, siis suure juubeli puhul ütleb suur juubel, kui on väike juubel siis väike juube. Suur juubel lõppeb 0'ga ja väike juubel 5'ga.

# data[].attributes.body
Kasutage eelnevates tundides tehtud PowerShell funktsioone ja lahendage järgmine ülesanne. Tegemist on ühe skirptiga. Skript peab vastama allolevatele nõudmisetele

1. Kasutaja peab saama teha X arv juhuslikke faile koos laiendi ja fikseeritud suurusega. X on failide arv

2. Kasutajal peab olema võimalus määrata ka juhusliku suurusega faile mingis suuruste vahemikus. Kui suurus on 0 siis on juhuslik suurus, kui on kindel number, siis nii suur fail tulebki

3. Maksimaalne failide arv mida lubatakse teha on 1000 tk.

4. Kui kasutaja pole määranud, kausta, kuhu failid teha, siis on selleks vaikimisi C:\Temp kaust.

5. Kasutaja peab saama määrata failinime pikkust. Kui see pole määratud, siis on see vahemikus 3 - 10

Vaikimisi väärtused, kui kasutaja pole määranud:

1. Kaust kuhu teha failid: C:\Temp

2. Maksimaalne lubatud failide arv on 1000

3. Failinime pikkus on vahemikus 3 - 10 märki

4. Maksimaalne faili suurus on 1 kB (1024 baiti)

Mida on vaja kontrollida, kui kasutaja on sisestatnud vajalikud algandmed:

1. Kasutaja sisestatud andmed:

1. Kausta olemasolu. Kui kausta ei ole, tuleb kaust eelnevalt teha. Kui kaust on olemas, siis kontrollida, kas kaust on tühi. Kui ei ole, siis võiks küsida kasutajalt kas kustutada või mitte.

2. Failide arvu. (See peab olema täisarv (Integer)). Kui see on 0, siis teeb juhusliku arvu vahemikus 1 kuni 1000. Kui on määratud, siis nii mitu faili tehaksegi. Kui failide arv on alla 1 või rohkem kui 1000, siis tehakse sama asi nagu 0 puhul.

3. Failinime pikkus (See peab olema täisarv (Integer)). Kui see on 0, siis on failinime pikkus vahemikus 3 - 10 märki. Kui on määratud, siis nii pika nimega failinimed tulevadki. Kui failinime pikkus on alla kolme või üle 10, siis tehakse nii nagu 0 puhul.

4. Faili suurus (See on murdarv (Double)). Kui see on 0, siis on juhuslik suurus vahemikus 0 - 1024 (see on baitides). Kui on kindel suurus, siis nii suure teebki. Kui faili suurus on alla nulli või üle 1024, siis tehakse nii nagu suuruse 0 puhul.

# data[].attributes.body
Õpetajaga koos tehtud skriptid saab siit. (14.11.2018 @ 10:11)