summaryrefslogtreecommitdiff
path: root/support/acroweb/acroweb/acroweb_eng.pm
blob: 23724d11c3d3a0238dd2a02259780b9decc317ba (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
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;