home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume2 / dating / date.v1.p < prev    next >
Text File  |  1987-10-26  |  15KB  |  718 lines

  1. program date(input, output, Questions, database, bbase);
  2.  
  3. (*
  4.             Date-A-Base version 1.0
  5.                    by
  6.                          Thomas M. Johnson
  7.  
  8.              john1233@csd4.milw.wisc.edu
  9.                   or
  10.                              tommyj@lakesys
  11.  
  12.      files used:
  13.        Questions - holds the questionaire
  14.        database  - all people registered with the Date-A-Base
  15.                and their information
  16.            bbase     - data used by brouse command.
  17.  
  18. (c) 1987 Thomas M. Johnson *)
  19.  
  20.  
  21.  
  22.  
  23. const
  24.     NUMOFQUESTIONS = 49;
  25.     STRINGLENGTH = 20;
  26.     ONE = 1;
  27.     LOW = 'a';
  28.  
  29. type
  30.     string = packed array [ONE..STRINGLENGTH] of char;
  31.     answerarray = packed array [ONE..NUMOFQUESTIONS] of char;
  32.     userp = ^ usertype;
  33.     usertype = 
  34.     record 
  35.         login: string;
  36.         passwd: string;
  37.         sex: char;
  38.         timeson: integer;
  39.         answers: answerarray;
  40. (*        laston: integer;   *)
  41.         next: userp
  42.     end;
  43.  
  44. var
  45.     Questions: text;
  46.     database: file of usertype;
  47.     head: userp;
  48.     static: usertype;
  49.     bbase: text;
  50.     continue: boolean;
  51.  
  52.  
  53.  
  54.     function cstrings(var string1: answerarray; string2: answerarray): real;
  55.  
  56.     (* The function cstrings takes 2 strings and compares them.
  57.        cstrings then returns the percent identical the strings are.
  58.        The strings are compared letter for letter and must be in the
  59.        same place in the string.                               *)
  60.  
  61.  
  62.     var
  63.     counter: integer;
  64.     percent: integer;
  65.  
  66.     begin
  67.     percent := 0;
  68.  
  69.     for counter := ONE to NUMOFQUESTIONS do 
  70.         if string1[counter] = string2[counter] then 
  71.         percent := percent + 1;
  72.     cstrings := percent / NUMOFQUESTIONS * 100
  73.     end; { cstrings }
  74.  
  75.     function yesNo: boolean;
  76.  
  77.     const
  78.     yes = 'y';
  79.     no = 'n';
  80.  
  81.     var
  82.     ch: char;
  83.  
  84.     begin
  85.     repeat
  86.         write(output, ' (y/n) ');
  87.         readln(input, ch)
  88.     until (ch = yes) or (ch = no);
  89.     yesNo := ch = yes
  90.  
  91.     end; { yesNo }
  92.  
  93.  
  94.  
  95.     function getanswer(ubound: char): char;
  96.  
  97.     (* The function getanswer reads in a character and checks to see
  98.        if it is in the range of lobound to ubound. If it isn't, then the
  99.        user is reprompted.                                          *)
  100.  
  101.  
  102.     var
  103.     tempchar: char;
  104.     charindex: char;
  105.  
  106.     begin
  107.     repeat
  108.         writeln(output);
  109.  
  110.         for charindex := LOW to ubound do 
  111.         write(output, charindex);
  112.  
  113.         writeln(output);
  114.         write(output, 'Your choice: ');
  115.         readln(input, tempchar)
  116.     until (tempchar >= LOW) and (tempchar <= ubound);
  117.  
  118.     writeln(output);
  119.     getanswer := tempchar
  120.     end; { getanswer }
  121.  
  122.  
  123.     procedure readstring(var tempstring: string);
  124.  
  125.     (* read a string from standard input. the string must have
  126.        a length of 2 or greater or it is invalid.   *)
  127.  
  128.  
  129.     const
  130.     init = 0;
  131.     inc = 1;
  132.     blank = '                    ';
  133.  
  134.     var
  135.     ch: char;
  136.     length: integer;
  137.  
  138.     begin
  139.     repeat
  140.         tempstring := blank;
  141.         length := init;
  142.         while not eoln(input) do begin
  143.         read(input, ch);
  144.         length := length + inc;
  145.         tempstring[length] := ch
  146.         end;
  147.         readln(input)
  148.     until length > 1
  149.  
  150.     end; { readstring }
  151.  
  152.     procedure readint(var sum: integer);
  153.  
  154.     (* read in a string from standard input and convert to an
  155.        integer.     *)
  156.  
  157.  
  158.     const
  159.     init = 0;
  160.     inc = 1;
  161.     base = 10;
  162.     intlow = '0';
  163.     inthigh = '9';
  164.  
  165.     var
  166.     i: integer;
  167.     done: boolean;
  168.     hold: string;
  169.  
  170.     begin
  171.     i := inc;
  172.     done := false;
  173.     sum := init;
  174.     readstring(hold);
  175.     while (i <= STRINGLENGTH) and not done do 
  176.         if (hold[i] < intlow) or (hold[i] > inthigh) then 
  177.         done := true
  178.         else begin
  179.         sum := sum * base + (ord(hold[i]) - ord(intlow));
  180.         if sum > maxint then 
  181.             done := true
  182.         else 
  183.             i := i + inc
  184.         end
  185.     end; { readint }
  186.  
  187.  
  188.  
  189.     procedure printques(var quests: answerarray);
  190.  
  191.     (* prints the questions from the file Questions.
  192.        the question file is set up like:
  193.     
  194.        The question
  195.        the answers
  196.                .
  197.                .
  198.                .
  199.                .
  200.        ^G (up limit)
  201.     
  202.        then ^G is just a marker to signify where the answers end.
  203.        low limit is usually and 'a'
  204.        up limit the the last answer
  205.     
  206.        *)
  207.  
  208.     var
  209.     ch: char;
  210.     uplimit: char;
  211.     chset: set of char;
  212.     i: integer;
  213.  
  214.     begin
  215.     reset(Questions);
  216.     i := 1;
  217.     chset := ['A'..'Z', 'a'..'z', '0'..'9', '?', '.', ' ', '-', '/'];
  218.     ch := ' ';
  219.     while not eof(Questions) do begin
  220.         while not eoln(Questions) do begin
  221.         read(Questions, ch);
  222.         if ch in chset then 
  223.             write(output, ch)
  224.         else begin
  225.             readln(Questions, uplimit);
  226.             quests[i] := getanswer(uplimit);
  227.             i := i + 1
  228.         end
  229.         end;
  230.         readln(Questions);
  231.         writeln(output)
  232.     end
  233.     end; { printques }
  234.  
  235.     function Search(lookfor: string; var hisrec: usertype): boolean;
  236.  
  237.     (* scan the linked list to find a match between the string lookfor 
  238.        and the .login field. If there is a match, a true is returned with
  239.        the record of that person. Otherwise a false is returned *)
  240.  
  241.  
  242.     var
  243.     found: boolean;
  244.     temptr: userp;
  245.  
  246.     begin
  247.     found := false;
  248.     temptr := head;
  249.  
  250.     while (temptr <> nil) and not found do 
  251.         if temptr^.login = lookfor then begin
  252.         hisrec := temptr^;
  253.         found := true
  254.         end else 
  255.         temptr := temptr^.next;
  256.  
  257.     Search := found
  258.     end; { Search }
  259.  
  260.  
  261.     procedure newUser;
  262.  
  263.     (* if the person in not in the linked list, add him *)
  264.  
  265.  
  266.     const
  267.     male = 'm';
  268.     female = 'f';
  269.     inc = 1;
  270.  
  271.     var
  272.     ch: char;
  273.     node: userp;
  274.  
  275.  
  276.  
  277.     begin
  278.     writeln(output, 'To use the Date-A-Base you will have to answer a');
  279.     writeln(output, 'personal questionaire. Your answers to all the');
  280.     writeln(output, 'questions will available for anyone registered');
  281.     writeln(output, 'in the Date-A-Base to look at.');
  282.     writeln(output);
  283.     writeln(output, 'Do you want to continue? ');
  284.     continue := yesNo;
  285.     if continue then begin
  286.         repeat
  287.         writeln(output);
  288.         writeln(output, 'What sex are you? m or f');
  289.         readln(input, ch)
  290.         until (ch = male) or (ch = female);
  291.         static.sex := ch;
  292.         with static do begin
  293.         timeson := inc
  294.         end;
  295.  
  296. (*        laston := wallclock   *)
  297.         printques(static.answers);
  298.         writeln(output);
  299.         writeln(output, 'What password do you want to use?');
  300.         writeln(output, 'IMPORTANT: Make this different than');
  301.         writeln(output, 'your login password.');
  302.         readstring(static.passwd);
  303.         new(node);
  304.         node^ := static;
  305.         node^.next := head;
  306.         head := node
  307.     end
  308.     end; { newUser }
  309.  
  310.  
  311.  
  312.  
  313.     procedure oldUser;
  314.  
  315.     (* the person is already registered. Just get his data. *)
  316.  
  317.  
  318.     const
  319.  
  320.  
  321.     inc = 1;
  322.     var
  323.     password: string;
  324.     temptr: userp;
  325.     found: boolean;
  326.  
  327.  
  328.     begin
  329.     repeat
  330.         writeln(output);
  331.         writeln(output, 'What is your password?');
  332.         write(output, '? ');
  333.         readstring(password);
  334.         if password <> static.passwd then 
  335.         writeln(output, 'Sorry, thats not right!')
  336.     until password = static.passwd;
  337.     with static do begin
  338.         timeson := timeson + inc
  339.     end;
  340.  
  341. (*        laston := wallclock   *)
  342.     temptr := head;
  343.     found := false;
  344.     while (temptr <> nil) and not found do 
  345.         if temptr^.login = static.login then begin
  346.         static.next := temptr^.next;
  347.         temptr^ := static;
  348.         found := true
  349.         end else 
  350.         temptr := temptr^.next
  351.  
  352.     end; { oldUser }
  353.  
  354.  
  355.  
  356.     procedure initialize;
  357.  
  358.     (* This procedure reads in the current file with all registered
  359.        users into a linked list. *)
  360.  
  361.  
  362.     var
  363.     node: userp;
  364.     name: string;
  365.  
  366.     begin
  367.     head := nil;
  368.     reset(database);
  369.     while not eof(database) do begin
  370.         new(node);
  371.         read(database, node^);
  372.         node^.next := head;
  373.         head := node
  374.     end; (* while *)
  375.     writeln(output);
  376.     writeln(output);
  377.     writeln(output, '                 The');
  378.     writeln(output, '            Date-A-Base');
  379.     writeln(output);
  380.     writeln(output);
  381.     writeln(output, '  The computerized dating service.');
  382.     writeln(output);
  383.     writeln(output);
  384.     writeln(output);
  385.     writeln(output, 'What is your login name?');
  386.     write(output, '? ');
  387.     continue := true;
  388.     readstring(name);
  389.     static.login := name;
  390.     if not Search(name, static) then 
  391.         newUser
  392.     else 
  393.         oldUser
  394.  
  395.  
  396.     end; { initialize }
  397.  
  398.     procedure savedata;
  399.  
  400.     (* save the linked list in the file database *)
  401.  
  402.  
  403.     var
  404.     pointer: userp;
  405.  
  406.  
  407.     begin
  408.     rewrite(database);
  409.     pointer := head;
  410.     if pointer <> nil then 
  411.         while pointer^.next <> nil do begin
  412.         write(database, pointer^);
  413.         pointer := pointer^.next
  414.         end;
  415.     write(database, pointer^)
  416.  
  417.     end; { savedata }
  418.  
  419.     procedure answer;
  420.  
  421.     (* answer the questionaire again *)
  422.  
  423.  
  424.     var
  425.     check: boolean;
  426.     temptr: userp;
  427.     found: boolean;
  428.  
  429.     begin
  430.     writeln(output);
  431.     writeln(output, 'Are you sure you want to answer all the');
  432.     writeln(output, 'questions again?');
  433.     check := yesNo;
  434.     if check then 
  435.         printques(static.answers);
  436.     temptr := head;
  437.     found := false;
  438.     while (temptr <> nil) and not found do 
  439.         if temptr^.login = static.login then begin
  440.         static.next := temptr^.next;
  441.         temptr^ := static;
  442.         found := true
  443.         end else 
  444.         temptr := temptr^.next
  445.  
  446.     end; { answer }
  447.  
  448.     procedure brouse;
  449.  
  450.     (* give a quick scan of someone else's questionaire. the data for
  451.        the brouse is in bbase. Data looks like:
  452.     
  453.               the topic
  454.               the maximum answer
  455.               answer
  456.                 .
  457.                 .
  458.                 .
  459.     
  460.                 *)
  461.  
  462.  
  463.     const
  464. (*    clicks = 86400;      *)
  465.     (* number of seconds in a day *)
  466.     low = 'a';
  467.     field = 3;
  468.     zero = 0;
  469.     marker = 15;
  470.  
  471.     var
  472.     who: string;
  473.     index: char;
  474.     ch: char;
  475.     max: char;
  476.     i: integer;
  477.     j: integer;
  478. (*    time: integer;    *)
  479.     rec: usertype;
  480.  
  481.     begin
  482.     writeln(output, 'Whose questionare do you want to brouse?');
  483.     write(output, '? ');
  484.     readstring(who);
  485.     if Search(who, rec) then begin
  486.  
  487.         i := ONE;
  488.         j := ONE;
  489.         reset(bbase);
  490.         writeln(output);
  491.         write(output, 'Name: ');
  492.         writeln(output, rec.login);
  493.         write(output, 'Used the Date-A-Base ');
  494.         write(output, rec.timeson: field);
  495.         if rec.timeson = ONE then 
  496.         writeln(output, ' time. ')
  497.         else 
  498.         writeln(output, ' times. ');
  499.  
  500.         write(output, 'Last used the Date-A-Base: ');
  501.         (*    time := wallclock - rec.laston;
  502.                     time := time div clicks;
  503.                     if time = zero then 
  504.                     writeln(output, 'today.');
  505.                     if time = ONE then 
  506.                     writeln(output, 'yesterday.');
  507.                     if time > ONE then begin
  508.                     write(output, time: field);
  509.                     writeln(output, ' days ago.')
  510.                     end;  *)
  511.  
  512.         writeln(output);
  513.         while not eof(bbase) do begin
  514.         while not eoln(bbase) do begin
  515.             read(bbase, ch);
  516.             write(output, ch)
  517.         end;
  518.         readln(bbase);
  519.         readln(bbase, max);
  520.         for index := low to max do begin
  521.             if index = rec.answers[i] then begin
  522.             while not eoln(bbase) do begin
  523.                 read(bbase, ch);
  524.                 write(output, ch)
  525.             end;
  526.             writeln(output);
  527.             readln(bbase)
  528.             end else 
  529.             readln(bbase)
  530.         end;
  531.         if j = marker then begin
  532.             repeat
  533.             writeln(output);
  534.             writeln(output, 'Continue? ')
  535.             until yesNo;
  536.             j := zero;
  537.             writeln(output)
  538.         end;
  539.         j := j + ONE;
  540.         i := i + ONE
  541.         end
  542.     end else 
  543.         writeln(output, 'Sorry that person is not registered!');
  544.  
  545.     repeat
  546.         writeln(output);
  547.         writeln(output, 'Return to the menu? ')
  548.     until yesNo
  549.     end; { brouse }
  550.  
  551.     procedure delete;
  552.  
  553.     (* delete a person from the linked list *)
  554.  
  555.     var
  556.     found: boolean;
  557.     pointer: userp;
  558.  
  559.     begin
  560.     found := false;
  561.     writeln(output, 'Are you sure you want to delete yourself?');
  562.     if yesNo then begin
  563.         pointer := head;
  564.         if pointer^.login = static.login then begin
  565.         head := pointer^.next;
  566.         dispose(pointer)
  567.         end else 
  568.         while not found do 
  569.             while pointer^.next <> nil do 
  570.             if pointer^.next^.login = static.login then begin
  571.                 pointer^.next := pointer^.next^.next;
  572.                 dispose(pointer^.next);
  573.                 found := true
  574.             end else 
  575.                 pointer := pointer^.next
  576.     end
  577.     end; { delete }
  578.  
  579.  
  580.  
  581.  
  582.  
  583.     procedure match;
  584.  
  585.     (* find a match between 2 people. scans the whole linked list
  586.        and reports all matches greater than the amount entered. *)
  587.  
  588.  
  589.     const
  590.     loginfield = 47;
  591.     perfield = 5;
  592.     dplaces = 1;
  593.     namefield = 33;
  594.     low = 9;
  595.     high = 100;
  596.  
  597.  
  598.     var
  599.     pointer: userp;
  600.     percent: integer;
  601.     per: real;
  602.     found: boolean;
  603.  
  604.  
  605.     begin
  606.     pointer := head;
  607.     writeln(output);
  608.     writeln(output, 'What is the lowest percent match that');
  609.     writeln(output, 'you want to see? ');
  610.     repeat
  611.         write(output, ' (10 - 99) ');
  612.  
  613.         readint(percent)
  614.     until (percent > low) and (percent < high);
  615.  
  616.  
  617.     writeln(output);
  618.     write(output, '%': perfield);
  619.     writeln(output, 'name': namefield);
  620.     writeln(output, '----------------------------------------------------');
  621.  
  622.     found := false;
  623.     if pointer <> nil then 
  624.         while pointer <> nil do begin
  625.         per := cstrings(static.answers, pointer^.answers);
  626.         if (per >= percent) and (static.sex <> pointer^.sex) then begin
  627.             found := true;
  628.             writeln(output);
  629.             write(output, per: perfield: dplaces);
  630.             write(output, '%');
  631.             writeln(output, pointer^.login: loginfield)
  632.         end;
  633.         pointer := pointer^.next
  634.         end;
  635.     if not found then begin
  636.         writeln(output);
  637.         writeln(output, 'Sorry, no matches found today. Try again later.')
  638.     end;
  639.     repeat
  640.         writeln(output);
  641.         writeln(output);
  642.         writeln(output, 'Are you ready to continue?')
  643.     until yesNo
  644.  
  645.     end; { match }
  646.  
  647.  
  648.     procedure bye;
  649.  
  650.     begin
  651.     writeln(output);
  652.     writeln(output, 'Thank you for using the Date-A-Base');
  653.     writeln(output, 'Hope to hear from you again soon.');
  654.     writeln(output);
  655.     writeln(output);
  656.     writeln(output);
  657.     writeln(output);
  658.     writeln(output);
  659.     writeln(output,'(c) 1987 Thomas M. Johnson');
  660.     writeln(output)
  661.     end; { bye }
  662.  
  663.  
  664.     procedure menu;
  665.  
  666.     (* The procedure menu is the programs main menu. It prints the
  667.        commands and executes the proper subroutine based on the users
  668.        choice.                                                  *)
  669.  
  670.  
  671.     const
  672.  
  673.     lastchoice = 'e';
  674.     var
  675.     choice: char;
  676.  
  677.     begin
  678.     repeat
  679.         writeln(output);
  680.         writeln(output);
  681.         writeln(output, '                           Menu');
  682.         writeln(output, '                           ----');
  683.         writeln(output);
  684.         writeln(output, '                 [a]                  answer questionare');
  685.         writeln(output, '                 [b]                  brouse questionare');
  686.         writeln(output, '                 [c]                  make a match');
  687.         writeln(output, '                 [d]                  delete your questionare');
  688.         writeln(output);
  689.         writeln(output, '                 [e]                  quit');
  690.  
  691.         choice := getanswer(lastchoice);
  692.  
  693.         case choice of
  694.         'a':
  695.             answer;
  696.         'b':
  697.             brouse;
  698.         'c':
  699.             match;
  700.         'd':
  701.             delete;
  702.         'e':
  703.             writeln(output)
  704.         end
  705.     until choice = lastchoice
  706.  
  707.     end; { menu }
  708.  
  709. begin
  710.     initialize;
  711.     if continue then begin
  712.     menu;
  713.     savedata
  714.     end;
  715.     bye
  716. end. { date }
  717.  
  718.