summaryrefslogtreecommitdiff
path: root/reference/C/CONTRIB/SNIP/inchcvrt.c
diff options
context:
space:
mode:
Diffstat (limited to 'reference/C/CONTRIB/SNIP/inchcvrt.c')
-rwxr-xr-xreference/C/CONTRIB/SNIP/inchcvrt.c79
1 files changed, 79 insertions, 0 deletions
diff --git a/reference/C/CONTRIB/SNIP/inchcvrt.c b/reference/C/CONTRIB/SNIP/inchcvrt.c
new file mode 100755
index 0000000..fb2cdb6
--- /dev/null
+++ b/reference/C/CONTRIB/SNIP/inchcvrt.c
@@ -0,0 +1,79 @@
+/*
+** Convert English measurement units
+**
+** Takes command line arguments in inches and converts to:
+**
+** 1. feet and inches (expressed as floating point)
+** 2. feet and inches (expressed as fraction)
+**
+** public domain demo by Bob Stout
+** uses ROUND.H from SNIPPETS
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include "round.h"
+
+#define BASE 64.0
+
+void cnvrt_inches(double input,
+ double *feet,
+ double *inches,
+ double *dec_inches,
+ double *num_inches,
+ double *den_inches)
+{
+ double quot, rem, temp;
+
+ /*
+ ** Split feet and inches
+ */
+
+ *feet = floor(input / 12.0);
+ *inches = fmod(input, 12.0);
+
+ /*
+ ** Get integer inches and fractions
+ */
+
+ *num_inches = modf(*inches, dec_inches) * BASE;
+
+ *num_inches = fround(*num_inches, 0);
+ if (0.0 == *num_inches)
+ return;
+
+ /*
+ ** Reduce fractions to lowest common denominator
+ */
+
+ for (*den_inches = BASE;
+ 0.0 == fmod(*num_inches, 2.0);
+ *den_inches /= 2.0, *num_inches /= 2.0)
+ {
+ ;
+ }
+}
+
+main(int argc, char *argv[])
+{
+ double arg, feet, inches, dec, num, den, dummy;
+
+ while (--argc)
+ {
+ arg = atof(*(++argv));
+ cnvrt_inches(arg, &feet, &inches, &dec, &num, &den);
+ printf("%f Inches = %d' %.5f\" or %d' %d",
+ arg, (int)feet, inches, (int)feet, (int)dec);
+ if (0.0 == num)
+ puts("\"");
+ else
+ {
+ printf("-%d/%d\"", (int)num, (int)den);
+ if (modf(num, &dummy))
+ puts(" (approx.)");
+ else puts("");
+ }
+ }
+ return EXIT_SUCCESS;
+}