-
[Kernighan - C] #4-1,2 함수의 기초전기전자공학/프로젝트 2017. 6. 26. 11:49
4.1 함수의 기초
[예제 4-1]
s내에서 t의 가장 오른쪽 위치를 나타내는 함수 strindex(s,t)를 작성해보라. 만일 t가 없다면 -1을 리턴.
(맨 오른쪽 기준을 0으로 한 경우)
1234567891011int 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
123456#include "hi.h"main() {char str[100] = "12.3e-6";printf("%lf\n", atof(str));}cs atof.c
12345678910111213141516171819202122232425262728#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
1234567891011#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
12345#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