ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kernighan - C] #4-1,2 함수의 기초
    전기전자공학/프로젝트 2017. 6. 26. 11:49

    4.1 함수의 기초



    [예제 4-1]

    s내에서 t의 가장 오른쪽 위치를 나타내는 함수 strindex(s,t)를 작성해보라. 만일 t가 없다면 -1을 리턴.

    (맨 오른쪽 기준을 0으로 한 경우)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int strindex(char s[], char t[]) {
        int i, j, k;
     
        for (i = 0; s[i] != '\0'; i++) {
            for (j = i, k = 0; t[k] != '\0' && s[j] == t[k]; j++, k++)
                ;
            if (k > 0 && t[k] == '\0')
                return strlen(s) - (i+ strlen(t)) - 1;
        }
        return -1;
    }
    cs


    strlen(s)는 실제 s에서 \n을 포함한 길이 이므로 실제 s의 길이(눈에 보이는 문자와 공백들)는 strlen(s) -1이다.

    (i + strlen(t) - 1)은 맨 왼쪽을 0으로 했을 때 t의 맨 오른쪽 단어의 위치를 나타내는 수식이다.

    (strlen(s) - 1) - (i + strlen(t) - 1)을 하면 맨 오른쪽이 index = 1인 기준이므로, 

    나같은 경우 최우측을 0으로 기준을 삼았으니 최종식에다 -1일 빼줘야 한다.

    따라서,  (strlen(s) - 1) - (i + strlen(t) - 1)  - 1 = strlen(s) - (i+ strlen(t)) -1



    [예제 4-2]

    소수 뒤에 e나 E가 나오고, 그 뒤에는 부호 생략이 가능한 지수부분이 오도록 atof 함수를 확장하여 프로그램을 작성하여라. 

    즉 123.45e-6와 같은 형태의 수를 다룰 수 있도록 atof함수를 확장하라.

    작성 파일: main.c, atof.c, power.c, hi.h

    Make파일: Makefile


    main.c

    1
    2
    3
    4
    5
    6
    #include "hi.h"
     
    main() {
        char str[100= "12.3e-6";
        printf("%lf\n", atof(str));
    }
    cs

    atof.c

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #include "hi.h"
     
    /* atof: convert string s to double */
    double atof(char s[]) {
        double val, power;
        int i, sign, n; // n: 자릿수
     
        for (i = 0; isspace(s[i]); i++/* skip white space */
            ;
     
        sign = (s[i] == '-') ? -1 : 1;
     
        if (s[i] == '+' || s[i] == '-')
            i++;
        for (val = 0.0; isdigit(s[i]); i++)
            val = 10.0 * val + (s[i] - '0');
        if (s[i] == '.')
            i++;
        for (power = 1.0; isdigit(s[i]); i++) {
            val = 10.0 * val + (s[i] - '0');
            power *= 10.0;
        }
        if (s[i] == 'e') {
            i += 2;
            n = s[i] - '0';
        }
        return sign *(val / power) * power1(10, n);
    }
    cs

    power.c

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include "hi.h"
     
    /* power: raise base to nth power */
    int power1(int base, int n)
    {
        int p;
     
        for (p = 1; n > 0--n)
            p *= base;
        return p;
    }
    cs

    hi.h

    1
    2
    3
    4
    5
    #include <stdio.h>
    #include <ctype.h>
     
    double atof(char[]);
    int power1(int base, int n);
    cs


    '전기전자공학 > 프로젝트' 카테고리의 다른 글

    #5-6,7 포인터 배열  (0) 2017.06.29
    [Kernighan - C] #5 - 5  (0) 2017.06.29
    [Kernighan - C] #2-11 조건문  (0) 2017.06.25
    [Kernighan - C] #2 - 10 지정 연산자와 수식  (0) 2017.06.25
    [Kernighan - C] #2-9 비트 연산자  (0) 2017.06.25

    댓글

Designed by Tistory.