Generiranje nalog

Spodnji program za dani seznam študentov omogoča generiranje naključnih nalog ter njihovih rešitev. Program sprejme:

seznam nalog (vsaka je opisana s programom v Mathematici),

vzorčno datoteko (ponavadi v LATEXu) in

seznam študentov,

nato pa ustvari posamezne datoteke z nalogami in skupno datoteko z rešitvami. Naloge niso čisto naključne, saj vam program za istega študenta vedno vrne enako nalogo. To vam omogoča, da naloge naknadno popravljate, ne da bi se vam pri tem v celoti spremenile.

Za idejo se zahvaljujem Gregorju Šegi.

Namestitev

Program za generiranje nalog najlaže namestite na sledeč način:

V meniju File izberite Install…, da odprete okno za namestitev datotek.

Za Type of Item to Install izberite Package.

Za Source izberite From File… ter poiščite datoteko generiranje.m.

Za Install Name vpišite generiranje.

Izberite, ali želite namestitev samo zase ali pa za vse uporabnike, in potrdite izbiro.

Ko datoteko namestite, jo naložite s spodnjim ukazom. Če ukaz ne javi nobene napake, je bila namestitev uspešna.

<<generiranje`

Pripravljanje podatkov za naloge

Prvi korak generiranja nalog je ustvarjanje podatkov naloge. Ti vsebujejo vse ključne podatke, ki jih hočemo izpisati: tako nalogo kot tudi njene rešitve. Ne vsebujejo pa spremnega besedila, saj bo to v vzorčni datoteki.

Vsako nalogo predstavimo s funkcijo, ki sprejme podatke o študentu (seznam, ki vsebuje vpisno številko, priimek in ime) in vrne seznam podatkov o nalogi. Podatkov o študentu ni treba uporabiti, lahko pa z njimi sestavite nalogo, kjer se v odgovoru skriva vpisna številka ali študentove začetnice.

Načeloma s samo obliko funkcije niste omejeni, vendar je večinoma najprimernejša oblika ukaz Module, v katerem naštejemo lokalne spremenljivke, ki jim postopoma nastavljamo vrednosti (običajno z ukazi za naključne izbire), zadnji ukaz pa je seznam vrednosti, ki bi jih vrnili.

Za začetek si definirajmo nalogo, ki bo od študenta zahtevala ničle danega polinoma. Najenostavnejši pristop je, da si najprej izmislimo ničle, nato pa iz njih rekonstruiramo polinom.
Izvedite spodnjo definicijo (in Mathematici potrdite, da naj poprej izvede še inicializacijske ukaze).

Polinom[student_]:=Module[{nicle,polinom},
nicle=RandomInteger[{-9,9},3];
polinom=Expand[Product[x-nicla,{nicla,nicle}]];
{nicle,polinom}]

S funkcijo PrimeriNaloge lahko na hitro pogledamo nekaj (ne popolnoma) naključnih primerov naloge.

PrimeriNaloge[Polinom, 10]

Včasih bi radi, da vaša naloga zadošča določenim pogojem. Za primer sestavimo nalogo, ki bo od študenta zahtevala ničle in pole dane racionalne funkcije. Za to potrebujemo dva polinoma brez skupnih ničel. Načeloma lahko podatke pripravljamo na način, pri katerem je pogojem vedno zadoščeno. V tem primeru bi ničle drugega polinoma izbirali le iz komplementa ničel prvega polinoma. Vendar ta postopek hitro odpove, ko pridemo do zapletenejših pogojev (celoštevilski inverz matrike, racionalne lastne vrednosti, “lepe” rešitve linearnega programa, …)

V ta namen lahko uporabite funkcijo Preveri, ki sprejme pogoj. Če je ta pogoj izpolnjen, se izvajanje nadaljuje, sicer pa se podatki začnejo pripravljati znova. V našem primeru lahko neodvisno izberemo ničle obeh polinomov ter šele nato preverimo, da jima nobena ničla ni skupna.

Racionalna[student_]:=Module[{nicle,poli,stevec,imenovalec},
nicle=RandomInteger[{-9,9},3];
poli=RandomInteger[{-9,9},3];
(* preverimo, da imajo ničle in poli prazen presek *)
Preveri[Intersection[nicle,poli]=={}];
stevec=Expand[Product[x-nicla,{nicla,nicle}]];
imenovalec=Expand[Product[x-pol,{pol,poli}]];
{nicle,poli,stevec/imenovalec}]

PrimeriNaloge[Racionalna,10]

Pozor: pazite, da vaša naloga lahko zadošča pogojem, ki bi jih radi. V nasprotnem primeru se bo program zapletel v neskončno zanko in kar naprej poskušal najti primerne podatke.

Še to, če funkciji PrimeriNaloge ne podamo števila, dobimo 7 primerov.

Izpisovanje nalog

Ko pripravite vse podatke, uporabite funkcijo SestaviNaloge. Ta sprejme vzorčno datoteko (ponavadi LATEX-ovsko) in opise nalog. Nato ustvari podatke ter jih izpiše v datoteke. Ker boste ponavadi hoteli ustvariti več datotek (list z nalogo za vsakega študenta, en list z vsemi rešitvami, skripta za klic LATEXa na vsaki datoteki, …), je vzorčna datoteka razdeljena na več delov. Preden nadaljujete, si oglejte vzorčno datoteko vzorec.tex.

Vsako nalogo opišete z imenom zgoraj definirane funkcije ter s seznamom spremenljivk, pod katerimi so v vzorčni datoteki dostopni njeni podatki. Ni potrebno, da spremenljivke ustrezajo tistim, ki ste jih uporabili v funkcijah, pazite pa, da se med posameznimi nalogami ne ponavljajo. Na primer, obe nalogi s polinomi in racionalnimi funkcijami vsebujeta podatke o ničlah. V obeh primerih lahko v funkciji, ki pripravlja podatke, uporabimo spremenljivko nicle, ko pa naloge izpisujemo, moramo ničle ločiti in tako se na prve sklicujemo s spremenljivko niclePolinoma, na druge pa z nicleRacionalne.

Ko pokličete funkcijo SestaviNaloge, se pripravijo podatki nalog za vse študente, vi pa dobite njihov predogled. Če s podatki niste zadovoljni, sestavljanje prekinete ter popravite funkcije, ki opisujejo naloge. Če ste s podatki zadovoljni, izpišete datoteke. Če ste z datotekami zadovoljni, ste končali, če pa niste, pa popravite vzorčno datoteko ter ponovno izpišete datoteke. Datoteke se vsakič izpišejo na novo, vendar s starimi podatki. Tako lahko delate hitre popravke v vzorčni datoteki, saj se izognete pogosto zamudnemu pripravljanju podatkov nalog.

SestaviNaloge[
"vzorec.tex",
{Polinom, {niclePolinoma, polinom}},
{Racionalna, {nicleRacionalne, poli, racionalna}}
]

Funkcija SestaviNaloge pozna sledeče nastavitve:

CiljniDirektorij, ki pove pot, kamor naj se shranijo sestavljene naloge (v osnovi se shranijo v direktorij programa).

SeznamStudentov, ki pove ime CSV datoteke (v osnovi je to studentje.csv), v kateri so shranjeni podatki o študentih. Prvi trije stolpci naj bodo: vpisna številka, priimek in ime. Preostali stolpci lahko hranijo poljubne podatke, do katerih lahko dostopate z izrazom student[[i]], kjer je ištevilka stolpca.

KodnaTabela, ki določa kodno tabelo (v osnovi je to UTF8), ki jo uporabljate za seznam študentov ter vzorčne datoteke. Bolje je uporabljati nastavitev UTF8, zna pa se zgoditi, da morate uporabiti nastavitev WindowsEastEurope (če vaš LATEX urejevalnik ne pozna Unicodea) ali ISO8859-2.

Nastavitve podate tako, da jih skupaj z njihovimi vrednostmi podate na koncu klica funkcije. Primer:

SestaviNaloge[
"vzorec.tex",
{Polinom, {niclePolinoma, polinom}},
{Racionalna, {nicleRacionalne, poli, racionalna}},
CiljniDirektorij->"Namizje"
]

Vrstni red nastavitev je poljuben. Če kakšno nastavitev izpustite, se uporabi privzeta vrednost.

Celoten primer

Ko enkrat znate uporabljati program, lahko zgornjo razlago pobrišete in uporabljate le spodnji vzorec.

<<generiranje`

Polinom[student_]:=Module[{nicle,polinom},
nicle=RandomInteger[{-9,9},3];
polinom=Expand[Product[x-nicla,{nicla,nicle}]];
{nicle,polinom}]

Racionalna[student_]:=Module[{nicle,poli,stevec,imenovalec},
nicle=RandomInteger[{-9,9},3];
poli=RandomInteger[{-9,9},3];
(* preverimo, da imajo ničle in poli prazen presek *)
Preveri[Intersection[nicle,poli]=={}];
stevec=Expand[Product[x-nicla,{nicla,nicle}]];
imenovalec=Expand[Product[x-pol,{pol,poli}]];
{nicle,poli,stevec/imenovalec}]

PrimeriNaloge[Racionalna]

SestaviNaloge[
"vzorec.tex",
{Polinom, {niclePolinoma, polinom}},
{Racionalna, {nicleRacionalne, poli, racionalna}}
]