/* ** Source: sqrt.c ** Author: Scott Wenger 1997 ** Box 802 ** Stevens Point, WI 54481 ** panther@wctc.net ** Purpose: approximation of square root ** This program uses standard header files. If your ** compiler requires other header files to handle floating ** point, use the appropriate header files and / or ** library for your compiler. */ #include #include #include #include #include // function prototypes float s_root(int number); int validate(char input[]); void prim_cls(); // s_root calculates approximate square root float s_root(int number) { register int x = 1; float q; float sr; float avg; int z = 1; char buffer[20]; int i = 0; do { z++; if (z * z == number) return( (float) z); // found the square root (a whole number) } while (z * z < number); // if still in function, compute the fractional square root... while(x * x < number) x++; q = (float) number / x; sprintf(buffer, "%.1f", q); sr = (float) atof(buffer); avg = (float) .5 * (x + sr); for (i = 0; i < 3; i++) { // get closer approximation q = number / avg; avg = (float) .5 * (avg + q); q = number / avg; } return(q); } /*--------------------------------------------------------------*/ int validate(char input[]) { int valid = 1; register int i; int len = strlen(input); if (len > 4) return(0); if ( *(input + len - 1) == '\n') *(input + len - 1) = '\0'; for (i = 0; i < len; i++) { if ( *(input + i) < '0' || *(input + i) > '9') valid = 0; } return(valid); } /*--------------------------------------------------------------*/ void prim_cls() { register int i; for (i = 0; i < 80; i++) printf("\n"); } /*--------------------------------------------------------------*/ main() { int question; int valid = 0; int retval = 1; int decision; char input[500]; char more; float answer; while (!valid) { prim_cls(); if (!retval) { printf("\nInvalid entry."); printf("\nTry again.\n\n"); retval = 1; } printf("\nEnter an integer (1 to 9999): "); fflush(stdout); scanf("%s", input); retval = validate(input); if (!retval) { continue; } question = atoi(input); answer = s_root(question); printf("\nApproximate square root of %d is %f\n\n", question, answer); decision = 0; printf("\nContinue ? (y or n): [ ]\b\b"); fflush(stdout); while (!decision) { more = getch(); if (more == 'y' || more == 'Y') decision = 1; if (more == 'n' || more == 'N') { printf("\n\n"); exit(0); } } } } /*--------------------------------------------------------------*/