Blame


1 5dc21454 2023-07-14 jrmu /*
2 5dc21454 2023-07-14 jrmu * Exercise 4-2. Extend atof to handle scientific notation of the form
3 5dc21454 2023-07-14 jrmu *
4 5dc21454 2023-07-14 jrmu * 123.45e-6
5 5dc21454 2023-07-14 jrmu *
6 5dc21454 2023-07-14 jrmu * where a floating point number may be followed by e or E and an optionally
7 5dc21454 2023-07-14 jrmu * signed exponent.
8 5dc21454 2023-07-14 jrmu */
9 5dc21454 2023-07-14 jrmu
10 5dc21454 2023-07-14 jrmu #include <stdio.h>
11 5dc21454 2023-07-14 jrmu #include <ctype.h>
12 5dc21454 2023-07-14 jrmu #include <math.h>
13 5dc21454 2023-07-14 jrmu
14 5dc21454 2023-07-14 jrmu #define MAXLINE 100
15 5dc21454 2023-07-14 jrmu
16 5dc21454 2023-07-14 jrmu /* rudimentary calculator */
17 5dc21454 2023-07-14 jrmu
18 5dc21454 2023-07-14 jrmu double pow(double x, double y);
19 5dc21454 2023-07-14 jrmu
20 5dc21454 2023-07-14 jrmu int main() {
21 5dc21454 2023-07-14 jrmu double atof(char []);
22 5dc21454 2023-07-14 jrmu char line[MAXLINE];
23 5dc21454 2023-07-14 jrmu int getlin(char line[], int max);
24 5dc21454 2023-07-14 jrmu
25 5dc21454 2023-07-14 jrmu while (getlin(line, MAXLINE) > 0)
26 5dc21454 2023-07-14 jrmu printf("\t%f\n", atof(line));
27 5dc21454 2023-07-14 jrmu return 0;
28 5dc21454 2023-07-14 jrmu }
29 5dc21454 2023-07-14 jrmu
30 5dc21454 2023-07-14 jrmu /* getlin: get line into s, return length */
31 5dc21454 2023-07-14 jrmu int getlin(char s[], int lim) {
32 5dc21454 2023-07-14 jrmu int c, i;
33 5dc21454 2023-07-14 jrmu i = 0;
34 5dc21454 2023-07-14 jrmu while (--lim > 0 && (c=getchar()) != EOF && c != '\n')
35 5dc21454 2023-07-14 jrmu s[i++] = c;
36 5dc21454 2023-07-14 jrmu if (c == '\n')
37 5dc21454 2023-07-14 jrmu s[i++] = c;
38 5dc21454 2023-07-14 jrmu s[i] = '\0';
39 5dc21454 2023-07-14 jrmu return i;
40 5dc21454 2023-07-14 jrmu }
41 5dc21454 2023-07-14 jrmu
42 5dc21454 2023-07-14 jrmu /* atof: convert string s to double */
43 5dc21454 2023-07-14 jrmu double atof(char s[]) {
44 5dc21454 2023-07-14 jrmu double val, power;
45 5dc21454 2023-07-14 jrmu int i, sign, expsign, exp;
46 5dc21454 2023-07-14 jrmu
47 5dc21454 2023-07-14 jrmu for (i = 0; isspace(s[i]); i++) /* skip white space */
48 5dc21454 2023-07-14 jrmu ;
49 5dc21454 2023-07-14 jrmu sign = (s[i] == '-') ? -1 : 1;
50 5dc21454 2023-07-14 jrmu if (s[i] == '+' || s[i] == '-')
51 5dc21454 2023-07-14 jrmu i++;
52 5dc21454 2023-07-14 jrmu for (val = 0.0; isdigit(s[i]); i++)
53 5dc21454 2023-07-14 jrmu val = 10.0 * val + (s[i] - '0');
54 5dc21454 2023-07-14 jrmu if (s[i] == '.')
55 5dc21454 2023-07-14 jrmu i++;
56 5dc21454 2023-07-14 jrmu for (power = 1.0; isdigit(s[i]); i++) {
57 5dc21454 2023-07-14 jrmu val = 10.0 * val + (s[i] - '0');
58 5dc21454 2023-07-14 jrmu power *= 10.0;
59 5dc21454 2023-07-14 jrmu }
60 5dc21454 2023-07-14 jrmu if (s[i] == 'e' || s[i] == 'E') {
61 5dc21454 2023-07-14 jrmu i++;
62 5dc21454 2023-07-14 jrmu expsign = (s[i] == '-') ? -1 : 1;
63 5dc21454 2023-07-14 jrmu if (s[i] == '+' || s[i] == '-')
64 5dc21454 2023-07-14 jrmu i++;
65 5dc21454 2023-07-14 jrmu for (exp = 0; isdigit(s[i]); i++)
66 5dc21454 2023-07-14 jrmu exp = 10 * exp + (s[i] - '0');
67 5dc21454 2023-07-14 jrmu } else {
68 5dc21454 2023-07-14 jrmu exp = 0;
69 5dc21454 2023-07-14 jrmu expsign = 1;
70 5dc21454 2023-07-14 jrmu }
71 5dc21454 2023-07-14 jrmu return sign * val * pow(10,expsign*exp) / power;
72 5dc21454 2023-07-14 jrmu }
73 5dc21454 2023-07-14 jrmu
74 5dc21454 2023-07-14 jrmu int atoi(char s[]) {
75 5dc21454 2023-07-14 jrmu double atof(char s[]);
76 5dc21454 2023-07-14 jrmu return (int) atof(s);
77 5dc21454 2023-07-14 jrmu }