diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/acroweb/acroweb/acroweb_eng.pm |
Initial commit
Diffstat (limited to 'support/acroweb/acroweb/acroweb_eng.pm')
-rw-r--r-- | support/acroweb/acroweb/acroweb_eng.pm | 193 |
1 files changed, 193 insertions, 0 deletions
diff --git a/support/acroweb/acroweb/acroweb_eng.pm b/support/acroweb/acroweb/acroweb_eng.pm new file mode 100644 index 0000000000..23724d11c3 --- /dev/null +++ b/support/acroweb/acroweb/acroweb_eng.pm @@ -0,0 +1,193 @@ +package acroweb_eng; + +use Exporter; +@ISA = qw(Exporter); +@EXPORT = qw(&genrandom &filtruj &permutemyfield); + +#### We read the rows of the file with all questions. Then name of the file +#### is the first papameter. The number of incorrect answers for each question +#### is in the second parameter. +#### The last parameter is flag (see the genrandom function below). +sub filtruj{ + my ($jmenosouboru,$variantspatne,$flag)=@_; + open(HLAVA,$jmenosouboru); + my @predfiltrem=<HLAVA>; + 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."\\correctanswer{$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."another answer"; + } + $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."\\problem{".$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 genrandom +# Parameters: +# ---------- +# 1. filename, +# 2. the number of questions in the test +# 3. the number of incorrect answers for each question +# 4. flag: 0 = keep answers +# 1 = replace the last answer with words "another question" +# 2 = the questions are fill-in questions +{ + my ($jmeno,$pocetzadani,$variantspatne,$flag)=@_; + my @hotovezadani; + my @ktisku; + +# We read all questions from the file, the answers are already randomized + @ktisku=filtruj($jmeno,$variantspatne,$flag); + +# We find the number of questions in the file (database) + my $celkemzadani=@ktisku; + +# We select random questions and put to the field @hotovezadani + for ($cislo=$celkemzadani;$cislo>($celkemzadani-$pocetzadani);$cislo--) + { + $randcislo = int(rand($cislo)); + push(@hotovezadani, $ktisku[$randcislo]); + splice(@ktisku,$randcislo,1); + } + +# We return the result stored in @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; + |