|
|
DataMuseum.dkPresents historical artifacts from the history of: RegneCentralen RC759 "Piccoline" |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RegneCentralen RC759 "Piccoline" Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 22400 (0x5780)
Types: TextFile
Names: »SPSKEMA.PAS«
└─⟦a1337913c⟧ Bits:30002679 PGM1 - indeholder forskellige undervisningsprogrammer
└─⟦this⟧ »SPSKEMA.PAS«
program sp_skema;
const maxsp=30;
maxvalg=20;
maxskema=500;
maxmaske=10;
op=@5;venstre=@19;hoejre=@4;ned=@24;return=@13;esc=@27;
back=@8@8@8@8@8@8@8@8@8@8; (* 10 skridt tilbage *)
feltpos : array(.1..maxsp,1..2.) of 1..70 =
( (10,2),(10,4),(10,6),(10,8),(10,10),
(10,12),(10,14),(10,16),(10,18),(10,20),
(30,2),(30,4),(30,6),(30,8),(30,10),
(30,12),(30,14),(30,16),(30,18),(30,20),
(50,2),(50,4),(50,6),(50,8),(50,10),
(50,12),(50,14),(50,16),(50,18),(50,20));
type svartype = array(.1..maxsp.) of 0..maxvalg;
skematype = record
nr: integer;
svar: svartype;
end;
masketype = record
sp : 1..maxsp;
maske : set of 0..maxvalg;
end;
var skema :skematype;
mulighed :svartype;
fil :text;
disk :file of skematype;
filnavn :string(.12.);
navn :string(.8.);
startet,maskeflag :boolean;
sv :char;
i,antalsp,antal_ind :integer;
skemastak :array(.1..maxskema.) of skematype;
s :array(.1..maxsp,0..maxvalg.) of integer;
sum :array(.1..maxsp.) of integer;
k :array(.0..maxvalg,0..maxvalg.) of integer;
si :array(.1..maxmaske.) of masketype;
antal_masker :0..maxmaske;
procedure forklaring;
begin
write(clrhom);
writeln(' Dette program kan benyttes til behandling af spørgeskemaer.');
writeln('Spørgeskemaet kan indeholde op til 30 forskellige spørgsmål.');
writeln('Hvert spørgsmål kan indeholde op til 20 svarmuligheder. Disse ');
writeln('skal kunne tillægges en talværdi mellem 1 og 20. Et spørgsmål,');
writeln('der ikke er besvaret indkodes med svaret 0.');
writeln('Ved indkodningen af svarene skal hvert skema have et nummer.');
writeln('Dette nummer bliver ikke benyttet af programmet i den nuværende');
writeln('udgave, men det kan dog benyttes til kontrol af de indtastede ');
writeln('skemaer-evt kan det sættes til 0.');
writeln;
writeln('Ved programstart vises en menu, hvoraf de forskellige muligheder');
writeln('fremgår. De indtastede data gemmes efter indtastningen på en ');
writeln('fil, hvorfra de kan hentes. Dette skal ALTID gøres inden den ');
writeln('endelige optælling og behandling foretages.');
writeln('Ved optællingen kan der defineres nogle specielle krav, der ');
writeln('skal være opfyldt for at skemaet indgår i optællingen.');
writeln('Disse krav kaldes masker og denne maskefunktion kan tændes ');
writeln('eller slukkes efter behov.');
writeln;
writeln('De spørgsmål programmet stiller og som kun kræver et bogstav');
writeln('som svar kræver ikke brug af <RETURN>-knappen.');
write(' ',rvson,'tast <RETURN> ',rvsoff);
readln;
end;
function input_tal : integer;
var x,p : integer;
ch : char;
tal_string : string(.8.);
begin
repeat
tal_string:='';
read(kbd,ch);
while ch<>return do begin
tal_string:=tal_string+ch;
write(ch);
read(kbd,ch);
end;
val(tal_string,x,p);
if p<>0 then write(chr(7),'??') ;
until p=0;
input_tal:=x;
end;
function pct(x,y :real):real;
begin
if y=0 then pct:=0 else pct:=x/y*100;
end;
function maske_kontrol(skema:skematype):boolean;
var i,spm : integer;
ok : boolean;
begin
if maskeflag and (antal_masker>0) then begin
i:=0;
repeat
i:=i+1;
spm:=si(.i.).sp;
ok:=skema.svar(.spm.) in si(.i.).maske;
until ( not ok ) or (i>=antal_masker);
maske_kontrol:=ok;
end
else
maske_kontrol:=true;
end;
procedure gotofelt(nr:integer);
var x,y :integer;
begin
x:=feltpos(.nr,1.);
y:=feltpos(.nr,2.);
gotoxy(x,y);
end;
procedure laes_disk; (* fastlægger antal_ind og skema_stak *)
begin
reset(disk);read(disk,skema);
antal_ind:=0;
while (not eof(disk)) and (antal_ind<maxskema) do begin
antal_ind:=antal_ind+1;
read(disk,skemastak(.antal_ind.));
end;
close(disk);
if antal_ind>=maxskema then begin
writeln('Der er maksimalt antal skemaer.');
write(' Tast <RETURN> ');
readln;
end;
end;
procedure tekstbilled(skema:skematype);
(**************************************************************************)
(* Der udskrives et tekstbilled, der indeholder oplysninger om indholdet *)
(* af skema. *)
(**************************************************************************)
var i,tal :integer;
begin
write(clrhom);
for i:=1 to antalsp do begin
gotofelt(i);
tal:=skema.svar(.i.);
write(back,'Sp. ',i:2,' ',rvson,tal:2,rvsoff);
end;
gotoxy(5,22);
write('Skriv det rigtige svar - Flyt med pilene - Afslut med <ESC>');
gotoxy(0,0);
write('Skema nr:',skema.nr:4);
end;
procedure laesfelt(var tast:char;var oktal:boolean;var tal :integer;
nr:integer);
(************************************************************************)
(* tast retunere den sidste tast, der er rørt. *)
(* oktal er sand, hvis tal er et tal, der kan bruges. *)
(* nr angiver i hvilket felt, der læses. *)
(************************************************************************)
var talstring : string(.2.);
x,p : integer;
slut,ok : boolean;
begin
repeat
talstring:='';gotofelt(nr);slut:=false;
repeat
read(kbd,tast);
case tast of
'0'..'9': begin
if len(talstring)=0 then write(' ',@8@8);
talstring:=talstring+tast;
write(tast);end;
op,ned,venstre,
hoejre,return : begin
slut:=true;
if len(talstring)>0 then begin
val(talstring,x,p);
ok:=p=0;
if ok then ok:=(x>=0) and (x<=mulighed(.nr.));
oktal:=ok;
gotofelt(nr);
write(rvson,x:2,rvsoff);
gotoxy(50,0);
if not oktal then begin
write(chr(7),rvson,'Tal uden for området!!',rvsoff);
end else write(clreol);
end else
oktal:=false;
end;
esc : begin
oktal:=false;
slut:=true;
end;
otherwise write(chr(7));
end;
until slut;
until (tast=esc) or oktal or (len(talstring)=0) ;
if oktal then tal:=x;
end;
procedure ret_skema(var skema :skematype);
var ok : boolean;
tal,felt : integer;
ch :char;
begin
tekstbilled(skema);
felt:=1;
repeat
laesfelt(ch,ok,tal,felt);
if ok then skema.svar(.felt.):=tal;
case ch of
op : begin felt:=felt-1;if felt=0 then felt:=antalsp; end;
venstre: if (felt>10) and (antalsp>10) then felt:=felt-10;
hoejre : if (antalsp>10) and (felt<=antalsp-10) then felt:=felt+10;
ned,return : begin felt:=felt+1;
if felt>antalsp then felt:=1;
end;
end;
gotofelt(felt);
until ch=esc;
end;
procedure gl_unders;
(**********************************************************************)
(* ved udgang kendes antalsp og mulighed samt filnavn eller også er *)
(* startet = FALSE *)
(**********************************************************************)
var fejl :integer;
begin
writeln(clrhom);startet:=false;
antal_ind:=0;
repeat
repeat
write('Hvad hedder undersøgelsen? (max 8 tegn, STOP standser.) ');
readln(navn);
until len(navn)>0;
fejl:=1;
if not ( (navn='STOP') or (navn='stop')) then begin
filnavn:=navn+'.sps';
(*$I-*) assign(disk,filnavn);reset(disk);(*$I+*)
fejl:=iores;
if fejl<>0 then writeln(rvson,'filen findes ikke!!',rvsoff);
end;
until (fejl=0) or (navn='STOP') or (navn='stop');
if fejl=0 then begin
read(disk,skema);
with skema do begin
antalsp:=nr;
mulighed:=svar;
end;
close(disk);
startet:=true;
end;
if (navn='STOP') or (navn='stop') then navn:='';
end; (* of gl_unders *)
procedure ny_unders;
(**********************************************************************)
(* ved udgang kendes antalsp og mulighed samt filnavn eller også er *)
(* startet = FALSE *)
(**********************************************************************)
var fejl,i : integer;
begin
writeln(clrhom); fejl:=0;startet:=false;antal_ind:=0;
repeat
repeat
write('Hvad skal undersøgelsen hedde? (max 8 tegn , STOP standser.) ');
readln(navn);
until len(navn)>0;
if not ((navn='STOP') or (navn='stop')) then begin
filnavn:=navn+'.sps';
(*$I-*) assign(disk,filnavn);reset(disk);(*$I+*)
fejl:=iores;
if fejl=0 then begin
writeln(rvson,'filen findes allerede!!',rvsoff);
close(disk);
end;
end;
until (fejl<>0) or ((navn='STOP') or (navn='stop'));
if not ((navn='STOP') or (navn='stop')) then begin
writeln;writeln;writeln;
repeat
write('Hvor mange spørgsmål er der ? (max ',maxsp,') ');
readln(antalsp);
until (0<antalsp) and (antalsp<=maxsp);
for i:=1 to antalsp do begin
repeat
write('Antal svarmuligheder i spørgsmål ',i,' : ');
readln(mulighed(.i.));
until (mulighed(.i.)>0) and (mulighed(.i.)<=maxvalg);
end;
with skema do begin
nr:=antalsp;
svar:=mulighed;
end;
rewrite(disk);
write(disk,skema);
close(disk);
startet:=true;
end
else
navn:='';
end;
procedure indtastning;
var snr,i : integer;
sv : char;
nulskema : skematype;
begin
nulskema.nr:=0;
for i:=1 to antalsp do nulskema.svar(.i.):=0;
write(clrhom);
antal_ind:=0;
repeat
skema:=nulskema;
gotoxy(0,0);write('Skema nr ? : ');snr:=input_tal;
skema.nr:=snr;
ret_skema(skema);
gotoxy(0,22);write(clreol,'Skal skema ',snr,' gemmes? (j/n) ');
repeat read(kbd,sv); until sv in (.'J','j','N','n'.);
if sv in (.'J','j'.) then begin
antal_ind:=antal_ind+1;
if antal_ind <= maxskema then
skemastak(.antal_ind.):=skema
else
writeln('Der kan ikke gemmes flere skemaer!!');
end else begin
write('Skema IKKE gemt - Flere skemaer? (j/n) ');
repeat read(kbd,sv); until sv in (.'J','j','N','n'.);
end;
until (sv in (.'N','n'.));
gotoxy(0,22);write(clreol,'......Et øjeblik og du kan gå videre.....');
reset(disk);seek(disk,length(disk));
for i:=1 to antal_ind do write(disk,skemastak(.i.));
close(disk);
end;
procedure for_udskriv(i :integer);
var j : integer;
begin
writeln(fil,'Optælling af ':20,antal_ind,' skemaer giver :');
writeln(fil);
write(fil,'Fordeling i spørgsmål ',i:4);
if maskeflag then
writeln(fil,' Der er benyttet masker!')
else
writeln(fil);
writeln(fil);
writeln(fil,'Svar antal ':15,' % ':12);
writeln(fil,'▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀');
for j:=1 to mulighed(.i.) do
writeln(fil,j:4,s(.i,j.):8,pct(s(.i,j.),sum(.i.)):15:1);
writeln(fil,'▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀▶88◀');
writeln(fil,' Besvaret ialt ',sum(.i.):12);
writeln(fil,' Ubesvarede ',s(.i,0.):12);
writeln(fil);
end;
procedure optaelling;
var ssum,i,j : integer;
ch,alle : char;
begin
writeln(clrhom,' ':25,'Svarfordeling laves!');
fill(s,size(s),0);
(* optæl *)
for i:=1 to antal_ind do begin
skema:=skemastak(.i.);
if maske_kontrol(skema) then
for j:=1 to antalsp do s(.j,skema.svar(.j.).):=s(.j,skema.svar(.j.).)+1;
end;
(* find søjlesummer *)
for i:=1 to antalsp do begin
ssum:=0;
for j:=1 to mulighed(.i.) do ssum:=ssum+s(.i,j.);
sum(.i.):=ssum;
end;
(*klar til udskrift *)
write('Ønskes udskrift på skærm eller printer ? (s/p) ');
repeat read(kbd,ch) until ch in (.'P','p','S','s'.);writeln(ch);
if ch in (.'P','p'.) then
assign(fil,'LST:')
else
assign(fil,'CON:');
rewrite(fil);
(* Hvilke tabeller skal udskrives?? *)
write('Udskrift af enkelte eller af alle tabeller ? (e/a) ');
repeat read(kbd,alle) until alle in (.'E','e','A','a'.);writeln(alle);
if alle in (.'A','a'.) then begin
for i:=1 to antalsp do begin
for_udskriv(i);
if ch in (.'S','s'.) then begin
gotoxy(0,24);write('tast <RETURN>');readln;write(clrhom);end
else
writeln(fil,chr(10),chr(10),chr(10));
end;
end else begin
repeat
write(clrhom,'Angiv tabelnummer. -1 standser. ');
i:=input_tal;
writeln;
if (i>0) and (i<=antalsp) then begin
for_udskriv(i);
if ch in (.'S','s'.) then begin
gotoxy(0,24);write('tast <RETURN>');readln;write(clrhom);
end;
end;
until i<=0 ;
end;
close(fil);
end;
procedure krydstabel;
var ch :char;
vandret,lodret, i,j : integer;
ssum : array(.1..maxvalg.) of integer;
streg : string(.79.);
relativ : boolean;
begin
streg:='';
for i:=1 to 79 do streg:=streg+'▶88◀';
repeat
writeln(clrhom,' Der kan nu laves krydstabeller. ');
write('Angiv første spørgsmål (vandret i tabellen).((højst 15)) ');
repeat
vandret:=input_tal;
until (vandret>0) and (vandret<=antalsp);
writeln;
write('Angiv nu andet spørgsmål. ');
repeat lodret:=input_tal until (lodret>0) and (lodret<=antalsp);
writeln;
write('Skal det være absolutte tal eller i % af søjleantal (a/p). ');
repeat read(kbd,ch) until ch in (.'A','a','P','p'.);writeln(ch);
relativ:= ch in (.'P','p'.);
(* klar til optælling *)
fill(k,size(k),0);
for i:=1 to antal_ind do
if maske_kontrol(skemastak(.i.)) then
k(.skemastak(.i.).svar(.lodret.),skemastak(.i.).svar(.vandret.).):=
k(.skemastak(.i.).svar(.lodret.),skemastak(.i.).svar(.vandret.).)+1;
fill(ssum,size(ssum),0);
for i:=1 to mulighed(.vandret.) do
for j:=1 to mulighed(.lodret.) do ssum(.i.):=ssum(.i.)+k(.j,i.);
(* summen i søjlerne er fundet og udskriften kan begynde *)
write('Ønskes udskrift på skærm eller printer? (s/p) ');
repeat read(kbd,ch) until ch in (.'S','s','P','p'.);writeln(ch);
if ch in (.'P','p'.) then
assign(fil,'LST:')
else
assign(fil,'CON:');
rewrite(fil);
if relativ then writeln(fil,'Krydstabel i % af søjleantal. ':30)
else writeln(fil,'Krydstabel i antal. ':25);
writeln(fil);writeln(fil,' Optalte skemaer :',antal_ind:4);
if maskeflag then
writeln(fil,' Der er benyttet masker!')
else
writeln(fil);
write(fil,lodret:2,'▶89◀',vandret:2,':');
for i:=1 to mulighed(.vandret.) do write(fil,i:4,' ');
if mulighed(.vandret.)<15 then writeln(fil);
writeln(fil,copy(streg,1,5+5*mulighed(.vandret.)));
for j:=1 to mulighed(.lodret.) do begin
write(fil,j:3,' ▶89◀');
for i:=1 to mulighed(.vandret.) do
if relativ then
write(fil,pct(k(.j,i.),ssum(.i.)):5:1)
else
write(fil,k(.j,i.):5);
if mulighed(.vandret.)<15 then writeln(fil);
end;
writeln(fil,copy(streg,1,5+5*mulighed(.vandret.)));
write(fil,'antal');
for i:=1 to mulighed(.vandret.) do write(fil,ssum(.i.):5);
if mulighed(.vandret.)<15 then writeln(fil);
writeln(fil);
write('tryk <RETURN>');readln;
write('Flere tabeller ? (j/n) ');
repeat read(kbd,sv) until sv in (.'J','j','N','n'.);
until sv in (.'N','n'.);
close(fil);
end;
procedure masker;
var maske_ind : masketype;
nr,msk : integer;
ch : char;
procedure hent_maske(spm:integer);
var i:integer;
begin
Writeln('Angiv de svar, der skal godkendes. (-1 afslutter) ');
writeln('Efter hver svarmulighed trykkes på <RETURN>.');
write('Svarmulighed --> ');
repeat
begin
i:=input_tal;
if not(i in (.-1,0,1..mulighed(.spm.).)) then write('??');
end
until i in (.-1,0,1..mulighed(.spm.).);
writeln;
maske_ind.maske:=(..);
while i>=0 do begin
maske_ind.maske:=maske_ind.maske+(.i.);
write('Svarmulighed --> ');
repeat
begin
i:=input_tal;
if not(i in (.-1,0,1..mulighed(.spm.).)) then write('??');
end
until i in (.-1,0,1..mulighed(.spm.).);
writeln;
end;
end; (* hent_maske *)
begin
repeat
writeln(clrhom,'Du kan nu vælge mellem følgende muligheder :');
writeln;
writeln(' N : Nye masker fremstilles.');
writeln(' V : Vis maskerne.');
writeln(' T : Tænd for maskefunktionen.');
writeln(' S : Sluk for maskefunktionen.');
writeln(' A : Afbryd denne programdel.');
writeln;
write(' Angiv det ønskede : ');
repeat read(kbd,ch) until ch in(.'N','n','T','t','S','s','A','a','V','v'.);
writeln(ch);
case ch of
'N','n' : begin
antal_masker:=0;
write('Angiv nummer på spørgsmålet (-1 standser) :');
repeat nr:=input_tal until nr in (.-1,1..antalsp.);
writeln;
while (nr>=1) and (antal_masker<maxmaske) do begin
maske_ind.sp:=nr;
hent_maske(nr);
if maske_ind.maske<>(..) then begin
antal_masker:=antal_masker+1;
si(.antal_masker.):=maske_ind;
end;
write(clrhom,'Angiv nummer på spørgsmålet (-1 standser) :');
repeat nr:=input_tal until nr in (.-1,1..antalsp.);
writeln;
end;
end;
'V','v' : begin
if antal_masker =0 then begin
writeln('Der er ikke defineret nogle masker.Tryk <RETURN>.');
readln;end
else begin
for msk:=1 to antal_masker do begin
write('Spørgsmål : ',si(.msk.).sp:3,' : ');
for nr:=0 to maxvalg do
if nr in si(.msk.).maske then write(nr:3,', ');
writeln;
end;
writeln;
writeln(' ',rvson,'Tryk <RETURN>.',rvsoff);
readln;
writeln;
end;
end;
'T','t' :begin
if antal_masker =0 then begin
writeln('Der er ikke defineret nogle masker. Tryk <RETURN>');
readln;
end;
maskeflag:= antal_masker>0;
end;
'S','s' : maskeflag:=false;
'A','a' : (* afslut *)
end;
until ch in (.'A','a'.);
end;
(* ---------------------HOVED PROGRAM ----------------*)
BEGIN
startet:=false;navn:='';maskeflag:=false;antal_masker:=0;antal_ind:=0;
repeat
write(clrhom);
write(rvson,navn:8,rvsoff,' ':17);
writeln(rvson,'SPØRGESKEMA - undersøgelse.',rvsoff);
writeln;
writeln(' Du har nu følgende muligheder at vælge mellem :');
writeln;
writeln(' 1 : Hente oplysninger om en gammel undersøgelse.');
writeln(' 2 : Foretage indlæsning af skemaer.');
writeln(' 3 : Indlæse alle skemaer fra disketten.');
writeln;
writeln(' 4 : Optælling af svarfordeling.');
writeln(' 5 : Lave krydstabeller.');
writeln(' 6 : Definere masker, der bestemmer optællingen.');
writeln;
writeln(' 7 : Starte en ny undersøgelse.');
writeln(' 8 : Standse.');
writeln(' 9 : Forklaring.');
writeln;
if maskeflag then begin
gotoxy(0,10);
write(rvson,'TÆNDT',rvsoff);
end;
gotoxy(0,17);
write(' ',rvson,'Tast det ønskede nummer.',rvsoff,' ');read(kbd,sv);
write(sv,' ');
case sv of
'7' : ny_unders;
'1' : gl_unders;
'2' : if startet then indtastning
else begin gotoxy(56,0);
write(rvson,chr(7),' brug først 1 eller 7',rvsoff);
gotoxy(56,1);Write('Tast <RETURN>');readln;
end;
'4' : if startet then optaelling
else begin gotoxy(56,0);
write(rvson,chr(7),' brug først 1 eller 7',rvsoff);
gotoxy(56,1);Write('Tast <RETURN>');readln;
end;
'5' : if startet then krydstabel
else begin gotoxy(56,0);
write(rvson,chr(7),' brug først 1 eller 7',rvsoff);
gotoxy(56,1);Write('Tast <RETURN>');readln;
end;
'6' : if startet then masker
else begin gotoxy(56,0);
write(rvson,chr(7),' brug først 1 eller 7',rvsoff);
gotoxy(56,1);Write('Tast <RETURN>');readln;
end;
'3' : if startet then begin writeln('Et øjeblik.');laes_disk;end
else begin gotoxy(56,0);
write(rvson,chr(7),' brug først 1 eller 7',rvsoff);
gotoxy(56,1);Write('Tast <RETURN>');readln;
end;
'8' :writeln(clrhom,'SLUT FOR DENNE GANG.');
'9' :forklaring;
otherwise write(chr(7))
END;
until sv='8';
end.
«eof»