home *** CD-ROM | disk | FTP | other *** search
-
-
- program xdata;{$P+}
- {$c-,m-,f-}
- label 1;
- const
- defaultpad = ' ';
- male = true;
- female = false;
-
- type
- id = array[1..6] of char;
- calendar = array [1..2] of char;
- date_of_test = record
- month:calendar;
- day:calendar;
- year:calendar
- end;
- lab_data = record
- name: array [1..30] of char;
- chart_number:id;
- date: date_of_test;
- sex:boolean;
- weight: real;
- height: real;
- surface_area: real;
- chronological_age: real;
- bone_age: real;
- height_age:real;
- percent_overweight_for_height:real;
- total_body_water: real;
- values:array[1..18,1..14] of real;
- pad:array[1..59] of char;
- end;
-
- byte = 0..255;
- $string0 = string 0;
- $string255 = string 255;
- $string80 = string 80;
- $string14 = string 14;
- $string4 = string 4;
- f = file of lab_data;
- axis_label = array[1..4] of char;
-
- var
- filename:$string14;
- norms,data:lab_data;
- num_values, peak_time,time,results,x,y,i:byte;
- fin:f;
- average,max,min,sum:real;
- normal_value_flag, error, terminate, continue,escape:boolean;
- rec:integer;
- strvalue:$string80;
- x_axis_label,y_axis_label: array[1..14] of axis_label;
-
-
- {************************* init labels for axis *************************}
- procedure initialize;
- var
- i:byte;
- begin
- x_axis_label[1]:= '-30 ';
- x_axis_label[2]:= '-1 ';
- x_axis_label[3]:= '15 ';
- x_axis_label[4]:= '30 ';
- x_axis_label[5]:= '45 ';
- x_axis_label[6]:= '60 ';
- x_axis_label[7]:= '90 ';
- x_axis_label[8]:= '120 ';
- x_axis_label[9]:= '150 ';
- x_axis_label[10]:= '180 ';
- x_axis_label[11]:= '210 ';
- x_axis_label[12]:= '240 ';
- x_axis_label[13]:= '300 ';
- x_axis_label[14]:= '360 ';
-
- y_axis_label[1]:= 'BS ';
- y_axis_label[2]:= 'IRI ';
- y_axis_label[3]:= 'GH ';
- y_axis_label[4]:= 'LH ';
- y_axis_label[5]:= 'FSH ';
- y_axis_label[6]:= 'F ';
- y_axis_label[7]:= 'PRL ';
- y_axis_label[8]:= 'TSH ';
- y_axis_label[9]:= 'T ';
- y_axis_label[10]:= 'DS ';
- y_axis_label[11]:= 'ACTH';
- y_axis_label[12]:= 'T4 ';
- y_axis_label[13]:= 'TBG ';
- y_axis_label[14]:= 'TT3 ';
-
- end;
-
-
- procedure setlength (var x:$string0; y:integer);external;
- function length (x:$string255):integer; external;
- procedure keyin(var cix:char);external;
-
-
- procedure clear_screen;
- begin
- write (chr(27),'*',chr(0),chr(0),chr(0),chr(0));
- end;
-
- procedure erase_lines(starting_line,number_of_lines:byte);
- const
- blanks = ' ';
- var
- i:byte;
-
- begin
- for i:= 1 to number_of_lines do
- begin
- write(chr(27),'=',chr(starting_line + 31),chr(32),blanks,blanks);
- starting_line:= starting_line + 1;
- end;
- end;
-
- procedure move_cursor(x,y:byte);
- begin
- write(chr(27),'=',chr(y+31),chr(x+31));
- end;
-
- procedure prompt (x,y,length:byte; p:$string80;
- protected_field_desired:boolean);
-
- var
- underline:string 80;
- i:byte;
- begin
- setlength(underline,0);
- for i:= 1 to length do append (underline,'_');
- if protected_field_desired = false then
- write(chr(27),'=',chr(y+31),chr(x+31),p,underline)
- else
- write(chr(27),'=',chr(y+31),chr(x+31),chr(27),')',p,
- underline,chr(27),'(');
- end;
-
- function query(x,y:byte; message:$string80):boolean; {ask y/n question}
- var
- answer:char;
- begin
- repeat
- move_cursor(x,y);
- write(message);
- keyin(answer);
- until answer in ['y','n','Y','N'];
- query:= ((answer = 'y') or (answer = 'Y'));
- erase_lines(y,1);
- end;
-
- function strtoreal (str:$string80):real;
- label 1;
-
- var
- decval,sign,val:real;
- decimal,error:boolean;
- l,i,len:integer;
-
- begin
- val:=0.0;
- decval:=0.0;
- len:=length(str);
- l:=len;
- error:=false;
- decimal:=false;
- i:=1;
- sign:= 1.0;
-
- if len = 0 then
- begin
- error:= true;
- goto 1;
- end;
-
- while (decimal = false) and (i < len + 1 ) do
- begin
- case str[i] of
- '-': sign:= -1.0;
- '.': decimal:= true;
- '0','1','2','3','4','5','6','7','8','9':
- val:=(val*10) + (ord(str[i]) - 48);
- end;
- i:= i+ 1;
- end;
-
- while (decimal) and (l > i-1) do
- begin
- if str[l] in ['0'..'9'] then
- decval:= (decval*0.1) + ((ord(str[l])-48)*0.1);
- l:=l-1;
- end;
- 1:
- strtoreal:=sign*(decval+val);
- end;
-
- function input_data (x,y,len:byte; alphanumeric:boolean;
- maximum_value,minimum_value:real):$string80;
-
- label 1;
- var
- data:$string80;
- realdata:real;
- i:byte;
-
- procedure correct(x,y:byte);
- var
- i,a,b:byte;
- begin
- erase_lines(1,1);
- write(chr(7));
- move_cursor(1,1);
-
- if (length(data)> len) then write ('TERM TOO LONG');
-
- if (alphanumeric = false) and
- ((realdata > maximum_value) or (realdata < minimum_value)) then
- write ('VALUE OUT OF RANGE');
-
- move_cursor(x,y);
- write(' ');
- a:=x;
- b:=y;
-
- for i:= 1 to length(data) do
- begin
- move_cursor(a,b);
- write (' ');
- a:= a + 1;
- end;
-
- move_cursor(x,y);
- write('_');
- a:=x;
- b:=y;
- for i:= 1 to (len-1) do
- begin
- move_cursor(a,b);
- write('_');
- a:= a+ 1;
- end;
- move_cursor(x,y);
- read(data);
- realdata:=strtoreal(data);
- erase_lines(1,1);
-
- end;
-
-
- begin
- move_cursor(x,y);
- read(data);
- if (length(data) > 0) and (ord(data[1]) <> 27) then
- realdata:=strtoreal(data) else goto 1;
-
- while (length(data) > len) or ((alphanumeric = false) and
- ((realdata > maximum_value) or (realdata < minimum_value)))
- do correct(x,y);
-
- 1: if length(data) = 0 then data:= '-999';
-
- if length(data) < len then for i:= length(data) to len do append(data,' ');
- input_data:=data;
- end;
-
-
- function ucase (x:$string80):$string80;
- label 1;
- var
- i,len,ascii:integer;
- ucasex:$string80;
-
- begin
- setlength(ucasex,0);
- len:=length(x);
- if (len = 0) or (len > 4) then goto 1;
- for i:= 1 to len do
- if (ord(x[i]) > 96) and (ord(x[i]) < 123) then
- append(ucasex,chr(ord(x[i])-32)) else
- append(ucasex,x[i]);
- ucase:=ucasex;
- 1:
- end;
-
-
- procedure calculate(current_number_of_records:integer);
- var
- i,thm,hm,o,t,h,th:byte;
- begin
- o:=0;
- t:=0;
- h:=0;
- thm:=0;
- hm:=0;
- th:=current_number_of_records div 1000;
- thm:= current_number_of_records mod 1000;
- h:= thm div 100;
- hm:= thm mod 100;
- t:= hm div 10;
- o:= hm mod 10;
-
- with data do
- begin
- chart_number[1]:= '0';
- chart_number[2]:= '0';
- chart_number[3]:= chr(th + 48);
- chart_number[4]:= chr(h + 48);
- chart_number[5]:= chr(t + 48);
- chart_number[6]:= chr(o + 48);
-
- end;
- end;
-
-
- procedure create_first_record;
- var
- j,i:byte;
- number:integer;
-
- begin
- rewrite(filename,fin);
- with data do
- begin
- name:=' ';
- chart_number:='000001';
- date.month:='00';
- date.day:='00';
- date.year:='00';
- sex:=true;
- weight:= 0.0;
- height:= 0.0;
- surface_area:=0.0;
- chronological_age:=0.0;
- bone_age:= 0.0;
- height_age:=0.0;
- percent_overweight_for_height:=0.0;
- total_body_water:= 0.0;
- pad:=defaultpad;
- for i:= 1 to 18 do
- for j:= 1 to 14 do values[i,j]:= -999.0;
- write(fin:1,data);
- end;
- end;
-
-
- function number_records(filenam:$string14):integer;
- label 1;
- var
- num:integer;
- i:byte;
-
- begin
- num:= 0;
- reset (filename,fin);
- if eof(fin) then
- begin
- create_first_record;
- num:= 1;
- goto 1;
- end;
- with data do
- begin
- read(fin:1,data);
- for i:= 1 to 6 do num:= num*10 + ord(chart_number[i])-48;
- end;
- 1: number_records:= num;
- end;
-
-
-
- procedure axis(pass:byte);
- var
- i:byte;
-
- begin
- writeln(' ');{DEBUG delay...terminal does not seem to respond fast enough}
- for i:= 6 to 19 do
- begin
- move_cursor(1,i);
- write(x_axis_label[i-5]:4);
- end;
- if pass <> 2 then
- begin
- prompt(1,21,0,'max',false);
- prompt(1,22,0,'min',false);
- prompt(1,23,0,'ave',false);
- prompt(1,24,0,'peak',false);
- end;
-
- move_cursor(3,3);
- write('chart number: ',data.chart_number:6,'Name: ':10,data.name:30);
-
- case pass of
- 1: move_cursor(9,5);
- 3: move_cursor(1,5);
- else: move_cursor(6,5);
- end;
-
- if pass = 3 then write ('TIME PATIENT NORMAL (AVE) DEVIATION') else
- for i:= 1 to 14 do
- write(y_axis_label[i]:5);
- end;
-
-
- procedure get_chart_number;
- label 1;
- var
- xchart_number:id;
- xname:array[1..30] of char;
- numrecs,i:integer;
- number:$string80;
- cno,found:boolean;
- ch:char;
-
- begin
- cno:=false;
- clear_screen;
- move_cursor(1,8);
- write('Enter ''NORMAL'' if you wish to display or alter normal values.');
- prompt(1,10,6,'Enter either the patient''s name or chart number: ',false);
- number:= input_data(50,10,30,true,0.0,0.0);
- writeln;
- writeln('One moment, please.');
- if (ord(number[1]) > 47) and (ord(number[1]) < 58) then
- begin
- cno:= true;
- for i:= 1 to 6 do xchart_number[i]:= number[i];
- end;
- if cno = false then
- begin
- for i:= 1 to 30 do
- xname[i]:=number[i];
- end;
-
- reset(filename,fin);
- numrecs:=number_records(filename);
- i:=0;
- normal_value_flag:= false;
- error:= false;
- with data do
- begin
- if (xname = 'NORMAL ')
- or (xname = 'normal ') then
- begin
- normal_value_flag:= true;
- read(fin:1,data);
- norms.values:=data.values;
- rec:=1;
- goto 1;
- end;
-
- repeat
- i:= i+1;
- read(fin:i,data);
- case cno of
- true:if xchart_number = data.chart_number then found:= true else found:= false;
- false:if xname = data.name then found:=true else found:= false;
- end; {of case}
- until (found) or (i = numrecs);
- if found then rec:= i else error:= true;
-
- 1:end;
- if error then
- begin
- clear_screen;
- move_cursor(1,10);
- if cno then writeln('Chart number not found !') else
- writeln('Name not found !');
- writeln;
- writeln('Enter any character to continue.');
- keyin(ch);
- end;
- clear_screen;
- end;
-
-
-
- procedure display_values(normal_value_flag, displayed_for_correction:boolean);
- var
- x,y,i:byte;
- continue:char;
-
- begin
- clear_screen;
- escape:=false;
- writeln(' '); {DEBUG for terminal delay}
- axis(1);
- if normal_value_flag then
- begin
- move_cursor(3,3);
- write('NORMAL VALUES');
- end;
- x:= 7;
- y:= 6;
- for time:= 1 to 18 do
- begin
- for results:= 1 to 14 do
- begin
- move_cursor(x,y);
- if abs(data.values[time,results]) <> 999.0 then
- write(data.values[time,results]:4:1) else
- write(' '); {4 spaces}
- x:= x + 5;
- end;
- y:= y + 1;
- if y = 20 then y:= 21;
- x:= 7;
- end;
- if displayed_for_correction = false then
- begin
- move_cursor(1,1);
- write('Enter any character to continue or ''ESC'' to return to menu.');
- keyin(continue);
- if ord(continue) = 27 then escape:= true;
- end;
- end;
-
-
-
- procedure print(desire_hardcopy:boolean);
-
- label 1,2;
- var
- i:integer;
- continue:char;
- recursive,all,more:boolean;
-
- procedure hardcopy(normal_value_flag:boolean);
- var
- counter,j:byte;
- output:text;
-
- begin
- rewrite('lst:',output);
-
- if recursive = false then
- begin
- write('Prepare printer, then enter any character to initiate listing. ');
- keyin(continue);
- clear_screen;
- writeln('Now printing results.');
- end;
-
- write(output,chr(12));
- for counter:= 1 to 3 do writeln(output);
- with data do
- begin
-
- if normal_value_flag then chart_number:= 'NORMAL';
- writeln(output,'chart_number: ',chart_number, ' Name: ',name);
- writeln(output);
- write(output,' '); {4 spaces}
- for counter:= 1 to 14 do write(output,y_axis_label[counter]:8);
- writeln(output);
-
- for counter:= 1 to 18 do
- begin
- if counter < 15 then write(output,x_axis_label[counter]:4,' ') else
- case counter of
- 15: write(output,'max ');
- 16: write(output,'min ');
- 17: write(output,'ave ');
- 18: write(output,'peak ');
- end;
-
- for j:= 1 to 14 do
- if abs(values[counter,j]) = 999.0 then
- write(output,' ':8) else
- write(output,values[counter,j]:8:1);
-
- writeln(output);
- writeln(output);
- end;
-
- end;
- end;
-
- begin {of procedure print}
- reset(filename,fin);
- if eof(fin) then
- begin
- writeln('NO FILE PRESENT!');
- writeln;
- write('Enter any character to continue. ');
- keyin(continue);
- goto 1;
- end;
-
- clear_screen;
- all:= query(1,10,'Do you wish to display all results for ALL patients? y/n ');
-
- case all of
- false: begin
- repeat
- get_chart_number;
-
- case desire_hardcopy of
- true: if error = false then hardcopy(normal_value_flag) else
- erase_lines(10,3);
- false: if error = false then display_values(false,false) else
- erase_lines(10,3);
- end;
- if (error) or (escape) then goto 1; {goto menu if record not found or done}
-
- error:=false;
- erase_lines(1,1);
- more:=query(1,1,'Do you wish to display data for another patient? y/n ');
- until more = false;
- end;
-
- true: begin
- rec:= number_records(filename);
- recursive:=false;
- for i:= 1 to rec do
- begin
- escape:= false;
- read(fin:i,data);
- case desire_hardcopy of
- true: if i= 1 then hardcopy(true) else hardcopy(false);
- false: if i= 1 then display_values(true,false) else
- display_values(false,false);
- end;
- recursive:= true;
- if escape then goto 1;
- end;
- end;
- end; {of case}
- 1:
- end;
-
-
- procedure values_calculation;
-
- begin
- with data do
- begin
-
- for results:= 1 to 14 do
- begin
- max:= values[1,results];
- peak_time:= 1;
-
- if values[1,results] = -999.0 then
- begin
- sum:= 0.0;
- num_values:= 0;
- min:=999.0;
- end;
-
- if values[1,results] > -999.0 then
- begin
- sum:= values[1,results] ;
- num_values:= 1;
- min:= values[1,results];
- end;
-
- for time := 2 to 14 do
- begin
- if max < values[time,results] then
- begin
- max:= values[time,results];
- peak_time:= time;
- end;
-
- if (values[time,results] > -999.0) and (min > values[time,results])
- then min:= values[time,results];
-
- if values[time,results] > -999.0 then
- begin
- sum:= sum + values[time,results] ;
- num_values:= num_values + 1;
- end;
- end;
-
- average:= sum/num_values;
- values[15,results]:= max;
- values[16,results]:= min;
- if average = 0.0 then values[17,results]:= -999.0 else
- values[17,results]:= average;
-
- case peak_time of
- 1: values[18,results]:= -30.0;
- 2: values[18,results]:= -1.0;
- 3: values[18,results]:= 15.0;
- 4: values[18,results]:= 30.0;
- 5: values[18,results]:= 45.0;
- 6: values[18,results]:= 60.0;
- 7: values[18,results]:= 90.0;
- 8: values[18,results]:= 120.0;
- 9: values[18,results]:= 150.0;
- 10: values[18,results]:= 180.0;
- 11: values[18,results]:= 210.0;
- 12: values[18,results]:= 240.0;
- 13: values[18,results]:= 300.0;
- 14: values[18,results]:= 360.0;
- end;
-
- if average = 0.0 then values[18,results]:= -999.0;
- end;
-
-
- y:=21;
- prompt(1,21,0,'max',false);
- prompt(1,22,0,'min',false);
- prompt(1,23,0,'ave',false);
- prompt(1,24,0,'peak',false);
- for time:= 1 to 4 do
- begin
- for results:= 1 to 14 do
- begin
- move_cursor(results*5+2,y);
- if (abs(values[time+14,results]) = 999.0) then
- write(' ') else
- write(values[time+14,results]:4:1);
- end;
- y:= y+ 1;
- end;
- end; {of with data}
- end;
-
-
-
- procedure mistake (shift_over_x_axis_flag:boolean);
- label 1,2;
- var
- strtime,strtest:$string80;
- xtime,xtest: axis_label;
- matrix,shift,i,j,time,test:byte;
- found,finished:boolean;
-
- begin
- finished:= false;
- repeat
- erase_lines(1,1);
- move_cursor(1,1);
- write('Enter test and time of incorrect data, e.g. BS <cr> 30 <cr> ');
- 1: strtest:= input_data(65,1,4,true,0.0,0.0);
- if strtest[1] = chr(27) then
- begin
- finished:= true;
- goto 2;
- end;
- strtest:= ucase(strtest);
- strtime:= input_data(75,1,4,true,0.0,0.0);
-
- for i:= 1 to 4 do
- begin
- xtime[i]:= strtime[i];
- xtest[i]:= strtest[i];
- end;
- erase_lines(1,1);
-
- time:= 255;
- test:= 255;
- matrix:= 1;
- found:= false;
- repeat
- if xtest = y_axis_label[matrix] then
- begin
- found:= true;
- test:= matrix;
- end;
- matrix:= matrix + 1;
- until (found) or (matrix > 14);
-
- matrix:= 1;
- found:= false;
- repeat
- if xtime = x_axis_label[matrix] then
- begin
- found:= true;
- time:= matrix;
- end;
- matrix:= matrix + 1;
- until (found) or (matrix > 14);
-
- if time = 255 then
- begin
- erase_lines(1,1);
- move_cursor(1,1);
- write('You have entered an invalid time, please reenter test & time: ');
- goto 1;
- end;
-
- if test = 255 then
- begin
- erase_lines(1,1);
- move_cursor(1,1);
- write('You have entered an invalid test, please reenter test & time: ');
- goto 1;
- end;
-
- if shift_over_x_axis_flag then shift:= 4 else shift:= 2;
-
- prompt(test*5+shift,time+5,0,' ',false);
- strvalue:= input_data(test*5+shift,time+5,4,false,9999.0,0.0);
- if strvalue = '-999' then
- data.values[time,test]:= -999.0 else
- data.values[time,test]:= strtoreal(strvalue);
-
- 2: until finished;
- erase_lines(1,1);
- values_calculation;
- end;
-
-
- procedure update_first_record (number_recs:integer);
- begin
- reset(filename,fin);
- with data do
- begin
- read(fin:1,data);
- calculate(number_recs);
- data.name:=' ';{DEBUG}
- write(fin:1,data);
- end;
- end;
-
-
-
- procedure get_vital_statistics;
- var
- xname,xchartnumber,xheight,xweight,xage,xboneage,xheightage:$string80;
- xmonth,xday,xyear:$string80;
- correction,i:byte;
- correct:boolean;
- wrong,xsex:char;
-
-
- procedure get_patient_data (entry:byte); {this procedure internal to above}
- begin
- case entry of
- 1: begin
- prompt(1,2,30,'{1} Name: ',false);
- xname:= input_data(10,2,30,true,0.0,0.0);
- xname:=ucase(xname);
- end;
- 2: begin
- prompt(50,2,6,'{2} Chart Number: ',false);
- xchartnumber:= input_data(67,2,6,true,0.0,0.0);
- end;
- 3: begin
- repeat
- move_cursor(1,4);
- write('{3} Sex (m/f) ');
- read(xsex);
- until xsex in ['m','f','M','F'];
- end;
- 4: begin
- prompt(20,4,0,'{4} Height (cm): ',false);
- xheight:= input_data(41,4,5,false,200.0,0.0);
- end;
- 5: begin
- prompt(50,4,0,'{5} Weight (kg): ',false);
- xweight:= input_data(71,4,5,false,300.0,0.0);
- end;
- 6: begin
- prompt(1,6,0,'{6} Age (yr.mo): ',false);
- xage:= input_data(20,6,5,false,30.0,0.1);
- end;
- 7: begin
- prompt(30,6,0,'{7} Bone Age (yr.mo): ',false);
- xboneage:= input_data(52,6,4,false,20.0,0.0);
- end;
- 8: begin
- prompt(1,8,0,'{8} Height Age (yr.mo): ',false);
- xheightage:= input_data(25,8,4,false,20.0,0.0);
- end;
- 9: begin
- prompt(1,10,2,'{9} date: ',false);
- prompt(13,10,0,'/',false);
- prompt(16,10,0,'/',false);
- xmonth:= input_data(10,10,2,true,0.0,0.0);
- xday:= input_data(14,10,2,true,0.0,0.0);
- xyear:= input_data(17,10,2,true,0.0,0.0);
- end;
- end; {of case}
- end; {of procedure}
-
-
- begin
- clear_screen;
- writeln;
- prompt(1,2,0,'{1} Name: ',false);
- prompt(50,2,0,'{2} Chart Number: ',false);
- prompt(1,4,0,'{3} Sex (m/f): ',false);
- prompt(20,4,0,'{4} Height (cm):',false);
- prompt(50,4,0,'{5} Weight (kg):',false);
- prompt(1,6,0,'{6} Age (yr.mo):',false);
- prompt(30,6,0,'{7} Bone Age (yr.mo):',false);
- prompt(1,8,0,'{8} Height Age (yr.mo):',false);
- prompt(1,10,0,'{9} date: ',false);
- prompt(13,10,0,'/',false);
- prompt(16,10,0,'/',false);
-
- for i:= 1 to 9 do get_patient_data(i);
- repeat
- correct:= query(1,15,'Is information correct as entered? y/n');
- if correct = false then
- begin
- repeat
- erase_lines(15,1);
- move_cursor(1,15);
- write('Enter number corresponding to incorrect data: ');
- keyin(wrong);
- correction:= ord(wrong) - 48;
- until correction in [1..9];
- erase_lines(15,1);
- get_patient_data(correction);
- end;
- until correct;
- with data do
- begin
- for i:= 1 to 30 do name[i]:= xname[i];
- for i:= 1 to 6 do chart_number[i]:= xchartnumber[i];
- if xsex in ['m','M'] then sex:= male else sex:= female;
- height:= strtoreal(xheight);
- weight:= strtoreal(xweight);
- chronological_age:= strtoreal(xage);
- bone_age:=strtoreal(xboneage);
- height_age:=strtoreal(xheightage);
- for i:= 1 to 2 do
- begin
- date.month[i]:=xmonth[i];
- date.day[i]:= xday[i];
- date.year[i]:= xyear[i];
- end;
- {calc_percent_overweight_for_height;}
- surface_area:=exp((0.425*ln(weight)) + (0.725*ln(height)) + 4.274);
-
- {S.A.= weight^.425 * height^.725 * 71.84 according to}
- {DuBois & DuBois Arch Int Med 17:863 (1916)}
-
- percent_overweight_for_height:=0.0;
- total_body_water:= -10.313 + 0.252*weight + 0.154*(height);
- end; {of with data}
-
- end; {of procedure}
-
-
- procedure get_data(flag:byte);
- label 1;
- var
- rec:integer;
- esc,num:byte;
-
- begin
- reset(filename,fin);
- if eof(fin) then create_first_record;
- rec:= number_records(filename) + 1;
- repeat
- with data do
- begin
- pad:= defaultpad;
-
- if flag > 0 then get_vital_statistics;
-
- clear_screen;
- writeln;
- move_cursor(1,1);
- if flag = 0 then write(' Enter NORMAL laboratory values: ') else
- write(' Enter patient''s laboratory values: ');
- axis(0);
- x:= 7;
- y:= 6;
- for results:= 1 to 14 do
- begin
- time:= 1;
- while (time < 15) do
- begin
- strvalue:= input_data(x,y,4,false,9999.0,0.0);
- case ord(strvalue[1]) of
- 27: begin
- for esc:= time to 14 do
- values[time,results]:= -999.0;
- time:= 15;
- end;
- else: begin
- if strvalue = '-999' then
- values[time,results]:= -999.0 else
- values[time,results]:= strtoreal(strvalue);
- time:= time + 1;
- y:= y+ 1;
- end;
- end; {of case}
- end; {of while}
- x:= x+ 5;
- y:= 6;
- end;
-
- continue:= query(1,1,'Is information correct as entered? y/n ');
- if continue = false then mistake(false);
-
- values_calculation;
- case flag of
- 0: write(fin:1,data);
- else: write(fin:rec,data);
- end;
-
- if flag = 0 then continue:= false else
- continue:= query(1,1,'Do you wish to add another record? y/n ');
- if continue then rec:= rec + 1;
- end; {of with data}
- until continue = false;
- if flag > 0 then update_first_record(rec);
- end;
-
-
- procedure set_normal_values;
- begin
- get_data(0);
- end;
-
-
- procedure get_normal_values;
- begin
- reset(filename,fin);
- read(fin:1,norms);
- end;
-
-
- procedure print_individual_test_results (desire_hardcopy:boolean);
- label 1;
- var
- x,y:byte;
- test,continue:char;
- output:text;
-
-
- procedure choose_test;
- begin
- clear_screen;
- writeln;
- writeln('A- BLOOD SUGAR');
- writeln('B- INSULIN');
- writeln('C- GROWTH HORMONE');
- writeln('D- LH');
- writeln('E- FSH');
- writeln('F- CORTISOL');
- writeln('G- PROLACTIN');
- writeln('H- TSH');
- writeln('I- TESTOSTERONE');
- writeln('J- DS');
- writeln('K- ACTH');
- writeln('L- T4');
- writeln('M- TBGI');
- writeln('N- TT3');
- writeln('O- display values for a different patient');
- writeln('P- return to the menu');
- writeln;
- write('Please enter the letter corresponding to the test: ');
- repeat
- move_cursor(61,19);
- keyin(test);
- if (ord(test) > 96) and (ord(test) < 123) then
- test:= chr(ord(test)-32);
- write(test);
- until test in ['A'..'P'];
- results:= ord(test)-64;
- clear_screen;
- end;
-
- begin
- reset(filename,fin);
- if eof(fin) then
- begin
- error:= true;
- goto 1;
- end;
- if desire_hardcopy then rewrite('lst:',output);
-
- get_chart_number;
- if normal_value_flag = false then get_normal_values;
- choose_test;
- while results < 16 do
- begin
-
- if results = 15 then
- begin
- get_chart_number;
- choose_test;
- end;
- if desire_hardcopy = false then axis(3) else
- begin
- clear_screen;
- write('Prepare printer, then enter any character to initiate printing.');
- keyin(continue);
- erase_lines(1,1);
- writeln;
- write('Now printing results.');
- end;
- with data do
- begin
-
- if desire_hardcopy = false then
- begin
- move_cursor(20,3);
- write(y_axis_label[results]);
- end;
- if desire_hardcopy then
- begin
- write(output,chr(12));
- for x:= 1 to 3 do writeln(output);
- if normal_value_flag then chart_number:= 'NORMAL';
- write(output,'chart number: ',chart_number, y_axis_label[results]:15);
- writeln(output);
- write(output,'PATIENT':20,'NORMAL (AVE)':22, 'DEVIATION':15);
- writeln(output);
- end;
-
- y:= 6;
- for time:= 1 to 18 do
- begin
- case desire_hardcopy of
- false: begin
- move_cursor(10,y);
- if (normal_value_flag) or (abs(values[time,results]) = 999.0) then
- write(' ') else
- write(values[time,results]:4:1);
- move_cursor(20,y);
- if (abs(norms.values[time,results]) = 999.0) then
- write(' ') else
- write(norms.values[time,results]:4:1);
- move_cursor(35,y);
- if (abs(values[time,results]) = 999.0) or (normal_value_flag) or
- (abs(norms.values[time,results]) = 999.0) then
- write(' ') else
- if values[time,results] < norms.values[time,results] then
- write('LOW') else
- if values[time,results] > norms.values[time,results] then
- write('HIGH') else write(' ');
- if y = 19 then y:= y + 2 else y:= y + 1;
- end;
-
- true: begin
- if time < 15 then write (output,x_axis_label[time]) else
- case time of
- 15: write(output,'max ');
- 16: write(output,'min ');
- 17: write(output,'ave ');
- 18: write(output,'peak');
- end;
-
- if (abs(values[time,results]) = 999.0) or (normal_value_flag) then
- write(output,' ':15) else
- write(output,values[time,results]:15:1);
-
- if (abs(norms.values[time,results]) = 999.0) then
- write(output,' ':15) else
- write(output,norms.values[time,results]:15:1);
-
- if (abs(values[time,results]) = 999.0) or (normal_value_flag) or
- (abs(norms.values[time,results]) = 999.0) then
- write(output,' ':15) else
- if values[time,results] < norms.values[time,results] then
- write(output,'LOW':15) else
- if values[time,results] > norms.values[time,results] then
- write(output,'HIGH':15) else write(output,' ':15);
-
- writeln(output);
- end;
- end;
-
- end; {of time}
- move_cursor(1,1);
- write('Enter any character to continue ');
- keyin(continue);
- choose_test;
- end;
- end;
- 1:
- end;
-
-
-
- procedure correction;
- label 1;
- var
- i:integer;
- ch:char;
- continue:boolean;
-
- begin
- clear_screen;
- reset(filename,fin);
- if eof(fin) then
- begin
- move_cursor(1,10);
- writeln('File not found!');
- writeln('Enter any character to continue.');
- keyin(ch);
- goto 1;
- end;
-
- continue:= true;
- repeat
- get_chart_number;
- if error = false then
- begin
- display_values(normal_value_flag,true);
- mistake(true);
- write(fin:rec,data);
- end;
- continue:= query(1,1,'Do you wish to correct another patient''s record? y/n ');
- until continue = false;
-
- 1:
- end;
-
-
- procedure get_filename;
- var
- newfile:boolean;
-
- begin
- clear_screen;
- writeln;
- writeln('Enter name of patient data file as: drive:name.extension ');
- writeln;
- writeln('Drive is either ''A'' or ''B'' .');
- writeln('Name may be up to 14 letters. ');
- writeln('Extention may be up to 3 letters.');
- move_cursor(10,10);
- write('----> ');
- read(filename);
-
- reset(filename,fin);
- if eof(fin) then
- begin
- prompt(10,15,0,'A file by that name is NOT FOUND. ',false);
- newfile:= query(10,16,'Is this a new file? y/n');
- if newfile then rewrite(filename,fin) else get_filename;
- end;
- end;
-
-
-
-
- procedure menu;
- var
- ch:char;
-
- begin
- error:= false;
- clear_screen;
- writeln;
- writeln('Choose one of the following: ');
- writeln;
- writeln('1- Establish or set the normal values');
- writeln('2- Add patient results to file');
- writeln('3- Display on terminal selected test results for a patient');
- writeln('4- Print selected test results for a patient');
- writeln('5- Display on terminal all results for a patient');
- writeln('6- Print all results for a patient');
- writeln('7- Correct selected values or results for a patient''s record');
- writeln;
- writeln('8- CHANGE NAME OF PATIENT DATA FILE');
- writeln('0- EXIT program');
- writeln;
- write('Your selection please: ');
- repeat
- move_cursor(25,15);
- keyin(ch);
- write(ch);
- until ch in ['0'..'8'];
- case ch of
- '1': set_normal_value;
- '2': get_data(1);
- '3': print_individual_test_results(false);
- '4': print_individual_test_results(true);
- '5': print(false);
- '6': print(true);
- '7': correction;
- '8': get_filename;
- '0': terminate:= true;
- end;
-
- end;
-
-
-
-
- {**************************** main program *****************************}
-
- begin
- initialize;
- terminate:= false;
- get_filename;
- repeat
- menu;
- until terminate ;
- end.
-