home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 8 / FreshFishVol8-CD2.bin / bbs / misc / ddli-3.41.lha / DDLI / ddli.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-07-25  |  12.0 KB  |  361 lines

  1. /*
  2.  *  ddli.c
  3.  *  The Duniho and Duniho Life Pattern Indicator
  4.  *  by Fergus Duniho
  5.  *  Copyright (c) 1992-1994 Fergus Duniho
  6.  */
  7.  
  8. #define VER "V3.41"
  9. #define EMAIL "fdnh@troi.cc.rochester.edu"
  10. #define NETMAIL "Fergus Duniho @ 1:2613/278 (The FileWorks BBS)"
  11.  
  12. #undef MSDOS
  13.  
  14. #define AMIGA 1
  15. #define MSDOS 2
  16. #define UNIX 3
  17.  
  18. #define OPSYS AMIGA
  19.  
  20. #if OPSYS == AMIGA
  21.     #define prtdev "PRT:"
  22.     #define FILE_NAME_MAX 32
  23.     #define OUTMAX 3
  24.     #define OUTSTR "Send output to (1) Screen, (2) File, or (3) Printer?"
  25. #elif OPSYS == MSDOS
  26.     #define prtdev "PRN"
  27.     #define FILE_NAME_MAX 8
  28.     #define OUTMAX 3
  29.     #define OUTSTR "Send output to (1) Screen, (2) File, or (3) Printer?"
  30. #elif OPSYS == UNIX
  31.     #define prtdev ""
  32.     #define FILE_NAME_MAX 32
  33.     #define OUTMAX 2
  34.     #define OUTSTR "Send output to (1) Screen or (2) File?"
  35. #else
  36.     #error OPERATING SYSTEM UNKNOWN
  37. #endif
  38.  
  39. /*
  40.  * If your compiler does not have the command "strdup",
  41.  * which is common in C compilers but not part of ANSI
  42.  * C, uncomment the next #include statement.
  43.  */
  44. /* #include "strdup.c" */
  45.  
  46. #include "fpdio.c"
  47. #include "qst.c"
  48. #include <time.h>
  49.  
  50. #define XN E ? "Extraverted" : "Introverted"
  51. #define QFILE "ddli.qst"
  52.  
  53. int pow (int x, int y);
  54. int typecmp (char *t1, char *t2);
  55. void pause (int col);
  56.  
  57. int main (int argc, char **argv) {
  58.     int i, col, size, A, pr[14], x, type,
  59.         E, I, S, N, T, F, J, P, ES, EN, ET, EF, R;
  60.     char line[256], nline[512], *name, *fname,
  61.         LP[5], LPE[5], LPI[5],
  62.         *PF[2] = {"Intuition", "Sensing"},
  63.         *JF[2] = {"Thinking", "Feeling"},
  64.         *text1 = "Your %s function is %s %s.";
  65.     FILE *fptr;
  66.     qst *Q;
  67.  
  68. #if OPSYS == MSDOS
  69.     col = 75;
  70. #else
  71.     wrapwrite (stdout, 0, 0, 20, "How many columns does your screen have?", 0);
  72.     col = fgetp(stdin);
  73. #endif
  74.  
  75.     wrapwrite (stdout, 0, 0, col,
  76.         "\n\"The Duniho and Duniho Life Pattern Indicator\"",
  77.         VER, "\nBy Fergus Duniho. Copyright (c) 1992-1994",
  78.         "Fergus Duniho.\n\nMost of the questions are drawn from",
  79.         "and based on those in Terence Duniho's \"Preference",
  80.         "Patterns Questionaire\" and his book _Wholeness Lies",
  81.         "Within_. Fergus is responsible for the choice of questions.",
  82.         "\n\nThis product is freeware. Send your raw scores and",
  83.         "sundry comments to Fergus Duniho through the Internet or",
  84.         "through the Fidonet.  Here are my Internet and Fidonet",
  85.         "addresses:\n\n", EMAIL, "\n", NETMAIL, "\n", 0);
  86.  
  87.     pause (col);
  88.     wrapwrite (stdout, 5, 0, col, "When you answer each question,",
  89.         "there are some things you should bear in mind.\n\n", 0);
  90.  
  91.     wrapwrite (stdout, 2, 0, col, "1.   Base your answer on how you usually",
  92.         "are, not just on how you were on a particular occasion.\n\n", 0);
  93.  
  94.     wrapwrite (stdout, 2, 0, col, "2.   Base your answer on how you actually",
  95.         "are, even when that differs from how you would like to be.\n\n", 0);
  96.  
  97.     wrapwrite (stdout, 2, 0, col, "3.   Base your answer on how you have",
  98.         "actually been in real situations, as opposed to how you might be",
  99.         "in imaginary situations.\n\n", 0);
  100.  
  101.     wrapwrite (stdout, 2, 0, col, "4.   Finally, remember that this is not",
  102.         "a test. Nobody has an answer key with the right answers in it.",
  103.         "The right answers depend upon who you are. This program does not",
  104.         "measure degrees of normality and abnormality. It merely measures",
  105.         "differences that may exist between normal, psychologically,",
  106.         "healthy individuals.\n\n", 0);
  107.  
  108.     size = HowMany(QFILE, '#');
  109.     Q = new_qnode(0);
  110.     Q->pv = (Q->nx = Q);
  111.     Get_QList (QFILE, Q, size);
  112.     if (argc > 1)
  113.         read_scores (argv[1], Q);
  114.  
  115.     wrapwrite (stdout, 0, 0, col, "What is your name?", 0);
  116.     name = clone_line(stdin, 80);
  117.     wrapwrite (stdout, 0, 0, col, "Do you already know your psychological",
  118.         "type? (y/n)", 0);
  119.     if (yes()) {
  120.         wrapwrite (stdout, 0, 0, col, "Please select your type from the",
  121.             "list below:\n\n0 - INFP\t1 - INFJ\t2 - INTP\t3 - INTJ\n",
  122.             "4 - ISFP\t5 - ISFJ\t6 - ISTP\t7 - ISTJ\n",
  123.             "8 - ENFP\t9 - ENFJ\t10 - ENTP\t11 - ENTJ\n",
  124.             "12 - ESFP\t13 - ESFJ\t14 - ESTP\t15 - ESTJ\n", 0);
  125.         type = getp(0, 15);
  126.     }
  127.     else type = 16;
  128.  
  129. #ifdef DEBUG
  130.     wrapwrite (stdout, 0, 0, col,
  131.         "Enter an integer as a seed value for the random # generator", 0);
  132.     srand (fgetp(stdin));
  133. #else
  134.     srand (clock());
  135. #endif
  136.  
  137.     Q = RND_QList (Q, size);
  138.     AskQuestions (Q, col);
  139.  
  140.     /* Initializes Preference Scores to Zero */
  141.     for (i = 0; i < 14; i++)
  142.         pr[i] = 0;
  143.  
  144.     /* Calculates Scores */
  145.     for (Q = Q->nx; Q->num > 0; Q = Q->nx)
  146.         pr[Q->ans] += Q->strength;
  147.  
  148.     wrapwrite (stdout, 0, 0, col, OUTSTR, 0);
  149.     A = getp(1, OUTMAX);
  150.     if (A == 1)
  151.         fptr = stdout;
  152.     else if (A == 2) {
  153.         wrapwrite (stdout, 0, 0, col, "Please enter a file name.", 0);
  154.         fname = clone_line(stdin, FILE_NAME_MAX);
  155.         WrOpen (fptr, fname);
  156.     }
  157. #if OPSYS != UNIX
  158.     else if (A == 3) {
  159.         WrOpen (fptr, prtdev);
  160.         col = 75;
  161.     }
  162. #endif
  163.  
  164.     wrapwrite (fptr, 0, 0, col, "Please bear in mind that the DDLI",
  165.         "does not tell you what your type is.  It merely indicates what",
  166.         "might be your type with some degree of probability.  Do not take",
  167.         "your results on the DDLI as the final word on what your type is.",
  168.         "With that said, here are your results:\n\n", 0);
  169.     E = pr[1]; I = pr[2]; S = pr[3]; N = pr[4];
  170.     T = pr[5]; F = pr[6]; J = pr[7]; P = pr[8];
  171.     ES = pr[12]; EN = pr[13]; ET = pr[11]; EF = pr[10];
  172.     sprintf (nline, "%s's scores on the main set of questions:\n"
  173.                     "\nExtraversion (E): %3d    %3d :(I) Introversion"
  174.                     "\nSensing      (S): %3d    %3d :(N) iNtuition"
  175.                     "\nThinking     (T): %3d    %3d :(F) Feeling"
  176.                     "\nJudging      (J): %3d    %3d :(P) Perceiving\n",
  177.                     name, E, I, S, N, T, F, J, P);
  178.     wrapwrite (fptr, 0, 0, col, nline, 0);
  179.  
  180.     /* Calculates possible life pattern based on primary scores. */
  181.     LP[0] = (E > I) ? 'E' : (E < I) ? 'I' : 'X';
  182.     LP[1] = (S > N) ? 'S' : (S < N) ? 'N' : 'X';
  183.     LP[2] = (T > F) ? 'T' : (T < F) ? 'F' : 'X';
  184.     LP[3] = (J > P) ? 'J' : (J < P) ? 'P' : 'X';
  185.     LP[4] = 0;
  186.  
  187.     fprintf (fptr, "You scored as an %s.\n", LP);
  188.     x = 0;
  189.     for (i = 0; i < 4; i++)
  190.         if (LP[i] == 'X')
  191.             x++;
  192.     if (x) {
  193.         sprintf (line, "This is not a real type. You could be any of "
  194.         "%d different types. Read the type descriptions to determine "
  195.         "which you are.", pow(2,x));
  196.         wrapwrite (fptr, 0, 0, col, line, 0);
  197.     }
  198.     else {
  199.         E = (LP[0] == 'E'); R = ((LP[3] == 'J') == E);
  200.         sprintf (line, "\nAssuming that you are an %s,\n", LP);
  201.         wrapwrite (fptr, 0, 5, col, line, 0);
  202.         sprintf (line, text1, "DOMINANT", XN, R ? JF[LP[2] == 'F'] : PF[LP[1] == 'S']);
  203.         wrapwrite (fptr, 0, 5, col, line, 0);
  204.         sprintf (line, text1, "AUXILIARY", !XN, R ? PF[LP[1] == 'S'] : JF[LP[2] == 'F']);
  205.         wrapwrite (fptr, 0, 5, col, line, 0);
  206.         sprintf (line, text1, "TERTIARY", XN, R ? PF[LP[1] == 'N'] : JF[LP[2] == 'T']);
  207.         wrapwrite (fptr, 0, 5, col, line, 0);
  208.         sprintf (line, text1, "INFERIOR", !XN, R ? JF[LP[2] == 'T'] : PF[LP[1] == 'N']);
  209.         wrapwrite (fptr, 0, 5, col, line, 0);
  210.     }
  211.     if (A == 1) pause (col);
  212.     wrapwrite (fptr, 0, 0, col, "Please bear in mind that the",
  213.         "supplementary questions are experimental and may be highly",
  214.         "unreliable.  If these scores conflict with your previous scores,",
  215.         "it is probably because the questions are still not reliable",
  216.         "enough.\n\n", 0);
  217.     if (A == 1) pause (col);
  218.     sprintf (nline, "\n%s's scores on the supplementary questions:\n\n"
  219.     "Extraverted Thinking / Introverted Feeling   : %d\n"
  220.     "Extraverted Feeling / Introverted Thinking   : %d\n\n"
  221.     "Extraverted Intuition / Introverted Sensing  : %d\n"
  222.     "Extraverted Sensing / Introverted Intuition  : %d\n\n"
  223.     "Rationality (Dominant Judging Function)      : %d\n"
  224.     "A-rationality (Dominant Perceiving Function) : %d\n\n",
  225.         name, ET, EF, EN, ES, pr[9], pr[0]);
  226.     wrapwrite (fptr, 0, 0, col, nline, 0);
  227.  
  228.     /* Calculates possible life patterns based on supplemental scores. */
  229.     LPE[0] = 'E'; LPI[0] = 'I';
  230.     if (pr[9] > pr[0]) {
  231.         LPE[3] = 'J';
  232.         LPI[3] = 'P';
  233.     }
  234.     else if (pr[9] < pr[0]) {
  235.         LPE[3] = 'P';
  236.         LPI[3] = 'J';
  237.     }
  238.     else {
  239.         LPE[3] = 'X';
  240.         LPI[3] = 'X';
  241.     }
  242.     if (LPE[3] == 'P') {
  243.         if (EF > ET) {
  244.             LPE[2] = 'T';
  245.             LPI[2] = 'F';
  246.         }
  247.         else if (EF < ET) {
  248.             LPE[2] = 'F';
  249.             LPI[2] = 'T';
  250.         }
  251.         else {
  252.             LPE[2] = 'X';
  253.             LPI[2] = 'X';
  254.         }
  255.         if (ES < EN) {
  256.             LPE[1] = 'N';
  257.             LPI[1] = 'S';
  258.         }
  259.         else if (ES > EN) {
  260.             LPE[1] = 'S';
  261.             LPI[1] = 'N';
  262.         }
  263.         else {
  264.             LPE[1] = 'X';
  265.             LPI[1] = 'X';
  266.         }
  267.     }
  268.     else if (LPE[3] == 'J') {
  269.         if (EF < ET) {
  270.             LPE[2] = 'T';
  271.             LPI[2] = 'F';
  272.         }
  273.         else if (EF > ET) {
  274.             LPE[2] = 'F';
  275.             LPI[2] = 'T';
  276.         }
  277.         else {
  278.             LPE[2] = 'X';
  279.             LPI[2] = 'X';
  280.         }
  281.         if (ES > EN) {
  282.             LPE[1] = 'N';
  283.             LPI[1] = 'S';
  284.         }
  285.         else if (ES < EN) {
  286.             LPE[1] = 'S';
  287.             LPI[1] = 'N';
  288.         }
  289.         else {
  290.             LPE[1] = 'X';
  291.             LPI[1] = 'X';
  292.         }
  293.     }
  294.     else {
  295.         LPE[1] = 'X';
  296.         LPE[2] = 'X';
  297.         LPI[1] = 'X';
  298.         LPI[2] = 'X';
  299.     }
  300.     LPE[4] = LPI[4] = 0;
  301.  
  302.     sprintf (line, "According to the supplementary scores, %s could be "
  303.     "an %s or an %s.  These are opposite types, because the supplementary "
  304.     "questions measure for preferences that opposite types share in common.  "
  305.     "See the FAQ for an explanation.", name, LPE, LPI);
  306.     if (typecmp(LP, LPE) || typecmp(LP, LPI))
  307.         sprintf (nline, "%s These results are consistent with your score as an %s.", line, LP);
  308.     else
  309.         sprintf (nline, "%s These results conflict with the evaluation of %s as an %s.", line, name, LP);
  310.     wrapwrite (fptr, 5, 0, col, nline, "\n\n", 0);
  311.     if (fptr != stdout)
  312.         fclose (fptr);
  313.     if (A == 1) pause (col);
  314.     wrapwrite (stdout, 5, 0, col,
  315.         "Please note that the DDLI is fallible, and that you might not",
  316.         "be what you scored as.  In order to make the DDLI more",
  317.         "reliable, I want to collect the raw scores from people who know",
  318.         "their type INDEPENDENTLY from what the DDLI has told them.",
  319.         "With your permission, the DDLI will store your raw",
  320.         "scores in a file.  If you ALREADY KNOW your type, or if you",
  321.         "figure out what your type is, please send me your raw scores",
  322.         "via e-mail.  Your raw scores will help me determine which",
  323.         "questions to leave out and which to leave in.  Do you give the",
  324.         "DDLI permission to store your raw scores in a file?", 0);
  325.     if (yes()) {
  326.         save_scores (Q, type, col);
  327.         wrapwrite (stdout, 0, 0, col, "Thank you for saving a copy of your",
  328.             "raw scores.  Please remember that it will be useful to me ONLY",
  329.             "IF you know your type INDEPENDENTLY from what the DDLI has",
  330.             "told you. Please note that this file is straight ASCII.",
  331.             "It is not binary.  Do NOT uuencode it.  Do NOT MIME-encode",
  332.             "it.  Do NOT BinHex it.  Do NOT compress it.  Just insert it",
  333.             "into the body of an ordinary e-mail message.", 0);
  334.     }
  335.  
  336.     return 0;
  337. }
  338.  
  339. int pow (int x, int y) {
  340.     if (y < 1)
  341.         return 1;
  342.     if (y == 1)
  343.         return x;
  344.     return x * pow(x, y-1);
  345. }
  346.  
  347. int typecmp (char *t1, char *t2) {
  348.     int i;
  349.  
  350.     for (i = 0; i < 4; i++)
  351.         if ((t1[i] != t2[i]) && (t1[i] != 'X') && (t2[i] != 'X'))
  352.             return 0;
  353.     return 1;
  354. }
  355.  
  356. void pause (int col) {
  357.     wrapwrite (stdout, 0, 0, col, "Press <ENTER> to continue.\n", 0);
  358.     nextline (stdin);
  359. }
  360.  
  361.