/*---------------------------------------------------------------------+00010000 | Copyright (c) 1996, SAS Institute Inc. | | Unpublished - All Rights Reserved | | S A S / C S A M P L E | | |00030100 | NAME: PI4 |00050000 | LANGUAGE: C |00051000 | PURPOSE: SAS/C DEBUGGER example program |00060000 | This program computes pi/4 using a slowly converging |00060000 | infinite series for atan(1.0). The SIGINT signal can |00060000 | be generated to terminate summation or print an |00060000 | indication of progress so far. |00060000 | MISC NOTES: This example is part of Debug Session 12 which shows |00060000 | how to use the attn command. |00060000 | See SAS/C Debugger User's Guide and Reference Third |00060000 | Edition, Chapter 6, pg. 175. |00060000 | INPUT/OUTPUT: stdin/stdout | | Since the input is stdin, you could type some lines in |00051000 | a file and redirect stdin to the file. However, the |00060000 | simplest way to enter the lines is from the Termin | | window. | | |00030100 | MVS - |00300000 | COMPILE,LINK: SUBMIT prefix.SAMPLE.AUX(PI4) | | make sure to use the =DEBUG compile option | | where "prefix" is the installation defined high-level | | qualifier for the SAS/C product. | | EXECUTE: execute under TSO, see below | | TSO - | | COMPILE: LC370 CLIST | | LINK: CLK370 CLIST | | EXECUTE: CALL your.load.lib(PI4) '=DEBUG' | | CMS - | | COMPILE: LC370 PI4 (DEBUG | | LINK: CLINK PI4 (GENMOD | | EXECUTE: PI4 =DEBUG | | |00030100 +---------------------------------------------------------------------*/ #eject #include #include #include /* This program computes pi/4 using a slowly converging */ /* infinite series for atan(1.0). The SIGINT signal can be */ /* generated to terminate summation or print an indication */ /* of progress so far. */ /* */ int iter; /* number of iterations */ double sum = 0.0; /* pi/4 value */ double lastterm = 2.0/3.0; void attn(int); /* attn handler */ void main() { signal(SIGINT, &attn); /* define attention handler */ for(iter = 1; lastterm > 1.00E-6; ++iter) { sum += lastterm; /* add in previous term */ lastterm = 2.0/((iter*4 + 1)*(iter*4 + 3)); /* compute next term */ sigchk(); /* check for interruption */ } printf("pi/4 computed as %.10f in %d iterations\n",sum, iter); exit(0); } void attn(int signum) { char reply(|20|); printf("Do you want to terminate, or print a status report? \n"); while(1) { printf("Enter \"t\" or \"p\" \n"); fgets(reply, 20, stdin); switch(tolower(reply(|0|))) { case 't': printf("Execution terminated.\n"); exit(1); case 'p': printf("Number of iterations = %d\n", iter); printf("Sum so far = %.10f\n", sum); printf("Last term computed = %.12f\n", lastterm); signal(SIGINT, &attn); /* Reinstate attn handling */ return; default: printf("Incorrect response. Please correct. \n"); break; } } }