본문내용
+ n - 1 : s;
for (p = s; p < q; ++p, --q) {
tmp = *p;
*p = *q;
*q = tmp;
}
return s;
}
다음 문장들을 포함하는 프로그램을 작성하여 이 함수를 검사해 보아라.
char str[] = "abcdefghijklnopqrstuvwxyz";
printf("%s\n", reverse(str));
작성한 프로그램을 실행하여 이것을 이해하여라.
☞ 프로그램이 실행되면 처음에 p는 a를 가리키고, q는 z를 가리킨다. for루프가 반복되면서 p는 b, c, d ... q는 y, x, w ...를 가리키게 된다. 그렇게 점점 p와 q의 값이 바뀌다가 14번째 루프를 돌려하다가 for문의 조건에 따라서 for문을 빠져나가 s를 반환하고 함수를 종료한다.
문제 39.
일반적으로 argc와 argv는 main() 함수의 인자로써 사용된다. argc는 명령어 라인에서의 인자 수이기 때문에, 배열 argv의 크기를 argc라고 생각할 수도 있지만, 그렇지 않다. 배열 argv는 argc+ 1의 크기를 갖고, 배열의 마지막 원소는 널 포인터이다. 다음은 echo 명령어의 다른 버전이다.
#include
int main(int argc, char **argv)
{
while (*argv != NULL)
printf("%s ", *argv++);
putchar('\n');
return 0;
}
이 프로그램을 수행시켜보고, 이것을 이해하여라. 그리고 이 프로그램이 어떻게 동작하는지 상세하게 기술하여라. 힌트: char 형 포인터에 대한 포인터가 역참조 되면, 그 결과는 char 형 포인터가 된다. 또한 6.11절의 strcat() 함수 분석을 다시 읽어 보아라.
☞ main()함수도 인자를 입력받을 수 있다. argc란 argument count이며, argv란 argument voctor의 약자이다. 즉 인자의 개수와 인자의 배열을 의미한다.
argv는 포인터의 배열이라고도 할 수 있다. argv[0] ~ argv[n]은 각각 포인터 변수이다. 이것은 각각 문자열을 가리키고 있다. 따라서 각각 문자열의 선두 문자를 가리킨다.
문제 42.
다음 프로그램을 컴파일하고 실행하여 프로그램을 이해하여라.
#include
#include
void tell_me(it f(const char *, const char *));
int main(void)
{
tell_me(strcmp);
tell_me(main);
return 0;
}
void tell_me(int f(const char *, const char *))
{
if (f == strcmp)
printf("Address of strcmp(): %p\n", f);
else
printf("Function address: %p\n", f);
}
tell_me() 함수에 대한 두 번째 호출에서, 전달되는 포인터가 잘못된 형을 가지고 있기 때문에 컴파일러는 경고 메시지를 발생시킬 것이다. 그러한가? 경고 메시지가 나타나지 않도록 void * 포인터형을 사용하는 프로그램으로 수정하여라.
☞ int main(void)에서 void를 빼면 된다. void키워드는 이 함수가 인자를 갖지 않음을 컴파일러에게 알려준다. tell_me()함수에서 인자 함수는 인자를 가지고 있다고 했는데 main(void)함수는 인자를 가지고 있지 않다고 했기 때문에 경고 메시지가 나타난거 같다.
문제 44.
컴파일러는 함수 이름 그 자체를 포인터로 취급한다. 이것은 C의 일반적인 규칙이다. 다음 코드는 옳은가? 컴파일하기 전에 다하여 보아라.
#include
void f(void);
void g(void);
void h(void);
int main(void)
{
(*f)();
return 0;
}
void f(void)
{
printf("Hello from f().\n");
(((*g)))();
}
void g(void)
{
printf("Hello from g().\n");
(*(*(*h)))();
}
void h(void)
{
printf("Hello from h().\n");
}
☞ 모두 옳다. 모두 함수 호출이며 포인터 변수는 그 값으로 주소를 가질 수 있는 것이다. 따라서 위의 함수 호출은 모두 정당하다.
문제 45.
bisection()이 실행되기 위한 선행조건은 f(a)와 f(b)가 서로 반대 부호를 갖는 것이다. 이 조건을 검사하기 위하여 bisection()의 시작 부분에서 단정을 사용하여 보아라.
☞ asset(f(a) == 0.0 || b - a < eps);
문제 46.
고대 이집트인들은 상형문자를 사용하였다. 이 시스템에서는 모음이 없고, 자음만이 있다. 일반적으로 모음을 사용하지 않는 영어를 이해할 수 있겠는가? 시험적으로 주어진 문자가 모음이면 1을 리턴하고, 그렇지 않으면 0을 리턴하는 is_vowel() 함수를 작성하여라. 이 함수를 사용하여 표준 입력 파일에서 읽고 모음을 삭제한 휴 표준 출력 파일에 쓰는 프로그램을 작성하여라. 재지정을 사용하여 영문 문서를 입력으로 한 후 이 프로그램을 검사하여라.
☞ 1 #include
2
3 int is_vowel(char);
4
5 int main(void)
6 {
7 int i;
8 char c;
9
10 while (scanf("%c", &c) != EOF) {
11
12 i = is_vowel(c);
13 if (i == 0) //함수에서 0리턴되면, 자음이다.
14 putchar(c); //자음이 리턴되면 그냥 출력한다.
15 }
16 return 0;
17 }
18
19 int is_vowel(char c)
20 {
21 switch (c) {
22 case 'a': case 'A':
23 case 'i': case 'I':
24 case 'e': case 'E':
25 case 'o': case 'O':
26 case 'u': case 'U':
27 return 1;
28 break;
29 default:
30 return 0;
31 }
32 }
for (p = s; p < q; ++p, --q) {
tmp = *p;
*p = *q;
*q = tmp;
}
return s;
}
다음 문장들을 포함하는 프로그램을 작성하여 이 함수를 검사해 보아라.
char str[] = "abcdefghijklnopqrstuvwxyz";
printf("%s\n", reverse(str));
작성한 프로그램을 실행하여 이것을 이해하여라.
☞ 프로그램이 실행되면 처음에 p는 a를 가리키고, q는 z를 가리킨다. for루프가 반복되면서 p는 b, c, d ... q는 y, x, w ...를 가리키게 된다. 그렇게 점점 p와 q의 값이 바뀌다가 14번째 루프를 돌려하다가 for문의 조건에 따라서 for문을 빠져나가 s를 반환하고 함수를 종료한다.
문제 39.
일반적으로 argc와 argv는 main() 함수의 인자로써 사용된다. argc는 명령어 라인에서의 인자 수이기 때문에, 배열 argv의 크기를 argc라고 생각할 수도 있지만, 그렇지 않다. 배열 argv는 argc+ 1의 크기를 갖고, 배열의 마지막 원소는 널 포인터이다. 다음은 echo 명령어의 다른 버전이다.
#include
int main(int argc, char **argv)
{
while (*argv != NULL)
printf("%s ", *argv++);
putchar('\n');
return 0;
}
이 프로그램을 수행시켜보고, 이것을 이해하여라. 그리고 이 프로그램이 어떻게 동작하는지 상세하게 기술하여라. 힌트: char 형 포인터에 대한 포인터가 역참조 되면, 그 결과는 char 형 포인터가 된다. 또한 6.11절의 strcat() 함수 분석을 다시 읽어 보아라.
☞ main()함수도 인자를 입력받을 수 있다. argc란 argument count이며, argv란 argument voctor의 약자이다. 즉 인자의 개수와 인자의 배열을 의미한다.
argv는 포인터의 배열이라고도 할 수 있다. argv[0] ~ argv[n]은 각각 포인터 변수이다. 이것은 각각 문자열을 가리키고 있다. 따라서 각각 문자열의 선두 문자를 가리킨다.
문제 42.
다음 프로그램을 컴파일하고 실행하여 프로그램을 이해하여라.
#include
#include
void tell_me(it f(const char *, const char *));
int main(void)
{
tell_me(strcmp);
tell_me(main);
return 0;
}
void tell_me(int f(const char *, const char *))
{
if (f == strcmp)
printf("Address of strcmp(): %p\n", f);
else
printf("Function address: %p\n", f);
}
tell_me() 함수에 대한 두 번째 호출에서, 전달되는 포인터가 잘못된 형을 가지고 있기 때문에 컴파일러는 경고 메시지를 발생시킬 것이다. 그러한가? 경고 메시지가 나타나지 않도록 void * 포인터형을 사용하는 프로그램으로 수정하여라.
☞ int main(void)에서 void를 빼면 된다. void키워드는 이 함수가 인자를 갖지 않음을 컴파일러에게 알려준다. tell_me()함수에서 인자 함수는 인자를 가지고 있다고 했는데 main(void)함수는 인자를 가지고 있지 않다고 했기 때문에 경고 메시지가 나타난거 같다.
문제 44.
컴파일러는 함수 이름 그 자체를 포인터로 취급한다. 이것은 C의 일반적인 규칙이다. 다음 코드는 옳은가? 컴파일하기 전에 다하여 보아라.
#include
void f(void);
void g(void);
void h(void);
int main(void)
{
(*f)();
return 0;
}
void f(void)
{
printf("Hello from f().\n");
(((*g)))();
}
void g(void)
{
printf("Hello from g().\n");
(*(*(*h)))();
}
void h(void)
{
printf("Hello from h().\n");
}
☞ 모두 옳다. 모두 함수 호출이며 포인터 변수는 그 값으로 주소를 가질 수 있는 것이다. 따라서 위의 함수 호출은 모두 정당하다.
문제 45.
bisection()이 실행되기 위한 선행조건은 f(a)와 f(b)가 서로 반대 부호를 갖는 것이다. 이 조건을 검사하기 위하여 bisection()의 시작 부분에서 단정을 사용하여 보아라.
☞ asset(f(a) == 0.0 || b - a < eps);
문제 46.
고대 이집트인들은 상형문자를 사용하였다. 이 시스템에서는 모음이 없고, 자음만이 있다. 일반적으로 모음을 사용하지 않는 영어를 이해할 수 있겠는가? 시험적으로 주어진 문자가 모음이면 1을 리턴하고, 그렇지 않으면 0을 리턴하는 is_vowel() 함수를 작성하여라. 이 함수를 사용하여 표준 입력 파일에서 읽고 모음을 삭제한 휴 표준 출력 파일에 쓰는 프로그램을 작성하여라. 재지정을 사용하여 영문 문서를 입력으로 한 후 이 프로그램을 검사하여라.
☞ 1 #include
2
3 int is_vowel(char);
4
5 int main(void)
6 {
7 int i;
8 char c;
9
10 while (scanf("%c", &c) != EOF) {
11
12 i = is_vowel(c);
13 if (i == 0) //함수에서 0리턴되면, 자음이다.
14 putchar(c); //자음이 리턴되면 그냥 출력한다.
15 }
16 return 0;
17 }
18
19 int is_vowel(char c)
20 {
21 switch (c) {
22 case 'a': case 'A':
23 case 'i': case 'I':
24 case 'e': case 'E':
25 case 'o': case 'O':
26 case 'u': case 'U':
27 return 1;
28 break;
29 default:
30 return 0;
31 }
32 }
키워드
추천자료
- [C 프로그래밍] C로 배우는 프로그래밍 기초 3장 이해점검 및 프로그램문제 풀이
- [C 프로그래밍] C로 배우는 프로그래밍 기초 4장 이해점검 및 프로그램문제 풀이
- [C 프로그래밍] C로 배우는 프로그래밍 기초 5장 이해점검 및 프로그램문제 풀이
- [C 프로그래밍] C로 배우는 프로그래밍 기초 6장 이해점검 및 프로그램문제 풀이
- [C 프로그래밍] C로 배우는 프로그래밍 기초 7장 이해점검 및 프로그램문제 풀이
- [C 프로그래밍] C로 배우는 프로그래밍 기초 1장 이해점검 및 프로그램문제 풀이
- [C 프로그래밍] C로 배우는 프로그래밍 기초 11장 이해점검 및 프로그램문제 풀이
- [C 프로그래밍] C로 배우는 프로그래밍 기초 12장 이해점검 및 프로그램문제 풀이
- [C 프로그래밍] C로 배우는 프로그래밍 기초 13장 이해점검 및 프로그램문제 풀이
- [C 프로그래밍] C로 배우는 프로그래밍 기초 14장 이해점검 및 프로그램문제 풀이
- [C 프로그래밍] C로 배우는 프로그래밍 기초 16장 이해점검 및 프로그램문제 풀이
- C언어의 원리, C언어의 장단점, C언어의 시작, C++의 추가된 사항, C++의 데이터선언, C++의 ...
- ICC(F.P.A) VS ICC(C) - ICC(F.P.A)조건과 ICC 2009(C)조건의 비교 (ICC(F.P.A)조건, ICC(C)...