package acroweb; use Exporter; @ISA = qw(Exporter); @EXPORT = qw(&generujnahodne &filtruj &permutemyfield); #### Procedura cte radky souboru jehoz nazev je v prvnim parametru #### a zpracovava je pro dalsi pouziti. V druhem parametruje pocet spatnych #### moznosti. #### Vystupem jsou otazky, ve kterych jsou nahodne prehazeny moznosti a #### uvodni + a - jsou nahrazena prikazy \Ans0 a \Ans1 sub filtruj{ my ($jmenosouboru,$variantspatne,$flag)=@_; open(HLAVA,$jmenosouboru); my @predfiltrem=; push(@predfiltrem,"konec"); my @pofiltru=(); my @spatne=(); # tady jsou pro kazde zadani radky zacinajici minusem my @nabidkaodpovedi=(); # spatne odpovedi vybrane do testu my @nabidkaperm=(); # nasledujici promenne jsou pouzite pri zpracovavani zadani do # formy citelne acrotexem my $spravne=""; my $bylominus=0; my $pocetspatne=0; # pocet spatnych variant pro kazdou otazku my $radekvystup=""; foreach $radek (@predfiltrem) { chomp($radek); # radek nezacina plusem ani minusem if (not(substr($radek,0,1) eq "-") and not(substr($radek,0,1) eq "+")) { if ($bylominus==1) { @nabidkaodpovedi=(); if ($flag==2) { chomp($spravne); chomp($spatne[0]); $spravne=~ s/^\+//; $spatne[0]=~ s/^-//; $radekvystup=$radekvystup."\\interval{$spatne[0]}"; $radekvystup=$radekvystup."\\reseni{$spravne}"; # do pole @pofiltru ukladame zpracovana zadani push (@pofiltru,$radekvystup."\n\n"); } else { # nahodne vybereme spatne odpovedi for ($cislo=($pocetspatne-1);$cislo>=($pocetspatne-$variantspatne);$cislo--) { $randcislo = int(rand($cislo+1)); push(@nabidkaodpovedi,$spatne[$randcislo]); splice(@spatne,$randcislo,1); } # pridame spravnou odpoved push(@nabidkaodpovedi,$spravne); # promichame @nabidkaodpovedi a ulozime do @nabidkaperm for ($cislo=$variantspatne;$cislo>=0;$cislo--) { $randcislo = int(rand($cislo+1)); push(@nabidkaperm,$nabidkaodpovedi[$randcislo]); splice(@nabidkaodpovedi,$randcislo,1); } if ($flag==1) { # zmenime zneni posledni odpovedi, spravnost nechame $plusminus=substr($nabidkaperm[$variantspatne],0,1); $nabidkaperm[$variantspatne]=$plusminus."jiná odpověď"; } $cislo=0; # zmenime tak, aby to proslo v AcroTeXu for ($cislo=0; $cislo<=($variantspatne); $cislo++) { $odpoved=$nabidkaperm[$cislo]; $odpoved=~ s/^\+/\\Ans1 /; $odpoved=~ s/^-/\\Ans0 /; if (not($cislo==$variantspatne)) { # oddelovac variant odpovedi chomp $odpoved; $radekvystup=$radekvystup.$odpoved."\\\\[5pt]\n"; } else { # konec nabizenych odpovedi $radekvystup=$radekvystup.$odpoved; } } # do pole @pofiltru ukladame zpracovana zadani push (@pofiltru,"$radekvystup\\end{answers}\n\n\n"); } # nova inicializace promennych pro cteni dalsiho zadani $radekvystup=""; $pocetspatne=0; $spravne=""; @spatne=(); @nabidkaperm=(); $bylominus=0; } if ($radek eq "") { $radekvystup=$radekvystup.$radek; } else { $radekvystup=$radekvystup."\\zadani{".$radek."}\n"; if ($flag != 2) { $radekvystup=$radekvystup."\\begin{answers}{1}\n"; } } } else { if (substr($radek,0,1) eq "-") { $bylominus=1; $pocetspatne=$pocetspatne+1; push(@spatne,$radek."\n"); } else { $spravne=$radek."\n"; } } } return(@pofiltru) } sub generujnahodne # parametry: # ---------- # soubor, # pocet otazek do vyberu # pocet spatnych odpovedi do vyberu # flag: 0 = nechat otazky # 1 = zmenit posledni variantu na "jina odpoved" # 2 = poslat dal { my ($jmeno,$pocetzadani,$variantspatne,$flag)=@_; my @hotovezadani; my @ktisku; # Nacteme otazky a prislusny pocet odpovedi, odpovedi uz budou prehazene @ktisku=filtruj($jmeno,$variantspatne,$flag); # Vybereme nahodne otazky, nejprve zjistime jejich pocet my $celkemzadani=@ktisku; # vybirame nahodne polozky a ukladame do pole @hotovezadani for ($cislo=$celkemzadani;$cislo>($celkemzadani-$pocetzadani);$cislo--) { $randcislo = int(rand($cislo)); push(@hotovezadani, $ktisku[$randcislo]); splice(@ktisku,$randcislo,1); } # vratime pole @hotovezadani return @hotovezadani; } sub permutemyfield { # reads a field and permutes this field randomly my @initfield=@_; my $NumberOfProblems=@initfield; my @permutedfield=(); for ($cislo=$NumberOfProblems;$cislo>0;$cislo--) { $randcislo = int(rand($cislo)); push(@permutedfield, $initfield[$randcislo]); splice(@initfield,$randcislo,1); } return @permutedfield; } 1;